Skip to content

Commit

Permalink
Improved: Rewrite ‘ComponentConfig’ constructor (OFBIZ-10829)
Browse files Browse the repository at this point in the history
Previouly this constructor was containing a lot of duplicated code
that is now factorized by using the newly added ‘collectElements’
private method.


git-svn-id: https://svn.apache.org/repos/asf/ofbiz/ofbiz-framework/trunk@1854671 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
mthl committed Mar 2, 2019
1 parent 617b762 commit e8ea418
Showing 1 changed file with 50 additions and 116 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.BiFunction;
import java.util.stream.Collectors;

import org.apache.ofbiz.base.container.ContainerConfig;
import org.apache.ofbiz.base.container.ContainerConfig.Configuration;
Expand Down Expand Up @@ -392,6 +395,15 @@ public ComponentConfig create() {
}
}

/**
* Instantiates a component config from a component name and a root location.
*
* @param globalName the global name of the component which can be {@code null}
* @param rootLocation the root location of the component
* @throws ComponentException when component directory does not exist or if the
* {@code ofbiz-component.xml} file of that component is not properly defined
* @throws NullPointerException when {@code rootLocation} is {@code null}
*/
private ComponentConfig(String globalName, String rootLocation) throws ComponentException {
if (!rootLocation.endsWith("/")) {
rootLocation = rootLocation + "/";
Expand All @@ -400,134 +412,41 @@ private ComponentConfig(String globalName, String rootLocation) throws Component
File rootLocationDir = new File(rootLocation);
if (!rootLocationDir.exists()) {
throw new ComponentException("The component root location does not exist: " + rootLocation);
}
if (!rootLocationDir.isDirectory()) {
} else if (!rootLocationDir.isDirectory()) {
throw new ComponentException("The component root location is not a directory: " + rootLocation);
}
String xmlFilename = rootLocation + "/" + OFBIZ_COMPONENT_XML_FILENAME;
String xmlFilename = this.rootLocation + "/" + OFBIZ_COMPONENT_XML_FILENAME;
URL xmlUrl = UtilURL.fromFilename(xmlFilename);
if (xmlUrl == null) {
throw new ComponentException("Could not find the " + OFBIZ_COMPONENT_XML_FILENAME + " configuration file in the component root location: " + rootLocation);
throw new ComponentException("Could not find the " + OFBIZ_COMPONENT_XML_FILENAME
+ " configuration file in the component root location: " + rootLocation);
}
Document ofbizComponentDocument = null;
Element componentElement = null;
try {
ofbizComponentDocument = UtilXml.readXmlDocument(xmlUrl, true);
Document ofbizComponentDocument = UtilXml.readXmlDocument(xmlUrl, true);
componentElement = ofbizComponentDocument.getDocumentElement();
} catch (Exception e) {
throw new ComponentException("Error reading the component config file: " + xmlUrl, e);
}
Element ofbizComponentElement = ofbizComponentDocument.getDocumentElement();
this.componentName = ofbizComponentElement.getAttribute("name");
this.enabled = "true".equalsIgnoreCase(ofbizComponentElement.getAttribute("enabled"));
if (UtilValidate.isEmpty(globalName)) {
this.globalName = this.componentName;
} else {
this.globalName = globalName;
}
// resource-loader - resourceLoaderInfos
List<? extends Element> childElements = UtilXml.childElementList(ofbizComponentElement, "resource-loader");
if (!childElements.isEmpty()) {
Map<String, ResourceLoaderInfo> resourceLoaderInfos = new LinkedHashMap<>();
for (Element curElement : childElements) {
ResourceLoaderInfo resourceLoaderInfo = new ResourceLoaderInfo(curElement);
resourceLoaderInfos.put(resourceLoaderInfo.name, resourceLoaderInfo);
}
this.resourceLoaderInfos = Collections.unmodifiableMap(resourceLoaderInfos);
} else {
this.resourceLoaderInfos = Collections.emptyMap();
}

childElements = UtilXml.childElementList(ofbizComponentElement, "depends-on");
if (!childElements.isEmpty()) {
List<DependsOnInfo> dependsOnList = new ArrayList<>(childElements.size());
for (Element curElement : childElements) {
DependsOnInfo dependsOnInfo = new DependsOnInfo(this, curElement);
dependsOnList.add(dependsOnInfo);
}
this.dependsOnInfos = Collections.unmodifiableList(dependsOnList);
} else {
this.dependsOnInfos = Collections.emptyList();
}

// classpath - classpathInfos
childElements = UtilXml.childElementList(ofbizComponentElement, "classpath");
if (!childElements.isEmpty()) {
List<ClasspathInfo> classpathInfos = new ArrayList<>(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
childElements = UtilXml.childElementList(ofbizComponentElement, "entity-resource");
if (!childElements.isEmpty()) {
List<EntityResourceInfo> entityResourceInfos = new ArrayList<>(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
childElements = UtilXml.childElementList(ofbizComponentElement, "service-resource");
if (!childElements.isEmpty()) {
List<ServiceResourceInfo> serviceResourceInfos = new ArrayList<>(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
childElements = UtilXml.childElementList(ofbizComponentElement, "test-suite");
if (!childElements.isEmpty()) {
List<TestSuiteInfo> testSuiteInfos = new ArrayList<>(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)
childElements = UtilXml.childElementList(ofbizComponentElement, "keystore");
if (!childElements.isEmpty()) {
List<KeystoreInfo> keystoreInfos = new ArrayList<>(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
childElements = UtilXml.childElementList(ofbizComponentElement, "webapp");
if (!childElements.isEmpty()) {
List<WebappInfo> webappInfos = new ArrayList<>(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();
}
// configurations
componentName = componentElement.getAttribute("name");
enabled = "true".equalsIgnoreCase(componentElement.getAttribute("enabled"));
this.globalName = UtilValidate.isEmpty(globalName) ? componentName : globalName;
dependsOnInfos = collectElements(componentElement, "depends-on", DependsOnInfo::new);
classpathInfos = collectElements(componentElement, "classpath", ClasspathInfo::new);
entityResourceInfos = collectElements(componentElement, "entity-resource", EntityResourceInfo::new);
serviceResourceInfos = collectElements(componentElement, "service-resource", ServiceResourceInfo::new);
testSuiteInfos = collectElements(componentElement, "test-suite", TestSuiteInfo::new);
keystoreInfos = collectElements(componentElement, "keystore", KeystoreInfo::new);
webappInfos = collectElements(componentElement, "webapp", WebappInfo::new);
resourceLoaderInfos = UtilXml.childElementList(componentElement, "resource-loader").stream()
.map(ResourceLoaderInfo::new)
.collect(Collectors.collectingAndThen(
Collectors.toMap(rli -> rli.name, rli -> rli),
Collections::unmodifiableMap));
try {
Collection<Configuration> configurations = ContainerConfig.getConfigurations(xmlUrl);
if (!configurations.isEmpty()) {
this.configurations = Collections.unmodifiableList(new ArrayList<>(configurations));
} else {
this.configurations = Collections.emptyList();
}
this.configurations = Collections.unmodifiableList(new ArrayList<>(configurations));
} catch (ContainerException ce) {
throw new ComponentException("Error reading container configurations for component: " + this.globalName, ce);
}
Expand All @@ -536,6 +455,21 @@ private ComponentConfig(String globalName, String rootLocation) throws Component
}
}

/**
* Constructs an immutable list of objects from the the childs of an XML element.
*
* @param ofbizComponentElement the XML element containing the childs
* @param elemName the name of the child elements to collect
* @param mapper the constructor use to map child elements to objects
* @return an immutable list of objects corresponding to {@code mapper}
*/
private <T> List<T> collectElements(Element ofbizComponentElement, String elemName,
BiFunction<ComponentConfig, Element, T> mapper) {
return UtilXml.childElementList(ofbizComponentElement, elemName).stream()
.map(element -> mapper.apply(this, element))
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
}

public boolean enabled() {
return this.enabled;
}
Expand Down

0 comments on commit e8ea418

Please sign in to comment.