You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jo...@apache.org on 2007/03/24 10:52:11 UTC
svn commit: r521999 - in
/ofbiz/trunk/framework/service/src/org/ofbiz/service: DispatchContext.java
ModelServiceReader.java ServiceDispatcher.java eca/ServiceEcaUtil.java
group/ServiceGroupReader.java
Author: jonesde
Date: Sat Mar 24 02:52:10 2007
New Revision: 521999
URL: http://svn.apache.org/viewvc?view=rev&rev=521999
Log:
This is a fairly complete rework of the UtilCache use and the loading code in the service engine; a reload of service definitions should now be possible by clearing the cache; also removed a bunch of the other caches that were either redundant and annoying, or dangerous because clearing them would break things, perhaps unknowingly; these are some problems and really messy weird code that has been around for quite a while, finally got sick of it and decided it needed to go
Modified:
ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java
ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java
ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java
ofbiz/trunk/framework/service/src/org/ofbiz/service/group/ServiceGroupReader.java
Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java?view=diff&rev=521999&r1=521998&r2=521999
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java Sat Mar 24 02:52:10 2007
@@ -53,11 +53,11 @@
public static final String module = DispatchContext.class.getName();
protected static final String GLOBAL_KEY = "global.services";
- protected static UtilCache modelService = new UtilCache("service.ModelServices", 0, 0, false);
+ protected static UtilCache modelServiceMapByDispatcher = new UtilCache("service.ModelServiceMapByDispatcher", 0, 0, false);
protected transient LocalDispatcher dispatcher;
protected transient ClassLoader loader;
- protected Collection readers;
+ protected Collection localReaders;
protected Map attributes;
protected String name;
@@ -66,24 +66,17 @@
* @param readers a collection of reader URLs
* @param loader the classloader to use for dispatched services
*/
- public DispatchContext(String name, Collection readers, ClassLoader loader, LocalDispatcher dispatcher) {
+ public DispatchContext(String name, Collection localReaders, ClassLoader loader, LocalDispatcher dispatcher) {
this.name = name;
- this.readers = readers;
+ this.localReaders = localReaders;
this.loader = loader;
this.dispatcher = dispatcher;
this.attributes = FastMap.newInstance();
}
public void loadReaders() {
- Map localService = addReaders(readers);
- if (localService != null) {
- modelService.put(name, localService);
- }
-
- Map globalService = addGlobal();
- if (globalService != null) {
- modelService.put(GLOBAL_KEY, globalService);
- }
+ this.getLocalServiceMap();
+ this.getGlobalServiceMap();
}
/**
@@ -119,7 +112,7 @@
* @return Collection of reader URLs
*/
public Collection getReaders() {
- return readers;
+ return localReaders;
}
/**
@@ -163,7 +156,7 @@
} else if (mode.equalsIgnoreCase("out")) {
modeInt = 2;
}
-
+
if (model == null) {
throw new GenericServiceException("Model service is null! Should never happen.");
} else {
@@ -187,6 +180,7 @@
* @return GenericServiceModel that corresponds to the serviceName
*/
public ModelService getModelService(String serviceName) throws GenericServiceException {
+ //long timeStart = System.currentTimeMillis();
ModelService retVal = getLocalModelService(serviceName);
if (retVal == null) {
retVal = getGlobalModelService(serviceName);
@@ -196,23 +190,12 @@
throw new GenericServiceException("Cannot locate service by name (" + serviceName + ")");
}
+ //Debug.logTiming("Got ModelService for name [" + serviceName + "] in [" + (System.currentTimeMillis() - timeStart) + "] milliseconds", module);
return retVal;
}
private ModelService getLocalModelService(String serviceName) throws GenericServiceException {
- Map serviceMap = (Map) modelService.get(name);
- if (serviceMap == null) {
- synchronized (this) {
- serviceMap = (Map) modelService.get(name);
- if (serviceMap == null) {
- serviceMap = addReaders(readers);
- if (serviceMap != null) {
- modelService.put(name, serviceMap);
- ServiceEcaUtil.reloadConfig();
- }
- }
- }
- }
+ Map serviceMap = this.getLocalServiceMap();
ModelService retVal = null;
if (serviceMap != null) {
@@ -226,19 +209,7 @@
}
private ModelService getGlobalModelService(String serviceName) throws GenericServiceException {
- Map serviceMap = (Map) modelService.get(GLOBAL_KEY);
- if (serviceMap == null) {
- synchronized (this) {
- serviceMap = (Map) modelService.get(GLOBAL_KEY);
- if (serviceMap == null) {
- serviceMap = addGlobal();
- if (serviceMap != null) {
- modelService.put(GLOBAL_KEY, serviceMap);
- ServiceEcaUtil.reloadConfig();
- }
- }
- }
- }
+ Map serviceMap = this.getGlobalServiceMap();
ModelService retVal = null;
if (serviceMap != null) {
@@ -283,96 +254,91 @@
return dispatcher.getSecurity();
}
- private Map addReaders(Collection readerURLs) {
- Map serviceMap = FastMap.newInstance();
-
- if (readerURLs == null)
- return null;
- Iterator urlIter = readerURLs.iterator();
-
- while (urlIter.hasNext()) {
- URL readerURL = (URL) urlIter.next();
-
- serviceMap.putAll(addReader(readerURL));
- }
- return serviceMap;
- }
-
- private Map addReader(URL readerURL) {
- if (readerURL == null) {
- Debug.logError("Cannot add reader with a null reader URL", module);
- return null;
- }
-
- ModelServiceReader reader = ModelServiceReader.getModelServiceReader(readerURL, this);
-
- if (reader == null) {
- Debug.logError("Could not load the reader for the reader URL " + readerURL, module);
- return null;
- }
-
- Map serviceMap = reader.getModelServices();
-
- return serviceMap;
- }
-
- private Map addReader(ResourceHandler handler) {
- ModelServiceReader reader = ModelServiceReader.getModelServiceReader(handler, this);
-
- if (reader == null) {
- Debug.logError("Could not load the reader for " + handler, module);
- return null;
+ private Map getLocalServiceMap() {
+ Map serviceMap = (Map) modelServiceMapByDispatcher.get(name);
+ if (serviceMap == null) {
+ synchronized (this) {
+ serviceMap = (Map) modelServiceMapByDispatcher.get(name);
+ if (serviceMap == null) {
+ if (this.localReaders != null) {
+ serviceMap = FastMap.newInstance();
+ Iterator urlIter = this.localReaders.iterator();
+ while (urlIter.hasNext()) {
+ URL readerURL = (URL) urlIter.next();
+ Map readerServiceMap = ModelServiceReader.getModelServiceMap(readerURL, this);
+ if (readerServiceMap != null) {
+ serviceMap.putAll(readerServiceMap);
+ }
+ }
+ }
+ if (serviceMap != null) {
+ modelServiceMapByDispatcher.put(name, serviceMap);
+ // NOTE: the current ECA per dispatcher for local services stuff is a bit broken, so now just doing this on the global def load: ServiceEcaUtil.reloadConfig();
+ }
+ }
+ }
}
-
- Map serviceMap = reader.getModelServices();
-
+
return serviceMap;
}
+
+ private Map getGlobalServiceMap() {
+ Map serviceMap = (Map) modelServiceMapByDispatcher.get(GLOBAL_KEY);
+ if (serviceMap == null) {
+ synchronized (this) {
+ serviceMap = (Map) modelServiceMapByDispatcher.get(GLOBAL_KEY);
+ if (serviceMap == null) {
+ serviceMap = FastMap.newInstance();
- private Map addGlobal() {
- Map globalMap = FastMap.newInstance();
+ Element rootElement = null;
- Element rootElement = null;
+ try {
+ rootElement = ServiceConfigUtil.getXmlRootElement();
+ } catch (GenericConfigException e) {
+ Debug.logError(e, "Error getting Service Engine XML root element", module);
+ return null;
+ }
- try {
- rootElement = ServiceConfigUtil.getXmlRootElement();
- } catch (GenericConfigException e) {
- Debug.logError(e, "Error getting Service Engine XML root element", module);
- return null;
- }
+ List globalServicesElements = UtilXml.childElementList(rootElement, "global-services");
+ Iterator gseIter = globalServicesElements.iterator();
+ while (gseIter.hasNext()) {
+ Element globalServicesElement = (Element) gseIter.next();
+ ResourceHandler handler = new MainResourceHandler(
+ ServiceConfigUtil.SERVICE_ENGINE_XML_FILENAME, globalServicesElement);
+
+ Map servicesMap = ModelServiceReader.getModelServiceMap(handler, this);
+ if (servicesMap != null) {
+ serviceMap.putAll(servicesMap);
+ }
+ }
+
+ // get all of the component resource model stuff, ie specified in each ofbiz-component.xml file
+ List componentResourceInfos = ComponentConfig.getAllServiceResourceInfos("model");
+ Iterator componentResourceInfoIter = componentResourceInfos.iterator();
+ while (componentResourceInfoIter.hasNext()) {
+ ComponentConfig.ServiceResourceInfo componentResourceInfo = (ComponentConfig.ServiceResourceInfo) componentResourceInfoIter.next();
+ Map servicesMap = ModelServiceReader.getModelServiceMap(componentResourceInfo.createResourceHandler(), this);
+ if (servicesMap != null) {
+ serviceMap.putAll(servicesMap);
+ }
+ }
- List globalServicesElements = UtilXml.childElementList(rootElement, "global-services");
- Iterator gseIter = globalServicesElements.iterator();
- while (gseIter.hasNext()) {
- Element globalServicesElement = (Element) gseIter.next();
- ResourceHandler handler = new MainResourceHandler(
- ServiceConfigUtil.SERVICE_ENGINE_XML_FILENAME, globalServicesElement);
-
- Map servicesMap = addReader(handler);
- if (servicesMap != null) {
- globalMap.putAll(servicesMap);
- }
- }
-
- // get all of the component resource model stuff, ie specified in each ofbiz-component.xml file
- List componentResourceInfos = ComponentConfig.getAllServiceResourceInfos("model");
- Iterator componentResourceInfoIter = componentResourceInfos.iterator();
- while (componentResourceInfoIter.hasNext()) {
- ComponentConfig.ServiceResourceInfo componentResourceInfo = (ComponentConfig.ServiceResourceInfo) componentResourceInfoIter.next();
- Map servicesMap = addReader(componentResourceInfo.createResourceHandler());
- if (servicesMap != null) {
- globalMap.putAll(servicesMap);
+ if (serviceMap != null) {
+ modelServiceMapByDispatcher.put(GLOBAL_KEY, serviceMap);
+ ServiceEcaUtil.reloadConfig();
+ }
+ }
}
}
- return globalMap;
+ return serviceMap;
}
public Set getAllServiceNames() {
Set serviceNames = new TreeSet();
- Map globalServices = (Map) modelService.get(GLOBAL_KEY);
- Map localServices = (Map) modelService.get(name);
+ Map globalServices = (Map) modelServiceMapByDispatcher.get(GLOBAL_KEY);
+ Map localServices = (Map) modelServiceMapByDispatcher.get(name);
if (globalServices != null) {
serviceNames.addAll(globalServices.keySet());
}
Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java?view=diff&rev=521999&r1=521998&r2=521999
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java Sat Mar 24 02:52:10 2007
@@ -26,23 +26,26 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+
import javax.xml.parsers.ParserConfigurationException;
import javolution.util.FastList;
import javolution.util.FastMap;
+import org.apache.commons.collections.map.LinkedMap;
import org.ofbiz.base.config.GenericConfigException;
import org.ofbiz.base.config.ResourceHandler;
-import org.ofbiz.base.util.*;
-import org.ofbiz.base.util.cache.UtilCache;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.GeneralException;
+import org.ofbiz.base.util.UtilTimer;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.UtilXml;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.model.ModelEntity;
import org.ofbiz.entity.model.ModelField;
import org.ofbiz.entity.model.ModelFieldType;
import org.ofbiz.service.group.GroupModel;
-
-import org.apache.commons.collections.map.LinkedMap;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -57,9 +60,6 @@
public static final String module = ModelServiceReader.class.getName();
- protected static UtilCache readersUrl = new UtilCache("service.ModelServiceReader.ByURL", 0, 0);
- protected static UtilCache readersLoader = new UtilCache("service.ModelServiceReader.ByResourceLoader", 0, 0);
-
/** is either from a URL or from a ResourceLoader (through the ResourceHandler) */
protected boolean isFromURL;
protected URL readerURL = null;
@@ -67,41 +67,32 @@
protected Map modelServices = null;
protected DispatchContext dctx = null;
- public static ModelServiceReader getModelServiceReader(URL readerURL, DispatchContext dctx) {
- ModelServiceReader reader;
+ public static Map getModelServiceMap(URL readerURL, DispatchContext dctx) {
+ if (readerURL == null) {
+ Debug.logError("Cannot add reader with a null reader URL", module);
+ return null;
+ }
- // if ( readersUrl.containsKey(readerURL) ) <-- this is unnecessary as it will return null below if not found
- reader = (ModelServiceReader) readersUrl.get(readerURL);
- if (reader == null) { // don't want to block here
- synchronized (ModelServiceReader.class) {
- // must check if null again as one of the blocked threads can still enter
- reader = (ModelServiceReader) readersUrl.get(readerURL);
- if (reader == null) {
- // if (Debug.infoOn()) Debug.logInfo("[Creating reader]: " + readerURL.toExternalForm(), module);
- reader = new ModelServiceReader(readerURL, dctx);
- readersUrl.put(readerURL, reader);
- }
- }
+ ModelServiceReader reader = new ModelServiceReader(readerURL, dctx);
+ if (reader == null) {
+ Debug.logError("Could not load the reader for the reader URL " + readerURL, module);
+ return null;
}
- return reader;
+
+ Map serviceMap = reader.getModelServices();
+ return serviceMap;
}
- public static ModelServiceReader getModelServiceReader(ResourceHandler handler, DispatchContext dctx) {
+ public static Map getModelServiceMap(ResourceHandler handler, DispatchContext dctx) {
ModelServiceReader reader;
-
- reader = (ModelServiceReader) readersLoader.get(handler);
- if (reader == null) { // don't want to block here
- synchronized (ModelServiceReader.class) {
- // must check if null again as one of the blocked threads can still enter
- reader = (ModelServiceReader) readersLoader.get(handler);
- if (reader == null) {
- // if (Debug.infoOn()) Debug.logInfo("[Creating reader]: " + handler, module);
- reader = new ModelServiceReader(handler, dctx);
- readersLoader.put(handler, reader);
- }
- }
+ reader = new ModelServiceReader(handler, dctx);
+ if (reader == null) {
+ Debug.logError("Could not load the reader for " + handler, module);
+ return null;
}
- return reader;
+
+ Map serviceMap = reader.getModelServices();
+ return serviceMap;
}
protected ModelServiceReader(URL readerURL, DispatchContext dctx) {
Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java?view=diff&rev=521999&r1=521998&r2=521999
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java Sat Mar 24 02:52:10 2007
@@ -236,11 +236,7 @@
* @throws GenericServiceException
*/
public Map runSync(String localName, ModelService modelService, Map context, boolean validateOut) throws ServiceAuthException, ServiceValidationException, GenericServiceException {
- UtilTimer timer = null;
- if (Debug.timingOn()) {
- timer = new UtilTimer(localName + " / " + modelService.name, true);
- // not thread safe: UtilTimer.timerLog(localName + " / " + modelService.name, "Sync service started...", module);
- }
+ long serviceStartTime = System.currentTimeMillis();
boolean debugging = checkDebug(modelService, 1, true);
if (Debug.verboseOn()) {
Debug.logVerbose("[ServiceDispatcher.runSync] : invoking service " + modelService.name + " [" + modelService.location +
@@ -454,10 +450,14 @@
checkDebug(modelService, 0, debugging);
rs.setEndStamp();
- if (timer != null) {
- timer.setLog(true);
- timer.timerString("Sync service finished", module);
+
+ long timeToRun = System.currentTimeMillis() - serviceStartTime;
+ if (Debug.timingOn() && timeToRun > 50) {
+ Debug.logTiming("Sync service [" + localName + "/" + modelService.name + "] finished in [" + timeToRun + "] milliseconds", module);
+ } else if (timeToRun > 200) {
+ Debug.logInfo("Sync service [" + localName + "/" + modelService.name + "] finished in [" + timeToRun + "] milliseconds", module);
}
+
return result;
}
Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java?view=diff&rev=521999&r1=521998&r2=521999
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java Sat Mar 24 02:52:10 2007
@@ -27,6 +27,8 @@
import java.util.TreeSet;
import java.util.Collection;
+import javolution.util.FastMap;
+
import org.ofbiz.base.component.ComponentConfig;
import org.ofbiz.base.config.GenericConfigException;
import org.ofbiz.base.config.MainResourceHandler;
@@ -47,7 +49,8 @@
public static final String module = ServiceEcaUtil.class.getName();
- public static UtilCache ecaCache = new UtilCache("service.ServiceECAs", 0, 0, false);
+ // using a cache is dangerous here because if someone clears it the ECAs won't run: public static UtilCache ecaCache = new UtilCache("service.ServiceECAs", 0, 0, false);
+ public static Map ecaCache = FastMap.newInstance();
public static void reloadConfig() {
ecaCache.clear();
@@ -115,13 +118,13 @@
numDefs++;
}
if (Debug.importantOn()) {
- String resourceLocation = handler.getLocation();
- try {
- resourceLocation = handler.getURL().toExternalForm();
- } catch (GenericConfigException e) {
- Debug.logError(e, "Could not get resource URL", module);
- }
- Debug.logImportant("Loaded " + numDefs + " Service ECA definitions from " + resourceLocation, module);
+ String resourceLocation = handler.getLocation();
+ try {
+ resourceLocation = handler.getURL().toExternalForm();
+ } catch (GenericConfigException e) {
+ Debug.logError(e, "Could not get resource URL", module);
+ }
+ Debug.logImportant("Loaded " + numDefs + " Service ECA definitions from " + resourceLocation, module);
}
}
Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/group/ServiceGroupReader.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/group/ServiceGroupReader.java?view=diff&rev=521999&r1=521998&r2=521999
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/group/ServiceGroupReader.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/group/ServiceGroupReader.java Sat Mar 24 02:52:10 2007
@@ -20,6 +20,9 @@
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+
+import javolution.util.FastMap;
import org.ofbiz.base.component.ComponentConfig;
import org.ofbiz.base.config.GenericConfigException;
@@ -27,7 +30,6 @@
import org.ofbiz.base.config.ResourceHandler;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilXml;
-import org.ofbiz.base.util.cache.UtilCache;
import org.ofbiz.service.config.ServiceConfigUtil;
import org.w3c.dom.Element;
@@ -38,7 +40,8 @@
public static final String module = ServiceGroupReader.class.getName();
- public static UtilCache groupsCache = new UtilCache("service.ServiceGroups", 0, 0, false);
+ // using a cache is dangerous here because if someone clears it the groups won't work at all: public static UtilCache groupsCache = new UtilCache("service.ServiceGroups", 0, 0, false);
+ public static Map groupsCache = FastMap.newInstance();
public static void readConfig() {
Element rootElement = null;