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(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.keySet().contains(this)) {
080                return (Feature) 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