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

http://dive4elements.wald.intevation.org