Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java @ 106:5864c41219db
Initializes a TransitionEngine storing all transitions for each artifact at the application start.
flys-artifacts/trunk@1288 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 03 Feb 2011 10:23:30 +0000 |
parents | |
children | a228b39494a9 |
comparison
equal
deleted
inserted
replaced
105:beb991dc4827 | 106:5864c41219db |
---|---|
1 package de.intevation.flys.artifacts.context; | |
2 | |
3 import java.io.File; | |
4 import java.util.ArrayList; | |
5 import java.util.List; | |
6 | |
7 import javax.xml.xpath.XPathConstants; | |
8 | |
9 import org.apache.log4j.Logger; | |
10 | |
11 import org.w3c.dom.Document; | |
12 import org.w3c.dom.Element; | |
13 import org.w3c.dom.NodeList; | |
14 | |
15 import de.intevation.artifacts.ArtifactContextFactory; | |
16 | |
17 import de.intevation.artifacts.common.utils.XMLUtils; | |
18 | |
19 import de.intevation.artifactdatabase.Config; | |
20 | |
21 import de.intevation.flys.artifacts.transitions.Transition; | |
22 import de.intevation.flys.artifacts.transitions.TransitionEngine; | |
23 import de.intevation.flys.artifacts.transitions.TransitionFactory; | |
24 | |
25 | |
26 /** | |
27 * The ArtifactContextFactory is used to initialize basic components and put | |
28 * them into the global context of the application. | |
29 * | |
30 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | |
31 */ | |
32 public class FLYSContextFactory implements ArtifactContextFactory { | |
33 | |
34 /** The logger that is used in this class */ | |
35 private static Logger logger = Logger.getLogger(FLYSContextFactory.class); | |
36 | |
37 /** The XPath to the artifacts configured in the configuration. */ | |
38 public static final String XPATH_ARTIFACTS = | |
39 "/artifact-database/artifacts/artifact"; | |
40 | |
41 /** The XPath to the name of the artifact. */ | |
42 public static final String XPATH_ARTIFACT_NAME = "@name"; | |
43 | |
44 /** The XPath to the xlink ref in an artifact configuration. */ | |
45 public static final String XPATH_XLINK = "xlink:href"; | |
46 | |
47 /** The XPath to the transitions configured in the artifact config. */ | |
48 public static final String XPATH_TRANSITIONS = | |
49 "/artifact/states/transition"; | |
50 | |
51 /** | |
52 * Creates a new FLYSArtifactContext object and initialize all | |
53 * components required by the application. | |
54 * | |
55 * @param config The artifact server configuration. | |
56 * @return a FLYSArtifactContext. | |
57 */ | |
58 public Object createArtifactContext(Document config) { | |
59 FLYSContext context = new FLYSContext(config); | |
60 | |
61 configureTransitions(config, context); | |
62 | |
63 return context; | |
64 } | |
65 | |
66 | |
67 /** | |
68 * This method initializes the transition configuration. | |
69 * | |
70 * @param config the config document. | |
71 * @param context the FLYSContext. | |
72 */ | |
73 protected void configureTransitions(Document config, FLYSContext context) { | |
74 TransitionEngine engine = new TransitionEngine(); | |
75 | |
76 Document[] artifacts = getArtifactConfigurations(config); | |
77 logger.info("Found " + artifacts.length + " artifacts in the config."); | |
78 | |
79 for (Document doc: artifacts) { | |
80 List<Transition> transitions = new ArrayList<Transition>(); | |
81 | |
82 String artName = (String) XMLUtils.xpath( | |
83 doc, XPATH_ARTIFACT_NAME, XPathConstants.STRING); | |
84 | |
85 NodeList transitionList = (NodeList) XMLUtils.xpath( | |
86 doc, XPATH_TRANSITIONS, XPathConstants.NODESET); | |
87 | |
88 if (transitionList == null) { | |
89 logger.warn("The artifact has no transitions configured."); | |
90 return; | |
91 } | |
92 | |
93 int trans = transitionList.getLength(); | |
94 | |
95 logger.info( | |
96 "Artifact '" + artName + "' has " + trans + " transitions."); | |
97 | |
98 for (int i = 0; i < trans; i++) { | |
99 transitions.add(TransitionFactory.createTransition( | |
100 transitionList.item(i))); | |
101 } | |
102 | |
103 engine.addTransition(artName, transitions); | |
104 } | |
105 | |
106 context.put(FLYSContext.TRANSITION_ENGINE_KEY, engine); | |
107 } | |
108 | |
109 | |
110 /** | |
111 * This method returns all artifact documents defined in | |
112 * <code>config</code>. <br>NOTE: The artifact configurations need to be | |
113 * stored in own files referenced by an xlink. | |
114 * | |
115 * @param config The global configuration. | |
116 * | |
117 * @return an array of Artifact configurations. | |
118 */ | |
119 protected Document[] getArtifactConfigurations(Document config) { | |
120 NodeList artifacts = (NodeList) XMLUtils.xpath( | |
121 config, XPATH_ARTIFACTS, XPathConstants.NODESET); | |
122 | |
123 int count = artifacts.getLength(); | |
124 | |
125 Document[] artifactDocs = new Document[count]; | |
126 | |
127 for (int i = 0; i < count; i++) { | |
128 Element tmp = (Element) artifacts.item(i); | |
129 | |
130 String xlink = tmp.getAttribute(XPATH_XLINK); | |
131 xlink = Config.replaceConfigDir(xlink); | |
132 | |
133 File artifactFile = new File(xlink); | |
134 artifactDocs[i] = XMLUtils.parseDocument(artifactFile); | |
135 } | |
136 | |
137 return artifactDocs; | |
138 } | |
139 } | |
140 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |