You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by mt...@apache.org on 2019/09/23 19:38:18 UTC

svn commit: r1867394 - in /ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base: component/ComponentLoaderConfig.java container/ComponentContainer.java

Author: mthl
Date: Mon Sep 23 19:38:17 2019
New Revision: 1867394

URL: http://svn.apache.org/viewvc?rev=1867394&view=rev
Log:
Improved: Refactor ‘ComponentLoaderConfig’ class
(OFBIZ-11192)

This redefines the ‘ComponentLoaderConfig#ComponentDef’ class by
removing its unused name attribute.

The ‘java.nio.file’ API has been used to represent the relative path
of a component location.

Various cleanups and Javadoc added.

Modified:
    ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentLoaderConfig.java
    ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/container/ComponentContainer.java

Modified: ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentLoaderConfig.java
URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentLoaderConfig.java?rev=1867394&r1=1867393&r2=1867394&view=diff
==============================================================================
--- ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentLoaderConfig.java (original)
+++ ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/component/ComponentLoaderConfig.java Mon Sep 23 19:38:17 2019
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -15,11 +15,13 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *******************************************************************************/
+ */
 package org.apache.ofbiz.base.component;
 
 import java.io.IOException;
 import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -36,9 +38,17 @@ import org.w3c.dom.Element;
 import org.xml.sax.SAXException;
 
 /**
- * ComponentLoaderConfig - Component Loader configuration utility class
- * to handle component-load.xml files
+ * This class is a module for manipulating component loader files.
+ *
+ * <p> The component loader files are named {@code component-load.xml}
+ * and are present either in the classpath when defining the top-level component
+ * directories or inside those component directories when defining the loading order
+ * of the enabled simple components inside those directories.
  *
+ * Simple components are directories containing a component configuration file
+ * named {@code ofbiz-component.xml} and mapped to a {@link ComponentConfig} object.
+ *
+ * @see ComponentConfig
  */
 public final class ComponentLoaderConfig {
 
@@ -47,34 +57,105 @@ public final class ComponentLoaderConfig
 
     public enum ComponentType { SINGLE_COMPONENT, COMPONENT_DIRECTORY }
 
+    private ComponentLoaderConfig() { }
+
+    /**
+     * Provides the list of root directory components defined in the classpath.
+     *
+     * @return the list of root directory components.
+     * @throws ComponentException if the main {@code component-load.xml} file is either invalid
+     *         or refer to non-existent component directory.
+     */
     public static List<ComponentDef> getRootComponents() throws ComponentException {
         URL xmlUrl = UtilURL.fromResource(COMPONENT_LOAD_XML_FILENAME);
         return getComponentsFromConfig(xmlUrl);
     }
 
+    /**
+     * Collects the component definitions from a {@code component-load.xml} file
+     *
+     * @param configUrl  the location of the {@code component-load.xml} file
+     * @return a list of component definitions
+     * @throws ComponentException when the {@code component-load.xml} file is invalid.
+     */
     public static List<ComponentDef> getComponentsFromConfig(URL configUrl) throws ComponentException {
         Document document = parseDocumentFromUrl(configUrl);
         List<? extends Element> toLoad = UtilXml.childElementList(document.getDocumentElement());
         List<ComponentDef> componentsFromConfig = new ArrayList<>();
 
         for (Element element : toLoad) {
-            componentsFromConfig.add(retrieveComponentDefFromElement(element, configUrl));
+            componentsFromConfig.add(ComponentDef.of(element, configUrl));
         }
         return Collections.unmodifiableList(componentsFromConfig);
     }
 
+    /**
+     * Represents a simple component or a component directory.
+     */
     public static class ComponentDef {
-        public String name;
-        public final String location;
+        /** The location of the component. */
+        public final Path location;
+        /** The type of component. */
         public final ComponentType type;
 
-        private ComponentDef(String name, String location, ComponentType type) {
-            this.name = name;
+        /**
+         * Constructs a component definition.
+         *
+         * @param location  the location of the component
+         * @param type  the type of the component
+         */
+        private ComponentDef(Path location, ComponentType type) {
             this.location = location;
             this.type = type;
         }
+
+        @Override
+        public String toString() {
+            return String.format("ComponentDef [location=%s, type=%s]", location, type);
+        }
+
+        /**
+         * Converts a string based location to a proper {@code Path}.
+         *
+         * @param location  the string based location
+         * @return the corresponding {@code Path} object.
+         */
+        private static Path locationToPath(String location) {
+            Map<String, ?> systemProps = UtilGenerics.cast(System.getProperties());
+            return Paths.get(FlexibleStringExpander.expandString(location, systemProps));
+        }
+
+        /**
+         * Constructs a component definition object from an XML element.
+         *
+         * @param element  an XML element which must have either a "load-component" or "load-components" label.
+         * @param configUrl  the location of the file containing the XML element
+         * @return the corresponding component definition object.
+         * @throws ComponentException when {@code element} has an invalid label.
+         */
+        private static ComponentDef of(Element element, URL configUrl) throws ComponentException {
+            String nodeName = element.getNodeName();
+            switch (nodeName) {
+            case "load-component":
+                return new ComponentDef(locationToPath(element.getAttribute("component-location")),
+                        ComponentType.SINGLE_COMPONENT);
+            case "load-components":
+                return new ComponentDef(locationToPath(element.getAttribute("parent-directory")),
+                        ComponentType.COMPONENT_DIRECTORY);
+            default:
+                throw new ComponentException(
+                        String.format("Invalid element '%s' found in component-load file %s", nodeName, configUrl));
+            }
+        }
     }
 
+    /**
+     * Parses a {@code component-load.xml} resource.
+     *
+     * @param configUrl the {@code component-load.xml} resource.
+     * @return the parsed XML document
+     * @throws ComponentException when {@code configUrl} is {@code null} or is invalid.
+     */
     private static Document parseDocumentFromUrl(URL configUrl) throws ComponentException {
         if (configUrl == null) {
             throw new ComponentException("configUrl cannot be null");
@@ -85,25 +166,4 @@ public final class ComponentLoaderConfig
             throw new ComponentException("Error reading the component config file: " + configUrl, e);
         }
     }
-
-    private static ComponentDef retrieveComponentDefFromElement(Element element, URL configUrl) throws ComponentException {
-        Map<String, ? extends Object> systemProps = UtilGenerics.cast(System.getProperties());
-        String nodeName = element.getNodeName();
-
-        String name = null;
-        String location = null;
-        ComponentType type = null;
-
-        if ("load-component".equals(nodeName)) {
-            name = element.getAttribute("component-name");
-            location = FlexibleStringExpander.expandString(element.getAttribute("component-location"), systemProps);
-            type = ComponentType.SINGLE_COMPONENT;
-        } else if ("load-components".equals(nodeName)) {
-            location = FlexibleStringExpander.expandString(element.getAttribute("parent-directory"), systemProps);
-            type = ComponentType.COMPONENT_DIRECTORY;
-        } else {
-            throw new ComponentException("Invalid element '" + nodeName + "' found in component-load file " + configUrl);
-        }
-        return new ComponentDef(name, location, type);
-    }
 }

Modified: ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/container/ComponentContainer.java
URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/container/ComponentContainer.java?rev=1867394&r1=1867393&r2=1867394&view=diff
==============================================================================
--- ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/container/ComponentContainer.java (original)
+++ ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/container/ComponentContainer.java Mon Sep 23 19:38:17 2019
@@ -117,12 +117,12 @@ public class ComponentContainer implemen
      * @throws ComponentException
      */
     private void loadComponentFromConfig(String parentPath, ComponentLoaderConfig.ComponentDef def) throws IOException, ContainerException, ComponentException {
-        String location = def.location.startsWith("/") ? def.location : parentPath + "/" + def.location;
+        String location = def.location.startsWith("/") ? def.location.toString() : parentPath + "/" + def.location;
 
         if (def.type.equals(ComponentLoaderConfig.ComponentType.COMPONENT_DIRECTORY)) {
             loadComponentDirectory(location);
         } else if (def.type.equals(ComponentLoaderConfig.ComponentType.SINGLE_COMPONENT)) {
-            ComponentConfig config = retrieveComponentConfig(def.name, location);
+            ComponentConfig config = retrieveComponentConfig(null, location);
             if (config != null) {
                 loadComponent(config);
             }