diff artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java @ 7143:053e39436ba3

Diagrams: Determine if axis should be inverted dynamically.
author Sascha L. Teichmann <teichmann@intevation.de>
date Wed, 25 Sep 2013 12:36:19 +0200
parents 038a04e001d7
children f2ffa631c2ed
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java	Wed Sep 25 12:33:22 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java	Wed Sep 25 12:36:19 2013 +0200
@@ -30,6 +30,24 @@
 {
     private static Logger log = Logger.getLogger(DiagramAttributes.class);
 
+    public interface Evaluator {
+        Object evaluate(D4EArtifact artifact, CallContext context);
+    } // interface Evaluator
+
+    public static final Evaluator TRUE = new Evaluator() {
+        @Override
+        public Object evaluate(D4EArtifact artifact, CallContext context) {
+            return Boolean.TRUE;
+        }
+    };
+
+    public static final Evaluator FALSE = new Evaluator() {
+        @Override
+        public Object evaluate(D4EArtifact artifact, CallContext context) {
+            return Boolean.TRUE;
+        }
+    };
+
     public class Instance {
 
         private List<Processor> processors;
@@ -73,8 +91,8 @@
             return DiagramAttributes.this.getSubtitle();
         }
 
-        public Title getDomainAxisTitle() {
-            return DiagramAttributes.this.getDomainAxisTitle();
+        public DomainAxisAttributes getDomainAxis() {
+            return DiagramAttributes.this.getDomainAxis();
         }
 
         public int getAxisIndex(String axisName) {
@@ -96,19 +114,23 @@
         private boolean forceAlign;
         private boolean includeZero;
 
+        private Evaluator isInverted;
+
         public AxisAttributes() {
         }
 
         public AxisAttributes(
-            String  name,
-            boolean isLeftAlign,
-            boolean forceAlign,
-            boolean includeZero
+            String    name,
+            boolean   isLeftAlign,
+            boolean   forceAlign,
+            boolean   includeZero,
+            Evaluator isInverted
         ) {
             this.name        = name;
             this.isLeftAlign = isLeftAlign;
             this.forceAlign  = forceAlign;
             this.includeZero = includeZero;
+            this.isInverted  = isInverted;
         }
 
         public String getName() {
@@ -126,8 +148,36 @@
         public boolean includeZero() {
             return includeZero;
         }
+
+        public Evaluator isInverted() {
+            return isInverted;
+        }
     } // class AxisAttributes
 
+    public class DomainAxisAttributes extends AxisAttributes {
+
+        private Title title;
+
+        public DomainAxisAttributes() {
+        }
+
+        public DomainAxisAttributes(
+            String    name,
+            boolean   isLeftAlign,
+            boolean   forceAlign,
+            boolean   includeZero,
+            Evaluator isInverted,
+            Title     title
+        ) {
+            super(name, isLeftAlign, forceAlign, includeZero, isInverted);
+            this.title = title;
+        }
+
+        public Title getTitle() {
+            return title;
+        }
+    } // class DomainAxisAttributes
+
     public static class AxisProcessor {
 
         private Class<Processor> processorClass;
@@ -240,7 +290,8 @@
 
     private Title title;
     private Title subtitle;
-    private Title domainAxisTitle;
+
+    private DomainAxisAttributes domainAxis;
 
     public DiagramAttributes() {
         axesAttrs      = new ArrayList<AxisAttributes>(5);
@@ -253,7 +304,7 @@
         parseProcessors(config);
         parseTitle(config);
         parseSubtitle(config);
-        parseDomainAxisTitle(config);
+        parseDomainAxis(config);
         return this;
     }
 
@@ -270,6 +321,9 @@
             String align = axisElement.getAttribute("align").trim();
             String includeZero =
                 axisElement.getAttribute("include-zero").trim();
+
+            String isInverted = axisElement.getAttribute("inverted");
+
             if (name.isEmpty()) {
                 continue;
             }
@@ -282,12 +336,38 @@
                 else if ("force".equals(part)) forceAlign  = true;
             }
 
+            Evaluator isInvertedE = parseEvaluator(isInverted, FALSE);
+
             axesAttrs.add(new AxisAttributes(
                 name, isleftAlign, forceAlign,
-                includeZero.equals("true")));
+                includeZero.equals("true"),
+                isInvertedE));
         }
     }
 
+    private Evaluator parseEvaluator(String s, Evaluator def) {
+        if ((s = s.trim()).isEmpty()) return def;
+        if ("true".equals(s)) return TRUE;
+        if ("false".equals(s)) return FALSE;
+        if (s.endsWith("()")) {
+            s = s.substring(0, s.length()-2).trim();
+            try {
+                Class<Evaluator> clazz = (Class<Evaluator>)Class.forName(s);
+                return clazz.newInstance();
+            }
+            catch (ClassNotFoundException cnfe) {
+                log.error(cnfe, cnfe);
+            }
+            catch (InstantiationException ie) {
+                log.error(ie, ie);
+            }
+            catch (IllegalAccessException iae) {
+                log.error(iae, iae);
+            }
+        }
+        return def;
+    }
+
     public List<AxisProcessor> getAxesProcessors() {
         return axesProcessors;
     }
@@ -300,8 +380,8 @@
         return subtitle;
     }
 
-    public Title getDomainAxisTitle() {
-        return domainAxisTitle;
+    public DomainAxisAttributes getDomainAxis() {
+        return domainAxis;
     }
 
     private void parseProcessors(Element config) {
@@ -334,8 +414,18 @@
         subtitle = extractTitle(config, "subtitle");
     }
 
-    private void parseDomainAxisTitle(Element config) {
-        domainAxisTitle = extractTitle(config, "domain-axis");
+    private void parseDomainAxis(Element config) {
+        Title title = extractTitle(config, "domain-axis");
+        String includeZero = config.getAttribute("include-zero");
+        String isInverted = config.getAttribute("inverted");
+
+        domainAxis = new DomainAxisAttributes(
+            "X",
+            false,
+            false,
+            false,
+            parseEvaluator(isInverted, FALSE),
+            title);
     }
 
     private static Title extractTitle(Element config, String tagName) {

http://dive4elements.wald.intevation.org