Mercurial > dive4elements > gnv-client
changeset 605:e8ebdbc7f1e3
First step of removing the cache blob. The static part of the describe document will be created by using the input data stored at each state. Some TODOs left (see ChangeLog).
gnv-artifacts/trunk@671 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 09 Feb 2010 14:27:55 +0000 |
parents | 938ce81a6bd0 |
children | 9efc1c256dbb |
files | gnv-artifacts/ChangeLog gnv-artifacts/src/main/java/de/intevation/gnv/state/StateBase.java |
diffstat | 2 files changed, 203 insertions(+), 75 deletions(-) [+] |
line wrap: on
line diff
--- a/gnv-artifacts/ChangeLog Tue Feb 09 13:01:20 2010 +0000 +++ b/gnv-artifacts/ChangeLog Tue Feb 09 14:27:55 2010 +0000 @@ -1,3 +1,15 @@ +2010-02-09 Ingo Weinzierl <ingo.weinzierl@intevation.de> + + * src/main/java/de/intevation/gnv/state/StateBase.java: Do not query the + cache / database for rendering the static part of the describe document - + just take the input data stored at each state. + + TODOs: + - Store 'description' of each chosen value. At the moment we are able to + render an id of value, only. + - Take care of input elements with multi selection. + - The subarea node disappears if we don't select any. + 2010-02-09 Tim Englich <tim.englich@intevation.de> * doc/conf/conf.xml:
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/StateBase.java Tue Feb 09 13:01:20 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/StateBase.java Tue Feb 09 14:27:55 2010 +0000 @@ -1,6 +1,3 @@ -/** - * - */ package de.intevation.gnv.state; import java.util.ArrayList; @@ -61,27 +58,30 @@ * the logger, used to log exceptions and additonaly information */ private static Logger log = Logger.getLogger(GNVArtifactBase.class); - + private final static String MINVALUEFIELDNAME = "minvalue"; private final static String MAXVALUEFIELDNAME = "maxvalue"; - + private final static String NODATASELECTIONKEY = "n/n"; - + public final static String DESCRIBEDATAKEY = "_DESCRIBEDATA"; public final static String XPATH_STATIC_UI = "art:static"; public final static String XPATH_DYNAMIC_UI = "art:dynamic"; + /** input value names which should not be rendered from State itself */ + public final static String[] BLACKLIST = {"sourceid", "fisname"}; + private String id = null; private String description = null; protected String dataName = null; - + protected String preSettingsName = null; protected boolean dataMultiSelect = false; - + protected boolean dataNoSelect = false; protected String queryID = null; @@ -93,7 +93,7 @@ private State parent = null; protected Map<String, InputData> inputData = null; - + private Map<String, InputData> preSettings = null; /** @@ -564,11 +564,55 @@ return keyValueDescibeData; } + + public String findNewValue() { + Iterator iter = inputValueNames.iterator(); + + while (iter.hasNext()) { + String key = (String) iter.next(); + boolean old = false; + + StateBase parent = (StateBase) getParent(); + if (parent == null) { + // first state should always render a dynamic part + old = true; + } + + while (parent != null) { + if (parent.inputValueNames.contains(key) || inBlackList(key)) { + old = true; + break; + } + + parent = (StateBase) parent.getParent(); + } + + if (!old) { + return key; + } + } + + return null; + } + + + public static boolean inBlackList(String key) { + int length = BLACKLIST.length; + for (int i = 0; i < length; i++) { + if (BLACKLIST[i].equals(key)) { + return true; + } + } + + return false; + } + /** * @see de.intevation.gnv.state.State#describe(org.w3c.dom.Document, * org.w3c.dom.Node, de.intevation.artifacts.CallMeta, * java.lang.String) */ + /* public void describe( Document document, Node rootNode, @@ -621,6 +665,98 @@ } } } + */ + + + public void describe( + Document document, + Node rootNode, + CallContext context, + String uuid) + { + log.debug("StateBase.describe"); + + XMLUtils.ElementCreator xCreator = new XMLUtils.ElementCreator( + document, + XMLUtils.XFORM_URL, + XMLUtils.XFORM_PREFIX + ); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + // append dynamic node + Node dynamic = (Node) XMLUtils.xpath( + rootNode, + XPATH_DYNAMIC_UI, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE + ); + + describeDynamic( + creator, xCreator, document, dynamic, context, uuid); + + // append static nodes + Node staticNode = (Node) XMLUtils.xpath( + rootNode, + XPATH_STATIC_UI, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE + ); + + describeStatic( + creator,xCreator, document, staticNode, context,uuid); + } + + + protected void describeDynamic( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node dynamic, + CallContext context, + String uuid) + { + log.debug("StateBase.describeDynamic"); + CallMeta callMeta = context.getMeta(); + + List<Object> descibeData = getDescibeData(uuid); + if (descibeData != null) { + Iterator<Object> it = descibeData.iterator(); + + while (it.hasNext()) { + Object o = it.next(); + if ((!it.hasNext() && dataName != null)) { + appendToDynamicNode( + artCreator, creator, document, dynamic, callMeta, o); + } + } + } + } + + + protected void describeStatic( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node staticNode, + CallContext context, + String uuid) + { + State parent = getParent(); + if (parent != null && parent instanceof StateBase) { + ((StateBase) parent).describeStatic( + artCreator, creator, document, staticNode, context, uuid); + } + + CallMeta callMeta = context.getMeta(); + String inputKey = findNewValue(); + appendToStaticNode( + artCreator, creator, document, staticNode, callMeta, inputKey); + } protected void appendToStaticNode( @@ -629,75 +765,55 @@ Document document, Node staticNode, CallMeta callMeta, - Object o + String inputKey ) { - if (o instanceof Collection<?>) { - String name = null; - boolean multiselect = false; - if (o instanceof NamedCollection<?>) { - NamedCollection<?> nc = ((NamedCollection<?>) o); - name = nc.getName(); - multiselect = nc.isMultiSelect(); - } else { - Object[] names = this.inputValueNames.toArray(); - name = names[names.length - 1].toString(); - } - - Element selectNode = creator.create(multiselect?"select":"select1"); - creator.addAttr(selectNode, "ref", name); - - Element lableNode = creator.create("label"); - lableNode.setTextContent(RessourceFactory.getInstance() - .getRessource(callMeta.getLanguages(), name, name)); - Element choiceNode = creator.create("choices"); - - Collection<KeyValueDescibeData> values = (Collection<KeyValueDescibeData>) o; - Iterator<KeyValueDescibeData> resultIt = values.iterator(); - while (resultIt.hasNext()) { - KeyValueDescibeData result = resultIt.next(); - - if (result.isSelected()) { - artCreator.addAttr( - selectNode, "state", result.getState(), true - ); - - Element itemNode = creator.create("item"); + InputValue meta = inputValues.get(inputKey); + InputData data = inputData.get(inputKey); - creator.addAttr(itemNode, "selected", "true"); - - Element choiceLableNode = creator.create("label"); - choiceLableNode.setTextContent(result.getValue()); - itemNode.appendChild(choiceLableNode); - - Element choiceValueNode = creator.create("value"); - choiceValueNode.setTextContent("" + result.getKey()); - itemNode.appendChild(choiceValueNode); - choiceNode.appendChild(itemNode); - } - } - selectNode.appendChild(lableNode); - selectNode.appendChild(choiceNode); - - staticNode.appendChild(selectNode); + if (meta == null || data == null) { + return; } - else if (o instanceof MinMaxDescribeData) { - appendMinMaxDescribeData( - artCreator, - creator, - document, - staticNode, - callMeta, - o); + + boolean multiselect = meta.isMultiselect(); + + Element selectNode = creator.create(multiselect?"select":"select1"); + creator.addAttr(selectNode, "ref", inputKey); + + Element lableNode = creator.create("label"); + lableNode.setTextContent(RessourceFactory.getInstance() + .getRessource(callMeta.getLanguages(), inputKey, inputKey)); + Element choiceNode = creator.create("choices"); + + /* TODO InputData can have more than 1 value if multiselect, implement a + * loop over these values + + while (resultIt.hasNext()) { + KeyValueDescibeData result = resultIt.next(); + */ + + artCreator.addAttr( + selectNode, "state", getID(), true + ); + + Element itemNode = creator.create("item"); + + creator.addAttr(itemNode, "selected", "true"); + + Element choiceLableNode = creator.create("label"); + choiceLableNode.setTextContent(data.getValue()); + itemNode.appendChild(choiceLableNode); + + Element choiceValueNode = creator.create("value"); + choiceValueNode.setTextContent(inputKey); + itemNode.appendChild(choiceValueNode); + choiceNode.appendChild(itemNode); + /* } - else if (o instanceof SingleValueDescribeData) { - appendSingleValueDescribeData( - artCreator, - creator, - document, - staticNode, - callMeta, - o); - } + */ + selectNode.appendChild(lableNode); + selectNode.appendChild(choiceNode); + + staticNode.appendChild(selectNode); } @@ -892,7 +1008,7 @@ } return null; } - + /** * @see de.intevation.gnv.state.State#getDescibeData() */