Mercurial > dive4elements > gnv-client
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 } |