# HG changeset patch # User Sascha L. Teichmann # Date 1305031392 0 # Node ID 7c018f466d6dcb10165b6c62f6e53c96ea494331 # Parent 0385bcc4229afdaf2b0fcbdcb5b1af89f9993557 Datacage: Added river parameter to meta data services. flys-artifacts/trunk@1879 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 0385bcc4229a -r 7c018f466d6d flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Tue May 10 12:19:17 2011 +0000 +++ b/flys-artifacts/ChangeLog Tue May 10 12:43:12 2011 +0000 @@ -1,3 +1,22 @@ +2011-05-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Fetches river name from incoming XML document. If no river is given all + infos about all rivers are listed. + + * src/main/resources/metadata/template.xml: Templates honors the 'river' + parameter. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Extended to pass parameters to the templating. Added support for + type conversion. + + * src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java: + Take parameters as an initial stack frame. + + * src/main/java/de/intevation/flys/artifacts/services/meta/TypeConverter.java: + New. Converts types off stacked variables. + 2011-05-10 Ingo Weinzierl * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added a diff -r 0385bcc4229a -r 7c018f466d6d flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java Tue May 10 12:19:17 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java Tue May 10 12:43:12 2011 +0000 @@ -10,6 +10,9 @@ import org.apache.log4j.Logger; +import java.util.Map; +import java.util.HashMap; + import de.intevation.artifacts.CallMeta; import de.intevation.artifacts.ServiceFactory; @@ -30,6 +33,8 @@ { private static Logger log = Logger.getLogger(MetaDataService.class); + public static final String XPATH_RIVER = "//river/@name"; + public static final String META_DATA_TEMPLATE = "/metadata/template.xml"; protected Builder builder; @@ -37,6 +42,20 @@ public MetaDataService() { } + protected static Map extractParameters(Document data) { + HashMap parameters = new HashMap(); + + String river = XMLUtils.xpathString(data, XPATH_RIVER, null); + + if (river == null || (river = river.trim()).length() == 0) { + river = "%"; // matches all rivers + } + + parameters.put("river", river); + + return parameters; + } + @Override public Document process( Document data, @@ -52,6 +71,8 @@ return result; } + final Map parameters = extractParameters(data); + Session session = SessionHolder.acquire(); try { session.doWork(new Work() { @@ -60,7 +81,7 @@ throws SQLException { log.debug("MetaDataService.execute"); - builder.build(connection, result); + builder.build(connection, result, parameters); } }); } diff -r 0385bcc4229a -r 7c018f466d6d flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java Tue May 10 12:19:17 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java Tue May 10 12:43:12 2011 +0000 @@ -26,24 +26,24 @@ public static final String DC_NAMESPACE_URI = "http://www.intevation.org/2011/Datacage"; - protected Document template; + protected Document template; public class BuildHelper { - protected Document output; - protected StackFrames frames; - protected Connection connection; + protected Document output; + protected StackFrames frames; + protected Connection connection; protected Map statements; - public BuildHelper() { - frames = new StackFrames(); - statements = new HashMap(); - } - - public BuildHelper(Document output, Connection connection) { - this(); + public BuildHelper( + Document output, + Connection connection, + Map parameters + ) { this.output = output; this.connection = connection; + frames = new StackFrames(parameters); + statements = new HashMap(); } public void build(List elements) throws SQLException { @@ -89,8 +89,10 @@ String stmntText = stmntNode.item(0).getTextContent(); - if (stmntText == null) { - log.warn("dc:context: no sql statement found"); + if (stmntText == null + || (stmntText = stmntText.trim()).length() == 0) { + log.warn("dc:context: no sql statement found -> ignored"); + return; } CompiledStatement cs = statements.get(stmntText); @@ -167,6 +169,19 @@ element.setAttribute(name, value); } + protected void convert(Node parent, Element current) { + + String variable = expand(current.getAttribute("var")); + String type = expand(current.getAttribute("type")); + + if (frames.containsKey(variable)) { + Object object = TypeConverter.convert( + frames.get(variable), + type); + frames.put(variable, object); + } + } + protected String expand(String s) { Matcher m = CompiledStatement.VAR.matcher(s); @@ -202,6 +217,9 @@ else if ("text".equals(localName)) { text(parent, (Element)current); } + else if ("convert".equals(localName)) { + convert(parent, (Element)current); + } else { log.warn("unknown '" + localName + "' -> ignore"); } @@ -237,16 +255,20 @@ public Document build(Connection connection) throws SQLException { - return build(connection, XMLUtils.newDocument()); + return build(connection, XMLUtils.newDocument(), null); } - public Document build(Connection connection, Document output) + public Document build( + Connection connection, + Document output, + Map parameters + ) throws SQLException { NodeList roots = template.getElementsByTagNameNS( DC_NAMESPACE_URI, "template"); - BuildHelper helper = new BuildHelper(output, connection); + BuildHelper helper = new BuildHelper(output, connection, parameters); List elements = new ArrayList(); diff -r 0385bcc4229a -r 7c018f466d6d flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java Tue May 10 12:19:17 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java Tue May 10 12:43:12 2011 +0000 @@ -13,6 +13,13 @@ frames = new ArrayList>(); } + public StackFrames(Map initialFrame) { + this(); + if (initialFrame != null) { + frames.add(new HashMap(initialFrame)); + } + } + public void enter() { frames.add(new HashMap()); } @@ -21,6 +28,13 @@ frames.remove(frames.size()-1); } + public void put(String key, Object value) { + int N = frames.size(); + if (N > 0) { + frames.get(N-1).put(key, value); + } + } + public void put(String [] keys, Object [] values) { Map top = frames.get(frames.size()-1); for (int i = 0; i < keys.length; ++i) { @@ -28,6 +42,15 @@ } } + public boolean containsKey(String key) { + for (int i = frames.size()-1; i >= 0; --i) { + if (frames.get(i).containsKey(key)) { + return true; + } + } + return false; + } + public Object get(String key) { return get(key, null); } diff -r 0385bcc4229a -r 7c018f466d6d flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/TypeConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/TypeConverter.java Tue May 10 12:43:12 2011 +0000 @@ -0,0 +1,31 @@ +package de.intevation.flys.artifacts.services.meta; + +public class TypeConverter +{ + private TypeConverter() { + } + + public static Object convert(Object object, String type) { + + if (type == null) { + return object; + } + + if ("Integer".equals(type)) { + return Integer.valueOf(object.toString()); + } + + if ("Double".equals(type)) { + return Double.valueOf(object.toString()); + } + + if ("String".equals(type)) { + return object.toString(); + } + + // TODO: Add more types + + return object; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 0385bcc4229a -r 7c018f466d6d flys-artifacts/src/main/resources/metadata/template.xml --- a/flys-artifacts/src/main/resources/metadata/template.xml Tue May 10 12:19:17 2011 +0000 +++ b/flys-artifacts/src/main/resources/metadata/template.xml Tue May 10 12:43:12 2011 +0000 @@ -4,6 +4,7 @@ SELECT id AS river_id, name as river_name FROM rivers + WHERE name ILIKE ${river}