Author: adrianc Date: Mon Oct 21 14:23:29 2013 New Revision: 1534178 URL: http://svn.apache.org/r1534178 Log: ComponentConfig.java refactor - thread-safety for the ComponentConfig instance.
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentConfig.java Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentConfig.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentConfig.java?rev=1534178&r1=1534177&r2=1534178&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentConfig.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/component/ComponentConfig.java Mon Oct 21 14:23:29 2013 @@ -34,6 +34,7 @@ import java.util.TreeMap; import org.ofbiz.base.container.ContainerConfig; import org.ofbiz.base.container.ContainerException; +import org.ofbiz.base.container.ContainerConfig.Container; import org.ofbiz.base.location.FlexibleLocation; import org.ofbiz.base.util.Assert; import org.ofbiz.base.util.Debug; @@ -48,7 +49,7 @@ import org.w3c.dom.Element; * ComponentConfig - Component configuration class for ofbiz-container.xml * */ -public class ComponentConfig { +public final class ComponentConfig { public static final String module = ComponentConfig.class.getName(); public static final String OFBIZ_COMPONENT_XML_FILENAME = "ofbiz-component.xml"; @@ -332,25 +333,21 @@ public class ComponentConfig { // ========== ComponentConfig instance ========== - protected String globalName = null; - protected String rootLocation = null; - protected String componentName = null; - protected boolean enabled = true; - - protected Map<String, ResourceLoaderInfo> resourceLoaderInfos = new LinkedHashMap<String, ResourceLoaderInfo>(); - protected List<ClasspathInfo> classpathInfos = new ArrayList<ClasspathInfo>(); - protected List<EntityResourceInfo> entityResourceInfos = new ArrayList<EntityResourceInfo>(); - protected List<ServiceResourceInfo> serviceResourceInfos = new ArrayList<ServiceResourceInfo>(); - protected List<TestSuiteInfo> testSuiteInfos = new ArrayList<TestSuiteInfo>(); - protected List<KeystoreInfo> keystoreInfos = new ArrayList<KeystoreInfo>(); - protected List<WebappInfo> webappInfos = new ArrayList<WebappInfo>(); - protected List<ContainerConfig.Container> containers = new ArrayList<ContainerConfig.Container>(); + private final String globalName; + private final String rootLocation; + private final String componentName; + private final boolean enabled; + + private final Map<String, ResourceLoaderInfo> resourceLoaderInfos; + private final List<ClasspathInfo> classpathInfos; + private final List<EntityResourceInfo> entityResourceInfos; + private final List<ServiceResourceInfo> serviceResourceInfos; + private final List<TestSuiteInfo> testSuiteInfos; + private final List<KeystoreInfo> keystoreInfos; + private final List<WebappInfo> webappInfos; + private final List<ContainerConfig.Container> containers; - protected ComponentConfig() { - } - - protected ComponentConfig(String globalName, String rootLocation) throws ComponentException { - this.globalName = globalName; + private ComponentConfig(String globalName, String rootLocation) throws ComponentException { if (!rootLocation.endsWith("/")) { rootLocation = rootLocation + "/"; } @@ -376,47 +373,103 @@ public class ComponentConfig { Element ofbizComponentElement = ofbizComponentDocument.getDocumentElement(); this.componentName = ofbizComponentElement.getAttribute("name"); this.enabled = "true".equalsIgnoreCase(ofbizComponentElement.getAttribute("enabled")); - if (UtilValidate.isEmpty(this.globalName)) { + if (UtilValidate.isEmpty(globalName)) { this.globalName = this.componentName; + } else { + this.globalName = globalName; } // resource-loader - resourceLoaderInfos - for (Element curElement : UtilXml.childElementList(ofbizComponentElement, "resource-loader")) { - ResourceLoaderInfo resourceLoaderInfo = new ResourceLoaderInfo(curElement); - this.resourceLoaderInfos.put(resourceLoaderInfo.name, resourceLoaderInfo); + List<? extends Element> childElements = UtilXml.childElementList(ofbizComponentElement, "resource-loader"); + if (!childElements.isEmpty()) { + Map<String, ResourceLoaderInfo> resourceLoaderInfos = new LinkedHashMap<String, ResourceLoaderInfo>(); + for (Element curElement : childElements) { + ResourceLoaderInfo resourceLoaderInfo = new ResourceLoaderInfo(curElement); + resourceLoaderInfos.put(resourceLoaderInfo.name, resourceLoaderInfo); + } + this.resourceLoaderInfos = Collections.unmodifiableMap(resourceLoaderInfos); + } else { + this.resourceLoaderInfos = Collections.emptyMap(); } // classpath - classpathInfos - for (Element curElement : UtilXml.childElementList(ofbizComponentElement, "classpath")) { - ClasspathInfo classpathInfo = new ClasspathInfo(this, curElement); - this.classpathInfos.add(classpathInfo); + childElements = UtilXml.childElementList(ofbizComponentElement, "classpath"); + if (!childElements.isEmpty()) { + List<ClasspathInfo> classpathInfos = new ArrayList<ClasspathInfo>(childElements.size()); + for (Element curElement : childElements) { + ClasspathInfo classpathInfo = new ClasspathInfo(this, curElement); + classpathInfos.add(classpathInfo); + } + this.classpathInfos = Collections.unmodifiableList(classpathInfos); + } else { + this.classpathInfos = Collections.emptyList(); } // entity-resource - entityResourceInfos - for (Element curElement : UtilXml.childElementList(ofbizComponentElement, "entity-resource")) { - EntityResourceInfo entityResourceInfo = new EntityResourceInfo(this, curElement); - this.entityResourceInfos.add(entityResourceInfo); + childElements = UtilXml.childElementList(ofbizComponentElement, "entity-resource"); + if (!childElements.isEmpty()) { + List<EntityResourceInfo> entityResourceInfos = new ArrayList<EntityResourceInfo>(childElements.size()); + for (Element curElement : childElements) { + EntityResourceInfo entityResourceInfo = new EntityResourceInfo(this, curElement); + entityResourceInfos.add(entityResourceInfo); + } + this.entityResourceInfos = Collections.unmodifiableList(entityResourceInfos); + } else { + this.entityResourceInfos = Collections.emptyList(); } // service-resource - serviceResourceInfos - for (Element curElement : UtilXml.childElementList(ofbizComponentElement, "service-resource")) { - ServiceResourceInfo serviceResourceInfo = new ServiceResourceInfo(this, curElement); - this.serviceResourceInfos.add(serviceResourceInfo); + childElements = UtilXml.childElementList(ofbizComponentElement, "service-resource"); + if (!childElements.isEmpty()) { + List<ServiceResourceInfo> serviceResourceInfos = new ArrayList<ServiceResourceInfo>(childElements.size()); + for (Element curElement : childElements) { + ServiceResourceInfo serviceResourceInfo = new ServiceResourceInfo(this, curElement); + serviceResourceInfos.add(serviceResourceInfo); + } + this.serviceResourceInfos = Collections.unmodifiableList(serviceResourceInfos); + } else { + this.serviceResourceInfos = Collections.emptyList(); } // test-suite - serviceResourceInfos - for (Element curElement : UtilXml.childElementList(ofbizComponentElement, "test-suite")) { - TestSuiteInfo testSuiteInfo = new TestSuiteInfo(this, curElement); - this.testSuiteInfos.add(testSuiteInfo); + childElements = UtilXml.childElementList(ofbizComponentElement, "test-suite"); + if (!childElements.isEmpty()) { + List<TestSuiteInfo> testSuiteInfos = new ArrayList<TestSuiteInfo>(childElements.size()); + for (Element curElement : childElements) { + TestSuiteInfo testSuiteInfo = new TestSuiteInfo(this, curElement); + testSuiteInfos.add(testSuiteInfo); + } + this.testSuiteInfos = Collections.unmodifiableList(testSuiteInfos); + } else { + this.testSuiteInfos = Collections.emptyList(); } // keystore - (cert/trust store infos) - for (Element curElement : UtilXml.childElementList(ofbizComponentElement, "keystore")) { - KeystoreInfo keystoreInfo = new KeystoreInfo(this, curElement); - this.keystoreInfos.add(keystoreInfo); + childElements = UtilXml.childElementList(ofbizComponentElement, "keystore"); + if (!childElements.isEmpty()) { + List<KeystoreInfo> keystoreInfos = new ArrayList<KeystoreInfo>(childElements.size()); + for (Element curElement : childElements) { + KeystoreInfo keystoreInfo = new KeystoreInfo(this, curElement); + keystoreInfos.add(keystoreInfo); + } + this.keystoreInfos = Collections.unmodifiableList(keystoreInfos); + } else { + this.keystoreInfos = Collections.emptyList(); } // webapp - webappInfos - for (Element curElement : UtilXml.childElementList(ofbizComponentElement, "webapp")) { - WebappInfo webappInfo = new WebappInfo(this, curElement); - this.webappInfos.add(webappInfo); + childElements = UtilXml.childElementList(ofbizComponentElement, "webapp"); + if (!childElements.isEmpty()) { + List<WebappInfo> webappInfos = new ArrayList<WebappInfo>(childElements.size()); + for (Element curElement : childElements) { + WebappInfo webappInfo = new WebappInfo(this, curElement); + webappInfos.add(webappInfo); + } + this.webappInfos = Collections.unmodifiableList(webappInfos); + } else { + this.webappInfos = Collections.emptyList(); } // containers try { - this.containers.addAll(ContainerConfig.getContainers(xmlUrl)); + Collection<Container> containers = ContainerConfig.getContainers(xmlUrl); + if (!containers.isEmpty()) { + this.containers = Collections.unmodifiableList(new ArrayList<ContainerConfig.Container>(containers)); + } else { + this.containers = Collections.emptyList(); + } } catch (ContainerException ce) { throw new ComponentException("Error reading containers for component: " + this.globalName, ce); }