sascha@372: package de.intevation.flys.artifacts.services; sascha@372: sascha@372: import java.sql.Connection; sascha@372: import java.sql.SQLException; sascha@372: sascha@372: import org.w3c.dom.Document; sascha@372: sascha@372: import org.apache.log4j.Logger; sascha@372: sascha@415: import java.util.Map; sascha@415: import java.util.HashMap; sascha@415: sascha@970: import de.intevation.artifacts.Artifact; sascha@372: import de.intevation.artifacts.CallMeta; sascha@966: import de.intevation.artifacts.GlobalContext; sascha@970: import de.intevation.artifacts.ArtifactDatabase; sascha@970: import de.intevation.artifacts.ArtifactDatabaseException; sascha@372: sascha@372: import de.intevation.artifactdatabase.DefaultService; sascha@372: sascha@372: import de.intevation.artifacts.common.utils.XMLUtils; sascha@970: import de.intevation.artifacts.common.utils.StringUtils; sascha@372: sascha@421: import de.intevation.artifacts.common.ArtifactNamespaceContext; sascha@421: sascha@372: import de.intevation.flys.artifacts.services.meta.Builder; sascha@950: import de.intevation.flys.artifacts.services.meta.DataCage; sascha@372: sascha@970: import de.intevation.flys.artifacts.FLYSArtifact; sascha@970: sascha@372: import de.intevation.flys.backend.SessionHolder; sascha@372: sascha@372: import org.hibernate.Session; sascha@372: sascha@372: import org.hibernate.jdbc.Work; sascha@372: sascha@372: public class MetaDataService sascha@372: extends DefaultService sascha@372: { sascha@372: private static Logger log = Logger.getLogger(MetaDataService.class); sascha@372: sascha@969: // old service. To be removed sascha@421: public static final String XPATH_RIVER = "/art:river/text()"; sascha@415: sascha@974: public static final String XPATH_UUID = "/art:meta/art:uuid/@value"; sascha@974: public static final String XPATH_OUTS = "/art:meta/art:outs/@value"; sascha@974: public static final String XPATH_PARAMETERS = "/art:meta/art:parameters/@value"; sascha@974: public static final String XPATH_FILTERS = "/art:meta/art:filters/@value"; sascha@970: sascha@970: /** The global context key of the artifact database */ sascha@970: public static final String ARTIFACT_DATA_BASE_KEY = sascha@970: "global.artifact.database"; sascha@969: sascha@372: public MetaDataService() { sascha@372: } sascha@372: sascha@415: protected static Map extractParameters(Document data) { sascha@415: HashMap parameters = new HashMap(); sascha@415: sascha@421: String river = XMLUtils.xpathString( sascha@421: data, XPATH_RIVER, ArtifactNamespaceContext.INSTANCE); sascha@415: sascha@415: if (river == null || (river = river.trim()).length() == 0) { sascha@415: river = "%"; // matches all rivers sascha@415: } sascha@415: sascha@415: parameters.put("river", river); sascha@415: sascha@415: return parameters; sascha@415: } sascha@415: sascha@970: /** The old service. To be removed. */ sascha@970: protected Document oldService(Document data) { sascha@372: sascha@372: final Document result = XMLUtils.newDocument(); sascha@372: sascha@950: final Builder builder = DataCage.getInstance().getBuilder(); sascha@950: sascha@372: if (builder == null) { sascha@372: log.error("MetaDataService is not setup properly."); sascha@372: return result; sascha@372: } sascha@372: sascha@415: final Map parameters = extractParameters(data); sascha@415: sascha@372: Session session = SessionHolder.acquire(); sascha@372: try { sascha@372: session.doWork(new Work() { sascha@372: @Override sascha@372: public void execute(Connection connection) sascha@372: throws SQLException sascha@372: { sascha@372: log.debug("MetaDataService.execute"); sascha@415: builder.build(connection, result, parameters); sascha@372: } sascha@372: }); sascha@372: } sascha@372: finally { sascha@372: session.close(); sascha@372: SessionHolder.release(); sascha@372: } sascha@372: sascha@372: return result; sascha@372: } sascha@970: sascha@974: protected static Map parameters( sascha@974: String parameters, sascha@974: Map data sascha@974: ) { sascha@974: if (parameters != null) { sascha@974: String [] parts = parameters.split("\\s*;\\s*"); sascha@974: for (String part: parts) { sascha@974: String [] kv = part.split("\\s*:\\s*"); sascha@974: if (kv.length < 2 || (kv[0] = kv[0].trim()).length() == 0) { sascha@974: continue; sascha@974: } sascha@974: String [] values = kv[1].split("\\s*,\\s*"); sascha@974: data.put(kv[0], values.length == 1 ? values[0] : values); sascha@974: } sascha@974: } sascha@974: return data; sascha@974: } sascha@974: sascha@974: protected static Map filters( sascha@974: String filters, sascha@974: Map data sascha@974: ) { sascha@974: if (filters != null) { sascha@974: for (String filter: filters.split("\\s*,\\*s")) { sascha@974: data.put(filter, "true"); sascha@974: } sascha@974: } sascha@974: return data; sascha@974: } sascha@974: sascha@970: protected Document newService( sascha@970: String uuid, sascha@970: String outsString, sascha@974: String parameters, sascha@970: String filters, sascha@970: GlobalContext globalContext sascha@970: ) { sascha@970: Document result = XMLUtils.newDocument(); sascha@970: sascha@974: FLYSArtifact flysArtifact; sascha@970: sascha@974: log.debug("uuid: " + uuid); sascha@974: log.debug("outs: " + outsString); sascha@974: log.debug("filters: " + filters); sascha@970: sascha@974: if (uuid != null && uuid.length() != 0) { sascha@974: if (!StringUtils.checkUUID(uuid)) { sascha@974: log.warn("'" + uuid + "' is not a UUID"); sascha@974: return result; sascha@974: } sascha@974: sascha@974: Object dbObject = sascha@974: (ArtifactDatabase)globalContext.get(ARTIFACT_DATA_BASE_KEY); sascha@974: sascha@974: if (!(dbObject instanceof ArtifactDatabase)) { sascha@974: log.error("Cannot find artifact database"); sascha@974: return result; sascha@974: } sascha@974: sascha@974: ArtifactDatabase db = (ArtifactDatabase)dbObject; sascha@974: sascha@974: Artifact artifact; sascha@974: sascha@974: try { sascha@974: artifact = db.getRawArtifact(uuid); sascha@974: } sascha@974: catch (ArtifactDatabaseException adbe) { sascha@974: log.warn("fetching artifact failed", adbe); sascha@974: return result; sascha@974: } sascha@974: sascha@974: if (!(artifact instanceof FLYSArtifact)) { sascha@974: log.warn("artifact is not a FLYS artifact."); sascha@974: return result; sascha@974: } sascha@974: sascha@974: flysArtifact = (FLYSArtifact)artifact; sascha@974: } sascha@974: else { sascha@974: flysArtifact = null; sascha@970: } sascha@970: sascha@974: Map data = sascha@974: filters(filters, sascha@974: parameters(parameters, sascha@974: new HashMap())); sascha@970: sascha@970: String [] outs = outsString.split("\\s*,\\s*"); sascha@970: sascha@970: DataCage dc = DataCage.getInstance(); sascha@970: sascha@974: dc.recommend(flysArtifact, outs, data, result); sascha@970: sascha@970: return result; sascha@970: } sascha@970: sascha@970: @Override sascha@970: public Document process( sascha@970: Document data, sascha@970: GlobalContext globalContext, sascha@970: CallMeta callMeta sascha@970: ) { sascha@970: log.debug("MetaDataService.process"); sascha@970: sascha@970: String uuid = XMLUtils.xpathString( sascha@970: data, XPATH_UUID, ArtifactNamespaceContext.INSTANCE); sascha@970: sascha@970: String outs = XMLUtils.xpathString( sascha@970: data, XPATH_OUTS, ArtifactNamespaceContext.INSTANCE); sascha@970: sascha@974: String parameters = XMLUtils.xpathString( sascha@974: data, XPATH_PARAMETERS, ArtifactNamespaceContext.INSTANCE); sascha@974: sascha@970: String filters = XMLUtils.xpathString( sascha@970: data, XPATH_FILTERS, ArtifactNamespaceContext.INSTANCE); sascha@970: sascha@974: return outs != null sascha@974: ? newService(uuid, outs, parameters, filters, globalContext) sascha@970: : oldService(data); sascha@970: } sascha@372: } sascha@372: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :