001    package org.crsh.cmdline.spi;
002    
003    import java.io.Serializable;
004    import java.util.Iterator;
005    import java.util.LinkedHashMap;
006    import java.util.Map;
007    import java.util.Set;
008    
009    /**
010     * A completion result.
011     *
012     * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
013     */
014    public final class ValueCompletion implements Iterable<Map.Entry<String, Boolean>>, Serializable {
015    
016      public static ValueCompletion create() {
017        return new ValueCompletion();
018      }
019    
020      public static ValueCompletion create(String prefix) {
021        return new ValueCompletion(prefix);
022      }
023    
024      public static ValueCompletion create(String prefix, String suffix, boolean value) {
025        ValueCompletion result = new ValueCompletion(prefix);
026        result.put(suffix, value);
027        return result;
028      }
029    
030      public static ValueCompletion create(String suffix, boolean value) {
031        ValueCompletion result = new ValueCompletion();
032        result.put(suffix, value);
033        return result;
034      }
035    
036      /** . */
037      private final String prefix;
038    
039      /** . */
040      private final Map<String, Boolean> entries;
041    
042      public ValueCompletion() {
043        this("");
044      }
045    
046      public ValueCompletion(String prefix) {
047        this(prefix, new LinkedHashMap<String, Boolean>());
048      }
049    
050      public ValueCompletion(String prefix, Map<String, Boolean> entries) {
051        if (prefix == null) {
052          throw new NullPointerException("No null prefix allowed");
053        }
054        if (entries == null) {
055          throw new NullPointerException("No null values allowed");
056        }
057    
058        //
059        this.prefix = prefix;
060        this.entries = entries;
061      }
062    
063      public Iterator<Map.Entry<String, Boolean>> iterator() {
064        return entries.entrySet().iterator();
065      }
066    
067      public Set<String> getSuffixes() {
068        return entries.keySet();
069      }
070    
071      public boolean isEmpty() {
072        return entries.isEmpty();
073      }
074    
075      public Object get(String key) {
076        return entries.get(key);
077      }
078    
079      public int getSize() {
080        return entries.size();
081      }
082    
083      public ValueCompletion put(String key, boolean value) {
084        entries.put(key, value);
085        return this;
086      }
087    
088      public String getPrefix() {
089        return prefix;
090      }
091    
092      @Override
093      public int hashCode() {
094        return prefix.hashCode() ^ entries.hashCode();
095      }
096    
097      @Override
098      public boolean equals(Object obj) {
099        if (obj == this) {
100          return true;
101        }
102        if (obj instanceof ValueCompletion) {
103          ValueCompletion that = (ValueCompletion)obj;
104          return prefix.equals(that.prefix) && entries.equals(that.entries);
105        }
106        return false;
107      }
108    
109      @Override
110      public String toString() {
111        return "Completion[prefix=" + prefix + ",entries=" + entries + "]";
112      }
113    }