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 }