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 }