ingo@937: package de.intevation.flys.artifacts; ingo@937: ingo@937: import java.io.File; ingo@937: import java.util.ArrayList; 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.apache.log4j.Logger; 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: import org.w3c.dom.NodeList; ingo@937: ingo@937: import de.intevation.artifacts.Artifact; ingo@937: import de.intevation.artifacts.ArtifactDatabase; ingo@937: import de.intevation.artifacts.ArtifactDatabaseException; 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.ClientProtocolUtils; ingo@937: import de.intevation.artifacts.common.utils.Config; ingo@937: import de.intevation.artifacts.common.utils.XMLUtils; ingo@937: ingo@937: ingo@937: public class CollectionMonitor implements Hook { ingo@937: ingo@937: public static final String XPATH_UUID = "/art:result/art:uuid/@art:value"; ingo@937: public static final String XPATH_HASH = "/art:result/art:hash/@art:value"; ingo@937: ingo@937: ingo@937: public class LoadArtifact { ingo@937: public String factory; ingo@937: public List parameters; ingo@937: ingo@937: public LoadArtifact(String factory) { ingo@937: this.factory = factory; ingo@937: this.parameters = new ArrayList(); ingo@937: } ingo@937: ingo@937: public void addParameter(String parameter) { ingo@937: parameters.add(parameter); ingo@937: } ingo@937: } // end of class LoadArtifact ingo@937: ingo@937: ingo@937: public static final String XPATH_STATES = "output-defaults/state"; ingo@937: ingo@937: ingo@937: protected Map> states; ingo@937: ingo@937: ingo@937: private static final Logger logger = ingo@937: Logger.getLogger(CollectionMonitor.class); ingo@937: ingo@937: ingo@937: @Override ingo@937: public void setup(Node cfg) { ingo@937: Element config = (Element) cfg; ingo@937: String xlink = config.getAttribute("xlink:href"); ingo@937: xlink = Config.replaceConfigDir(xlink); ingo@937: ingo@937: File file = new File(xlink); ingo@937: ingo@937: if (file == null || !file.exists()) { ingo@937: logger.error("The config file '" + xlink + "' does not exist."); ingo@937: return; ingo@937: } ingo@937: ingo@937: Document outputDefaults = XMLUtils.parseDocument(file); ingo@937: ingo@937: NodeList states = (NodeList) XMLUtils.xpath( ingo@937: outputDefaults, ingo@937: XPATH_STATES, ingo@937: XPathConstants.NODESET); ingo@937: ingo@937: int len = states != null ? states.getLength() : 0; ingo@937: ingo@937: this.states = new HashMap>(len); ingo@937: ingo@937: for (int i = 0; i < len; i++) { ingo@937: Element state = (Element) states.item(i); ingo@937: ingo@937: String stateId = state.getAttribute("id"); ingo@937: List artifacts = parseLoadArtifacts(state); ingo@937: ingo@937: if (artifacts != null) { ingo@937: this.states.put(stateId, artifacts); ingo@937: } ingo@937: } ingo@937: } ingo@937: ingo@937: ingo@937: protected List parseLoadArtifacts(Element state) { ingo@937: NodeList artifacts = (NodeList) XMLUtils.xpath( ingo@937: state, "artifact", XPathConstants.NODESET); ingo@937: ingo@937: int len = artifacts != null ? artifacts.getLength() : 0; ingo@937: ingo@937: List loadArtifacts = new ArrayList(len); ingo@937: ingo@937: for (int i = 0; i < len; i++) { ingo@937: LoadArtifact la = parseLoadArtifact((Element) artifacts.item(i)); ingo@937: ingo@937: if (la != null) { ingo@937: loadArtifacts.add(la); ingo@937: } ingo@937: } ingo@937: ingo@937: return loadArtifacts; ingo@937: } ingo@937: ingo@937: ingo@937: protected LoadArtifact parseLoadArtifact(Element art) { ingo@937: String factory = art.getAttribute("factory"); ingo@937: ingo@937: LoadArtifact artifact = new LoadArtifact(factory); ingo@937: ingo@937: NodeList parameters = (NodeList) XMLUtils.xpath( ingo@937: art, "parameter", XPathConstants.NODESET); ingo@937: ingo@937: int len = parameters != null ? parameters.getLength() : 0; ingo@937: ingo@937: for (int i = 0; i < len; i++) { ingo@937: Element parameter = (Element) parameters.item(i); ingo@937: artifact.addParameter(parameter.getAttribute("name")); ingo@937: } ingo@937: ingo@937: return artifact; ingo@937: } ingo@937: ingo@937: ingo@937: @Override ingo@937: public void execute(Artifact artifact, CallContext context) { ingo@937: FLYSArtifact flys = (FLYSArtifact) artifact; ingo@937: ingo@937: String stateId = flys.getCurrentStateId(); ingo@937: ingo@937: List loadArtifacts = states.get(stateId); ingo@937: ingo@937: if (loadArtifacts == null || loadArtifacts.isEmpty()) { ingo@937: return; ingo@937: } ingo@937: ingo@937: ArtifactDatabase db = context.getDatabase(); ingo@937: List uuids = new ArrayList(); ingo@937: ingo@937: for (LoadArtifact rawArtifact: loadArtifacts) { ingo@937: String[] art = createArtifact(db, context, rawArtifact); ingo@937: ingo@937: if (art != null && art.length >= 2) { ingo@937: Document feed = prepareFeed( ingo@937: artifact, rawArtifact, art[0], art[1]); ingo@937: ingo@937: boolean success = initializeArtifact(db, context, feed, art[0]); ingo@937: ingo@937: if (success) { ingo@937: uuids.add(art[0]); ingo@937: } ingo@937: } ingo@937: } ingo@937: ingo@937: // TODO ADD UUIDS TO DESCRIBE ingo@937: } ingo@937: ingo@937: ingo@937: protected String[] createArtifact( ingo@937: ArtifactDatabase db, ingo@937: CallContext cc, ingo@937: LoadArtifact raw) ingo@937: { ingo@937: Document create = ClientProtocolUtils.newCreateDocument(raw.factory); ingo@937: ingo@937: try { ingo@937: Document result = db.createArtifactWithFactory( ingo@937: raw.factory, cc.getMeta(), create); ingo@937: ingo@937: String uuid = XMLUtils.xpathString( ingo@937: result, XPATH_UUID, ArtifactNamespaceContext.INSTANCE); ingo@937: String hash = XMLUtils.xpathString( ingo@937: result, XPATH_HASH, ArtifactNamespaceContext.INSTANCE); ingo@937: ingo@937: return new String[] {uuid, hash}; ingo@937: } ingo@937: catch (ArtifactDatabaseException ade) { ingo@937: logger.error(ade, ade); ingo@937: } ingo@937: ingo@937: return null; ingo@937: } ingo@937: ingo@937: ingo@937: protected Document prepareFeed( ingo@937: Artifact artifact, ingo@937: LoadArtifact rawArtifact, ingo@937: String uuid, ingo@937: String hash) ingo@937: { ingo@937: FLYSArtifact flys = (FLYSArtifact) artifact; ingo@937: ingo@937: String[][] data = new String[rawArtifact.parameters.size()][2]; ingo@937: ingo@937: for (int i = 0, len = rawArtifact.parameters.size(); i < len; i++) { ingo@937: String param = rawArtifact.parameters.get(i); ingo@937: String value = flys.getDataAsString(param); ingo@937: ingo@937: if (value != null) { ingo@937: data[i][0] = param; ingo@937: data[i][1] = value; ingo@937: } ingo@937: } ingo@937: ingo@937: return ClientProtocolUtils.newFeedDocument(uuid, hash, data); ingo@937: } ingo@937: ingo@937: ingo@937: protected boolean initializeArtifact( ingo@937: ArtifactDatabase db, ingo@937: CallContext cc, ingo@937: Document feed, ingo@937: String uuid) ingo@937: { ingo@937: try { ingo@937: db.feed(uuid, feed, cc.getMeta()); ingo@937: ingo@937: return true; ingo@937: } ingo@937: catch (ArtifactDatabaseException adbe) { ingo@937: logger.error(adbe, adbe); ingo@937: } ingo@937: ingo@937: return false; ingo@937: } ingo@937: } ingo@937: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :