Java tutorial
/** Copyright (C) 2010 E.Albert, P.Arenas, S.Genaim, G.Puebla, and D.Zanardini, G. Roman https://costa.ls.fi.upm.es This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package costabs.utils; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.SourceType; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; import costabs.exceptions.CostabsException; /** * Class to interact with source files * @author groman * @license GPL * */ public class SourceUtils { public static IMethod[] getMethodsFromJavaFile(IJavaElement element) throws Exception { try { ICompilationUnit unit = (ICompilationUnit) element; IJavaElement elements[] = unit.getChildren(); for (int i = 0; i < elements.length; i++) { //LogUtils.debug(elements[i].getClass()); if (elements[i] instanceof org.eclipse.jdt.internal.core.SourceType) { SourceType source = (SourceType) elements[i]; return source.getMethods(); } } throw new Exception("No methods found in file "); } catch (Exception e) { throw new Exception("Cannot find the methods from Java file"); } } public static IResource extractResource(IEditorPart editor) { IEditorInput input = editor.getEditorInput(); if (!(input instanceof FileEditorInput)) return null; return ((FileEditorInput) input).getFile(); } private static IJavaProject obtainJavaProjectFromResource(IResource jresource) { IProject project = jresource.getProject(); return JavaCore.create(project); } public static IProject obtainCurrProject() throws CostabsException { IEditorPart ieditorpart; ClassLoader loader; //we obtain the current window that is being edited try { ieditorpart = SourceUtils.obtainActiveEditor(); } catch (NullPointerException e) { throw (new CostabsException("There is not any selected class.")); } IResource jresource = extractResource(ieditorpart); if (jresource == null) throw (new CostabsException("Could not extract file from the current editor")); return jresource.getProject(); } public static Class ObtainCurrentlyEditingClass() throws CostabsException { IEditorPart ieditorpart; ClassLoader loader; //we obtain the current window that is being edited try { ieditorpart = SourceUtils.obtainActiveEditor(); //If the file is not safe we fail and say it if (ieditorpart.isDirty()) { throw (new CostabsException("Java file must be saved to analyze it.")); } } catch (NullPointerException e) { throw (new CostabsException("There is not any selected class.")); } //obtain the file being modified IResource jresource = extractResource(ieditorpart); if (jresource == null) throw (new CostabsException("Could not extract file from the current editor")); //get the project that owns the file IJavaProject jproject = obtainJavaProjectFromResource(jresource); if (jproject == null) throw (new CostabsException("Cannot load the File: project must be a Java Project")); IJavaElement javaFile = JavaCore.create(jresource, jproject); if (javaFile == null) throw (new CostabsException("Cannot load the File: file must be a Java File")); try { loader = ClasspathUtils.getProjectClassLoader(jproject); } catch (Exception e) { throw (new CostabsException("Non valid project, failed to buid class loader")); } fileEvaluations(javaFile); return getClassFromResource((ICompilationUnit) javaFile, loader); } public static IEditorPart obtainActiveEditor() throws NullPointerException { IWorkbench iworkbench = PlatformUI.getWorkbench(); IWorkbenchWindow iworkbenchwindow = iworkbench.getActiveWorkbenchWindow(); IWorkbenchPage iworkbenchpage = iworkbenchwindow.getActivePage(); return iworkbenchpage.getActiveEditor(); } private static void fileEvaluations(IJavaElement javaFile) throws CostabsException { try { if (javaFile.getElementType() != IJavaElement.COMPILATION_UNIT) { throw new CostabsException("The file must be a Java file"); } ICompilationUnit javaFileComp = (ICompilationUnit) javaFile; if (!javaFile.isStructureKnown()) { throw new CostabsException("The file cannot have errors to analyze it"); } if (!javaFile.getElementName().endsWith(".java")) { throw new CostabsException("The file is not a Java File"); } if (!javaFileComp.isConsistent()) { throw new CostabsException("The file is not consistent, cannot proccess it"); } } catch (JavaModelException e) { throw new CostabsException("Cannot evaluate the file, it may be incorrect"); } } private static Class getClassFromResource(ICompilationUnit javaFile, ClassLoader loader) throws CostabsException { try { String className = javaFile.getElementName(); className = className.substring(0, className.length() - 5); if (!"".equals(javaFile.getParent().getElementName())) className = javaFile.getParent().getElementName() + "." + className; Class clazz = loader.loadClass(className); return clazz; } catch (ClassNotFoundException t) { //t.printStackTrace(); throw new CostabsException("The class loading failed... Classpath may be wrong"); } } }