src/core/net/sf/basedb/util/jep/convert/ConverterFactory.java

Code
Comments
Other
Rev Date Author Line
3604 26 Jul 07 nicklas 1 /**
3604 26 Jul 07 nicklas 2   $Id$
3604 26 Jul 07 nicklas 3
3675 16 Aug 07 jari 4   Copyright (C) 2007 Nicklas Nordborg
3604 26 Jul 07 nicklas 5
3604 26 Jul 07 nicklas 6   This file is part of BASE - BioArray Software Environment.
3604 26 Jul 07 nicklas 7   Available at http://base.thep.lu.se/
3604 26 Jul 07 nicklas 8
3604 26 Jul 07 nicklas 9   BASE is free software; you can redistribute it and/or
3604 26 Jul 07 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
3604 26 Jul 07 nicklas 12   of the License, or (at your option) any later version.
3604 26 Jul 07 nicklas 13
3604 26 Jul 07 nicklas 14   BASE is distributed in the hope that it will be useful,
3604 26 Jul 07 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
3604 26 Jul 07 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3604 26 Jul 07 nicklas 17   GNU General Public License for more details.
3604 26 Jul 07 nicklas 18
3604 26 Jul 07 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/>.
3604 26 Jul 07 nicklas 21 */
3604 26 Jul 07 nicklas 22 package net.sf.basedb.util.jep.convert;
3604 26 Jul 07 nicklas 23
3604 26 Jul 07 nicklas 24 import java.util.Collection;
3604 26 Jul 07 nicklas 25 import java.util.HashMap;
3604 26 Jul 07 nicklas 26 import java.util.Map;
3604 26 Jul 07 nicklas 27
3604 26 Jul 07 nicklas 28 import net.sf.basedb.core.ItemAlreadyExistsException;
3604 26 Jul 07 nicklas 29 import net.sf.basedb.core.query.Expression;
3604 26 Jul 07 nicklas 30 import net.sf.basedb.core.query.Restriction;
3604 26 Jul 07 nicklas 31
3604 26 Jul 07 nicklas 32 import org.nfunk.jep.ASTConstant;
3604 26 Jul 07 nicklas 33 import org.nfunk.jep.ASTFunNode;
3604 26 Jul 07 nicklas 34 import org.nfunk.jep.ASTVarNode;
3604 26 Jul 07 nicklas 35 import org.nfunk.jep.function.Abs;
3604 26 Jul 07 nicklas 36 import org.nfunk.jep.function.Add;
3604 26 Jul 07 nicklas 37 import org.nfunk.jep.function.Divide;
3604 26 Jul 07 nicklas 38 import org.nfunk.jep.function.Exp;
3656 13 Aug 07 nicklas 39 import org.nfunk.jep.function.If;
3604 26 Jul 07 nicklas 40 import org.nfunk.jep.function.Logarithm;
3604 26 Jul 07 nicklas 41 import org.nfunk.jep.function.Multiply;
3604 26 Jul 07 nicklas 42 import org.nfunk.jep.function.NaturalLogarithm;
3604 26 Jul 07 nicklas 43 import org.nfunk.jep.function.Not;
3604 26 Jul 07 nicklas 44 import org.nfunk.jep.function.SquareRoot;
3604 26 Jul 07 nicklas 45 import org.nfunk.jep.function.Subtract;
3604 26 Jul 07 nicklas 46 import org.nfunk.jep.function.UMinus;
3604 26 Jul 07 nicklas 47
3604 26 Jul 07 nicklas 48 /**
3604 26 Jul 07 nicklas 49   Keep {@link JepConversionFunction} objects for converting built-in
3604 26 Jul 07 nicklas 50   JEP object to Query API {@link Expression} or {@link Restriction}
3604 26 Jul 07 nicklas 51   objects.
3604 26 Jul 07 nicklas 52
3604 26 Jul 07 nicklas 53   @author nicklas
3604 26 Jul 07 nicklas 54   @version 2.4
3604 26 Jul 07 nicklas 55   @see JepConversionFunction
3604 26 Jul 07 nicklas 56   @base.modified $Date$
3604 26 Jul 07 nicklas 57 */
3604 26 Jul 07 nicklas 58 public class ConverterFactory
3604 26 Jul 07 nicklas 59 {
3604 26 Jul 07 nicklas 60
3604 26 Jul 07 nicklas 61   private static Map<Object, JepConversionFunction<?>> converters = 
3604 26 Jul 07 nicklas 62     new HashMap<Object, JepConversionFunction<?>>();
3604 26 Jul 07 nicklas 63   
3604 26 Jul 07 nicklas 64   /**
3604 26 Jul 07 nicklas 65     Register the built-in functions, operators and node types.
3604 26 Jul 07 nicklas 66   */
3604 26 Jul 07 nicklas 67   static
3604 26 Jul 07 nicklas 68   {
3604 26 Jul 07 nicklas 69     // Basic nodes types
3604 26 Jul 07 nicklas 70     converters.put(ASTFunNode.class, new ASTFunNodeConverter());
3604 26 Jul 07 nicklas 71     converters.put(ASTVarNode.class, new ASTVarNodeConverter());
3604 26 Jul 07 nicklas 72     converters.put(ASTConstant.class, new ASTConstantConverter());
3604 26 Jul 07 nicklas 73     
3604 26 Jul 07 nicklas 74     // Built-in operators
3604 26 Jul 07 nicklas 75     converters.put(Add.class, new AddConverter());
3604 26 Jul 07 nicklas 76     converters.put(Subtract.class, new SubtractConverter());
3604 26 Jul 07 nicklas 77     converters.put(Multiply.class, new MultiplyConverter());
3604 26 Jul 07 nicklas 78     converters.put(Divide.class, new DivideConverter());
3604 26 Jul 07 nicklas 79     converters.put(UMinus.class, new UMinusConverter());
3604 26 Jul 07 nicklas 80     converters.put("==", new EqualsConverter());
3604 26 Jul 07 nicklas 81     converters.put("!=", new NotEqualsConverter());
3604 26 Jul 07 nicklas 82     converters.put(">", new GreaterConverter());
3604 26 Jul 07 nicklas 83     converters.put(">=", new GreaterEqualsConverter());
3604 26 Jul 07 nicklas 84     converters.put("<", new LessConverter());
3604 26 Jul 07 nicklas 85     converters.put("<=", new LessEqualsConverter());
3604 26 Jul 07 nicklas 86     converters.put("&&", new AndConverter());
3604 26 Jul 07 nicklas 87     converters.put("||", new OrConverter());
3604 26 Jul 07 nicklas 88     converters.put(Not.class, new NotConverter());
3604 26 Jul 07 nicklas 89     
3604 26 Jul 07 nicklas 90     // Built-in functions
3604 26 Jul 07 nicklas 91     converters.put(Logarithm.class, new LogarithmConverter());
3604 26 Jul 07 nicklas 92     converters.put(NaturalLogarithm.class, new NaturalLogarithmConverter());
3604 26 Jul 07 nicklas 93     converters.put(SquareRoot.class, new SquareRootConverter());
3604 26 Jul 07 nicklas 94     converters.put(Abs.class, new AbsConverter());
3604 26 Jul 07 nicklas 95     converters.put(Exp.class, new ExpConverter());
3656 13 Aug 07 nicklas 96     converters.put(If.class, new IfConverter());
3604 26 Jul 07 nicklas 97     
3604 26 Jul 07 nicklas 98     // Constant values
3604 26 Jul 07 nicklas 99     converters.put(Integer.class, new IntegerConverter());
3604 26 Jul 07 nicklas 100     FloatConverter fc = new FloatConverter();
3604 26 Jul 07 nicklas 101     converters.put(Float.class, fc);
3604 26 Jul 07 nicklas 102     converters.put(Double.class, fc);
3604 26 Jul 07 nicklas 103     converters.put(String.class, new StringConverter());
3604 26 Jul 07 nicklas 104       
3604 26 Jul 07 nicklas 105   }
3604 26 Jul 07 nicklas 106   
3604 26 Jul 07 nicklas 107   /**
3604 26 Jul 07 nicklas 108     Get a converter for the specified built-in JEP object.
3604 26 Jul 07 nicklas 109     @param o The object to convert
3604 26 Jul 07 nicklas 110     @return A {@link JepConversionFunction} or null if no converter is found
3604 26 Jul 07 nicklas 111   */
3604 26 Jul 07 nicklas 112   public static JepConversionFunction<?> getConverter(Object o)
3604 26 Jul 07 nicklas 113   {
3604 26 Jul 07 nicklas 114     if (o == null) return null;
3604 26 Jul 07 nicklas 115     return converters.get(o);
3604 26 Jul 07 nicklas 116   }
3604 26 Jul 07 nicklas 117   
3604 26 Jul 07 nicklas 118   /**
3604 26 Jul 07 nicklas 119     Get a converter for the specified built-in JEP object by checking if
3604 26 Jul 07 nicklas 120     a converter has been registered for it's class.
3604 26 Jul 07 nicklas 121     @param o The object to convert
3604 26 Jul 07 nicklas 122     @return A {@link JepConversionFunction} or null if no converter is found
3604 26 Jul 07 nicklas 123   */
3604 26 Jul 07 nicklas 124   public static JepConversionFunction<?> getConverterByClass(Object o)
3604 26 Jul 07 nicklas 125   {
3604 26 Jul 07 nicklas 126     if (o == null) return null;
3604 26 Jul 07 nicklas 127     return converters.get(o.getClass());
3604 26 Jul 07 nicklas 128   }
3604 26 Jul 07 nicklas 129   
3604 26 Jul 07 nicklas 130   /**
3604 26 Jul 07 nicklas 131     Add a converter for a specific object. It can for example, be the class
3604 26 Jul 07 nicklas 132     of a JEP function, the symbol for an operator:
3604 26 Jul 07 nicklas 133     <pre class="code">
3604 26 Jul 07 nicklas 134 registerConverter(Add.class, new AddConverter());
3604 26 Jul 07 nicklas 135 registerConverter("==", new EqualsConverter());
3604 26 Jul 07 nicklas 136 </pre>
3604 26 Jul 07 nicklas 137     
3604 26 Jul 07 nicklas 138     @param o The object defining what the converter can convert
3604 26 Jul 07 nicklas 139     @param converter The converter
3604 26 Jul 07 nicklas 140     @throws ItemAlreadyExistsException If a converter already exists for the given class
3604 26 Jul 07 nicklas 141   */
3604 26 Jul 07 nicklas 142   public static void registerConverter(Object o, JepConversionFunction<?> converter)
3604 26 Jul 07 nicklas 143   {
3604 26 Jul 07 nicklas 144     if (o == null) throw new NullPointerException("o");
3604 26 Jul 07 nicklas 145     if (converter == null) throw new NullPointerException("converter");
3604 26 Jul 07 nicklas 146     if (converters.containsKey(o))
3604 26 Jul 07 nicklas 147     {
3604 26 Jul 07 nicklas 148       throw new ItemAlreadyExistsException("A converter for is already registered for object: " + o);
3604 26 Jul 07 nicklas 149     }
3604 26 Jul 07 nicklas 150     synchronized (converters)
3604 26 Jul 07 nicklas 151     {
3604 26 Jul 07 nicklas 152       converters.put(o, converter);
3604 26 Jul 07 nicklas 153     }
3604 26 Jul 07 nicklas 154   }
3604 26 Jul 07 nicklas 155   
3604 26 Jul 07 nicklas 156   /**
3604 26 Jul 07 nicklas 157     Get all registered converters.
3604 26 Jul 07 nicklas 158   */
3604 26 Jul 07 nicklas 159   public static Collection<JepConversionFunction<?>> getConverters()
3604 26 Jul 07 nicklas 160   {
3604 26 Jul 07 nicklas 161     return converters.values();
3604 26 Jul 07 nicklas 162   }
3604 26 Jul 07 nicklas 163   
3604 26 Jul 07 nicklas 164 }