diff artifacts/src/main/java/org/dive4elements/river/themes/ThemeFactory.java @ 9555:ef5754ba5573

Implemented legend aggregation based on type of themes. Added theme-editor style configuration for aggregated legend entries. Only configured themes get aggregated.
author gernotbelger
date Tue, 23 Oct 2018 16:26:48 +0200
parents f0ea2063b58e
children
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/themes/ThemeFactory.java	Mon Oct 22 18:26:05 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/themes/ThemeFactory.java	Tue Oct 23 16:26:48 2018 +0200
@@ -8,10 +8,6 @@
 
 package org.dive4elements.river.themes;
 
-import org.dive4elements.artifacts.common.utils.XMLUtils;
-import org.dive4elements.river.artifacts.D4EArtifact;
-import org.dive4elements.river.artifacts.context.RiverContext;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -20,6 +16,9 @@
 import javax.xml.xpath.XPathConstants;
 
 import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.common.utils.XMLUtils;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.context.RiverContext;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
@@ -29,7 +28,7 @@
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  *
- * Mapping-matching rules:
+ *         Mapping-matching rules:
  *
  */
 public class ThemeFactory {
@@ -40,23 +39,24 @@
     private ThemeFactory() {
     }
 
-
     /**
      * Creates a new theme from <i>config</i>.
      *
-     * @param themeCfg The theme config document that is used to fetch parent
-     * themes.
-     * @param config The theme config node.
+     * @param themeCfg
+     *            The theme config document that is used to fetch parent
+     *            themes.
+     * @param config
+     *            The theme config node.
      *
      * @return a new theme.
      */
-    public static Theme createTheme(Document themeCfg, Node config) {
-        String name = getName(config);
-        String desc = getDescription(config);
+    public static Theme createTheme(final Document themeCfg, final Node config) {
+        final String name = getName(config);
+        final String desc = getDescription(config);
 
         log.trace("Create new theme: " + name);
 
-        Theme theme = new DefaultTheme(name, desc);
+        final DefaultTheme theme = new DefaultTheme(name, desc);
 
         parseInherits(themeCfg, config, theme);
         parseFields(config, theme);
@@ -65,26 +65,21 @@
         return theme;
     }
 
-
     /**
      * Get first matching theme for facet.
      *
-     * @param name    Name to match "from" of theme mapping.
-     * @param pattern String to 'compare' to pattern in mapping.
-     * @param output  Name of the current output
+     * @param name
+     *            Name to match "from" of theme mapping.
+     * @param pattern
+     *            String to 'compare' to pattern in mapping.
+     * @param output
+     *            Name of the current output
      *
      * @return First matching theme.
      */
-    public static Theme getTheme(
-        RiverContext c,
-        String name,
-        String pattern,
-        String output,
-        String groupName)
-    {
+    public static Theme getTheme(final RiverContext c, final String name, final String pattern, final String output, final String groupName) {
         if (log.isDebugEnabled()) {
-            log.debug(
-                "Search theme for: " + name + " - pattern: " + pattern);
+            log.debug("Search theme for: " + name + " - pattern: " + pattern);
         }
 
         if (c == null || name == null) {
@@ -94,15 +89,15 @@
 
         // Fetch mapping and themes.
         @SuppressWarnings("unchecked")
-        Map<String, List<ThemeMapping>> map = (Map<String, List<ThemeMapping>>)
-            c.get(RiverContext.THEME_MAPPING);
+        final
+        Map<String, List<ThemeMapping>> map = (Map<String, List<ThemeMapping>>) c.get(RiverContext.THEME_MAPPING);
 
         @SuppressWarnings("unchecked")
-        List<ThemeGroup> tgs = (List<ThemeGroup>)
-            c.get(RiverContext.THEMES);
+        final
+        List<ThemeGroup> tgs = (List<ThemeGroup>) c.get(RiverContext.THEMES);
 
         ThemeGroup group = null;
-        for (ThemeGroup tg: tgs) {
+        for (final ThemeGroup tg : tgs) {
             if (tg.getName().equals(groupName)) {
                 group = tg;
                 break;
@@ -114,16 +109,16 @@
             return null;
         }
 
-        Map<String, Theme> t = group.getThemes();
+        final Map<String, Theme> t = group.getThemes();
 
-        D4EArtifact artifact = (D4EArtifact) c.get(RiverContext.ARTIFACT_KEY);
+        final D4EArtifact artifact = (D4EArtifact) c.get(RiverContext.ARTIFACT_KEY);
 
         if (map == null || map.isEmpty() || t == null || t.isEmpty()) {
             log.warn("No mappings or themes found. Cannot retrieve theme!");
             return null;
         }
 
-        List<ThemeMapping> mapping = map.get(name);
+        final List<ThemeMapping> mapping = map.get(name);
 
         if (mapping == null) {
             log.warn("No theme found for mapping: " + name);
@@ -131,77 +126,60 @@
         }
 
         // Take first mapping of which all conditions are satisfied.
-        for (ThemeMapping tm: mapping) {
-            if (name.equals(tm.getFrom())
-                && tm.applyPattern(pattern)
-                && tm.masterAttrMatches(artifact)
-                && tm.outputMatches(output))
-            {
-                String target = tm.getTo();
+        for (final ThemeMapping tm : mapping) {
+            if (name.equals(tm.getFrom()) && tm.applyPattern(pattern) && tm.masterAttrMatches(artifact) && tm.outputMatches(output)) {
+                final String target = tm.getTo();
 
                 log.debug("Found theme '" + target + "'");
                 return t.get(target);
             }
         }
 
-        String msg =
-            "No theme found for '" + name +
-            "' with pattern '" + pattern + "' and output " + output + ".";
+        final String msg = "No theme found for '" + name + "' with pattern '" + pattern + "' and output " + output + ".";
 
         log.warn(msg);
 
         return null;
     }
 
-
     @SuppressWarnings("unchecked")
-    public static List<ThemeGroup> getThemeGroups(RiverContext c) {
-        List<ThemeGroup> tgs = (List<ThemeGroup>)
-            c.get(RiverContext.THEMES);
+    public static List<ThemeGroup> getThemeGroups(final RiverContext c) {
+        final List<ThemeGroup> tgs = (List<ThemeGroup>) c.get(RiverContext.THEMES);
         return tgs;
     }
 
-
     @SuppressWarnings("unchecked")
-    public static List<Theme> getThemes (RiverContext c, String name) {
-        List<ThemeGroup> tgs = (List<ThemeGroup>)
-            c.get(RiverContext.THEMES);
+    public static List<Theme> getThemes(final RiverContext c, final String name) {
+        final List<ThemeGroup> tgs = (List<ThemeGroup>) c.get(RiverContext.THEMES);
         if (tgs == null) {
             return null;
         }
 
-        List<Theme> themes = new ArrayList<Theme>();
-        for (ThemeGroup tg: tgs) {
+        final List<Theme> themes = new ArrayList<>();
+        for (final ThemeGroup tg : tgs) {
             themes.add(tg.getThemeByName(name));
         }
         return themes;
     }
 
-    protected static String getName(Node config) {
-        return ((Element)config).getAttribute("name");
+    private static String getName(final Node config) {
+        return ((Element) config).getAttribute("name");
     }
 
-
-    protected static String getDescription(Node config) {
-        return ((Element)config).getAttribute("desc");
+    private static String getDescription(final Node config) {
+        return ((Element) config).getAttribute("desc");
     }
 
-
-    protected static void parseInherits(Document themeCfg, Node cfg, Theme t) {
+    private static void parseInherits(final Document themeCfg, final Node cfg, final DefaultTheme t) {
         parseInherits(themeCfg, cfg, t, null);
     }
 
-    protected static void parseInherits(
-        Document themeCfg,
-        Node     cfg,
-        Theme    t,
-        Map<String, Node> themes
-    ) {
+    private static void parseInherits(final Document themeCfg, final Node cfg, final DefaultTheme t, Map<String, Node> themes) {
         log.trace("ThemeFactory.parseInherits");
 
-        NodeList inherits = ((Element)cfg).getElementsByTagName("inherit");
+        final NodeList inherits = ((Element) cfg).getElementsByTagName("inherit");
 
-        int num = inherits.getLength();
+        final int num = inherits.getLength();
 
         if (num == 0) {
             log.trace("Theme does not inherit from other themes.");
@@ -215,43 +193,41 @@
         }
 
         for (int i = 0; i < num; i++) {
-            Node inherit = inherits.item(i);
-            String from = ((Element)inherit).getAttribute("from");
+            final Node inherit = inherits.item(i);
+            final String from = ((Element) inherit).getAttribute("from");
 
-            Node tmp = themes.get(from);
+            final Node tmp = themes.get(from);
 
             parseInherits(themeCfg, tmp, t, themes);
             parseFields(tmp, t);
         }
     }
 
-    protected static Map<String, Node> buildThemeMap(Document themeCfg) {
-        Map<String, Node> map = new HashMap<String, Node>();
-        String xpath = "/themes/themegroup/theme";
+    private static Map<String, Node> buildThemeMap(final Document themeCfg) {
+        final Map<String, Node> map = new HashMap<>();
+        final String xpath = "/themes/themegroup/theme";
 
-        NodeList nodes = (NodeList)XMLUtils.xpath(
-            themeCfg, xpath, XPathConstants.NODESET);
+        final NodeList nodes = (NodeList) XMLUtils.xpath(themeCfg, xpath, XPathConstants.NODESET);
 
         if (nodes != null) {
             for (int i = 0, N = nodes.getLength(); i < N; ++i) {
-                Node node = nodes.item(i);
-                String name = ((Element)node).getAttribute("name");
+                final Node node = nodes.item(i);
+                final String name = ((Element) node).getAttribute("name");
                 map.put(name, node);
             }
         }
         return map;
     }
 
-
-    protected static void parseFields(Node config, Theme theme) {
+    private static void parseFields(final Node config, final DefaultTheme theme) {
         if (config == null || theme == null) {
             log.warn("Parsing fields without node or theme is senseless!");
             return;
         }
 
-        NodeList fields = ((Element)config).getElementsByTagName("field");
+        final NodeList fields = ((Element) config).getElementsByTagName("field");
 
-        int num = fields.getLength();
+        final int num = fields.getLength();
 
         log.trace("Found " + num + " own fields in this theme.");
 
@@ -261,34 +237,33 @@
         }
 
         for (int i = 0; i < num; i++) {
-            Node field = fields.item(i);
+            final Node field = fields.item(i);
 
             addField(theme, field);
         }
     }
 
-
-    protected static void addField(Theme theme, Node field) {
-        String name = ((Element)field).getAttribute("name");
+    private static void addField(final DefaultTheme theme, final Node field) {
+        final String name = ((Element) field).getAttribute("name");
 
         log.trace("Add field " + name + " to theme " + theme.getName());
 
-        NamedNodeMap attrs = field.getAttributes();
+        final NamedNodeMap attrs = field.getAttributes();
 
-        int num = attrs != null ? attrs.getLength() : 0;
+        final int num = attrs != null ? attrs.getLength() : 0;
 
         if (num == 0) {
             log.warn("This field has no attributes.");
             return;
         }
 
-        ThemeField theField = new DefaultThemeField(name);
+        final ThemeField theField = new DefaultThemeField(name);
 
         for (int i = 0; i < num; i++) {
-            Node attr    = attrs.item(i);
+            final Node attr = attrs.item(i);
 
-            String key   = attr.getNodeName();
-            String value = attr.getNodeValue();
+            final String key = attr.getNodeName();
+            final String value = attr.getNodeValue();
 
             theField.setAttribute(key, value);
         }
@@ -296,11 +271,10 @@
         theme.addField(name, theField);
     }
 
+    private static void parseAttrs(final Node config, final DefaultTheme theme) {
+        final NamedNodeMap attrs = config.getAttributes();
 
-    protected static void parseAttrs(Node config, Theme theme) {
-        NamedNodeMap attrs = config.getAttributes();
-
-        int num = attrs != null ? attrs.getLength() : 0;
+        final int num = attrs != null ? attrs.getLength() : 0;
 
         if (num == 0) {
             log.trace("Theme has no attributes set.");
@@ -308,13 +282,20 @@
         }
 
         for (int i = 0; i < num; i++) {
-            Node attr = attrs.item(i);
+            final Node attr = attrs.item(i);
 
-            String name  = attr.getNodeName();
-            String value = attr.getNodeValue();
+            final String name = attr.getNodeName();
+            final String value = attr.getNodeValue();
 
             theme.addAttribute(name, value);
         }
     }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+
+    public static Theme getLegendTheme(final RiverContext flysContext, final String themeType) {
+
+        @SuppressWarnings("unchecked")
+        final
+        Map<String, Theme> themes = (Map<String, Theme>) flysContext.get(RiverContext.LEGEND);
+        return themes.get(themeType);
+    }
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org