extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/XmlConfig.java

Code
Comments
Other
Rev Date Author Line
4132 27 Sep 16 olle 1 package net.sf.basedb.meludi;
4132 27 Sep 16 olle 2
4132 27 Sep 16 olle 3 import java.util.ArrayList;
4132 27 Sep 16 olle 4 import java.util.Arrays;
4132 27 Sep 16 olle 5 import java.util.Collections;
4132 27 Sep 16 olle 6 import java.util.List;
4132 27 Sep 16 olle 7
4132 27 Sep 16 olle 8 import net.sf.basedb.core.ConfigurationException;
4132 27 Sep 16 olle 9 import net.sf.basedb.util.Values;
4132 27 Sep 16 olle 10
4132 27 Sep 16 olle 11 import org.jdom2.Attribute;
4132 27 Sep 16 olle 12 import org.jdom2.Element;
4132 27 Sep 16 olle 13 import org.jdom2.xpath.XPathFactory;
4132 27 Sep 16 olle 14
4132 27 Sep 16 olle 15 /**
4132 27 Sep 16 olle 16   Utility class for working with MeLuDI XML configuration file.
4132 27 Sep 16 olle 17
4132 27 Sep 16 olle 18   @author nicklas
4132 27 Sep 16 olle 19   @since Reggie 2.18
4132 27 Sep 16 olle 20   @since 1.5
4132 27 Sep 16 olle 21 */
4132 27 Sep 16 olle 22 public class XmlConfig 
4132 27 Sep 16 olle 23 {
4132 27 Sep 16 olle 24
4132 27 Sep 16 olle 25   private final Element root;
4132 27 Sep 16 olle 26   private final String id;
4132 27 Sep 16 olle 27   
4132 27 Sep 16 olle 28   /**
4132 27 Sep 16 olle 29     Create a new configuration item using the given XML element as the
4132 27 Sep 16 olle 30     root element.
4132 27 Sep 16 olle 31     @param root The root XML element
4132 27 Sep 16 olle 32     @param id The id of the root element (used in error message)
4132 27 Sep 16 olle 33   */
4132 27 Sep 16 olle 34   public XmlConfig(Element root, String id)
4132 27 Sep 16 olle 35   {
4132 27 Sep 16 olle 36     this.root = root;
4132 27 Sep 16 olle 37     this.id = id;
4132 27 Sep 16 olle 38   }
4132 27 Sep 16 olle 39   
4132 27 Sep 16 olle 40   /**
4132 27 Sep 16 olle 41     Get the XML root element.
4132 27 Sep 16 olle 42   */
4132 27 Sep 16 olle 43   public Element getRoot()
4132 27 Sep 16 olle 44   {
4132 27 Sep 16 olle 45     return root;
4132 27 Sep 16 olle 46   }
4132 27 Sep 16 olle 47
4132 27 Sep 16 olle 48   /**
4132 27 Sep 16 olle 49     Get the value of a required configuration option. If no
4132 27 Sep 16 olle 50     value is found an exception is thrown.
4132 27 Sep 16 olle 51     @param xpath An XPath expression identifying a (single) configuration element
4132 27 Sep 16 olle 52     @param parameterSet A named parameter set that should be used before the unnamed parameters
4132 27 Sep 16 olle 53     @since 3.1
4132 27 Sep 16 olle 54   */
4132 27 Sep 16 olle 55   public String getRequiredConfig(String xpath, String parameterSet)
4132 27 Sep 16 olle 56   {
4132 27 Sep 16 olle 57     String value = getConfig(xpath, parameterSet, null);
4132 27 Sep 16 olle 58     if (value == null)
4132 27 Sep 16 olle 59     {
4132 27 Sep 16 olle 60       throw new ConfigurationException("Can't find '" + xpath + "' setting for " + id + "[parameter-set: " + parameterSet + "]");
4132 27 Sep 16 olle 61     }
4132 27 Sep 16 olle 62     return value;
4132 27 Sep 16 olle 63   }
4132 27 Sep 16 olle 64   
4132 27 Sep 16 olle 65   /**
4132 27 Sep 16 olle 66     Shortcut for {@link #getConfig(String, String, String)} with null
4132 27 Sep 16 olle 67     values for parameterSet and defaultValue.
4132 27 Sep 16 olle 68     @since 4.1
4132 27 Sep 16 olle 69   */
4132 27 Sep 16 olle 70   public String getConfig(String xpath)
4132 27 Sep 16 olle 71   {
4132 27 Sep 16 olle 72     return getConfig(xpath, null, null);
4132 27 Sep 16 olle 73   }
4132 27 Sep 16 olle 74   
4132 27 Sep 16 olle 75   /**
4132 27 Sep 16 olle 76     Searches for an ordered list of configuration values all with
4132 27 Sep 16 olle 77     the given root prefix. For example if prefix is 'run-archive' 
4132 27 Sep 16 olle 78     this will look for 'run-archive-N', 'run-archive-(N+1)', and so on
4132 27 Sep 16 olle 79     until an empty element or no element is found (N=starting index).
4132 27 Sep 16 olle 80     @since 4.6
4132 27 Sep 16 olle 81   */
4132 27 Sep 16 olle 82   public List<String> getConfigList(String prefix, int startAt)
4132 27 Sep 16 olle 83   {
4132 27 Sep 16 olle 84     int index = startAt;
4132 27 Sep 16 olle 85     List<String> list = new ArrayList<>();
4132 27 Sep 16 olle 86     do
4132 27 Sep 16 olle 87     {
4132 27 Sep 16 olle 88       String value = getConfig(prefix + "-" + index);
4132 27 Sep 16 olle 89       if (value == null) break;
4132 27 Sep 16 olle 90       list.add(value);
4132 27 Sep 16 olle 91       index++;
4132 27 Sep 16 olle 92     } while (true);
4132 27 Sep 16 olle 93     
4132 27 Sep 16 olle 94     return list;
4132 27 Sep 16 olle 95   }
4132 27 Sep 16 olle 96
4132 27 Sep 16 olle 97   
4132 27 Sep 16 olle 98   /**
4132 27 Sep 16 olle 99     Get the value of a configuration option. If no value is found the default value is used.
4132 27 Sep 16 olle 100     
4132 27 Sep 16 olle 101     @param xpath An XPath expression identifying a (single) configuration element or attribute
4132 27 Sep 16 olle 102     @param parameterSet A named parameter set that should be used before the unnamed parameters
4132 27 Sep 16 olle 103     @since 3.1
4132 27 Sep 16 olle 104   */
4132 27 Sep 16 olle 105   public String getConfig(String xpath, String parameterSet, String defaultValue)
4132 27 Sep 16 olle 106   {
4132 27 Sep 16 olle 107     String value = null;
4132 27 Sep 16 olle 108     if (xpath == null) return defaultValue;
4132 27 Sep 16 olle 109     
4132 27 Sep 16 olle 110     List<Object> list = XPathFactory.instance().compile(xpath).evaluate(root);
4132 27 Sep 16 olle 111     for (Object n : list)
4132 27 Sep 16 olle 112     {
4132 27 Sep 16 olle 113       Element e = null;
4132 27 Sep 16 olle 114       String tmp = null;
4132 27 Sep 16 olle 115       if (n instanceof Element)
4132 27 Sep 16 olle 116       {
4132 27 Sep 16 olle 117         e = (Element)n;
4132 27 Sep 16 olle 118         tmp = Values.getStringOrNull(e.getTextTrim());
4132 27 Sep 16 olle 119       }
4132 27 Sep 16 olle 120       else if (n instanceof Attribute)
4132 27 Sep 16 olle 121       {
4132 27 Sep 16 olle 122         Attribute a = (Attribute)n;
4132 27 Sep 16 olle 123         e = a.getParent();
4132 27 Sep 16 olle 124         tmp = Values.getStringOrNull(a.getValue());
4132 27 Sep 16 olle 125       }
4132 27 Sep 16 olle 126       if (e != null)
4132 27 Sep 16 olle 127       {
4132 27 Sep 16 olle 128         String ps = e.getAttributeValue("parameter-set");
4132 27 Sep 16 olle 129         if (ps == null)
4132 27 Sep 16 olle 130         {
4132 27 Sep 16 olle 131           // Default parameter set; use this unless we find the specific parameter set
4132 27 Sep 16 olle 132           value = tmp;
4132 27 Sep 16 olle 133           if (parameterSet == null) break;
4132 27 Sep 16 olle 134         }
4132 27 Sep 16 olle 135         else if (parameterSet != null && Arrays.asList(ps.split(",")).indexOf(parameterSet) != -1)
4132 27 Sep 16 olle 136         {
4132 27 Sep 16 olle 137           // We have found the parameter set we are lookup for, break and use this value
4132 27 Sep 16 olle 138           value = tmp;
4132 27 Sep 16 olle 139           break;
4132 27 Sep 16 olle 140         }
4132 27 Sep 16 olle 141       }
4132 27 Sep 16 olle 142     }
4132 27 Sep 16 olle 143     return value == null ? defaultValue : value;
4132 27 Sep 16 olle 144   }
4132 27 Sep 16 olle 145   
4132 27 Sep 16 olle 146   /**
4132 27 Sep 16 olle 147     Get all parameters in the given parameter set.
4132 27 Sep 16 olle 148     @since 3.1
4132 27 Sep 16 olle 149   */
4132 27 Sep 16 olle 150   public List<Element> getAllInParameterSet(String parameterSet)
4132 27 Sep 16 olle 151   {
4132 27 Sep 16 olle 152     if (parameterSet == null) return Collections.emptyList();
4132 27 Sep 16 olle 153     
4132 27 Sep 16 olle 154     List<Object> list = XPathFactory.instance().compile("//*[@parameter-set]").evaluate(root);
4132 27 Sep 16 olle 155     List<Element> parameters = new ArrayList<Element>();
4132 27 Sep 16 olle 156     
4132 27 Sep 16 olle 157     for (Object o : list)
4132 27 Sep 16 olle 158     {
4132 27 Sep 16 olle 159       Element e = (Element)o;
4132 27 Sep 16 olle 160       String ps = e.getAttributeValue("parameter-set");
4132 27 Sep 16 olle 161       if (Arrays.asList(ps.split(",")).indexOf(parameterSet) != -1)
4132 27 Sep 16 olle 162       {
4132 27 Sep 16 olle 163         parameters.add(e);
4132 27 Sep 16 olle 164       }
4132 27 Sep 16 olle 165     }
4132 27 Sep 16 olle 166     return parameters;
4132 27 Sep 16 olle 167   }
4132 27 Sep 16 olle 168   
4132 27 Sep 16 olle 169 }