comparison gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java @ 478:0e0c64c821dc

Added support to step back to the point for choosing a product. gnv-artifacts/trunk@547 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 15 Jan 2010 18:21:49 +0000
parents
children d47b478e662b
comparison
equal deleted inserted replaced
477:40a058047854 478:0e0c64c821dc
1 package de.intevation.gnv.artifacts;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashMap;
6 import java.util.Map;
7 import java.util.Set;
8
9 import javax.xml.xpath.XPathConstants;
10
11 import org.w3c.dom.Document;
12 import org.w3c.dom.Element;
13 import org.w3c.dom.Node;
14 import org.w3c.dom.NodeList;
15
16 import de.intevation.artifactdatabase.DefaultArtifactFactory;
17 import de.intevation.artifactdatabase.ProxyArtifact;
18 import de.intevation.artifactdatabase.XMLUtils;
19 import de.intevation.artifacts.Artifact;
20 import de.intevation.artifacts.ArtifactFactory;
21 import de.intevation.gnv.artifacts.fis.SelectProductArtifact;
22 import de.intevation.gnv.artifacts.fis.product.DefaultProduct;
23 import de.intevation.gnv.state.DefaultInputData;
24 import de.intevation.gnv.state.InputData;
25
26 import org.apache.log4j.Logger;
27
28 /**
29 * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
30 */
31 public class GNVProductArtifactFactory extends DefaultArtifactFactory {
32
33 public static final String XPATH_REPLACE_NAME = "IDENTIFIER";
34
35 public static final String XPATH_PRODUCT_ARTIFACT =
36 "artifact-database/artifacts/artifact[@name='"+XPATH_REPLACE_NAME+"']";
37
38 public static final String XPATH_PRODUCT = "products/product";
39
40 public static final String XPATH_PRODUCT_NAME = "@name";
41
42 public static final String XPATH_PRODUCT_FACTORY = "artifact-factory";
43
44 public static final String XPATH_PRODUCT_PARAMETER = "parameters/parameter";
45
46 private Logger logger = Logger.getLogger(GNVProductArtifactFactory.class);
47
48 private Map productFactories;
49 private Map products;
50
51
52 public GNVProductArtifactFactory() {
53 }
54
55 @Override
56 public Artifact createArtifact(String identifier, Object context) {
57
58 // create a SelectProductArtifact for initial product selection
59 Artifact artifact = super.createArtifact(identifier, context);
60
61 if (artifact instanceof ProxyArtifact) {
62
63 SelectProductArtifact select = new SelectProductArtifact();
64 select.setProducts(products);
65 select.setup(identifier, this, context);
66
67 ((ProxyArtifact) artifact).setProxied(select);
68 }
69
70 return artifact;
71 }
72
73 @Override
74 public void setup(Document document, Node factoryNode) {
75 super.setup(document, factoryNode);
76
77 String xpath = XPATH_PRODUCT_ARTIFACT.replace(XPATH_REPLACE_NAME, name);
78 Node artifact = (Node) XMLUtils.xpath(
79 document, xpath, XPathConstants.NODE);
80
81 NodeList productNodes = (NodeList) XMLUtils.xpath(
82 artifact, XPATH_PRODUCT, XPathConstants.NODESET);
83
84 if (productNodes == null) {
85 logger.warn("No products found for fis: " + name);
86 return;
87 }
88
89 int productLength = productNodes.getLength();
90
91 if (productLength != 0) {
92 productFactories = new HashMap(productLength);
93 products = new HashMap(productLength);
94
95 parseProductFactories(document, productNodes);
96 }
97 }
98
99
100 public ArtifactFactory getArtifactFactoryByName(String name) {
101 return (ArtifactFactory) productFactories.get(name);
102 }
103
104
105 protected void parseProductFactories(Document document, NodeList products) {
106 int items = products.getLength();
107
108 for(int i = 0; i < items; i++) {
109
110 try {
111 Node product = products.item(i);
112
113 String name = (String) XMLUtils.xpath(
114 product, XPATH_PRODUCT_NAME, XPathConstants.STRING);
115
116 Node factoryNode = (Node) XMLUtils.xpath(
117 product, XPATH_PRODUCT_FACTORY, XPathConstants.NODE);
118
119 String factoryClass = factoryNode.getTextContent();
120
121 if (factoryClass == null || factoryClass.equals("")) {
122 logger.warn("No artifact factory class found for " + name);
123 continue;
124 }
125
126 Class cls = Class.forName(factoryClass);
127 ArtifactFactory factory = (ArtifactFactory) cls.newInstance();
128 factory.setup(document, factoryNode);
129
130 productFactories.put(name, factory);
131 initializeProducts(product);
132 }
133 catch (ClassNotFoundException cnfe) {
134 logger.warn(cnfe, cnfe);
135 }
136 catch (InstantiationException ie) {
137 logger.warn(ie, ie);
138 }
139 catch (IllegalAccessException iae) {
140 logger.warn(iae, iae);
141 }
142 }
143 }
144
145
146 protected void initializeProducts(Node productNode) {
147 String productName = (String) XMLUtils.xpath(
148 productNode, "@name", XPathConstants.STRING);
149
150 NodeList parameterNodes = (NodeList) XMLUtils.xpath(
151 productNode, XPATH_PRODUCT_PARAMETER, XPathConstants.NODESET
152 );
153
154 if (parameterNodes != null) {
155 int items = parameterNodes.getLength();
156 Collection inputParameter = new ArrayList(items);
157
158 for (int j = 0; j < items; j++) {
159 Node parameterNode = (Node) parameterNodes.item(j);
160 String name = (String) XMLUtils.xpath(
161 parameterNode, "@name", XPathConstants.STRING);
162 String value = (String) XMLUtils.xpath(
163 parameterNode, "@value", XPathConstants.STRING);
164
165 inputParameter.add(new DefaultInputData(name, value));
166 }
167
168 products.put(
169 productName,
170 new DefaultProduct(productName, inputParameter, this.name)
171 );
172 }
173 }
174 }

http://dive4elements.wald.intevation.org