Mercurial > dive4elements > gnv-client
comparison gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java @ 473:a6a33ef35809
Added support to step back to previous states. Add state names to xform nodes in describe document and append old targets to list of reachable targets.
gnv-artifacts/trunk@539 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 13 Jan 2010 23:10:56 +0000 |
parents | b7bb66440cc8 |
children | c0504976e606 |
comparison
equal
deleted
inserted
replaced
472:d6a100d5f74a | 473:a6a33ef35809 |
---|---|
7 import java.io.OutputStream; | 7 import java.io.OutputStream; |
8 import java.util.ArrayList; | 8 import java.util.ArrayList; |
9 import java.util.Collection; | 9 import java.util.Collection; |
10 import java.util.HashMap; | 10 import java.util.HashMap; |
11 import java.util.Iterator; | 11 import java.util.Iterator; |
12 import java.util.List; | |
12 import java.util.Map; | 13 import java.util.Map; |
13 | 14 |
14 import javax.xml.xpath.XPathConstants; | 15 import javax.xml.xpath.XPathConstants; |
16 | |
17 import net.sf.ehcache.Cache; | |
15 | 18 |
16 import org.apache.log4j.Logger; | 19 import org.apache.log4j.Logger; |
17 import org.w3c.dom.Document; | 20 import org.w3c.dom.Document; |
18 import org.w3c.dom.Element; | 21 import org.w3c.dom.Element; |
19 import org.w3c.dom.Node; | 22 import org.w3c.dom.Node; |
25 import de.intevation.artifactdatabase.XMLUtils; | 28 import de.intevation.artifactdatabase.XMLUtils; |
26 import de.intevation.artifacts.ArtifactFactory; | 29 import de.intevation.artifacts.ArtifactFactory; |
27 import de.intevation.artifacts.ArtifactNamespaceContext; | 30 import de.intevation.artifacts.ArtifactNamespaceContext; |
28 import de.intevation.artifacts.CallContext; | 31 import de.intevation.artifacts.CallContext; |
29 import de.intevation.artifacts.CallMeta; | 32 import de.intevation.artifacts.CallMeta; |
33 import de.intevation.gnv.artifacts.cache.CacheFactory; | |
30 import de.intevation.gnv.artifacts.context.GNVArtifactContext; | 34 import de.intevation.gnv.artifacts.context.GNVArtifactContext; |
31 import de.intevation.gnv.artifacts.fis.FISSelectArtifact; | 35 import de.intevation.gnv.artifacts.fis.FISSelectArtifact; |
32 import de.intevation.gnv.artifacts.fis.product.Product; | 36 import de.intevation.gnv.artifacts.fis.product.Product; |
33 import de.intevation.gnv.artifacts.ressource.RessourceFactory; | 37 import de.intevation.gnv.artifacts.ressource.RessourceFactory; |
34 import de.intevation.gnv.state.DefaultInputData; | 38 import de.intevation.gnv.state.DefaultInputData; |
35 import de.intevation.gnv.state.InputData; | 39 import de.intevation.gnv.state.InputData; |
36 import de.intevation.gnv.state.InputValue; | 40 import de.intevation.gnv.state.InputValue; |
37 import de.intevation.gnv.state.OutputMode; | 41 import de.intevation.gnv.state.OutputMode; |
38 import de.intevation.gnv.state.OutputState; | 42 import de.intevation.gnv.state.OutputState; |
39 import de.intevation.gnv.state.State; | 43 import de.intevation.gnv.state.State; |
44 import de.intevation.gnv.state.StateBase; | |
40 import de.intevation.gnv.state.StateFactory; | 45 import de.intevation.gnv.state.StateFactory; |
41 import de.intevation.gnv.state.exception.StateException; | 46 import de.intevation.gnv.state.exception.StateException; |
42 import de.intevation.gnv.transition.Transition; | 47 import de.intevation.gnv.transition.Transition; |
43 import de.intevation.gnv.transition.TransitionFactory; | 48 import de.intevation.gnv.transition.TransitionFactory; |
44 import de.intevation.gnv.utils.ArtifactXMLUtilities; | 49 import de.intevation.gnv.utils.ArtifactXMLUtilities; |
164 ); | 169 ); |
165 } | 170 } |
166 | 171 |
167 // step backward | 172 // step backward |
168 else if((next = getPreviousState(current, targetState)) != null) { | 173 else if((next = getPreviousState(current, targetState)) != null) { |
174 | |
175 // reset input data | |
169 resetFutureStates(current, targetState); | 176 resetFutureStates(current, targetState); |
177 | |
178 // remove data from future states from cache | |
179 resetDescribeData(current, identifier, targetState); | |
180 | |
170 current = next; | 181 current = next; |
171 | 182 |
172 result = createReport( | 183 result = createReport( |
173 result, "result", "success", "Advance success" | 184 result, "result", "success", "Advance success" |
174 ); | 185 ); |
245 else { | 256 else { |
246 return getPreviousState(current.getParent(), name); | 257 return getPreviousState(current.getParent(), name); |
247 } | 258 } |
248 } | 259 } |
249 | 260 |
261 public void resetDescribeData(State state, String uuid, String target) { | |
262 CacheFactory factory = CacheFactory.getInstance(); | |
263 | |
264 if (factory.isInitialized()) { | |
265 Cache cache = factory.getCache(); | |
266 String key = uuid + StateBase.DESCRIBEDATAKEY; | |
267 | |
268 net.sf.ehcache.Element value = cache.get(key); | |
269 if (value == null) | |
270 return; | |
271 | |
272 List data = (List) value.getObjectValue(); | |
273 while(!target.equals(state.getID())) { | |
274 data.remove(data.size()-1); | |
275 state = state.getParent(); | |
276 } | |
277 | |
278 cache.put(new net.sf.ehcache.Element(key, data)); | |
279 } | |
280 } | |
281 | |
250 | 282 |
251 protected void resetFutureStates(State current, String name) { | 283 protected void resetFutureStates(State current, String name) { |
252 if (current == null) { | 284 if (current == null) { |
253 return; | 285 return; |
254 } | 286 } |
262 } | 294 } |
263 } | 295 } |
264 | 296 |
265 | 297 |
266 private boolean isStateCurrentlyReachable(String stateid){ | 298 private boolean isStateCurrentlyReachable(String stateid){ |
267 log.debug("GNVArtifactBase.isStateCurrentlyReachable "+stateid); | |
268 Iterator<Transition> it = this.transitions.iterator(); | 299 Iterator<Transition> it = this.transitions.iterator(); |
269 String from = this.current.getID(); | 300 String from = this.current.getID(); |
270 while (it.hasNext()){ | 301 while (it.hasNext()){ |
271 Transition transition = it.next(); | 302 Transition transition = it.next(); |
272 if (transition.getFrom().equals(from)){ | 303 if (transition.getFrom().equals(from)){ |
273 if (transition.getTo().equals(stateid) && transition.isValid(this.current)){ | 304 if (transition.getTo().equals(stateid) && transition.isValid(this.current)){ |
274 return true; | 305 return true; |
275 } | 306 } |
276 } | 307 } |
277 } | 308 } |
278 log.debug("State is not reachable."); | |
279 return false; | 309 return false; |
280 } | 310 } |
281 | 311 |
282 public Document initialize (CallContext context) { | 312 public Document initialize (CallContext context) { |
283 Document result = XMLUtils.newDocument(); | 313 Document result = XMLUtils.newDocument(); |
551 Element parent, | 581 Element parent, |
552 Document document | 582 Document document |
553 ) { | 583 ) { |
554 Element stateNode = creator.create("reachable-states"); | 584 Element stateNode = creator.create("reachable-states"); |
555 if (this.current != null) { | 585 if (this.current != null) { |
586 | |
587 // add future states | |
556 Iterator<Transition> transitions = this.transitions.iterator(); | 588 Iterator<Transition> transitions = this.transitions.iterator(); |
557 while (transitions.hasNext()) { | 589 while (transitions.hasNext()) { |
558 Transition tmpTransition = transitions.next(); | 590 Transition tmpTransition = transitions.next(); |
559 if (tmpTransition.getFrom().equals(current.getID()) && | 591 if (tmpTransition.getFrom().equals(current.getID()) && |
560 tmpTransition.isValid(this.current)){ | 592 tmpTransition.isValid(this.current)){ |
561 Element currentNode = creator.create("state"); | 593 Element currentNode = creator.create("state"); |
562 creator.addAttr(currentNode, "name", tmpTransition.getTo()); | 594 creator.addAttr(currentNode, "name", tmpTransition.getTo()); |
563 log.debug("Reachable State: " + tmpTransition.getTo()); | |
564 creator.addAttr( | 595 creator.addAttr( |
565 currentNode, | 596 currentNode, |
566 "description", | 597 "description", |
567 this.states.get(tmpTransition.getTo()).getDescription()); | 598 this.states.get(tmpTransition.getTo()).getDescription()); |
568 stateNode.appendChild(currentNode); | 599 stateNode.appendChild(currentNode); |
569 } | 600 } |
570 } | 601 } |
602 | |
603 | |
604 // add old states | |
605 appendOldReachableStates(creator, stateNode, current); | |
571 } | 606 } |
572 parent.appendChild(stateNode); | 607 parent.appendChild(stateNode); |
573 } | 608 } |
609 | |
610 | |
611 protected void appendOldReachableStates( | |
612 XMLUtils.ElementCreator creator, | |
613 Element parent, | |
614 State state | |
615 ) { | |
616 if (state == null) | |
617 return; | |
618 | |
619 while (state != null) { | |
620 Element currentNode = creator.create("state"); | |
621 creator.addAttr(currentNode, "name", state.getID()); | |
622 creator.addAttr(currentNode, "description", state.getDescription()); | |
623 parent.appendChild(currentNode); | |
624 | |
625 state = state.getParent(); | |
626 } | |
627 } | |
628 | |
574 | 629 |
575 protected void createCurrentState( | 630 protected void createCurrentState( |
576 XMLUtils.ElementCreator creator, | 631 XMLUtils.ElementCreator creator, |
577 Element parent, | 632 Element parent, |
578 Document document | 633 Document document |