ConstraintFactory.java
001 /*
002  *  Constraint Factory - transducer class
003  *
004  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Eric Sword, 03/09/08
013  *
014  *  $Id$
015  */
016 
017 package gate.jape.constraint;
018 
019 import java.util.*;
020 
021 import gate.jape.Constraint;
022 
023 /**
024  * Creates Jape {@link Constraint}s and associated
025  {@link ConstraintPredicate}s.
026  *
027  @version $Revision$
028  @author esword
029  */
030 public class ConstraintFactory {
031 
032   protected Map<String, Class<? extends ConstraintPredicate>> operatorImplMap =
033     new HashMap<String, Class<? extends ConstraintPredicate>>();
034 
035   protected Map<String, Class<? extends AnnotationAccessor>> metaPropertyMap =
036     new HashMap<String, Class<? extends AnnotationAccessor>>();
037 
038   public ConstraintFactory() {
039     initOperatorMap();
040     initMetaPropertyMap();
041   }
042 
043   protected void initOperatorMap() {
044     addOperator(ConstraintPredicate.EQUAL, EqualPredicate.class);
045     addOperator(ConstraintPredicate.NOT_EQUAL, NotEqualPredicate.class);
046     addOperator(ConstraintPredicate.GREATER, GreaterPredicate.class);
047     addOperator(ConstraintPredicate.LESSER, LesserPredicate.class);
048     addOperator(ConstraintPredicate.GREATER_OR_EQUAL,
049             GreaterEqualPredicate.class);
050     addOperator(ConstraintPredicate.LESSER_OR_EQUAL, LesserEqualPredicate.class);
051     addOperator(ConstraintPredicate.REGEXP_FIND, RegExpFindPredicate.class);
052     addOperator(ConstraintPredicate.NOT_REGEXP_FIND, NotRegExpFindPredicate.class);
053     addOperator(ConstraintPredicate.REGEXP_MATCH, RegExpMatchPredicate.class);
054     addOperator(ConstraintPredicate.NOT_REGEXP_MATCH, NotRegExpMatchPredicate.class);
055     addOperator(ContainsPredicate.OPERATOR, ContainsPredicate.class);
056     addOperator(NotContainsPredicate.OPERATOR, NotContainsPredicate.class);
057     addOperator(WithinPredicate.OPERATOR, WithinPredicate.class);
058     addOperator(NotWithinPredicate.OPERATOR, NotWithinPredicate.class);
059   }
060 
061   protected void initMetaPropertyMap() {
062     addMetaProperty("string", StringAccessor.class);
063     addMetaProperty("cleanString", CleanStringAccessor.class);
064     addMetaProperty("length", LengthAccessor.class);
065   }
066 
067   public void addOperator(String operator,
068           Class<? extends ConstraintPredicate> clazz) {
069     operatorImplMap.put(operator, clazz);
070   }
071 
072   public void addMetaProperty(String metaProperty,
073           Class<? extends AnnotationAccessor> clazz) {
074     metaPropertyMap.put(metaProperty, clazz);
075   }
076 
077   /**
078    * Create a new constraint for the given annotation type
079    */
080   public Constraint createConstraint(String annotType) {
081     return new Constraint(annotType);
082   }
083 
084   public AnnotationAccessor createDefaultAccessor(Object key) {
085     return new AnnotationFeatureAccessor(key);
086   }
087 
088   public AnnotationAccessor createMetaPropertyAccessor(String propName) {
089     AnnotationAccessor retVal = null;
090     Class<?> clazz = metaPropertyMap.get(propName);
091     if(clazz == null)
092       throw new IllegalArgumentException(
093               "No meta property associated with name: " + propName);
094 
095     try {
096       retVal = (AnnotationAccessor)clazz.newInstance();
097     }
098     catch(Exception e) {
099       throw new RuntimeException("Could not create accessor for name '"
100               + propName + "'", e);
101     }
102 
103     return retVal;
104   }
105 
106   /**
107    * Create a constraint predicate using the default equals predicate.
108    *
109    @param name feature name associated with the predicate
110    @param value value associated with the predicate
111    */
112   public ConstraintPredicate createPredicate(String name, Object value) {
113     return createPredicate(createDefaultAccessor(name), value);
114   }
115 
116   public ConstraintPredicate createPredicate(AnnotationAccessor accessor,
117           Object value) {
118     return createPredicate(ConstraintPredicate.EQUAL, accessor, value);
119   }
120 
121   public ConstraintPredicate createPredicate(String operator,
122           AnnotationAccessor accessor, Object value) {
123     ConstraintPredicate retVal = null;
124     Class<?> clazz = operatorImplMap.get(operator);
125     if(clazz == null)
126       throw new IllegalArgumentException(
127               "No predicate associated with operator: " + operator);
128 
129     try {
130       retVal = (ConstraintPredicate)clazz.newInstance();
131       retVal.setAccessor(accessor);
132       retVal.setValue(value);
133     }
134     catch(Exception e) {
135       throw new RuntimeException("Could not create predicate for operator '"
136               + operator + "' with accessor '" + accessor + "' and value '"
137               + value + "'", e);
138     }
139 
140     return retVal;
141   }
142 
143 }