changeset 513:69f99bdf3d65

Use a list of "static" facets loaded from configuration to generate facets on artifact setup.
author Raimund Renkert <rrenkert@intevation.de>
date Wed, 30 Apr 2014 15:05:54 +0200
parents ff79b8df9aa6
children 0416d9fb3668
files artifact-database/src/main/java/org/dive4elements/artifactdatabase/DefaultArtifact.java artifact-database/src/main/java/org/dive4elements/artifactdatabase/DefaultArtifactFactory.java artifacts/src/main/java/org/dive4elements/artifacts/Artifact.java
diffstat 3 files changed, 72 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/artifact-database/src/main/java/org/dive4elements/artifactdatabase/DefaultArtifact.java	Wed Apr 30 15:04:14 2014 +0200
+++ b/artifact-database/src/main/java/org/dive4elements/artifactdatabase/DefaultArtifact.java	Wed Apr 30 15:05:54 2014 +0200
@@ -17,6 +17,7 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.List;
 
 import org.apache.log4j.Logger;
 
@@ -124,7 +125,8 @@
         ArtifactFactory factory,
         Object          context,
         CallMeta        callMeta,
-        Document        data)
+        Document        data,
+        List<Class>     facets)
     {
         if (logger.isDebugEnabled()) {
             logger.debug("DefaultArtifact.setup: " + identifier);
--- a/artifact-database/src/main/java/org/dive4elements/artifactdatabase/DefaultArtifactFactory.java	Wed Apr 30 15:04:14 2014 +0200
+++ b/artifact-database/src/main/java/org/dive4elements/artifactdatabase/DefaultArtifactFactory.java	Wed Apr 30 15:05:54 2014 +0200
@@ -8,7 +8,15 @@
 
 package org.dive4elements.artifactdatabase;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.xpath.XPathConstants;
+
 import org.dive4elements.artifacts.common.utils.Config;
+import org.dive4elements.artifacts.common.utils.XMLUtils;
 
 import org.dive4elements.artifacts.Artifact;
 import org.dive4elements.artifacts.ArtifactFactory;
@@ -20,6 +28,7 @@
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * Trivial implementation of the ArtifactFactory interface.
@@ -53,6 +62,17 @@
      * by this factory.
      */
     public static final String XPATH_ARTIFACT    = "@artifact";
+    /**
+     * XPath to access the static facets configured for artifacts
+     */
+    public static final String XPATH_ARTIFACT_CONFIG =
+        "/artifact-database/artifacts/artifact[@name=$name]/load-facets/facet";
+
+    /**
+     * XPath to access the static facets configured for artifacts
+     */
+    public static final String XPATH_ARTIFACT_NAME =
+        "/artifact-database/artifacts/artifact/@name";
 
     /**
      * Default description of this factory if none is given by the
@@ -88,9 +108,20 @@
     protected Class  artifactClass;
 
     /**
+     * The name of the artifacts to be build by this factory.
+     */
+    protected String  artifactName;
+
+    /**
+     * The list of facets the generated artifact creates on instantiation.
+     */
+    protected List<Class> facetClasses;
+
+    /**
      * Default constructor.
      */
     public DefaultArtifactFactory() {
+        facetClasses = new ArrayList<Class>();
     }
 
     public String getName() {
@@ -111,7 +142,17 @@
             Artifact artifact =
                 (Artifact)artifactClass.newInstance();
 
-            artifact.setup(identifier, this, context, callMeta, data);
+            if (artifact.getName() == null ||
+                artifact.getName().length() == 0) {
+                artifact.setName(artifactName);
+            }
+            artifact.setup(
+                identifier,
+                this,
+                context,
+                callMeta,
+                data,
+                facetClasses);
 
             return artifact;
         }
@@ -129,7 +170,6 @@
     }
 
     public void setup(Document document, Node factoryNode) {
-
         String ttlString = Config.getStringXPath(factoryNode, XPATH_TTL);
         if (ttlString != null) {
             try {
@@ -145,10 +185,34 @@
 
         name = Config.getStringXPath(
             factoryNode, XPATH_NAME, toString());
+        logger.debug("setting up " + name);
 
         String artifact = Config.getStringXPath(
             factoryNode, XPATH_ARTIFACT, DEFAULT_ARTIFACT);
 
+        artifactName = Config.getStringXPath(
+            document, XPATH_ARTIFACT_NAME, "default");
+        logger.debug(artifactName);
+        Map<String, String> variables = new HashMap<String, String>();
+        variables.put("name", name);
+        NodeList facets = (NodeList) XMLUtils.xpath(
+            document,
+            XPATH_ARTIFACT_CONFIG,
+            XPathConstants.NODESET,
+            null,
+            variables);
+
+        for (int i = 0; i < facets.getLength(); i++) {
+            logger.debug(facets.item(i).getAttributes().getNamedItem("class").getNodeValue());
+            String className =
+                facets.item(i).getAttributes().getNamedItem("class").getNodeValue();
+            try {
+                facetClasses.add(Class.forName(className));
+            }
+            catch (ClassNotFoundException cnfe) {
+                logger.error(cnfe.getLocalizedMessage(), cnfe);
+            }
+        }
         try {
             artifactClass = Class.forName(artifact);
         }
--- a/artifacts/src/main/java/org/dive4elements/artifacts/Artifact.java	Wed Apr 30 15:04:14 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/artifacts/Artifact.java	Wed Apr 30 15:05:54 2014 +0200
@@ -11,6 +11,7 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Serializable;
+import java.util.List;
 
 import org.w3c.dom.Document;
 
@@ -144,7 +145,8 @@
         ArtifactFactory factory,
         Object          context,
         CallMeta        callMeta,
-        Document        data);
+        Document        data,
+        List<Class>     facets);
 
     /**
      * Called from artifact database when an artifact is

http://dive4elements.wald.intevation.org