teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts; ingo@937: ingo@937: import java.util.HashMap; ingo@937: import java.util.List; ingo@937: import java.util.Map; ingo@937: ingo@937: import javax.xml.xpath.XPathConstants; ingo@937: ingo@937: import org.w3c.dom.Document; ingo@937: import org.w3c.dom.Element; ingo@937: import org.w3c.dom.Node; ingo@937: teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.ArtifactNamespaceContext; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.Hook; ingo@937: teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; ingo@937: teichmann@5831: import org.dive4elements.artifactdatabase.state.Output; ingo@964: teichmann@5831: import org.dive4elements.river.artifacts.datacage.Recommendations; ingo@937: felix@5107: /** Monitors collection changes. */ ingo@937: public class CollectionMonitor implements Hook { ingo@937: ingo@940: public static final String XPATH_RESULT = "/art:result"; ingo@937: felix@5107: ingo@937: @Override ingo@937: public void setup(Node cfg) { ingo@937: } ingo@937: ingo@937: ingo@937: @Override ingo@940: public void execute(Artifact artifact, CallContext context, Document doc) { teichmann@5867: D4EArtifact flys = (D4EArtifact) artifact; ingo@937: teichmann@7434: // Do not generate recommendations for a loaded artifact. teichmann@7434: String out = flys.getBoundToOut(); teichmann@7434: if (out != null && !out.isEmpty()) { teichmann@7434: return; teichmann@7434: } teichmann@7434: ingo@940: Element result = (Element) XMLUtils.xpath( ingo@940: doc, ingo@940: XPATH_RESULT, ingo@940: XPathConstants.NODE, ingo@940: ArtifactNamespaceContext.INSTANCE); ingo@937: ingo@940: ElementCreator creator = new ElementCreator( ingo@940: doc, ingo@940: ArtifactNamespaceContext.NAMESPACE_URI, ingo@940: ArtifactNamespaceContext.NAMESPACE_PREFIX); ingo@937: ingo@940: Element recommended = creator.create("recommended-artifacts"); ingo@964: result.appendChild(recommended); ingo@937: ingo@964: String[] outs = extractOutputNames(flys, context); sascha@998: Map params = getNoneUserSpecificParameters(flys, context); ingo@940: sascha@1015: Recommendations rec = Recommendations.getInstance(); felix@3391: felix@3391: // TODO For newer official-lines recommendations we actually felix@3391: // need user-id (null here). sascha@1015: rec.recommend(flys, null, outs, params, recommended); ingo@964: } ingo@964: ingo@964: felix@1834: /** felix@1834: * Get outputnames from current state (only the ones for which felix@1834: * facets exist). felix@1834: */ ingo@964: public static String[] extractOutputNames( teichmann@5867: D4EArtifact flys, ingo@964: CallContext context) ingo@964: { raimund@2132: if (flys instanceof ChartArtifact) { raimund@2132: return new String[0]; raimund@2132: } raimund@2132: felix@4527: List outs = flys.getCurrentOutputs(context); ingo@964: sascha@1012: int num = outs == null ? 0 : outs.size(); sascha@1012: sascha@1012: String[] names = new String[num]; sascha@1012: sascha@1012: for (int i = 0; i < num; i++) { ingo@964: names[i] = outs.get(i).getName(); ingo@937: } ingo@937: ingo@964: return names; ingo@964: } ingo@964: ingo@964: felix@4527: /** felix@4527: * Creates Map from Strings "recommended" to "true". felix@4527: */ sascha@998: protected Map getNoneUserSpecificParameters( teichmann@5867: D4EArtifact flys, ingo@964: CallContext context) ingo@964: { ingo@964: Map params = new HashMap(1); ingo@964: params.put("recommended", "true"); ingo@964: ingo@964: return params; ingo@937: } ingo@937: } ingo@937: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :