package rtt.annotation.test.rtt;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Platform;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.osgi.framework.Bundle;
import rtt.annotation.editor.AnnotationEditorPlugin;
import rtt.annotation.editor.data.NameResolver;
import rtt.annotation.editor.data.asm.ASMClassModelManager;
import rtt.annotation.editor.model.ClassElement;
import rtt.annotation.editor.model.ClassModel;
import rtt.annotation.editor.model.ClassModelFactory;
import rtt.annotations.Node;
@Node
public class RTTParser {
ClassModel model;
public RTTParser() {
model = ClassModelFactory.getFactory().createClassModel();
}
@Node.Initialize
public void initialize(InputStream in) throws Exception {
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(in));
List<String> fileNames = new ArrayList<String>();
String line = bufferedreader.readLine();
while (line != null) {
if (!line.equals("") && !fileNames.contains(line)) {
fileNames.add(line);
}
line = bufferedreader.readLine();
}
bufferedreader.close();
Bundle bundle = Platform.getBundle(AnnotationEditorPlugin.PLUGIN_ID);
if (bundle == null) {
throw new IllegalStateException("Bundle not found");
}
ClassModelFactory factory = ClassModelFactory.getFactory();
model = factory.createClassModel();
for (String fileName : fileNames) {
URL resourceURL = bundle.getEntry(fileName);
System.out.println("Reading: " + resourceURL);
ClassReader reader = new ClassReader(resourceURL.openStream());
String completeName = reader.getClassName().replace("/", ".");
String className = ASMClassModelManager.RESOLVER.computeClassName(completeName);
String packageName = ASMClassModelManager.RESOLVER.computePackageName(completeName);
ClassElement element = factory.createClassElement(model, className, packageName);
ClassVisitor visitor = new ImportClassElementVisitor(element, factory);
reader.accept(visitor, ClassReader.SKIP_CODE);
model.addClassElement(element);
}
}
@Node.Value
public ClassModel getModel() {
return model;
}
}