changeset 7048:a43137dfdcac generator-refactoring

Simple interpolation logic for diagram titles and subtitles.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 19 Sep 2013 10:57:47 +0200
parents 6ab1464021ae
children 165ea04b1545
files artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java
diffstat 1 files changed, 126 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java	Wed Sep 18 17:13:17 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java	Thu Sep 19 10:57:47 2013 +0200
@@ -18,11 +18,16 @@
 
 import org.apache.log4j.Logger;
 
+import org.dive4elements.artifacts.CallContext;
+
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.artifacts.D4EArtifact;
+
 public class DiagramAttributes
 {
     private static Logger log = Logger.getLogger(DiagramAttributes.class);
 
-    public class AxisAttributes {
+    public static class AxisAttributes {
         // TODO: More Attributes
         private String name;
 
@@ -38,7 +43,7 @@
         }
     } // class AxisAttributes
 
-    public class AxisProcessor {
+    public static class AxisProcessor {
         private Processor processor;
         private String axisName;
 
@@ -59,9 +64,92 @@
         }
     } // class AxisProcessor
 
+    public static class Argument {
+        private String expression;
+        private String type;
+
+        public Argument() {
+        }
+
+        public Argument(String expression, String type) {
+            this.expression = expression;
+            this.type = type;
+        }
+
+        public Object evaluate(D4EArtifact artifact, CallContext context) {
+            if (expression.startsWith("artifact.")) {
+                String value = artifact.getDataAsString(
+                    expression.substring("artifact.".length()));
+                return convert(value);
+            }
+            if (expression.startsWith("context.")) {
+                return context.getContextValue(
+                    expression.substring("context.".length()));
+            }
+            return expression;
+        }
+
+        private Object convert(String value) {
+            if (value == null || type == null) {
+                return value;
+            }
+            if ("double".equals(type)) {
+                return Double.valueOf(value);
+            }
+            if ("int".equals(type)) {
+                return Integer.valueOf(value);
+            }
+            // TODO: more types
+            return value;
+        }
+    } // class Argument
+
+    public static class Title {
+
+        private String key;
+        private String def;
+        private List<Argument> arguments;
+
+        public Title() {
+            arguments = new ArrayList<Argument>(5);
+        }
+
+        public Title(String key) {
+            this(key, key);
+        }
+
+        public Title(String key, String def) {
+            this();
+            this.key = key;
+            this.def = def;
+        }
+
+        public String getKey() {
+            return key;
+        }
+
+        public void addArgument(Argument argument) {
+            arguments.add(argument);
+        }
+
+        public String evalute(D4EArtifact artifact, CallContext context) {
+            if (key == null || key.isEmpty()) {
+                return def;
+            }
+            Object [] args = new Object[arguments.size()];
+            for (int i = 0; i < args.length; ++i) {
+                args[i] = arguments.get(i).evaluate(artifact, context);
+            }
+            return Resources.getMsg(context.getMeta(), key, def, args);
+        }
+    } // class Title
+
     private List<AxisAttributes> axesAttrs;
     private List<AxisProcessor> axesProcessors;
 
+    private Title title;
+    private Title subtitle;
+
     public DiagramAttributes() {
         axesAttrs      = new ArrayList<AxisAttributes>(5);
         axesProcessors = new ArrayList<AxisProcessor>(5);
@@ -71,6 +159,7 @@
         this();
         parseAxis(config);
         parseProcessors(config);
+        parseTitle(config);
     }
 
     private void parseAxis(Element config) {
@@ -89,6 +178,14 @@
         return axesProcessors;
     }
 
+    public Title getTitle() {
+        return title;
+    }
+
+    public Title getSubtitle() {
+        return subtitle;
+    }
+
     private void parseProcessors(Element config) {
         NodeList processorNodes = config.getElementsByTagName("processor");
 
@@ -119,5 +216,32 @@
             }
         }
     }
+
+    private void parseTitle(Element config) {
+        title = extractTitle(config, "title");
+    }
+
+    private void parseSubtitle(Element config) {
+        subtitle = extractTitle(config, "subtitle");
+    }
+
+    private static Title extractTitle(Element config, String tagName) {
+        NodeList titleNodes = config.getElementsByTagName(tagName);
+        if (titleNodes.getLength() < 1) {
+            return null;
+        }
+        Element titleElement = (Element)titleNodes.item(0);
+        String key = titleElement.getAttribute("key");
+        String def = titleElement.getAttribute("default");
+        Title title = new Title(key, def);
+        NodeList argumentNodes = titleElement.getElementsByTagName("arg");
+        for (int i = 0, N = argumentNodes.getLength(); i < N; ++i) {
+            Element argumentElement = (Element)argumentNodes.item(i);
+            String expression = argumentElement.getAttribute("expr");
+            String type = argumentElement.getAttribute("type");
+            title.addArgument(new Argument(expression, type));
+        }
+        return title;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org