1 25 package org.ofbiz.entityext.eca; 26 27 import java.util.HashMap ; 28 import java.util.Iterator ; 29 import java.util.LinkedList ; 30 import java.util.List ; 31 import java.util.Map ; 32 import java.util.Collection ; 33 34 import org.ofbiz.base.component.ComponentConfig; 35 import org.ofbiz.base.config.GenericConfigException; 36 import org.ofbiz.base.config.MainResourceHandler; 37 import org.ofbiz.base.config.ResourceHandler; 38 import org.ofbiz.base.util.Debug; 39 import org.ofbiz.base.util.UtilXml; 40 import org.ofbiz.base.util.cache.UtilCache; 41 import org.ofbiz.entity.config.DelegatorInfo; 42 import org.ofbiz.entity.config.EntityConfigUtil; 43 import org.ofbiz.entity.config.EntityEcaReaderInfo; 44 import org.ofbiz.entity.GenericDelegator; 45 import org.w3c.dom.Element ; 46 47 55 public class EntityEcaUtil { 56 57 public static final String module = EntityEcaUtil.class.getName(); 58 59 public static UtilCache entityEcaReaders = new UtilCache("entity.EcaReaders", 0, 0, false); 60 61 public static Map getEntityEcaCache(String entityEcaReaderName) { 62 Map ecaCache = (Map ) entityEcaReaders.get(entityEcaReaderName); 63 if (ecaCache == null) { 64 synchronized (EntityEcaUtil.class) { 65 ecaCache = (Map ) entityEcaReaders.get(entityEcaReaderName); 66 if (ecaCache == null) { 67 ecaCache = new HashMap (); 68 readConfig(entityEcaReaderName, ecaCache); 69 entityEcaReaders.put(entityEcaReaderName, ecaCache); 70 } 71 } 72 } 73 return ecaCache; 74 } 75 76 public static String getEntityEcaReaderName(String delegatorName) { 77 DelegatorInfo delegatorInfo = EntityConfigUtil.getDelegatorInfo(delegatorName); 78 if (delegatorInfo == null) { 79 Debug.logError("BAD ERROR: Could not find delegator config with name: " + delegatorName, module); 80 return null; 81 } 82 return delegatorInfo.entityEcaReader; 83 } 84 85 protected static void readConfig(String entityEcaReaderName, Map ecaCache) { 86 EntityEcaReaderInfo entityEcaReaderInfo = EntityConfigUtil.getEntityEcaReaderInfo(entityEcaReaderName); 87 if (entityEcaReaderInfo == null) { 88 Debug.logError("BAD ERROR: Could not find entity-eca-reader config with name: " + entityEcaReaderName, module); 89 return; 90 } 91 92 Iterator eecaResourceIter = entityEcaReaderInfo.resourceElements.iterator(); 93 while (eecaResourceIter.hasNext()) { 94 Element eecaResourceElement = (Element ) eecaResourceIter.next(); 95 ResourceHandler handler = new MainResourceHandler(EntityConfigUtil.ENTITY_ENGINE_XML_FILENAME, eecaResourceElement); 96 addEcaDefinitions(handler, ecaCache); 97 } 98 99 List componentResourceInfos = ComponentConfig.getAllEntityResourceInfos("eca"); 101 Iterator componentResourceInfoIter = componentResourceInfos.iterator(); 102 while (componentResourceInfoIter.hasNext()) { 103 ComponentConfig.EntityResourceInfo componentResourceInfo = (ComponentConfig.EntityResourceInfo) componentResourceInfoIter.next(); 104 if (entityEcaReaderName.equals(componentResourceInfo.readerName)) { 105 addEcaDefinitions(componentResourceInfo.createResourceHandler(), ecaCache); 106 } 107 } 108 } 109 110 protected static void addEcaDefinitions(ResourceHandler handler, Map ecaCache) { 111 Element rootElement = null; 112 try { 113 rootElement = handler.getDocument().getDocumentElement(); 114 } catch (GenericConfigException e) { 115 Debug.logError(e, module); 116 return; 117 } 118 119 List ecaList = UtilXml.childElementList(rootElement, "eca"); 120 Iterator ecaIt = ecaList.iterator(); 121 int numDefs = 0; 122 while (ecaIt.hasNext()) { 123 Element e = (Element ) ecaIt.next(); 124 String entityName = e.getAttribute("entity"); 125 String eventName = e.getAttribute("event"); 126 Map eventMap = (Map ) ecaCache.get(entityName); 127 List rules = null; 128 if (eventMap == null) { 129 eventMap = new HashMap (); 130 rules = new LinkedList (); 131 ecaCache.put(entityName, eventMap); 132 eventMap.put(eventName, rules); 133 } else { 134 rules = (List ) eventMap.get(eventName); 135 if (rules == null) { 136 rules = new LinkedList (); 137 eventMap.put(eventName, rules); 138 } 139 } 140 rules.add(new EntityEcaRule(e)); 141 numDefs++; 142 } 143 Debug.logImportant("Loaded " + numDefs + " Entity ECA definitions from " + handler.getLocation() + " in loader " + handler.getLoaderName(), module); 144 } 145 146 public static Collection getEntityEcaRules(GenericDelegator delegator, String entityName, String event) { 147 Map ecaCache = EntityEcaUtil.getEntityEcaCache(EntityEcaUtil.getEntityEcaReaderName(delegator.getDelegatorName())); 148 Map eventMap = (Map ) ecaCache.get(entityName); 149 if (eventMap != null) { 150 if (event != null) { 151 return (Collection ) eventMap.get(event); 152 } else { 153 return eventMap.values(); 154 } 155 } 156 return null; 157 } 158 } 159 | Popular Tags |