| SimpleFeatureMapImpl |

    1   /*
    2    *  SimpleFeatureMapImpl.java
    3    *
    4    *  Copyright (c) 1998-2001, The University of Sheffield.
    5    *
    6    *  This file is part of GATE (see http://gate.ac.uk/), and is free
    7    *  software, licenced under the GNU Library General Public License,
    8    *  Version 2, June 1991 (in the distribution as file licence.html,
    9    *  and also available at http://gate.ac.uk/gate/licence.html).
    10   *
    11   *  Hamish Cunningham, 7/Feb/2000
    12   *
    13   *  $Id: SimpleFeatureMapImpl.java,v 1.17 2001/11/20 14:10:36 cursu Exp $
    14   */
    15
    16  package gate.util;
    17
    18  import java.util.*;
    19  import gate.*;
    20  import gate.event.*;
    21
    22  /** Simple case of features.
    23    */
    24  //>>> DAM: was (derived from HashMap)
    25  /*
    26  public class SimpleFeatureMapImpl  extends HashMap implements FeatureMap
    27  */
    28  //=== DAM: FeatArray optimization, now derived from SimpleMapImpl
    29  public class SimpleFeatureMapImpl
    30      extends SimpleMapImpl
    31  //    extends HashMap
    32      implements FeatureMap, java.io.Serializable, java.lang.Cloneable
    33  //>>> DAM: end
    34  {
    35    /** Debug flag */
    36    private static final boolean DEBUG = false;
    37
    38
    39    /** Test if <b>this</b> featureMap includes all features from aFeatureMap
    40      * @param aFeatureMap object which will be included or not in
    41      * <b>this</b> FeatureMap obj.If this param is null then it will return true.
    42      * @return <code>true</code> if aFeatureMap is incuded in <b>this</b> obj.
    43      * and <code>false</code> if not.
    44      */
    45    public boolean subsumes(FeatureMap aFeatureMap){
    46      // null is included in everything
    47      if (aFeatureMap == null) return true;
    48
    49      if (this.size() < aFeatureMap.size()) return false;
    50
    51      SimpleFeatureMapImpl sfm = (SimpleFeatureMapImpl)aFeatureMap;
    52
    53      Object key;
    54      Object keyValueFromAFeatureMap;
    55      Object keyValueFromThis;
    56
    57      for (int i=0; i<sfm.m_size; i++) {
    58        key = sfm.m_keys[i];
    59        keyValueFromAFeatureMap = sfm.m_values[i];
    60        keyValueFromThis = get(key);
    61
    62        if  ( (keyValueFromThis == null && keyValueFromAFeatureMap != null) ||
    63              (keyValueFromThis != null && keyValueFromAFeatureMap == null)
    64            ) return false;
    65
    66        if ((keyValueFromThis != null) && (keyValueFromAFeatureMap != null))
    67          if (!keyValueFromThis.equals(keyValueFromAFeatureMap)) return false;
    68      } // for
    69
    70      return true;
    71    }//subsumes()
    72
    73    /** Tests if <b>this</b> featureMap object includes aFeatureMap but only
    74      * for the those features present in the aFeatureNamesSet.
    75      * @param aFeatureMap which will be included or not in <b>this</b>
    76      * FeatureMap obj.If this param is null then it will return true.
    77      * @param aFeatureNamesSet is a set of strings representing the names of the
    78      * features that would be considered for subsumes. If aFeatureNamesSet is
    79      * <b>null</b> then subsumes(FeatureMap) will be called.
    80      * @return <code>true</code> if all features present in the aFeaturesNameSet
    81      * from aFeatureMap are included in <b>this</b> obj, or <code>false</code>
    82      * otherwise.
    83      */
    84    public boolean subsumes(FeatureMap aFeatureMap, Set aFeatureNamesSet){
    85      // This means that all features are taken into consideration.
    86      if (aFeatureNamesSet == null) return this.subsumes(aFeatureMap);
    87      // null is included in everything
    88      if (aFeatureMap == null) return true;
    89      // This means that subsumes is supressed.
    90      if (aFeatureNamesSet.isEmpty()) return true;
    91
    92      SimpleFeatureMapImpl sfm = (SimpleFeatureMapImpl)aFeatureMap;
    93
    94      Object key;
    95      Object keyValueFromAFeatureMap;
    96      Object keyValueFromThis;
    97
    98      for (int i=0; i<sfm.m_size; i++) {
    99        key = sfm.m_keys[i];
    100
    101       if (!aFeatureNamesSet.contains(key))
    102         continue;
    103
    104       keyValueFromAFeatureMap = sfm.m_values[i];
    105         keyValueFromThis = get(key);
    106
    107       if  ( (keyValueFromThis == null && keyValueFromAFeatureMap != null) ||
    108             (keyValueFromThis != null && keyValueFromAFeatureMap == null)
    109           ) return false;
    110
    111       if ((keyValueFromThis != null) && (keyValueFromAFeatureMap != null))
    112         if (!keyValueFromThis.equals(keyValueFromAFeatureMap)) return false;
    113     } // for
    114
    115     return true;
    116   }// subsumes()
    117
    118
    119   /**
    120    * Overriden to fire events, so that the persistent objects
    121    *  can keep track of what's updated
    122    */
    123   public Object put(Object key, Object value) {
    124     Object result = super.put(key, value);
    125     this.fireMapUpdatedEvent();
    126     return result;
    127   } // put
    128
    129   /**
    130    * Overriden to fire events, so that the persistent objects
    131    *  can keep track of what's updated
    132    */
    133   public Object remove(Object key) {
    134     Object result = super.remove(key);
    135     this.fireMapUpdatedEvent();
    136     return result;
    137   } // remove
    138
    139   public void clear() {
    140     super.clear();
    141     //tell the world if they're listening
    142     this.fireMapUpdatedEvent();
    143   } // clear
    144
    145   // Views
    146     public Object clone() {
    147           return super.clone();
    148     }
    149
    150   public boolean equals(Object o) {
    151     return super.equals(o);
    152   }
    153
    154
    155 //////////////////THE EVENT HANDLING CODE//////////////
    156 //Needed so an annotation can listen to its features//
    157 //and update correctly the database//////////////////
    158   private transient Vector mapListeners;
    159   /**
    160    *
    161    * Removes a gate listener
    162    */
    163   public synchronized void removeFeatureMapListener(FeatureMapListener l) {
    164     if (mapListeners != null && mapListeners.contains(l)) {
    165       Vector v = (Vector) mapListeners.clone();
    166       v.removeElement(l);
    167       mapListeners = v;
    168     }
    169   }
    170   /**
    171    *
    172    * Adds a gate listener
    173    */
    174    public synchronized void addFeatureMapListener(FeatureMapListener l) {
    175      Vector v = mapListeners == null ? new Vector(2) : (Vector)mapListeners.clone();
    176     if (!v.contains(l)) {
    177       v.addElement(l);
    178       mapListeners = v;
    179     }
    180   }
    181   /**
    182    *
    183    * @param e
    184    */
    185    protected void fireMapUpdatedEvent () {
    186      if (mapListeners != null) {
    187        Vector listeners = mapListeners;
    188       int count = listeners.size();
    189       if (count == 0) return;
    190       for (int i = 0; i < count; i++)
    191         ((FeatureMapListener) listeners.elementAt(i)).featureMapUpdated();
    192     }
    193   }//fireAnnotationUpdated
    194
    195
    196  /** Freeze the serialization UID. */
    197   static final long serialVersionUID = -2747241616127229116L;
    198 } // class SimpleFeatureMapImpl
    199
    200

| SimpleFeatureMapImpl |