/***************************************************************************** * This file is part of Rinzo * * Author: Claudio Cancinos * WWW: https://sourceforge.net/projects/editorxml * Copyright (C): 2008, Claudio Cancinos * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * 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 Lesser General Public * License along with this program; If not, see <http://www.gnu.org/licenses/> ****************************************************************************/ package ar.com.tadp.xml.rinzo.jdt; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IJavaModel; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeHierarchy; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.ResourceUtil; /** * Collection of utility methods for interaction with JDT. * * @author ccancinos */ public class JDTUtils { private static final String JAVA_NATURE_ID = "org.eclipse.jdt.core.javanature"; public static IType findType(String classNameCandidate) { return findType(classNameCandidate, getActiveJavaProject()); } /** * @return the IType for the candidate class name in the workspace or null if not available. */ public static IType findType(String classNameCandidate, IJavaProject activeJavaProject) { IJavaProject[] projects = getWorkspaceProjects(); IType type = null; // Busco primero en el proyectos actual try { type = activeJavaProject.findType(classNameCandidate); } catch (Exception e) { // TODO: At this moment I don't care about any explotion here, because it could be caused by trying to // open a type in a file without associated project such as files external to the workspace } // Si no lo encuentro ah�, entonces busco en el resto de los proyectos // del workspace if (type == null) { for (int i = 0; i < projects.length; i++) { IJavaProject project = projects[i]; if (project != activeJavaProject) { try { type = project.findType(classNameCandidate); } catch (JavaModelException exception) { // Don't mind about this one. } if (type != null) { break; } } } } return type; } /** * @return All projects contained in the workspace. */ public static IJavaProject[] getWorkspaceProjects() { IWorkspace workspace = ResourcesPlugin.getWorkspace(); IJavaModel javaModel = JavaCore.create(workspace.getRoot()); IJavaProject[] projects = null; try { projects = javaModel.getJavaProjects(); } catch (JavaModelException jme) { projects = new IJavaProject[0]; } return projects; } public static IJavaProject getActiveJavaProject() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); IJavaProject project = null; if (window != null) { IWorkbenchPage page = window.getActivePage(); if (page != null) { IFile input = ResourceUtil.getFile(page.getActiveEditor().getEditorInput()); if (input != null) { project = JavaCore.create(input.getProject()); } } } return project; } /** * Opens the type corresponding to the class name using the associated editor. * * @param selection the name of the class to be opened. * @return */ public static boolean openType(String selection) { if (selection.length() > 0 && JavaConventions.validateJavaTypeName(selection).isOK()) { try { IType type = JDTUtils.findType(selection); if (type != null) { JavaUI.openInEditor(type); return true; } } catch (Exception e) { } } return false; } public static boolean isJavaProject(IJavaProject project) { try { return project != null && project.getProject().getNature(JAVA_NATURE_ID) != null; } catch (CoreException e) { return false; } } public static IType[] getAllSuperTypes(String qualifiedTypeName) { IType[] superTypes = null; try { IType type; type = JDTUtils.findType(qualifiedTypeName); if (type!=null) { ITypeHierarchy typeHierachy = type.newSupertypeHierarchy(null); if (typeHierachy!=null) { superTypes = typeHierachy.getAllSupertypes(type); } } } catch (JavaModelException e) { } return (superTypes == null) ? new IType[0] : superTypes; } public static boolean isSuperType(String className, String superType) { IType[] supertypes = JDTUtils.getAllSuperTypes(className); for (IType iType : supertypes) { if (iType.getFullyQualifiedName().equals(superType)) { return true; } } return false; } }