Mercurial > dive4elements > river
changeset 7160:f2ffa631c2ed
Diagram attributes: Use evaluators for title arguments, too. This makes it more consistent, powerful and a little bit faster.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 26 Sep 2013 12:56:37 +0200 |
parents | 1508ee33f85f |
children | b7b839557282 |
files | artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java |
diffstat | 1 files changed, 117 insertions(+), 50 deletions(-) [+] |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java Thu Sep 26 11:41:02 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java Thu Sep 26 12:56:37 2013 +0200 @@ -110,9 +110,9 @@ public static class AxisAttributes { private String name; - private boolean isLeftAlign; - private boolean forceAlign; - private boolean includeZero; + private boolean isLeftAlign; // TODO: Remove! + private boolean forceAlign; // TODO: Remove! + private boolean includeZero; // TODO: Use Evaluator private Evaluator isInverted; @@ -205,54 +205,95 @@ } // class AxisProcessor - public static class Argument { - private String expression; - private String type; + public abstract static class ConvertEvaluator + implements Evaluator + { + protected String key; + protected String type; - public Argument() { + public ConvertEvaluator() { } - public Argument(String expression, String type) { - this.expression = expression; + public ConvertEvaluator(String key, String type) { + this.key = key; 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); + protected Object convert(Object value) { + if (value == null || type == null || type.isEmpty()) { + return value; } - if (expression.startsWith("context.")) { - return context.getContextValue( - expression.substring("context.".length())); + if (value instanceof String) { + String v = (String)value; + if ("double".equals(type)) { + return Double.valueOf(v); + } + if ("int".equals(type)) { + return Integer.valueOf(v); + } + if ("string".equals(type)) { + return v; + } } - return expression; + // TODO: Support more types + return value; + } + } // class ConvertEvaluator + + public static class ContextEvaluator extends ConvertEvaluator { + + public ContextEvaluator() { } - 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 + public ContextEvaluator(String key, String type) { + super(key, type); + } + + @Override + public Object evaluate(D4EArtifact artifact, CallContext context) { + return convert(context.getContextValue(key)); + } + } // class ContextEvaluator + + public static class ArtifactEvaluator extends ConvertEvaluator { + + public ArtifactEvaluator() { + } + + public ArtifactEvaluator(String key, String type) { + super(key, type); + } + + @Override + public Object evaluate(D4EArtifact artifact, CallContext context) { + return convert(artifact.getDataAsString(key)); + } + } // class ContextEvaluator + + public static class StringEvaluator implements Evaluator { + + private String value; + + public StringEvaluator() { + } + public StringEvaluator(String value) { + this.value = value; + } + + @Override + public Object evaluate(D4EArtifact artifact, CallContext context) { return value; } - } // class Argument + } // class StringEvaluator public static class Title { private String key; private String def; - private List<Argument> arguments; + private List<Evaluator> arguments; public Title() { - arguments = new ArrayList<Argument>(5); + arguments = new ArrayList<Evaluator>(5); } public Title(String key) { @@ -269,7 +310,7 @@ return key; } - public void addArgument(Argument argument) { + public void addArgument(Evaluator argument) { arguments.add(argument); } @@ -345,25 +386,34 @@ } } - private Evaluator parseEvaluator(String s, Evaluator def) { + private static Evaluator createDynamicEvaluator( + String className, + Evaluator def + ) { + try { + Class<Evaluator> clazz = (Class<Evaluator>)Class.forName(className); + 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; + } + + private static 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 createDynamicEvaluator( + s.substring(0, s.length()-2).trim(), + def); } return def; } @@ -423,7 +473,7 @@ "X", false, false, - false, + includeZero.equals("true"), parseEvaluator(isInverted, FALSE), title); } @@ -442,7 +492,24 @@ Element argumentElement = (Element)argumentNodes.item(i); String expression = argumentElement.getAttribute("expr"); String type = argumentElement.getAttribute("type"); - title.addArgument(new Argument(expression, type)); + + Evaluator ev = new StringEvaluator(expression); + + if (expression.endsWith("()")) { + ev = createDynamicEvaluator( + expression.substring(0, expression.length()-2).trim(), + ev); + } + else if (expression.startsWith("artifact.")) { + ev = new ArtifactEvaluator( + expression.substring("artifact.".length()), type); + } + else if (expression.startsWith("context.")) { + ev = new ContextEvaluator( + expression.substring("context.".length()), type); + } + + title.addArgument(ev); } return title; }