ingo@937: package de.intevation.flys.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: 
ingo@937: import de.intevation.artifacts.Artifact;
ingo@937: import de.intevation.artifacts.ArtifactNamespaceContext;
ingo@937: import de.intevation.artifacts.CallContext;
ingo@937: import de.intevation.artifacts.Hook;
ingo@937: 
ingo@937: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@940: import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
ingo@937: 
ingo@964: import de.intevation.artifactdatabase.state.Output;
ingo@964: 
sascha@1015: import de.intevation.flys.artifacts.datacage.Recommendations;
ingo@937: 
ingo@937: public class CollectionMonitor implements Hook {
ingo@937: 
ingo@940:     public static final String XPATH_RESULT = "/art:result";
ingo@937: 
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) {
ingo@937:         FLYSArtifact flys = (FLYSArtifact) artifact;
ingo@937: 
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<String, Object> 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(
ingo@964:         FLYSArtifact flys,
ingo@964:         CallContext  context)
ingo@964:     {
raimund@2132:         if (flys instanceof ChartArtifact) {
raimund@2132:             return new String[0];
raimund@2132:         }
raimund@2132: 
felix@1834:         List<Output>  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: 
sascha@998:     protected Map<String, Object> getNoneUserSpecificParameters(
ingo@964:         FLYSArtifact flys,
ingo@964:         CallContext  context)
ingo@964:     {
ingo@964:         Map<String, Object> params = new HashMap<String, Object>(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 :