package gnu.java.util.prefs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.prefs.InvalidPreferencesFormatException;
import java.util.prefs.Preferences;
import java.util.prefs.PreferencesFactory;
public class NodeReader {
private final BufferedReader br;
private String line = "";
private final PreferencesFactory factory;
public NodeReader(Reader r, PreferencesFactory factory) {
if(r instanceof BufferedReader) {
br = (BufferedReader) r;
} else {
br = new BufferedReader(r);
}
this.factory = factory;
}
public NodeReader(InputStream is, PreferencesFactory factory) {
this(new InputStreamReader(is), factory);
}
public void importPreferences()
throws InvalidPreferencesFormatException, IOException
{
readPreferences();
}
private void readPreferences()
throws InvalidPreferencesFormatException, IOException
{
skipTill("<preferences");
readRoot();
skipTill("</preferences>");
}
private void readRoot()
throws InvalidPreferencesFormatException, IOException
{
skipTill("<root");
skipTill("type=\"");
String type = readTill("\"");
Preferences root;
if ("user".equals(type)) {
root = factory.userRoot();
} else if ("system".equals(type)) {
root = factory.systemRoot();
} else {
throw new InvalidPreferencesFormatException("Unknown type: "
+ type);
}
readMap(root);
readNodes(root);
skipTill("</root>");
}
private void readNodes(Preferences node)
throws InvalidPreferencesFormatException, IOException
{
while ("node".equals(nextTag())) {
skipTill("<node");
skipTill("name=\"");
String name = readTill("\"");
Preferences subnode = node.node(name);
System.out.println("Found subnode: " + subnode.absolutePath());
readMap(subnode);
readNodes(subnode);
skipTill("</node>");
}
}
private void readMap(Preferences node)
throws InvalidPreferencesFormatException, IOException
{
skipTill("<map");
if (line.startsWith("/>")) {
line = line.substring(2);
return;
}
readEntries(node);
skipTill("</map>");
}
private void readEntries(Preferences node)
throws InvalidPreferencesFormatException, IOException
{
while ("entry".equals(nextTag())) {
skipTill("<entry");
skipTill("key=\"");
String key = readTill("\"");
skipTill("value=\"");
String value = readTill("\"");
System.out.println("Key: " + key + " Value: " + value);
node.put(key, value);
}
}
private void skipTill(String s)
throws InvalidPreferencesFormatException, IOException
{
while(true) {
if (line == null)
throw new InvalidPreferencesFormatException(s + " not found");
int index = line.indexOf(s);
if (index == -1) {
line = br.readLine();
} else {
line = line.substring(index+s.length());
return;
}
}
}
private String readTill(String s)
throws InvalidPreferencesFormatException
{
int index = line.indexOf(s);
if (index == -1)
throw new InvalidPreferencesFormatException(s + " not found");
String read = line.substring(0, index);
line = line.substring(index+s.length());
return read;
}
private String nextTag()
throws InvalidPreferencesFormatException, IOException
{
while(true) {
if (line == null)
throw new InvalidPreferencesFormatException("unexpected EOF");
int start = line.indexOf("<");
if (start == -1) {
line = br.readLine();
} else {
int end = start+1;
while (end != line.length()
&& " \t\r\n".indexOf(line.charAt(end)) == -1) {
end++;
}
String tag = line.substring(start+1,end);
line = line.substring(start);
return tag;
}
}
}
}