# HG changeset patch # User Sascha L. Teichmann # Date 1379581067 -7200 # Node ID a43137dfdcac931d7de6cc74273b1b409d76ac59 # Parent 6ab1464021ae6694911396dbb5859023506a1d11 Simple interpolation logic for diagram titles and subtitles. diff -r 6ab1464021ae -r a43137dfdcac artifacts/src/main/java/org/dive4elements/river/exports/DiagramAttributes.java --- 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 arguments; + + public Title() { + arguments = new ArrayList(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 axesAttrs; private List axesProcessors; + private Title title; + private Title subtitle; + public DiagramAttributes() { axesAttrs = new ArrayList(5); axesProcessors = new ArrayList(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 :