001 package ps6.tigerdb;
002 import java.io.Serializable;
003 import java.util.ArrayList;
004 import java.util.HashMap;
005 import java.util.Iterator;
006
007 /**
008 * Feature.java
009 *
010 * @author Felix S. Klock II
011 */
012
013 public class Feature implements Serializable {
014 // public static Set fullNames = new TreeSet();
015 public static final long serialVersionUID = 4534;
016 private final String prefixDir;
017 private final String name;
018 private final String type;
019 private final String suffixDir;
020
021 public Feature(String prefixDir, String name,
022 String type, String suffixDir) {
023 this.prefixDir = prefixDir.trim().intern();
024 this.name = name.trim().intern();
025 this.type = type.trim().intern();
026 this.suffixDir = suffixDir.trim().intern();
027
028 // fullNames.add( fullName().intern() );
029 }
030
031 public Feature(String s) {
032 if (s.length() != 38)
033 throw new RuntimeException
034 ("feature must have length of 38, not "+s.length());
035 prefixDir = s.substring( 0, 2).trim().intern();
036 name = s.substring( 2, 32).trim().intern();
037 type = s.substring(32, 36).trim().intern();
038 suffixDir = s.substring(36, 38).trim().intern();
039
040 // fullNames.add( fullName().intern() );
041 }
042
043 public boolean equals(/*@Nullable*/ Object o) {
044 if (! (o instanceof Feature) ) return false;
045 return ((Feature)o).fullName().equals(this.fullName());
046 }
047 public int hashCode() {
048 return fullName().hashCode();
049 }
050 public String fullName() {
051 StringBuilder sb = new StringBuilder();
052 boolean pre = false;
053 if (prefixDir.length() > 0) {
054 sb.append(prefixDir); pre = true;
055 }
056 if (name.length() > 0) {
057 sb.append((pre)?" ":"");
058 sb.append(name);
059 pre = true;
060 }
061 if (type.length() > 0) {
062 sb.append((pre)?" ":"");
063 sb.append(type);
064 pre = true;
065 }
066 if (suffixDir.length() > 0) {
067 sb.append((pre)?" ":"");
068 sb.append(suffixDir);
069 }
070
071 if (sb.length() == 0) {
072 sb.append("(unnamed street)");
073 }
074 return sb.toString();
075 }
076
077 private static HashMap<Feature, Feature> internMap = new HashMap<Feature, Feature>();
078 public Feature intern() {
079 if (internMap.containsKey(this)) {
080 return internMap.get(this);
081 } else {
082 internMap.put(this, this);
083 return this;
084 }
085 }
086
087 /** Returns an Iterator[String] of names for this feature. */
088 Iterator<String> names() {
089 ArrayList<String> l = new ArrayList<String>();
090 l.add(fullName().trim());
091 l.add(name.trim());
092 l.add( (prefixDir+" "+name).trim() );
093 l.add( (prefixDir+" "+name+" "+type).trim() );
094 l.add( (name+" "+type).trim() );
095 l.add( (name+" "+type+" "+suffixDir).trim() );
096 return ImmIterator.wrap(l.iterator());
097 }
098
099 public String toString() {
100 return "Feature:"+fullName();
101 }
102
103 /**
104 * @return the prefix directory of the feature.
105 */
106 public String getPrefixDir() {
107 return prefixDir;
108 }
109
110 /**
111 * @return the name of the feature.
112 */
113 public String getName() {
114 return name;
115 }
116 /**
117 * @return the type of the feature.
118 */
119 public String getType() {
120 return type;
121 }
122 /**
123 * @return the suffix directory of the feature.
124 */
125 public String getSuffixDir() {
126 return suffixDir;
127 }
128
129 } // Feature