1 21 22 package org.continuent.sequoia.controller.semantic; 23 24 import java.util.ArrayList ; 25 import java.util.HashMap ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 import java.util.SortedSet ; 29 import java.util.TreeSet ; 30 31 import org.continuent.sequoia.common.log.Trace; 32 import org.continuent.sequoia.common.xml.DatabasesXmlTags; 33 import org.continuent.sequoia.common.xml.XmlComponent; 34 import org.continuent.sequoia.controller.requests.AbstractRequest; 35 import org.continuent.sequoia.controller.requests.StoredProcedure; 36 import org.continuent.sequoia.controller.sql.macros.AbstractMacro; 37 38 46 public class SemanticManager implements XmlComponent 47 { 48 private List requestSemantic; 49 private HashMap storedProcedureSemantic; 50 private StoredProcedureSemantic defaultStoredProcedureSemantic; 51 private HashMap triggerSemantic; 52 private HashMap viewSemantic; 53 54 private Trace logger = Trace 55 .getLogger("org.continuent.sequoia.controller.semantic"); 56 57 60 public SemanticManager() 61 { 62 requestSemantic = new ArrayList (); 63 storedProcedureSemantic = new HashMap (); 64 triggerSemantic = new HashMap (); 65 viewSemantic = new HashMap (); 66 } 67 68 74 public void addRequestSemantic(RequestSemantic semantic) 75 { 76 if (requestSemantic.contains(semantic)) 77 { 78 if (logger.isInfoEnabled()) 79 logger.info("Replacing request semantic for " 80 + semantic.getSqlPattern()); 81 requestSemantic.set(requestSemantic.indexOf(semantic), semantic); 82 } 83 else 84 { 85 if (logger.isDebugEnabled()) 86 logger.debug("Adding request semantic for " + semantic.getSqlPattern()); 87 requestSemantic.add(semantic); 88 } 89 } 90 91 97 public void addStoredProcedureSemantic(StoredProcedureSemantic semantic) 98 { 99 String storedProcedureKey = semantic.getProcedureKey(); 100 if (logger.isInfoEnabled()) 101 { 102 if (storedProcedureSemantic.containsKey(storedProcedureKey)) 103 logger.info("Replacing semantic for StoredProcedure " 104 + storedProcedureKey); 105 else 106 logger.debug("Adding semantic for StoredProcedure " 107 + storedProcedureKey); 108 } 109 storedProcedureSemantic.put(storedProcedureKey, semantic); 110 } 111 112 118 public void addTriggerSemantic(TriggerSemantic semantic) 119 { 120 String triggerName = semantic.getTriggerName(); 121 if (logger.isInfoEnabled()) 122 { 123 if (triggerSemantic.containsKey(triggerName)) 124 logger.info("Replacing semantic for trigger " + triggerName); 125 else 126 logger.debug("Adding semantic for trigger " + triggerName); 127 } 128 triggerSemantic.put(triggerName, semantic); 129 } 130 131 137 public void addViewSemantic(ViewSemantic semantic) 138 { 139 String viewName = semantic.getViewName(); 140 if (logger.isInfoEnabled()) 141 { 142 if (viewSemantic.containsKey(viewName)) 143 logger.info("Replacing semantic for view " + viewName); 144 else 145 logger.debug("Adding semantic for view " + viewName); 146 } 147 viewSemantic.put(viewName, semantic); 148 } 149 150 155 public StoredProcedureSemantic getDefaultStoredProcedureSemantic() 156 { 157 return defaultStoredProcedureSemantic; 158 } 159 160 165 public void setDefaultStoredProcedureSemantic( 166 StoredProcedureSemantic defaultSemantic) 167 { 168 this.defaultStoredProcedureSemantic = defaultSemantic; 169 } 170 171 183 public SemanticBehavior getRequestSemantic(AbstractRequest request) 184 { 185 for (Iterator iter = requestSemantic.iterator(); iter.hasNext();) 186 { 187 RequestSemantic rs = (RequestSemantic) iter.next(); 188 if (rs.matchesPattern(request.getSqlOrTemplate())) 189 return rs.getSemanticBehavior(); 190 } 191 192 if (request instanceof StoredProcedure) 193 return getStoredProcedureSemantic((StoredProcedure) request); 194 195 return null; 196 } 197 198 206 public SemanticBehavior getStoredProcedureSemantic(StoredProcedure procedure) 207 { 208 StoredProcedureSemantic semantic = (StoredProcedureSemantic) storedProcedureSemantic 209 .get(procedure.getProcedureKey()); 210 211 if (semantic != null) 212 return semantic.getSemanticBehavior(); 213 214 semantic = (StoredProcedureSemantic) storedProcedureSemantic.get(procedure 215 .getProcedureName()); 216 if (semantic != null) 217 return semantic.getSemanticBehavior(); 218 219 if (defaultStoredProcedureSemantic != null) 220 return defaultStoredProcedureSemantic.getSemanticBehavior(); 221 222 return null; 223 } 224 225 234 public SemanticBehavior getStoredProcedureSemantic(String storedProcedureKey) 235 { 236 StoredProcedureSemantic semantic = (StoredProcedureSemantic) storedProcedureSemantic 237 .get(storedProcedureKey); 238 239 if (semantic != null) 240 return semantic.getSemanticBehavior(); 241 242 if (defaultStoredProcedureSemantic != null) 243 return defaultStoredProcedureSemantic.getSemanticBehavior(); 244 245 return null; 246 } 247 248 254 public ViewSemantic getViewSemantic(String viewName) 255 { 256 ViewSemantic semantic = (ViewSemantic) this.viewSemantic.get(viewName); 257 return semantic; 258 } 259 260 268 public SortedSet getWriteLockedTables(SemanticBehavior semantic) 269 { 270 if (semantic == null) 272 return new TreeSet (); 273 274 SortedSet result = processTableList(semantic.getWriteSet()); 275 result 276 .addAll(processStoredProcedureRef(semantic.getProceduresReferenced())); 277 processTriggersForTables(result); 278 return result; 279 } 280 281 290 private void processTriggersForTables(SortedSet result) 291 { 292 297 298 if (result.isEmpty()) 299 return; 300 301 SortedSet res = new TreeSet (); 302 for (Iterator iter = result.iterator(); iter.hasNext();) 303 { 304 String tableName = (String ) iter.next(); 305 for (Iterator iterator = triggerSemantic.values().iterator(); iterator 306 .hasNext();) 307 { 308 TriggerSemantic element = (TriggerSemantic) iterator.next(); 309 if (element.getOnTableOrView().equals(tableName)) 310 { 311 SemanticBehavior semantic = element.getSemanticBehavior(); 312 if (semantic == null) 313 return; 314 res = processTableList(semantic.getWriteSet()); 315 res.addAll(processStoredProcedureRef(semantic 316 .getProceduresReferenced())); 317 } 318 } 319 } 320 processTriggersForTables(res); 321 result.addAll(res); 322 } 323 324 330 private SortedSet processTableList(SortedSet list) 331 { 332 SortedSet result = new TreeSet (); 333 if (list == null) 334 return result; 335 336 for (Iterator iter = list.iterator(); iter.hasNext();) 337 { 338 String tableOrViewName = (String ) iter.next(); 339 340 ViewSemantic semantic = getViewSemantic(tableOrViewName); 343 if (semantic != null) 344 { 345 result.addAll(processTableList(semantic.getWriteSet())); 348 } 349 else 350 result.add(tableOrViewName); 352 } 353 return result; 354 } 355 356 365 private SortedSet processStoredProcedureRef(SortedSet list) 366 { 367 SortedSet result = new TreeSet (); 368 if (list != null) 369 for (Iterator iter = list.iterator(); iter.hasNext();) 370 { 371 String storedProcedureKey = (String ) iter.next(); 372 SemanticBehavior spSemantic = getStoredProcedureSemantic(storedProcedureKey); 373 374 SortedSet writeSet = spSemantic.getWriteSet(); 375 376 if (writeSet != null) 377 result.addAll(processTableList(writeSet)); 378 379 writeSet = null; 380 SortedSet spReferenced = spSemantic.getProceduresReferenced(); 381 if (spReferenced != null) 382 result.addAll(processStoredProcedureRef(spReferenced)); 383 384 } 385 return result; 386 } 387 388 391 public String getXml() 392 { 393 StringBuffer sb = new StringBuffer (); 394 sb.append("<" + DatabasesXmlTags.ELT_Semantic + ">"); 395 for (Iterator iter = requestSemantic.iterator(); iter.hasNext();) 396 { 397 AbstractMacro macro = (AbstractMacro) iter.next(); 398 sb.append(macro.getXml()); 399 } 400 sb.append("</" + DatabasesXmlTags.ELT_Semantic + ">"); 401 return sb.toString(); 402 } 403 404 } 405 | Popular Tags |