Hmmm... this seems to have a caused a problem with the load-demo ant
target. I am looking into it. Adrian Crum Sandglass Software www.sandglass-software.com On 4/30/2015 1:12 PM, [hidden email] wrote: > Author: adrianc > Date: Thu Apr 30 12:12:17 2015 > New Revision: 1676970 > > URL: http://svn.apache.org/r1676970 > Log: > Some work on ComponentLoaderConfig.java: > > 1. Thread safety > 2. Optimization > 3. Code cleanup > 4. Improved error handling > > Modified: > ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentLoaderConfig.java > > Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentLoaderConfig.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentLoaderConfig.java?rev=1676970&r1=1676969&r2=1676970&view=diff > ============================================================================== > --- ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentLoaderConfig.java (original) > +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentLoaderConfig.java Thu Apr 30 12:12:17 2015 > @@ -20,15 +20,15 @@ package org.ofbiz.base.component; > > import java.io.IOException; > import java.net.URL; > -import java.util.LinkedList; > +import java.util.ArrayList; > import java.util.List; > -import java.util.Properties; > +import java.util.Map; > +import java.util.concurrent.atomic.AtomicReference; > > import javax.xml.parsers.ParserConfigurationException; > > import org.ofbiz.base.util.UtilGenerics; > import org.ofbiz.base.util.UtilURL; > -import org.ofbiz.base.util.UtilValidate; > import org.ofbiz.base.util.UtilXml; > import org.ofbiz.base.util.string.FlexibleStringExpander; > import org.w3c.dom.Document; > @@ -43,33 +43,31 @@ public class ComponentLoaderConfig { > > public static final String module = ComponentLoaderConfig.class.getName(); > public static final String COMPONENT_LOAD_XML_FILENAME = "component-load.xml"; > - > public static final int SINGLE_COMPONENT = 0; > public static final int COMPONENT_DIRECTORY = 1; > - > - protected static List<ComponentDef> componentsToLoad = null; > + private static final AtomicReference<List<ComponentDef>> componentDefsRef = new AtomicReference<List<ComponentDef>>(null); > > public static List<ComponentDef> getRootComponents(String configFile) throws ComponentException { > - if (componentsToLoad == null) { > - synchronized (ComponentLoaderConfig.class) { > - if (componentsToLoad == null) { > - if (configFile == null) { > - configFile = COMPONENT_LOAD_XML_FILENAME; > - } > - URL xmlUrl = UtilURL.fromResource(configFile); > - ComponentLoaderConfig.componentsToLoad = ComponentLoaderConfig.getComponentsFromConfig(xmlUrl); > - } > + List<ComponentDef> existingInstance = componentDefsRef.get(); > + if (existingInstance == null) { > + if (configFile == null) { > + configFile = COMPONENT_LOAD_XML_FILENAME; > + } > + URL xmlUrl = UtilURL.fromResource(configFile); > + List<ComponentDef> newInstance = getComponentsFromConfig(xmlUrl); > + if (componentDefsRef.compareAndSet(existingInstance, newInstance)) { > + existingInstance = newInstance; > + } else { > + existingInstance = componentDefsRef.get(); > } > } > - return componentsToLoad; > + return existingInstance; > } > > public static List<ComponentDef> getComponentsFromConfig(URL configUrl) throws ComponentException { > if (configUrl == null) { > - throw new ComponentException("Component config file does not exist: " + configUrl); > + throw new IllegalArgumentException("configUrl cannot be null"); > } > - > - List<ComponentDef> componentsFromConfig = null; > Document document = null; > try { > document = UtilXml.readXmlDocument(configUrl, true); > @@ -80,13 +78,27 @@ public class ComponentLoaderConfig { > } catch (IOException e) { > throw new ComponentException("Error reading the component config file: " + configUrl, e); > } > - > Element root = document.getDocumentElement(); > List<? extends Element> toLoad = UtilXml.childElementList(root); > - if (UtilValidate.isNotEmpty(toLoad)) { > - componentsFromConfig = new LinkedList<ComponentDef>(); > - for (Element element: toLoad) { > - componentsFromConfig.add(new ComponentDef(element)); > + List<ComponentDef> componentsFromConfig = null; > + if (!toLoad.isEmpty()) { > + componentsFromConfig = new ArrayList<ComponentDef>(toLoad.size()); > + Map<String, ? extends Object> systemProps = UtilGenerics.<String, Object> checkMap(System.getProperties()); > + for (Element element : toLoad) { > + String nodeName = element.getNodeName(); > + String name = null; > + String location = null; > + int type = SINGLE_COMPONENT; > + if ("load-component".equals(nodeName)) { > + name = element.getAttribute("component-name"); > + location = FlexibleStringExpander.expandString(element.getAttribute("component-location"), systemProps); > + } else if ("load-components".equals(nodeName)) { > + location = FlexibleStringExpander.expandString(element.getAttribute("parent-directory"), systemProps); > + type = COMPONENT_DIRECTORY; > + } else { > + throw new ComponentException("Invalid element '" + nodeName + "' found in component config file " + configUrl); > + } > + componentsFromConfig.add(new ComponentDef(name, location, type)); > } > } > return componentsFromConfig; > @@ -94,20 +106,13 @@ public class ComponentLoaderConfig { > > public static class ComponentDef { > public String name; > - public String location; > - public int type = -1; > + public final String location; > + public final int type; > > - public ComponentDef(Element element) { > - Properties systemProps = System.getProperties(); > - if ("load-component".equals(element.getNodeName())) { > - name = element.getAttribute("component-name"); > - location = FlexibleStringExpander.expandString(element.getAttribute("component-location"), UtilGenerics.<String, Object>checkMap(systemProps)); > - type = SINGLE_COMPONENT; > - } else if ("load-components".equals(element.getNodeName())) { > - name = null; > - location = FlexibleStringExpander.expandString(element.getAttribute("parent-directory"), UtilGenerics.<String, Object>checkMap(systemProps)); > - type = COMPONENT_DIRECTORY; > - } > + private ComponentDef(String name, String location, int type) { > + this.name = name; > + this.location = location; > + this.type = type; > } > } > } > > |
Free forum by Nabble | Edit this page |