Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java @ 974:30c85cb33a50
meta data service: made artifact optional and allow passing extra parameters.
flys-artifacts/trunk@2400 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 25 Jul 2011 11:05:33 +0000 |
parents | e456aca4eb7b |
children | a111f0984706 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java Sat Jul 23 18:47:08 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java Mon Jul 25 11:05:33 2011 +0000 @@ -42,9 +42,10 @@ // old service. To be removed public static final String XPATH_RIVER = "/art:river/text()"; - public static final String XPATH_UUID = "/art:uuid/@value"; - public static final String XPATH_OUTS = "/art:outs/@value"; - public static final String XPATH_FILTERS = "/art:filters/@value"; + public static final String XPATH_UUID = "/art:meta/art:uuid/@value"; + public static final String XPATH_OUTS = "/art:meta/art:outs/@value"; + public static final String XPATH_PARAMETERS = "/art:meta/art:parameters/@value"; + public static final String XPATH_FILTERS = "/art:meta/art:filters/@value"; /** The global context key of the artifact database */ public static final String ARTIFACT_DATA_BASE_KEY = @@ -102,63 +103,98 @@ return result; } + protected static Map<String, Object> parameters( + String parameters, + Map<String, Object> data + ) { + if (parameters != null) { + String [] parts = parameters.split("\\s*;\\s*"); + for (String part: parts) { + String [] kv = part.split("\\s*:\\s*"); + if (kv.length < 2 || (kv[0] = kv[0].trim()).length() == 0) { + continue; + } + String [] values = kv[1].split("\\s*,\\s*"); + data.put(kv[0], values.length == 1 ? values[0] : values); + } + } + return data; + } + + protected static Map<String, Object> filters( + String filters, + Map<String, Object> data + ) { + if (filters != null) { + for (String filter: filters.split("\\s*,\\*s")) { + data.put(filter, "true"); + } + } + return data; + } + protected Document newService( String uuid, String outsString, + String parameters, String filters, GlobalContext globalContext ) { Document result = XMLUtils.newDocument(); - if (!StringUtils.checkUUID(uuid)) { - log.warn("'" + uuid + "' is not a UUID"); - return result; - } + FLYSArtifact flysArtifact; - Object dbObject = - (ArtifactDatabase)globalContext.get(ARTIFACT_DATA_BASE_KEY); + log.debug("uuid: " + uuid); + log.debug("outs: " + outsString); + log.debug("filters: " + filters); - if (!(dbObject instanceof ArtifactDatabase)) { - log.error("Cannot find artifact database"); - return result; + if (uuid != null && uuid.length() != 0) { + if (!StringUtils.checkUUID(uuid)) { + log.warn("'" + uuid + "' is not a UUID"); + return result; + } + + Object dbObject = + (ArtifactDatabase)globalContext.get(ARTIFACT_DATA_BASE_KEY); + + if (!(dbObject instanceof ArtifactDatabase)) { + log.error("Cannot find artifact database"); + return result; + } + + ArtifactDatabase db = (ArtifactDatabase)dbObject; + + Artifact artifact; + + try { + artifact = db.getRawArtifact(uuid); + } + catch (ArtifactDatabaseException adbe) { + log.warn("fetching artifact failed", adbe); + return result; + } + + if (!(artifact instanceof FLYSArtifact)) { + log.warn("artifact is not a FLYS artifact."); + return result; + } + + flysArtifact = (FLYSArtifact)artifact; + } + else { + flysArtifact = null; } - ArtifactDatabase db = (ArtifactDatabase)dbObject; - - Artifact artifact; - - try { - artifact = db.getRawArtifact(uuid); - } - catch (ArtifactDatabaseException adbe) { - log.warn("fetching artifact failed", adbe); - return result; - } - - if (!(artifact instanceof FLYSArtifact)) { - log.warn("artifact is not a FLYS artifact."); - return result; - } - - FLYSArtifact flysArtifact = (FLYSArtifact)artifact; + Map<String, Object> data = + filters(filters, + parameters(parameters, + new HashMap<String, Object>())); String [] outs = outsString.split("\\s*,\\s*"); - - Map<String, Object> extras; - if (filters != null) { - extras = new HashMap<String, Object>(); - for (String filter: filters.split("\\s*,\\*s")) { - extras.put(filter, "true"); - } - } - else { - extras = null; - } - DataCage dc = DataCage.getInstance(); - dc.recommend(flysArtifact, outs, extras, result); + dc.recommend(flysArtifact, outs, data, result); return result; } @@ -177,11 +213,14 @@ String outs = XMLUtils.xpathString( data, XPATH_OUTS, ArtifactNamespaceContext.INSTANCE); + String parameters = XMLUtils.xpathString( + data, XPATH_PARAMETERS, ArtifactNamespaceContext.INSTANCE); + String filters = XMLUtils.xpathString( data, XPATH_FILTERS, ArtifactNamespaceContext.INSTANCE); - return uuid != null && outs != null - ? newService(uuid, outs, filters, globalContext) + return outs != null + ? newService(uuid, outs, parameters, filters, globalContext) : oldService(data); } }