/******************************************************************************* * Copyright (c) 2005, 2016 IBM Corporation and others. * 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 ******************************************************************************/ package org.eclipse.dltk.internal.core; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IStorage; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.dltk.compiler.util.Util; import org.eclipse.dltk.core.DLTKLanguageManager; import org.eclipse.dltk.core.IDLTKLanguageToolkit; import org.eclipse.dltk.core.IModelStatusConstants; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.core.RuntimePerformanceMonitor; import org.eclipse.dltk.core.RuntimePerformanceMonitor.PerformanceNode; import org.eclipse.dltk.core.WorkingCopyOwner; import org.eclipse.dltk.core.environment.EnvironmentPathUtils; import org.eclipse.dltk.core.environment.IFileHandle; /** * Represents an external source module. */ public class ExternalSourceModule extends AbstractExternalSourceModule { private IStorage storage; public ExternalSourceModule(ModelElement parent, String name, WorkingCopyOwner owner, IStorage storage) { super(parent, name, owner); this.storage = storage; } public IStorage getStorage() { return storage; } @Override public boolean equals(Object obj) { if (!(obj instanceof ExternalSourceModule)) { return false; } return super.equals(obj); } @Override public InputStream getContents() throws CoreException { return storage.getContents(); } @Override public String getFileName() { return getPath().toOSString(); } @Override public IPath getFullPath() { if (this.storage != null) { return storage.getFullPath(); } else { return getPath(); } } @Override public String getName() { return storage.getName(); } @Override public IResource getResource() { return null; } @Override protected char[] getBufferContent() throws ModelException { IPath path = getBufferPath(); IFileHandle file = EnvironmentPathUtils.getFile(path); Charset charset = storage.getAdapter(Charset.class); IProjectFragment projectFragment = this.getProjectFragment(); if (charset == null) { if (projectFragment.isArchive()) charset = Charset.forName(Util.UTF_8); } PerformanceNode p = RuntimePerformanceMonitor.begin(); long length = 0; try { try { InputStream stream = null; try { stream = storage.getContents(); char[] rv = Util.getInputStreamAsCharArray(stream, -1, charset == null ? null : charset.name()); length = rv.length; return rv; } finally { if (stream != null) stream.close(); } } catch (CoreException e) { throw new ModelException(e, IModelStatusConstants.ELEMENT_DOES_NOT_EXIST); } } catch (IOException e) { throw new ModelException(e, IModelStatusConstants.IO_EXCEPTION); } finally { p.done("#", RuntimePerformanceMonitor.IOREAD, length); } } /** * Return buffer path in full mode */ protected IPath getBufferPath() { return getPath(); } @Override protected String getModuleType() { return "DLTK External Source Module"; //$NON-NLS-1$ } @Override protected String getNatureId() { IPath path = getFullPath(); IDLTKLanguageToolkit toolkit = lookupLanguageToolkit(path); if (toolkit == null) { toolkit = DLTKLanguageManager .getLanguageToolkit(getScriptProject()); } return (toolkit != null) ? toolkit.getNatureId() : null; } @Override protected ISourceModule getOriginalSourceModule() { return new ExternalSourceModule((ModelElement) getParent(), getElementName(), DefaultWorkingCopyOwner.PRIMARY, storage); } }