AbstractConstraintPredicate.java
001 /*
002  *  Constraint Predicate implementation
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 package gate.jape.constraint;
017 
018 import gate.Annotation;
019 import gate.AnnotationSet;
020 import gate.jape.JapeException;
021 
022 /**
023  * Base class for most {@link ConstraintPredicate}s. Contains standard
024  * getters/setters and other routines.
025  *
026  @author esword
027  */
028 public abstract class AbstractConstraintPredicate implements
029                                                  ConstraintPredicate {
030 
031   private static final long serialVersionUID = -4564142595796620686L;
032 
033   protected AnnotationAccessor accessor;
034   protected Object value;
035 
036   public AbstractConstraintPredicate() {
037   }
038 
039   public AbstractConstraintPredicate(AnnotationAccessor accessor, Object value) {
040     setAccessor(accessor);
041     setValue(value);
042   }
043 
044   @Override
045   public String toString() {
046     // If value is a String, quote it. Otherwise (for things like
047     // Numbers), don't.
048     Object val = getValue();
049     if(val instanceof Stringval = "\"" + val + "\"";
050     return accessor + " " + getOperator() " " + val;
051   }
052 
053   @Override
054   public int hashCode() {
055     final int prime = 31;
056     int result = 1;
057     result = prime * result + ((accessor == null: accessor.hashCode());
058     result = prime * result + ((value == null: value.hashCode());
059     return result;
060   }
061 
062   @Override
063   public boolean equals(Object obj) {
064     if(this == objreturn true;
065     if(obj == nullreturn false;
066     if(!(obj instanceof AbstractConstraintPredicate)) return false;
067     AbstractConstraintPredicate other = (AbstractConstraintPredicate)obj;
068     if(accessor == null) {
069       if(other.accessor != nullreturn false;
070     else if(!accessor.equals(other.accessor)) return false;
071     if(value == null) {
072       if(other.value != nullreturn false;
073     else if(!value.equals(other.value)) return false;
074     return true;
075   }
076 
077   @Override
078   public boolean matches(Annotation annot, AnnotationSet contextthrows JapeException {
079     //get the appropriate value using the accessor and then have
080     //concrete subclasses do the eval
081     return doMatch(accessor.getValue(annot, context), context);
082   }
083 
084   protected abstract boolean doMatch(Object value, AnnotationSet context)
085           throws JapeException;
086 
087 
088 
089   @Override
090   public void setAccessor(AnnotationAccessor accessor) {
091     this.accessor = accessor;
092   }
093 
094   @Override
095   public AnnotationAccessor getAccessor() {
096     return accessor;
097   }
098 
099   @Override
100   public void setValue(Object value) {
101     this.value = value;
102   }
103 
104   @Override
105   public Object getValue() {
106     return value;
107   }
108 }