Java tutorial
/** * Copyright 2008 Loom Developers. This file is part of the loom eclipse plugin for eclipse and is licensed under the * GPL version 3. Please refer to the URL http://www.gnu.org/licenses/gpl-3.0.html for details. */ package org.digitalsoul.loom.core; import org.digitalsoul.loom.core.prefs.Preferences; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.JavaProject; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import java.io.File; import java.util.HashMap; /** * Class EditorFileOpener */ public class EditorFileOpener { /** * */ private static EditorFileOpener editorFileOpener; /** * */ private HashMap<String, IFile> fileMap; private ProjectBuilder builder; /** * */ public EditorFileOpener() { fileMap = new HashMap<String, IFile>(); } /** * @param theFile */ public void openFileInEditor(IFile theFile) { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { IDE.openEditor(activePage, theFile, true); } catch (PartInitException e) { e.printStackTrace(); } } /** * @param filename * @return */ private IFile findCachedFile(String filename) { IFile file = fileMap.get(filename); if (file != null) { synchronizeFile(file, true); if (file.exists() && file.isAccessible()) { return file; } else { fileMap.remove(filename); file = null; } } return file; } /** * @param file * @param force */ private void synchronizeFile(IFile file, boolean force) { if (force || !file.isSynchronized(IResource.DEPTH_ONE)) { try { file.refreshLocal(IResource.DEPTH_ONE, null); } catch (CoreException e) { e.printStackTrace(); } } } /** * @param contextMenuResource */ public void switchToTemplateOrJavaFile(IResource contextMenuResource) { IFile foundFile = null; String templateFileExtension = Preferences.getTemplateFileExtension(); if (contextMenuResource instanceof IFile) { String searchFilename = contextMenuResource.getName(); IJavaProject project = convertToJavaProject(contextMenuResource.getProject()); builder = new ProjectBuilder(project); if (searchFilename.endsWith(LoomConstants.JAVA_FILE_EXTENSION)) { searchFilename = searchFilename.replace(LoomConstants.JAVA_FILE_EXTENSION, templateFileExtension); } else if (searchFilename.endsWith(templateFileExtension)) { searchFilename = searchFilename.replace(templateFileExtension, LoomConstants.JAVA_FILE_EXTENSION); } foundFile = findFile(contextMenuResource, searchFilename, project); if (foundFile != null && foundFile.exists()) { synchronizeFile(foundFile, false); addToCache(searchFilename, foundFile); openFileInEditor(foundFile); } else { System.err.println("Couldn't find file: " + searchFilename); } } } /** * @param contextMenuResource * @param searchFilename * @param project * @return */ private IFile findFile(IResource contextMenuResource, String searchFilename, IJavaProject project) { IFile foundFile = null; foundFile = findCachedFile(searchFilename); if (foundFile == null) { if (Preferences.isCreateTemplateInJavaFolder()) { IFolder folder = (IFolder) contextMenuResource.getParent(); foundFile = folder.getFile(searchFilename); } else { if (searchFilename.endsWith(Preferences.getTemplateFileExtension())) { IFolder folder = builder.getFolder(getTemplateFilePath(contextMenuResource)); foundFile = folder.getFile(searchFilename); } else { foundFile = switchToFile(searchFilename, project); } } } return foundFile; } /** * @param selectedJavaFile * @return */ protected IPath getTemplateFilePath(IResource selectedJavaFile) { String path = selectedJavaFile.getParent().getProjectRelativePath().toPortableString(); path = path.replaceAll(Preferences.getJavaFragmentRootPath(), Preferences.getTemplateFragmentRootPath()); return new Path(path); } /** * @param searchFilename * @param project * @return */ private IFile switchToFile(String searchFilename, IJavaProject project) { IFile foundFile = null; foundFile = findCachedFile(searchFilename); if (foundFile == null) { try { IPath projectPath = project.getCorrespondingResource().getLocation(); File searchFolder = new File(projectPath.toPortableString()); String pathURL = findFile(searchFilename, searchFolder, project); Path path = new Path(pathURL); foundFile = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path)[0]; } catch (JavaModelException e) { e.printStackTrace(); } } return foundFile; } /** * @param searchFilename * @param foundFile */ private void addToCache(String searchFilename, IFile foundFile) { if (foundFile != null) { synchronizeFile(foundFile, false); fileMap.put(searchFilename, foundFile); } } private String findFile(String searchFilename, File searchFolder, IJavaProject project) { String path = null; for (File file : searchFolder.listFiles()) { // ignore hidden and target directories if (file.isDirectory() && !file.getName().startsWith(".") && !file.getName().equals("target")) { String aPath = findFile(searchFilename, file, project); if (aPath != null) { path = aPath; } } else if (file.getName().equals(searchFilename)) { if (!isDerived(file, project)) { return file.getPath(); } } } return path; } /** * @param file * @param project * @return */ private boolean isDerived(File file, IJavaProject project) { Path path = new Path(file.getAbsolutePath()); IFile ifile = project.getProject().getFile(path); if (ifile != null) { return ifile.isDerived(); } return false; } /** * @param project * @return */ private IJavaProject convertToJavaProject(IProject project) { return new JavaProject(project, null); } /** * */ public void switchToTemplateOrJavaFile() { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorPart editor = activePage.getActiveEditor(); if (editor != null) { IEditorInput input = editor.getEditorInput(); if (input != null) { IFile currentFile = (input instanceof IFileEditorInput) ? ((IFileEditorInput) input).getFile() : null; switchToTemplateOrJavaFile(currentFile); } } } /** * @return */ public static EditorFileOpener getInstance() { if (editorFileOpener == null) { editorFileOpener = new EditorFileOpener(); } return editorFileOpener; } }