1: 
  37: 
  38: package ;
  39: 
  40: import ;
  41: import ;
  42: import ;
  43: import ;
  44: import ;
  45: import ;
  46: import ;
  47: import ;
  48: 
  49: 
  54: public class NodeReader {
  55: 
  56:     private final BufferedReader br;
  57:     private String line = "";
  58: 
  59:     private final PreferencesFactory factory;
  60: 
  61:     public NodeReader(Reader r, PreferencesFactory factory) {
  62:         if(r instanceof BufferedReader) {
  63:             br = (BufferedReader) r;
  64:         } else {
  65:             br = new BufferedReader(r);
  66:         }
  67:         this.factory = factory;
  68:     }
  69: 
  70:     public NodeReader(InputStream is, PreferencesFactory factory) {
  71:         this(new InputStreamReader(is), factory);
  72:     }
  73: 
  74:     public void importPreferences()
  75:                     throws InvalidPreferencesFormatException, IOException
  76:     {
  77:         readPreferences();
  78:     }
  79: 
  80:     private void readPreferences()
  81:                     throws InvalidPreferencesFormatException, IOException
  82:     {
  83:         
  84:         skipTill("<preferences");
  85: 
  86:         readRoot();
  87: 
  88:         
  89:         skipTill("</preferences>");
  90:     }
  91: 
  92:     private void readRoot()
  93:                     throws InvalidPreferencesFormatException, IOException
  94:     {
  95:         
  96:         skipTill("<root");
  97: 
  98:         
  99:         skipTill("type=\"");
 100:         String type = readTill("\"");
 101:         Preferences root;
 102:         if ("user".equals(type)) {
 103:             root = factory.userRoot();
 104:         } else if ("system".equals(type)) {
 105:             root = factory.systemRoot();
 106:         } else {
 107:             throw new InvalidPreferencesFormatException("Unknown type: "
 108:                                                         + type);
 109:         }
 110: 
 111:         
 112:         readMap(root);
 113:         readNodes(root);
 114: 
 115:         
 116:         skipTill("</root>");
 117:     }
 118: 
 119:     private void readNodes(Preferences node)
 120:                     throws InvalidPreferencesFormatException, IOException
 121:     {
 122:         while ("node".equals(nextTag())) {
 123:             skipTill("<node");
 124:             skipTill("name=\"");
 125:             String name = readTill("\"");
 126:             Preferences subnode = node.node(name);
 127:             readMap(subnode);
 128:             readNodes(subnode);
 129:             skipTill("</node>");
 130:         }
 131: 
 132:     }
 133: 
 134:     private void readMap(Preferences node)
 135:                     throws InvalidPreferencesFormatException, IOException
 136:     {
 137:         
 138:         skipTill("<map");
 139: 
 140:         
 141:         if (line.startsWith("/>")) {
 142:             line = line.substring(2);
 143:             return;
 144:         }
 145: 
 146:         
 147:         readEntries(node);
 148: 
 149:         
 150:         skipTill("</map>");
 151:     }
 152: 
 153:     private void readEntries(Preferences node)
 154:                     throws InvalidPreferencesFormatException, IOException
 155:     {
 156:         while ("entry".equals(nextTag())) {
 157:             skipTill("<entry");
 158:             skipTill("key=\"");
 159:             String key = readTill("\"");
 160:             skipTill("value=\"");
 161:             String value = readTill("\"");
 162:             node.put(key, value);
 163:         }
 164:     }
 165: 
 166:     private void skipTill(String s)
 167:                     throws InvalidPreferencesFormatException, IOException
 168:     {
 169:         while(true) {
 170:             if (line == null)
 171:                 throw new InvalidPreferencesFormatException(s + " not found");
 172: 
 173:             int index = line.indexOf(s);
 174:             if (index == -1)  {
 175:                 line = br.readLine();
 176:             } else {
 177:                 line = line.substring(index+s.length());
 178:                 return;
 179:             }
 180:         }
 181:     }
 182: 
 183:     private String readTill(String s)
 184:                     throws InvalidPreferencesFormatException
 185:     {
 186:         int index = line.indexOf(s);
 187:         if (index == -1)
 188:                 throw new InvalidPreferencesFormatException(s + " not found");
 189: 
 190:         String read = line.substring(0, index);
 191:         line = line.substring(index+s.length());
 192: 
 193:         return read;
 194:     }
 195: 
 196:     private String nextTag()
 197:                     throws InvalidPreferencesFormatException, IOException
 198:     {
 199:         while(true) {
 200:             if (line == null)
 201:                 throw new InvalidPreferencesFormatException("unexpected EOF");
 202: 
 203:             int start = line.indexOf("<");
 204:             if (start == -1)  {
 205:                 line = br.readLine();
 206:             } else {
 207:                 
 208:                 int end = start+1;
 209:                 while (end != line.length()
 210:                        && " \t\r\n".indexOf(line.charAt(end)) == -1) {
 211:                     end++;
 212:                 }
 213:                 
 214:                 String tag = line.substring(start+1,end);
 215:                 line = line.substring(start);
 216:                 return tag;
 217:             }
 218:         }
 219:     }
 220: 
 221: }