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 :

http://dive4elements.wald.intevation.org