/** * 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 * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.resources; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import tern.ITernFile; import tern.ITernProject; import tern.TernResourcesManager; import tern.utils.ExtensionUtils; import tern.utils.IOUtils; /** * Basic Tern file implementation, which provides wrapper for java.io.File */ public class FilesystemTernFile extends AbstractTernFile implements ITernFile { private File file; private File canonical; public FilesystemTernFile(File file) { this.file = file; } @Override public boolean isAccessible() { return file.isFile() && file.canRead(); } @Override public String getFullName(ITernProject project) { if (canonical == null) { //get the canonical path of the file try { canonical = file.getCanonicalFile(); } catch (IOException ex) { //best effort canonical = file; } } if (project != null) { //check if the file belongs to the project try { String path = project.getProjectDir().getCanonicalPath().replace('\\', '/'); if (!path.endsWith("/")) { //$NON-NLS-1$ path += "/"; //$NON-NLS-1$ } String fileName = canonical.toString().replace('\\', '/'); if (fileName.startsWith(path)) { return fileName.substring(path.length()); } } catch (Exception ex) { //ignore } } //if it doesn't, use the external protocol return EXTERNAL_PROTOCOL + canonical.toString(); } @Override public String getFileName() { String full = getFullName(null); int last = full.lastIndexOf('/'); if (last >=0 ) { return full.substring(last + 1); } return full; } @Override public String getContents() throws IOException { FileInputStream input = new FileInputStream(file); try { return IOUtils.toString(input); } finally { input.close(); } } @Override public ITernFile getRelativeFile(String relativePath) { File f = new File(file, relativePath); return TernResourcesManager.getTernFile(f); } @Override public String getFileExtension() { return ExtensionUtils.getFileExtension(getFileName()); } @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class adapterClass) { if (adapterClass == File.class) { return file; } return null; } @Override public String toString() { return file.toString(); } }