package cideplus.automation; import java.util.TreeSet; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import cideplus.FeaturerPlugin; import cideplus.ui.configuration.FeaturesConfigurationUtil; import cideplus.ui.configuration.ICompilationUnitFeaturesManager; public class WizardPagina2 extends WizardPage { private final IProject project; private IJavaProject javaProject; public Tree tree, lstSeeds; public WizardPagina2(String pageName, IProject p) { super(pageName); this.setTitle("Semi-automatic Feature Extraction - Step 2"); this.project = p; } @Override public boolean canFlipToNextPage() { return (false); } /*MÉTODOS UTILITARIOS*/ private ICompilationUnitFeaturesManager getSafeCompilationUnit(ICompilationUnit cu) { try { return FeaturesConfigurationUtil.getFeaturesManager(project).getManagerForFile(cu); } catch (Exception e) { MessageDialog.openError(getShell(), "Erro", "Não foi possível criar o compilation unit para o arquivo. " + e.getMessage()); throw new RuntimeException(e); } } private CompilationUnit getAst(ICompilationUnit cu) { return Util.getAst(cu); } public void createControl(Composite parent) { String path = "/images/source_obj.gif"; final Image img_src = getImage(path); final Image img_lib = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/library_obj.gif")); final Image img_pkg = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/package_obj.gif")); final Image img_inter = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/int_obj.gif")); final Image img_classe = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/class_obj.gif")); final Image img_mathpub = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/methpub_obj.gif")); final Image img_mathpro = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/methpro_obj.gif")); final Image img_mathpri = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/methpri_obj.gif")); final Image img_field_pub = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/field_public_obj.gif")); final Image img_field_pri = new Image(getShell().getDisplay(), FeaturerPlugin.getFile("/images/field_private_obj.gif")); final Composite composite = new Composite(parent, SWT.NONE); javaProject = null; try { javaProject = (IJavaProject)project.getNature(JavaCore.NATURE_ID); } catch (CoreException e2) { e2.printStackTrace(); return; } composite.setLayout(null); Label label = new Label(composite, SWT.NONE); label.setText("Select the seeds for feature extraction:"); label.setBounds(30, 30, 230, 50); tree = new Tree(composite, SWT.MULTI | SWT.BORDER); final TreeItem root = new TreeItem(tree, SWT.NULL); root.setText(project.getName()); root.setGrayed(true); root.setImage(new Image(null, FeaturerPlugin.getFile("/images/prj_obj.gif"))); tree.addListener(SWT.Expand, new Listener() { public void handleEvent(Event event) { final TreeItem item = (TreeItem) event.item; if(item == null || item.getItems().length > 1) return; composite.getDisplay().asyncExec(new Runnable() { public void run() { try { if(item.getData() instanceof IPackageFragmentRoot) { IPackageFragmentRoot ipfr = (IPackageFragmentRoot)item.getData(); TreeSet<Item> aux = new TreeSet<Item>(); tree.setCursor(new Cursor(null, SWT.CURSOR_WAIT)); for(IJavaElement e : ipfr.getChildren()) { if(e.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { IPackageFragment pkg = (IPackageFragment)e; if(pkg.getCompilationUnits().length == 0 && pkg.getClassFiles().length == 0) continue; Item ti = new Item(); if(pkg.isDefaultPackage()) ti.setText("(default package)"); else ti.setText(pkg.getElementName()); ti.setData(pkg); ti.setImage(img_pkg); aux.add(ti); } } item.removeAll(); addItems(aux, item, true); tree.setCursor(new Cursor(null, SWT.CURSOR_ARROW)); } else if(item.getData() instanceof IPackageFragment) { IPackageFragment pkg = (IPackageFragment)item.getData(); TreeSet<Item> aux = new TreeSet<Item>(); tree.setCursor(new Cursor(null, SWT.CURSOR_WAIT)); /* TIPO SOURCE */ if(pkg.getKind() == IPackageFragmentRoot.K_SOURCE) { for(ICompilationUnit cu : pkg.getCompilationUnits()) { ICompilationUnitFeaturesManager cuManager = getSafeCompilationUnit(cu); //IColoredJavaSourceFile source = ColoredJavaSourceFile.getColoredJavaSourceFile(cu); CompilationUnit ast = getAst(cu); //FIXME Não necessariamente é um TypeDeclaration, pode ser um EnumDeclaration for(TypeDeclaration t : (java.util.List<TypeDeclaration>)ast.types()) { Item i = new Item(); if(t.getSuperclassType() != null) i.setText(t.getName().getIdentifier() + ": " + t.getSuperclassType().toString()); else i.setText(t.getName().getIdentifier() + ": Object"); if(t.isInterface()) { i.setData2("3" + t.resolveBinding().getKey()); i.setImage(img_inter); } else { i.setData2("2" + t.resolveBinding().getKey()); i.setImage(img_classe); } TreeSet<Item> aux2 = new TreeSet<Item>(); for(BodyDeclaration bd : (java.util.List<BodyDeclaration>)t.bodyDeclarations()) { switch(bd.getNodeType()) { case ASTNode.METHOD_DECLARATION: { Item it = new Item(); MethodDeclaration md = (MethodDeclaration)bd; String temp = ""; for(SingleVariableDeclaration svd : (java.util.List<SingleVariableDeclaration>) md.parameters()) { temp += svd.getType().toString() + ", "; } if(!temp.equals("")) temp = temp.substring(0, temp.length() - 2); if(md.getReturnType2() != null) it.setText(md.getName().getFullyQualifiedName() + "(" + temp + "): " + md.getReturnType2().toString()); else it.setText(md.getName().getFullyQualifiedName() + "(" + temp+ ")"); if((md.getModifiers() & Flags.AccPublic) == Flags.AccPublic) it.setImage(img_mathpub); else if((md.getModifiers() & Flags.AccProtected) == Flags.AccProtected) it.setImage(img_mathpro); else it.setImage(img_mathpri); it.setData("4" + md.resolveBinding().getKey()); aux2.add(it); break; } case ASTNode.FIELD_DECLARATION: { FieldDeclaration fd = (FieldDeclaration)bd; java.util.List<VariableDeclarationFragment> frag = fd.fragments(); for(VariableDeclarationFragment vd : frag) { Item it = new Item(); it.setText(vd.getName().getFullyQualifiedName() + ": " + fd.getType().toString()); it.setData("5" + vd.resolveBinding().getKey()); if((fd.getModifiers() & Flags.AccPublic) == Flags.AccPublic) it.setImage(img_field_pub); else it.setImage(img_field_pri); aux2.add(it); } break; } case ASTNode.INITIALIZER: { break; } } } i.setData(aux2); aux.add(i); } } item.removeAll(); for(Item i : aux) { TreeItem ti = new TreeItem(item, SWT.NULL); ti.setText(i.getText()); ti.setData(i.getData2()); ti.setImage(i.getImage()); addItems((TreeSet<Item>)i.getData(), ti, false); } } /* TIPO BINARY */ else { for(IClassFile cu : pkg.getClassFiles()) { IType t = cu.findPrimaryType(); if(t == null) continue; Item i = new Item(); String name = "(Anonymous)"; if(!t.getElementName().equals("")) name = t.getElementName(); if(t.getSuperclassName() != null) i.setText(name + ": " + t.getSuperclassName()); else i.setText(name + ": (Unknow)"); if(t.isInterface()) { i.setImage(img_inter); i.setData2("3" + t.getKey()); } else { i.setImage(img_classe); i.setData2("2" + t.getKey()); } TreeSet<Item> aux2 = new TreeSet<Item>(); for(IField fd : t.getFields()) { Item it = new Item(); it.setText(fd.getElementName() + ": " + fd.getTypeSignature()); it.setData("5" + fd.getKey()); if((fd.getFlags() & Flags.AccPublic) == Flags.AccPublic) it.setImage(img_field_pub); else it.setImage(img_field_pri); aux2.add(it); } for(IMethod md : t.getMethods()) { Item it = new Item(); String temp = ""; for(String svd : md.getParameterTypes()) { temp += svd + ", "; } if(!temp.equals("")) temp = temp.substring(0, temp.length() - 2); it.setText(md.getElementName() + "(" + temp + "): " + md.getReturnType()); if((md.getFlags() & Flags.AccPublic) == Flags.AccPublic) it.setImage(img_mathpub); else if((md.getFlags() & Flags.AccProtected) == Flags.AccProtected) it.setImage(img_mathpro); else it.setImage(img_mathpri); it.setData("4" + md.getKey()); aux2.add(it); } i.setData(aux2); aux.add(i); } item.removeAll(); for(Item i : aux) { TreeItem ti = new TreeItem(item, SWT.NULL); ti.setText(i.getText()); ti.setData(i.getData2()); ti.setImage(i.getImage()); addItems((TreeSet<Item>)i.getData(), ti, false); } } tree.setCursor(new Cursor(null, SWT.CURSOR_ARROW)); } } catch(CoreException e1) { tree.setCursor(new Cursor(null, SWT.CURSOR_ARROW)); e1.printStackTrace();; } } }); }}); parent.getDisplay().asyncExec(new Runnable() { public void run() { try { for(IPackageFragmentRoot r: javaProject.getAllPackageFragmentRoots()) { TreeItem nivel0 = new TreeItem(root, SWT.NULL); if(r.getElementName().trim().equals("")) nivel0.setText("(src)"); else nivel0.setText(r.getElementName()); nivel0.setData(r); //nivel0.setData("0" + r.getElementName().replaceAll("\\.", "/")); nivel0.setImage(img_lib); if(r.getKind() == IPackageFragmentRoot.K_SOURCE){ nivel0.setImage(img_src); } new TreeItem(nivel0, SWT.NULL); } // for(IPackageFragment pkg : javaProject.getPackageFragments()) { // if(pkg.getCompilationUnits().length == 0) // continue; // TreeItem nivel1 = new TreeItem(root, SWT.NULL); // if(pkg.isDefaultPackage()) // nivel1.setText("(default package)"); // else // nivel1.setText(pkg.getElementName()); // nivel1.setData("1" + pkg.getElementName().replaceAll("\\.", "/")); // nivel1.setImage(img_pkg); // // for(ICompilationUnit cu : pkg.getCompilationUnits()) { // IColoredJavaSourceFile source = ColoredJavaSourceFile.getColoredJavaSourceFile(cu); // // for(TypeDeclaration t : (java.util.List<TypeDeclaration>)source.getAST().types()) { // TreeItem nivel2 = new TreeItem(nivel1, SWT.NULL); // if(t.getSuperclassType() != null) // nivel2.setText(t.getName().getIdentifier() + ": " + t.getSuperclassType().toString()); // else // nivel2.setText(t.getName().getIdentifier() + ": Object"); // if(t.isInterface()) { // nivel2.setData("3" + t.resolveBinding().getKey()); // nivel2.setImage(img_inter); // } // else { // nivel2.setData("2" + t.resolveBinding().getKey()); // nivel2.setImage(img_classe); // } // // for(BodyDeclaration bd : (java.util.List<BodyDeclaration>)t.bodyDeclarations()) { // switch(bd.getNodeType()) { // case ASTNode.METHOD_DECLARATION: { // TreeItem nivel3 = new TreeItem(nivel2, SWT.NULL); // MethodDeclaration md = (MethodDeclaration)bd; // String aux = ""; // for(SingleVariableDeclaration svd : (java.util.List<SingleVariableDeclaration>) md.parameters()) { // aux += svd.getType().toString() + ", "; // } // if(!aux.equals("")) // aux = aux.substring(0, aux.length() - 2); // if(md.getReturnType2() != null) // nivel3.setText(md.getName().getFullyQualifiedName() + "(" + aux + "): " + md.getReturnType2().toString()); // else // nivel3.setText(md.getName().getFullyQualifiedName() + "(" + aux + ")"); // if((md.getModifiers() & Flags.AccPublic) == Flags.AccPublic) // nivel3.setImage(img_mathpub); // else if((md.getModifiers() & Flags.AccProtected) == Flags.AccProtected) // nivel3.setImage(img_mathpro); // else // nivel3.setImage(img_mathpri); // nivel3.setData("4" + md.resolveBinding().getKey()); // break; // } // // case ASTNode.FIELD_DECLARATION: { // FieldDeclaration fd = (FieldDeclaration)bd; // java.util.List<VariableDeclarationFragment> frag = fd.fragments(); // // for(VariableDeclarationFragment vd : frag) { // TreeItem nivel3 = new TreeItem(nivel2, SWT.NULL); // nivel3.setText(vd.getName().getFullyQualifiedName() + ": " + fd.getType().toString()); // nivel3.setData("5" + vd.resolveBinding().getKey()); // if((fd.getModifiers() & Flags.AccPublic) == Flags.AccPublic) // nivel3.setImage(img_field_pub); // else // nivel3.setImage(img_field_pri); // } // break; // } // // case ASTNode.INITIALIZER: { // break; // } // } // } // } // } // } } catch (CoreException e1) { tree.setCursor(new Cursor(null, SWT.CURSOR_ARROW)); e1.printStackTrace(); } }}); tree.setBounds(30, 80, 450, 300); /* final Text txtRegExp = new Text(composite, SWT.SINGLE | SWT.BORDER); txtRegExp.setBounds(30, 400, 240, 22); txtRegExp.setText(".*"); txtRegExp.setTextLimit(80); lstSeeds = new Tree(composite, SWT.MULTI | SWT.BORDER); lstSeeds.setBounds(330, 80, 240, 300); Button btnAdd = new Button(composite, SWT.NONE); btnAdd.setText("=>"); btnAdd.addMouseListener(new MouseListener() { public void search(TreeItem t, Tree lst, String pattern) { for(TreeItem i : t.getItems()) { int aux; aux = i.getText().indexOf('('); if(aux == -1) { aux = i.getText().indexOf(':'); if(aux == -1) aux = i.getText().length(); } if(i.getText().substring(0, aux).matches(pattern)) { TreeItem item = new TreeItem(lst, SWT.NULL); item.setText(i.getText()); item.setData(i.getData()); item.setImage(i.getImage()); } else search(i, lst, pattern); } } public void mouseDoubleClick(MouseEvent e) {} public void mouseDown(MouseEvent e) {} public void mouseUp(MouseEvent e) { lstSeeds.removeAll(); Arrays.sort(lstSeeds.getItems()); for(TreeItem i : tree.getItems()) { search(i, lstSeeds, txtRegExp.getText()); } // for(TreeItem i : tree.getSelection()) { // System.out.println(i.getData().toString()); // } } }); btnAdd.setBounds(280, 210, 40, 20); */ setControl(composite); } public Image getImage(String path) { return new Image(getShell().getDisplay(), FeaturerPlugin.getFile(path)); } public void addItems(TreeSet<Item> aux, TreeItem item, boolean add) { for(Item i : aux) { TreeItem ti = new TreeItem(item, SWT.NULL); ti.setText(i.getText()); ti.setData(i.getData()); ti.setImage(i.getImage()); if(add) new TreeItem(ti, SWT.NULL); } aux.clear(); } } class Item implements Comparable<Item> { private String text; private Object data; private Object data2; public Object getData2() { return data2; } public void setData2(Object data2) { this.data2 = data2; } private Image image; public String getText() { return text; } public void setText(String text) { this.text = text; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Image getImage() { return image; } public void setImage(Image image) { this.image = image; } public int compareTo(Item o) { return text.compareTo(o.text); } }