src/core/net/sf/basedb/util/extensions/xml/VariableConverter.java

Code
Comments
Other
Rev Date Author Line
4170 07 Mar 08 nicklas 1 /**
4479 05 Sep 08 jari 2   $Id$
4170 07 Mar 08 nicklas 3
4170 07 Mar 08 nicklas 4   Copyright (C) Authors contributing to this file.
4170 07 Mar 08 nicklas 5
4170 07 Mar 08 nicklas 6   This file is part of BASE - BioArray Software Environment.
4170 07 Mar 08 nicklas 7   Available at http://base.thep.lu.se/
4170 07 Mar 08 nicklas 8
4170 07 Mar 08 nicklas 9   BASE is free software; you can redistribute it and/or
4170 07 Mar 08 nicklas 10   modify it under the terms of the GNU General Public License
4479 05 Sep 08 jari 11   as published by the Free Software Foundation; either version 3
4170 07 Mar 08 nicklas 12   of the License, or (at your option) any later version.
4170 07 Mar 08 nicklas 13
4170 07 Mar 08 nicklas 14   BASE is distributed in the hope that it will be useful,
4170 07 Mar 08 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
4170 07 Mar 08 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4170 07 Mar 08 nicklas 17   GNU General Public License for more details.
4170 07 Mar 08 nicklas 18
4170 07 Mar 08 nicklas 19   You should have received a copy of the GNU General Public License
4515 11 Sep 08 jari 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
4170 07 Mar 08 nicklas 21 */
4170 07 Mar 08 nicklas 22 package net.sf.basedb.util.extensions.xml;
4170 07 Mar 08 nicklas 23
4170 07 Mar 08 nicklas 24 import java.lang.reflect.Method;
4170 07 Mar 08 nicklas 25 import java.util.HashMap;
4170 07 Mar 08 nicklas 26 import java.util.Map;
4170 07 Mar 08 nicklas 27 import java.util.regex.Matcher;
4170 07 Mar 08 nicklas 28 import java.util.regex.Pattern;
4170 07 Mar 08 nicklas 29
4170 07 Mar 08 nicklas 30 import net.sf.basedb.util.extensions.ActionFactory;
4170 07 Mar 08 nicklas 31 import net.sf.basedb.util.extensions.RendererFactory;
4170 07 Mar 08 nicklas 32
4170 07 Mar 08 nicklas 33 /**
4170 07 Mar 08 nicklas 34   A value converter that can be used on all setter methods
4170 07 Mar 08 nicklas 35   that has been annotated with the {@link VariableSetter}
4170 07 Mar 08 nicklas 36   annotation. The input string will be scanned for
4170 07 Mar 08 nicklas 37   parts that match <code>$VARIABLE$</code> and have that part
4198 28 Mar 08 nicklas 38   replaced by the actual value of a defined variable. Undefined
4198 28 Mar 08 nicklas 39   variables are not replaced. See {@link #setVariable(String, String)}
4198 28 Mar 08 nicklas 40   for more details.
4170 07 Mar 08 nicklas 41
4170 07 Mar 08 nicklas 42   <p>
4170 07 Mar 08 nicklas 43   Web client note! The web client application defines the variables
4170 07 Mar 08 nicklas 44   <code>ROOT</code> and <code>HOME</code> which are the paths to
4198 28 Mar 08 nicklas 45   the web application root directory (<code>/base2</code>) and the 
4198 28 Mar 08 nicklas 46   home directory (<code>/base2/extensions/xxxx</code>) of the current 
4170 07 Mar 08 nicklas 47   extension. This means that the XML configuration file may
5946 03 Feb 12 nicklas 48   contain values like <code>$ROOT$/images/copy.png</code>. The 
4170 07 Mar 08 nicklas 49   <code>$ROOT$</code> portion will automatically be replaced with the
4170 07 Mar 08 nicklas 50   correct path if the factory method is annotated with the {@link VariableSetter}
4170 07 Mar 08 nicklas 51   annotation.
4170 07 Mar 08 nicklas 52
4170 07 Mar 08 nicklas 53   @author nicklas
4170 07 Mar 08 nicklas 54   @version 2.7
4198 28 Mar 08 nicklas 55   @base.modified $Date:2008-03-20 12:15:25 +0100 (Thu, 20 Mar 2008) $
4170 07 Mar 08 nicklas 56 */
4170 07 Mar 08 nicklas 57 public class VariableConverter 
4170 07 Mar 08 nicklas 58   implements ValueConverter
4170 07 Mar 08 nicklas 59 {
4170 07 Mar 08 nicklas 60
4170 07 Mar 08 nicklas 61   // Pattern to match $VARIABLE$
4170 07 Mar 08 nicklas 62   private static final Pattern VARIABLE = Pattern.compile("\\$(\\w+)\\$");
4170 07 Mar 08 nicklas 63   
4170 07 Mar 08 nicklas 64   // Contains variable values
4170 07 Mar 08 nicklas 65   private Map<String, String> variables;
4170 07 Mar 08 nicklas 66   
4170 07 Mar 08 nicklas 67   /**
4170 07 Mar 08 nicklas 68     Create a new variable converter. Use {@link #setVariable(String, String)}
4170 07 Mar 08 nicklas 69     to define variables and {@link XmlLoader#addValueConverter(ValueConverter)}
4170 07 Mar 08 nicklas 70     to register this converter with an XML loader.
4170 07 Mar 08 nicklas 71   */
4170 07 Mar 08 nicklas 72   public VariableConverter()
4170 07 Mar 08 nicklas 73   {}
4170 07 Mar 08 nicklas 74   
4170 07 Mar 08 nicklas 75   /*
4170 07 Mar 08 nicklas 76     From the ValueConverter interface
4170 07 Mar 08 nicklas 77     ----------------------------------
4170 07 Mar 08 nicklas 78   */
4170 07 Mar 08 nicklas 79   @Override
4170 07 Mar 08 nicklas 80   public String convert(String in, Method method) 
4170 07 Mar 08 nicklas 81   {
4170 07 Mar 08 nicklas 82     if (variables == null) return in;
4170 07 Mar 08 nicklas 83     if (!method.isAnnotationPresent(VariableSetter.class)) return in;
4170 07 Mar 08 nicklas 84     Matcher m = VARIABLE.matcher(in);
4170 07 Mar 08 nicklas 85     StringBuffer sb = new StringBuffer();
4170 07 Mar 08 nicklas 86     while (m.find())
4170 07 Mar 08 nicklas 87     {
4170 07 Mar 08 nicklas 88       String variable = m.group(1);
4170 07 Mar 08 nicklas 89       String value = variables.get(variable);
4233 17 Apr 08 nicklas 90       if (value == null) value = m.group();
4233 17 Apr 08 nicklas 91       m.appendReplacement(sb, Matcher.quoteReplacement(value));
4170 07 Mar 08 nicklas 92     }
4170 07 Mar 08 nicklas 93     m.appendTail(sb);
4170 07 Mar 08 nicklas 94     return sb.toString();
4170 07 Mar 08 nicklas 95   }
4170 07 Mar 08 nicklas 96   // ---------------------------------------
4170 07 Mar 08 nicklas 97
4170 07 Mar 08 nicklas 98   /**
4170 07 Mar 08 nicklas 99     Set the value of a variable. If a setter method of a factory class 
4198 28 Mar 08 nicklas 100     ({@link ActionFactory} or {@link RendererFactory}) is annotated with the
4198 28 Mar 08 nicklas 101     {@link VariableSetter} annotation the 
4170 07 Mar 08 nicklas 102     XML loader will scan the value from the XML file for replacement 
4170 07 Mar 08 nicklas 103     tags, <code>$VARIABLE$</code>, and replace the tag with the value 
4170 07 Mar 08 nicklas 104     of the variable. If the variable doesn't exists, the tag is left 
4170 07 Mar 08 nicklas 105     untouched.
4170 07 Mar 08 nicklas 106     
4170 07 Mar 08 nicklas 107     @param name The name of the variable
4170 07 Mar 08 nicklas 108     @param value The value of the variable, or null to remove
4170 07 Mar 08 nicklas 109       the variable
4170 07 Mar 08 nicklas 110   */
4170 07 Mar 08 nicklas 111   public void setVariable(String name, String value)
4170 07 Mar 08 nicklas 112   {
4170 07 Mar 08 nicklas 113     if (variables == null) variables = new HashMap<String, String>();
4170 07 Mar 08 nicklas 114     if (variables == null) variables = new HashMap<String, String>();
4170 07 Mar 08 nicklas 115     if (value == null)
4170 07 Mar 08 nicklas 116     {
4170 07 Mar 08 nicklas 117       variables.remove(name);
4170 07 Mar 08 nicklas 118     }
4170 07 Mar 08 nicklas 119     else
4170 07 Mar 08 nicklas 120     {
4170 07 Mar 08 nicklas 121       variables.put(name, value);
4170 07 Mar 08 nicklas 122     }    
4170 07 Mar 08 nicklas 123   }
4170 07 Mar 08 nicklas 124   
4170 07 Mar 08 nicklas 125   
4170 07 Mar 08 nicklas 126   /**
4170 07 Mar 08 nicklas 127     Get the value of a variable.
4170 07 Mar 08 nicklas 128     @param name The variable's name
4170 07 Mar 08 nicklas 129     @return The value, or null if it doesn't exists
4170 07 Mar 08 nicklas 130   */
4170 07 Mar 08 nicklas 131   public String getVariable(String name)
4170 07 Mar 08 nicklas 132   {
4170 07 Mar 08 nicklas 133     return variables == null ? null : variables.get(name);
4170 07 Mar 08 nicklas 134   }
4170 07 Mar 08 nicklas 135 }