001    package com.thaiopensource.validate.mns;
002    
003    import com.thaiopensource.xml.util.Name;
004    
005    import java.util.Vector;
006    import java.util.Hashtable;
007    
008    class ContextMap {
009      private Object rootValue;
010      private Object otherValue;
011      private final Hashtable nameTable = new Hashtable();
012    
013      Object get(Vector context) {
014        return get(context, context.size());
015      }
016    
017      boolean put(boolean isRoot, Vector names, Object value) {
018        return put(isRoot, names, names.size(), value);
019      }
020    
021      private Object get(Vector context, int len) {
022        if (len > 0) {
023          ContextMap nestedMap = (ContextMap)nameTable.get(context.elementAt(len - 1));
024          if (nestedMap != null) {
025            Object value = nestedMap.get(context, len - 1);
026            if (value != null)
027              return value;
028          }
029        }
030        if (rootValue != null && len == 0)
031          return rootValue;
032        return otherValue;
033      }
034    
035      private boolean put(boolean isRoot, Vector names, int len, Object value) {
036        if (len == 0) {
037          if (isRoot) {
038            if (rootValue != null)
039              return false;
040            rootValue = value;
041          }
042          else {
043            if (otherValue != null)
044              return false;
045            otherValue = value;
046          }
047          return true;
048        }
049        else {
050          Name name = (Name)names.elementAt(len - 1);
051          ContextMap nestedMap = (ContextMap)nameTable.get(name);
052          if (nestedMap == null) {
053            nestedMap = new ContextMap();
054            nameTable.put(name, nestedMap);
055          }
056          return nestedMap.put(isRoot, names, len - 1, value);
057        }
058      }
059    }