# HG changeset patch # User Sascha L. Teichmann # Date 1383130749 -3600 # Node ID 5cddf115b27be5081340b3d81a5a93c57e7638cb # Parent 4b29bb2c785f542bebb207b2445a3806edc94a74# Parent 5b5a2cc8210f5de3c2fb6ff54fdcc53076c0f2b4 Merged diff -r 5b5a2cc8210f -r 5cddf115b27b artifacts/src/main/java/org/dive4elements/river/artifacts/CollectionMonitor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/CollectionMonitor.java Tue Oct 29 19:59:59 2013 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/CollectionMonitor.java Wed Oct 30 11:59:09 2013 +0100 @@ -12,18 +12,16 @@ import java.util.List; import java.util.Map; -import javax.xml.xpath.XPathConstants; - import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import org.dive4elements.artifacts.Artifact; import org.dive4elements.artifacts.ArtifactNamespaceContext; import org.dive4elements.artifacts.CallContext; import org.dive4elements.artifacts.Hook; -import org.dive4elements.artifacts.common.utils.XMLUtils; import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; import org.dive4elements.artifactdatabase.state.Output; @@ -33,9 +31,6 @@ /** Monitors collection changes. */ public class CollectionMonitor implements Hook { - public static final String XPATH_RESULT = "/art:result"; - - @Override public void setup(Node cfg) { } @@ -51,11 +46,14 @@ return; } - Element result = (Element) XMLUtils.xpath( - doc, - XPATH_RESULT, - XPathConstants.NODE, - ArtifactNamespaceContext.INSTANCE); + NodeList results = doc.getElementsByTagNameNS( + ArtifactNamespaceContext.NAMESPACE_URI, "result"); + + if (results.getLength() < 1) { + return; + } + + Element result = (Element)results.item(0); ElementCreator creator = new ElementCreator( doc, @@ -63,7 +61,6 @@ ArtifactNamespaceContext.NAMESPACE_PREFIX); Element recommended = creator.create("recommended-artifacts"); - result.appendChild(recommended); String[] outs = extractOutputNames(flys, context); Map params = getNoneUserSpecificParameters(flys, context); @@ -73,6 +70,8 @@ // TODO For newer official-lines recommendations we actually // need user-id (null here). rec.recommend(flys, null, outs, params, recommended); + + result.appendChild(recommended); } diff -r 5b5a2cc8210f -r 5cddf115b27b artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java Tue Oct 29 19:59:59 2013 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java Wed Oct 30 11:59:09 2013 +0100 @@ -77,20 +77,26 @@ } public void addDensity(double km, double density, int year) { + logger.debug("adding " + year); - if (this.densities.containsKey(year)) { - List list = this.densities.get(year); - list.add(new SedimentDensityValue(km, density, year)); + + Integer key = Integer.valueOf(year); + + List list = densities.get(key); + + if (list == null) { + list = new ArrayList(); + densities.put(key, list); } - else { - List list = - new ArrayList(); - list.add(new SedimentDensityValue(km, density, year)); - densities.put(year, list); - } - if (!this.years.contains(new Integer(year))) { + + list.add(new SedimentDensityValue(km, density, year)); + + // XXX: Why do we store a redundant list of years, too? + // Years are the keys of densities so they can be easily + // accessed by their key set! + if (!years.contains(key)) { logger.debug("new year"); - years.add(new Integer(year)); + years.add(key); } } diff -r 5b5a2cc8210f -r 5cddf115b27b artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java Tue Oct 29 19:59:59 2013 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java Wed Oct 30 11:59:09 2013 +0100 @@ -522,7 +522,7 @@ SedimentDensityFactory.getSedimentDensity(river, kmLow, kmUp, year); for (double km: load.getKms()) { - double dens = density.getDensity(km, year); + double dens = 1d/density.getDensity(km, year); SedimentLoadFraction fraction = load.getFraction(km); double coarse = fraction.getCoarse(); double fineMiddle = fraction.getFineMiddle(); diff -r 5b5a2cc8210f -r 5cddf115b27b gwt-client/src/main/java/org/dive4elements/river/client/server/MetaDataServiceImpl.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/server/MetaDataServiceImpl.java Tue Oct 29 19:59:59 2013 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/MetaDataServiceImpl.java Wed Oct 30 11:59:09 2013 +0100 @@ -28,6 +28,8 @@ import org.dive4elements.artifacts.httpclient.http.HttpClient; import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.river.client.shared.model.AttrList; +import org.dive4elements.river.client.shared.model.DataCageNode; import org.dive4elements.river.client.shared.model.DataCageTree; import org.dive4elements.river.client.server.meta.Converter; @@ -38,7 +40,7 @@ */ public class MetaDataServiceImpl extends RemoteServiceServlet -implements MetaDataService +implements MetaDataService, DataCageTree.Visitor { /** Our very own logger. */ private static final Logger logger = @@ -48,6 +50,12 @@ "error_no_meta_data_found"; + @Override + public boolean accept(DataCageNode node) { + AttrList al = node.getAttributes(); + return al != null && al.hasAttribute("factory"); + } + /** * @param locale needed for i18n. * @param artifactId ID of masterartifact (can be null) @@ -109,7 +117,9 @@ try { Converter converter = new Converter(); - return converter.convert(client.callService(url, "metadata", doc)); + DataCageTree tree = converter.convert(client.callService(url, "metadata", doc)); + tree.prune(this); + return tree; } catch (ConnectionException ce) { ce.printStackTrace(); diff -r 5b5a2cc8210f -r 5cddf115b27b gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttrList.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttrList.java Tue Oct 29 19:59:59 2013 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttrList.java Wed Oct 30 11:59:09 2013 +0100 @@ -41,5 +41,14 @@ keyValues.add(key); keyValues.add(value); } + + public boolean hasAttribute(String key) { + for (int i = 0, N = keyValues.size(); i < N; i += 2) { + if (keyValues.get(i).equals(key)) { + return true; + } + } + return false; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 5b5a2cc8210f -r 5cddf115b27b gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DataCageNode.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DataCageNode.java Tue Oct 29 19:59:59 2013 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DataCageNode.java Wed Oct 30 11:59:09 2013 +0100 @@ -63,5 +63,9 @@ public AttrList getAttributes() { return attrs; } + + public boolean hasChildren() { + return children != null && !children.isEmpty(); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 5b5a2cc8210f -r 5cddf115b27b gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DataCageTree.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DataCageTree.java Tue Oct 29 19:59:59 2013 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DataCageTree.java Wed Oct 30 11:59:09 2013 +0100 @@ -9,9 +9,15 @@ package org.dive4elements.river.client.shared.model; import java.io.Serializable; +import java.util.List; public class DataCageTree implements Serializable { + + public interface Visitor { + boolean accept(DataCageNode node); + } // interface + protected DataCageNode root; public DataCageTree() { @@ -28,5 +34,28 @@ public DataCageNode getRoot() { return root; } + + + protected boolean recursivePrune(DataCageNode node, Visitor visitor) { + if (!node.hasChildren()) { + return visitor.accept(node); + } + + List children = node.getChildren(); + + for (int i = children.size()-1; i >= 0; --i) { + if (!recursivePrune(children.get(i), visitor)) { + children.remove(i); + } + } + + return !children.isEmpty(); + } + + public boolean prune(Visitor visitor) { + return root == null || !root.hasChildren() + ? true + : recursivePrune(root, visitor); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :