Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java @ 937:9e813e9137a5
Added a monitor that creates new artifacts for default themes in charts and maps.
flys-artifacts/trunk@2329 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 14 Jul 2011 11:27:01 +0000 |
parents | |
children | f4439e015278 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java Thu Jul 14 11:27:01 2011 +0000 @@ -0,0 +1,239 @@ +package de.intevation.flys.artifacts; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactDatabase; +import de.intevation.artifacts.ArtifactDatabaseException; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.Hook; + +import de.intevation.artifacts.common.utils.ClientProtocolUtils; +import de.intevation.artifacts.common.utils.Config; +import de.intevation.artifacts.common.utils.XMLUtils; + + +public class CollectionMonitor implements Hook { + + public static final String XPATH_UUID = "/art:result/art:uuid/@art:value"; + public static final String XPATH_HASH = "/art:result/art:hash/@art:value"; + + + public class LoadArtifact { + public String factory; + public List<String> parameters; + + public LoadArtifact(String factory) { + this.factory = factory; + this.parameters = new ArrayList<String>(); + } + + public void addParameter(String parameter) { + parameters.add(parameter); + } + } // end of class LoadArtifact + + + public static final String XPATH_STATES = "output-defaults/state"; + + + protected Map<String, List<LoadArtifact>> states; + + + private static final Logger logger = + Logger.getLogger(CollectionMonitor.class); + + + @Override + public void setup(Node cfg) { + Element config = (Element) cfg; + String xlink = config.getAttribute("xlink:href"); + xlink = Config.replaceConfigDir(xlink); + + File file = new File(xlink); + + if (file == null || !file.exists()) { + logger.error("The config file '" + xlink + "' does not exist."); + return; + } + + Document outputDefaults = XMLUtils.parseDocument(file); + + NodeList states = (NodeList) XMLUtils.xpath( + outputDefaults, + XPATH_STATES, + XPathConstants.NODESET); + + int len = states != null ? states.getLength() : 0; + + this.states = new HashMap<String, List<LoadArtifact>>(len); + + for (int i = 0; i < len; i++) { + Element state = (Element) states.item(i); + + String stateId = state.getAttribute("id"); + List<LoadArtifact> artifacts = parseLoadArtifacts(state); + + if (artifacts != null) { + this.states.put(stateId, artifacts); + } + } + } + + + protected List<LoadArtifact> parseLoadArtifacts(Element state) { + NodeList artifacts = (NodeList) XMLUtils.xpath( + state, "artifact", XPathConstants.NODESET); + + int len = artifacts != null ? artifacts.getLength() : 0; + + List<LoadArtifact> loadArtifacts = new ArrayList<LoadArtifact>(len); + + for (int i = 0; i < len; i++) { + LoadArtifact la = parseLoadArtifact((Element) artifacts.item(i)); + + if (la != null) { + loadArtifacts.add(la); + } + } + + return loadArtifacts; + } + + + protected LoadArtifact parseLoadArtifact(Element art) { + String factory = art.getAttribute("factory"); + + LoadArtifact artifact = new LoadArtifact(factory); + + NodeList parameters = (NodeList) XMLUtils.xpath( + art, "parameter", XPathConstants.NODESET); + + int len = parameters != null ? parameters.getLength() : 0; + + for (int i = 0; i < len; i++) { + Element parameter = (Element) parameters.item(i); + artifact.addParameter(parameter.getAttribute("name")); + } + + return artifact; + } + + + @Override + public void execute(Artifact artifact, CallContext context) { + FLYSArtifact flys = (FLYSArtifact) artifact; + + String stateId = flys.getCurrentStateId(); + + List<LoadArtifact> loadArtifacts = states.get(stateId); + + if (loadArtifacts == null || loadArtifacts.isEmpty()) { + return; + } + + ArtifactDatabase db = context.getDatabase(); + List<String> uuids = new ArrayList<String>(); + + for (LoadArtifact rawArtifact: loadArtifacts) { + String[] art = createArtifact(db, context, rawArtifact); + + if (art != null && art.length >= 2) { + Document feed = prepareFeed( + artifact, rawArtifact, art[0], art[1]); + + boolean success = initializeArtifact(db, context, feed, art[0]); + + if (success) { + uuids.add(art[0]); + } + } + } + + // TODO ADD UUIDS TO DESCRIBE + } + + + protected String[] createArtifact( + ArtifactDatabase db, + CallContext cc, + LoadArtifact raw) + { + Document create = ClientProtocolUtils.newCreateDocument(raw.factory); + + try { + Document result = db.createArtifactWithFactory( + raw.factory, cc.getMeta(), create); + + String uuid = XMLUtils.xpathString( + result, XPATH_UUID, ArtifactNamespaceContext.INSTANCE); + String hash = XMLUtils.xpathString( + result, XPATH_HASH, ArtifactNamespaceContext.INSTANCE); + + return new String[] {uuid, hash}; + } + catch (ArtifactDatabaseException ade) { + logger.error(ade, ade); + } + + return null; + } + + + protected Document prepareFeed( + Artifact artifact, + LoadArtifact rawArtifact, + String uuid, + String hash) + { + FLYSArtifact flys = (FLYSArtifact) artifact; + + String[][] data = new String[rawArtifact.parameters.size()][2]; + + for (int i = 0, len = rawArtifact.parameters.size(); i < len; i++) { + String param = rawArtifact.parameters.get(i); + String value = flys.getDataAsString(param); + + if (value != null) { + data[i][0] = param; + data[i][1] = value; + } + } + + return ClientProtocolUtils.newFeedDocument(uuid, hash, data); + } + + + protected boolean initializeArtifact( + ArtifactDatabase db, + CallContext cc, + Document feed, + String uuid) + { + try { + db.feed(uuid, feed, cc.getMeta()); + + return true; + } + catch (ArtifactDatabaseException adbe) { + logger.error(adbe, adbe); + } + + return false; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :