Java tutorial
/** * Logback-beagle: The logback Console Plugin for Eclipse * Copyright (C) 2006-2012, QOS.ch. All rights reserved. * * This program and the accompanying materials are licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation. */ package ch.qos.logback.beagle.util; import java.util.HashMap; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; 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.JavaModelException; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; /** * This class borrows very heavily from Eclipse's own EditorUtility class. */ public class EditorUtil { private static final String JAVA_EDITOR_ID = "org.eclipse.jdt.internal.ui.javaeditor.JavaEditor"; //$NON-NLS-1$ public static void openInEditor(StackTraceElement ste) { IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); IType type; IProject project; for (int i = 0; i < projects.length; i++) { project = projects[i]; if (project.isOpen()) { try { IJavaProject javaProject = JavaCore.create(project); String className = ste.getClassName(); if (className == null) { return; } type = findType(javaProject, className); if (type != null) { String path = type.getPath().toString(); if (path.startsWith('/' + project.getName())) { path = path.substring(project.getName().length() + 1); } IFile file = project.getFile(path); if (file.exists()) { openInEditor(file, ste.getLineNumber()); } } } catch (JavaModelException e) { e.printStackTrace(); } } } } private static void openInEditor(IFile file, int lineNumber) { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put(IMarker.LINE_NUMBER, new Integer(lineNumber)); map.put(IDE.EDITOR_ID_ATTR, JAVA_EDITOR_ID); try { IMarker marker = file.createMarker(IMarker.TEXT); marker.setAttributes(map); IDE.openEditor(page, marker); marker.delete(); } catch (PartInitException e) { e.printStackTrace(); } catch (CoreException e) { e.printStackTrace(); } } private static IType findType(IJavaProject jproject, String fullyQualifiedName) throws JavaModelException { IType type = jproject.findType(fullyQualifiedName); if (type != null) return type; IPackageFragmentRoot[] roots = jproject.getPackageFragmentRoots(); for (int i = 0; i < roots.length; i++) { IPackageFragmentRoot root = roots[i]; type = findType(root, fullyQualifiedName); if (type != null && type.exists()) return type; } return null; } private static IType findType(IPackageFragmentRoot root, String fullyQualifiedName) throws JavaModelException { IJavaElement[] children = root.getChildren(); for (int i = 0; i < children.length; i++) { IJavaElement element = children[i]; if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { IPackageFragment pack = (IPackageFragment) element; if (!fullyQualifiedName.startsWith(pack.getElementName())) continue; IType type = findType(pack, fullyQualifiedName); if (type != null && type.exists()) return type; } } return null; } private static IType findType(IPackageFragment pack, String fullyQualifiedName) throws JavaModelException { ICompilationUnit[] cus = pack.getCompilationUnits(); for (int i = 0; i < cus.length; i++) { ICompilationUnit unit = cus[i]; IType type = findType(unit, fullyQualifiedName); if (type != null && type.exists()) return type; } return null; } private static IType findType(ICompilationUnit cu, String fullyQualifiedName) throws JavaModelException { IType[] types = cu.getAllTypes(); for (int i = 0; i < types.length; i++) { IType type = types[i]; if (getFullyQualifiedName(type).equals(fullyQualifiedName)) return type; } return null; } private static String getFullyQualifiedName(IType type) { try { if (type.isBinary() && !type.isAnonymous()) { IType declaringType = type.getDeclaringType(); if (declaringType != null) { return getFullyQualifiedName(declaringType) + '.' + type.getElementName(); } } } catch (JavaModelException e) { // ignore } return type.getFullyQualifiedName('.'); } }