SimpleRelation.java
001 /*
002  *  SimpleRelation.java
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  *  Valentin Tablan, 27 Feb 2012
013  *
014  *  $Id: SimpleRelation.java 17173 2013-12-15 18:54:25Z markagreenwood $
015  */
016 package gate.relations;
017 
018 import gate.Factory;
019 import gate.FeatureMap;
020 
021 import java.util.Arrays;
022 import java.util.regex.Matcher;
023 
024 /**
025  * A simple implementation for the {@link Relation} interface.
026  */
027 public class SimpleRelation implements Relation {
028 
029   private static final long serialVersionUID = 6866132107461267866L;
030 
031   protected String type;
032 
033   protected int[] members;
034 
035   protected int id;
036 
037   protected FeatureMap features;
038 
039   protected Object userData;
040 
041   /**
042    * You should never create instances of this class directly, you
043    * should create new relations via the appropriate methods of
044    {@link RelationSet}. This method is only publicly available to
045    * support persistence.
046    */
047   public SimpleRelation(int id, String type, int[] members) {
048     super();
049     this.id = id;
050     this.type = type;
051     this.members = members;
052     features = Factory.newFeatureMap();
053   }
054 
055   /*
056    * (non-Javadoc)
057    
058    * @see gate.relations.Relation#getType()
059    */
060   @Override
061   public String getType() {
062     return type;
063   }
064 
065   /*
066    * (non-Javadoc)
067    
068    * @see gate.relations.Relation#getMembers()
069    */
070   @Override
071   public int[] getMembers() {
072     return members;
073   }
074 
075   /*
076    * (non-Javadoc)
077    
078    * @see java.lang.Object#toString()
079    */
080   @Override
081   public String toString() {
082     StringBuilder str = new StringBuilder();
083     str.append(id).append(": ");
084     String typeOut =
085             type.replaceAll("\\(", Matcher.quoteReplacement("\\(")).replaceAll(
086                     "\\)", Matcher.quoteReplacement("\\)"));
087     str.append(typeOut).append("(");
088     for(int i = 0; i < members.length; i++) {
089       if(i > 0str.append(", ");
090       str.append(members[i]);
091     }
092     str.append(")");
093     if(features != null) {
094       str.append("#").append(features.toString());
095     }
096     if(userData != null) {
097       str.append("#").append(userData.toString());
098     }
099     return str.toString();
100   }
101 
102   @Override
103   public int hashCode() {
104     final int prime = 31;
105     int result = 1;
106     result = prime * result + ((features == null: features.hashCode());
107     result = prime * result + Arrays.hashCode(members);
108     result = prime * result + ((type == null: type.hashCode());
109     result = prime * result + ((userData == null: userData.hashCode());
110     return result;
111   }
112 
113   @Override
114   public boolean equals(Object obj) {
115     if(this == objreturn true;
116     if(obj == nullreturn false;
117     if(getClass() != obj.getClass()) return false;
118     SimpleRelation other = (SimpleRelation)obj;
119     if(features == null) {
120       if(other.features != nullreturn false;
121     else if(!features.equals(other.features)) return false;
122     if(!Arrays.equals(members, other.members)) return false;
123     if(type == null) {
124       if(other.type != nullreturn false;
125     else if(!type.equals(other.type)) return false;
126     if(userData == null) {
127       if(other.userData != nullreturn false;
128     else if(!userData.equals(other.userData)) return false;
129     return true;
130   }
131 
132   @Override
133   public Integer getId() {
134     return id;
135   }
136 
137   @Override
138   public FeatureMap getFeatures() {
139     return features;
140   }
141 
142   @Override
143   public void setFeatures(FeatureMap features) {
144     this.features = features;
145   }
146 
147   @Override
148   public Object getUserData() {
149     return userData;
150   }
151 
152   @Override
153   public void setUserData(Object data) {
154     userData = data;
155   }
156 }