/** * Copyright (c) 2013-2016 Angelo ZERR and Genuitec LLC. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Piotr Tomiak <piotr@genuitec.com> - initial API and implementation */ package tern.eclipse.ide.internal.core.resources; import java.io.File; import java.io.IOException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import tern.ITernFile; import tern.ITernFileSynchronizer; import tern.ITernProject; import tern.ITernResourcesManagerDelegate; import tern.eclipse.ide.internal.core.Trace; import tern.resources.FilesystemTernFile; import tern.utils.ExtensionUtils; public class IDEResourcesManager implements ITernResourcesManagerDelegate { private static IDEResourcesManager instance = new IDEResourcesManager(); private IDEResourcesManager() { } public static IDEResourcesManager getInstance() { return instance; } @Override public ITernProject getTernProject(Object obj, boolean force) throws IOException { if (obj instanceof IProject) { IProject project = (IProject) obj; try { if (!IDETernProject.hasTernNature(project) && !force) { return null; } if (force) { // Dispose tern project if exists IDETernProject ternProject = IDETernProject .getTernProject(project); if (ternProject != null) { ternProject.dispose(); } } IDETernProject ternProject = IDETernProject .getTernProject(project); if (ternProject == null) { ternProject = new IDETernProject(project); try { ternProject.load(); } catch (IOException e) { Trace.trace(Trace.SEVERE, "Error while loading tern project", e); throw e; } } return ternProject; } catch (CoreException ex) { Trace.trace(Trace.SEVERE, "Error creating " + project.getName() + ": " + ex.getMessage(), ex); } } return null; } @Override public ITernFile getTernFile(ITernProject project, String name) { Object file; if (name.startsWith(ITernFile.EXTERNAL_PROTOCOL)) { file = new File( name.substring(ITernFile.EXTERNAL_PROTOCOL.length() + 1)); } else if (name.startsWith(ITernFile.PROJECT_PROTOCOL)) { file = ResourcesPlugin .getWorkspace() .getRoot() .getFile( new Path(name.substring(ITernFile.PROJECT_PROTOCOL .length() + 1))); } else { IProject ip = (IProject) project.getAdapter(IProject.class); file = ip.getFile(name); } return getTernFile(file); } @Override public ITernFile getTernFile(Object fileObject) { if (fileObject instanceof File) { File file = (File) fileObject; // it is possible that this file maps to a file in the workspace IFile[] files = ResourcesPlugin.getWorkspace().getRoot() .findFilesForLocationURI(file.toURI()); if (files.length == 0) { return new FilesystemTernFile(file); } // create IDETernFile fileObject = files[0]; } if (fileObject instanceof IFile) { return new IDETernFile((IFile) fileObject); } return null; } @Override public ITernFileSynchronizer createTernFileSynchronizer(ITernProject project) { return new IDETernFileSynchronizer(project); } protected String getExtension(Object fileObject) { if (fileObject instanceof IFile) { return ((IFile) fileObject).getFileExtension(); } else if (fileObject instanceof ITernFile) { return ((ITernFile) fileObject).getFileExtension(); } else if (fileObject instanceof File) { return ExtensionUtils.getFileExtension(((File) fileObject) .getName()); } else if (fileObject instanceof String) { return ExtensionUtils.getFileExtension((String) fileObject); } return null; } @Override public boolean isHTMLFile(Object fileObject) { String ext = getExtension(fileObject); return ext != null && ExtensionUtils.HTML_EXTENSIONS.contains(ext.toLowerCase()); } @Override public boolean isJSFile(Object fileObject) { String ext = getExtension(fileObject); return ext != null && ExtensionUtils.JS_EXTENSION.equals(ext.toLowerCase()); } }