1 19 20 package org.netbeans.upgrade.systemoptions; 21 22 import java.io.*; 23 import java.util.Iterator ; 24 import java.util.Set ; 25 import org.openide.filesystems.FileObject; 26 27 31 public class SystemOptionsParser { 32 static final String EXPECTED_INSTANCE = "org.openide.options.SystemOption"; 34 private String systemOptionInstanceName; 35 private boolean types; 36 37 private SystemOptionsParser(final String systemOptionInstanceName, final boolean types) { 38 this.systemOptionInstanceName = systemOptionInstanceName; 39 this.types = types; 40 } 41 42 public static DefaultResult parse(FileObject settingsFo, boolean types) throws IOException, ClassNotFoundException { 43 SettingsRecognizer instance = getRecognizer(settingsFo); 44 45 SystemOptionsParser rImpl = null; 46 InputStream is = instance.getSerializedInstance(); 47 try { 48 SerParser sp = new SerParser(is); 49 SerParser.Stream s = sp.parse(); 50 rImpl = new SystemOptionsParser(instance.instanceName(), types); 51 DefaultResult ret = (DefaultResult)rImpl.processContent(s.contents.iterator(), false); 52 ret.setModuleName(instance.getCodeNameBase().replace('.','/')); 53 return ret; 54 } finally { 55 is.close(); 56 } 57 } 58 59 private Result processContent(final Iterator <Object > it, final boolean reachedWriteReplace) { 60 for (; it.hasNext();) { 61 Object elem = it.next(); 62 if (!reachedWriteReplace && elem instanceof SerParser.ObjectWrapper) { 63 SerParser.ObjectWrapper ow = (SerParser.ObjectWrapper)elem; 64 String name = ow.classdesc.name; 65 if (name.endsWith("org.openide.util.SharedClassObject$WriteReplace;")) { return processContent(ow.data.iterator(), true); 67 } 68 } else if (reachedWriteReplace && elem instanceof SerParser.NameValue ) { 69 SerParser.NameValue nv = (SerParser.NameValue)elem; 70 if (systemOptionInstanceName.equals(nv.value)) { 71 Result result = ContentProcessor.parseContent(systemOptionInstanceName, types, it); 72 return result; 73 } 74 } 75 } 76 return null; 77 } 78 79 private static SettingsRecognizer getRecognizer(final FileObject settingsFo) throws IOException { 80 SettingsRecognizer recognizer = new SettingsRecognizer(false, settingsFo); 81 recognizer.parse(); 82 83 Set instances = recognizer.getInstanceOf(); 84 String iName = recognizer.instanceName(); 85 if (!instances.contains(EXPECTED_INSTANCE)) { 86 throw new IOException(iName); 87 } 88 return recognizer; 89 } 90 } 91 92 93 94 95 | Popular Tags |