/**
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
* Piotr Tomiak <piotr@genuitec.com> - refactoring of file management API
*/
package tern.eclipse.ide.internal.core.scriptpath;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import tern.ITernProject;
import tern.eclipse.ide.core.IIDETernProject;
import tern.eclipse.ide.core.IIDETernScriptPathReporter;
import tern.eclipse.ide.core.utils.PathUtils;
import tern.eclipse.ide.internal.core.Trace;
import tern.scriptpath.ITernScriptResource;
import tern.scriptpath.impl.ContainerTernScriptPath;
/**
* Folder script path. This script path implementation gives the capability to
* select a folder with "Add Folder" in the Tern "Script Path" property page
* project and retrieve list of JS files which are hosted in this folder and
* their subfolders.
*
*/
public class FolderScriptPath extends ContainerTernScriptPath implements IIDETernScriptPath {
private final IContainer container;
private final IIDETernScriptPathReporter reporter;
public FolderScriptPath(ITernProject project, IContainer container, String[] inclusionPatterns,
String[] exclusionPatterns, String external) {
super(project, ScriptPathsType.FOLDER, inclusionPatterns, exclusionPatterns, external);
this.container = container;
this.reporter = ((IIDETernProject) project).getScriptPathReporter();
}
@Override
public List<ITernScriptResource> getScriptResources() {
List<ITernScriptResource> resources = new ArrayList<ITernScriptResource>();
ScriptResourceProxyVisitor visitor = new ScriptResourceProxyVisitor(this, resources, reporter);
try {
if (container.exists()) {
container.accept(visitor, IResource.NONE);
}
} catch (CoreException e) {
Trace.trace(Trace.SEVERE,
"Error while retrieving script resources from the folder script path " + container.getName(), e);
}
return resources;
}
public String getLabel() {
StringBuilder text = new StringBuilder(container.getName()).append(" - ").append( //$NON-NLS-1$
container.getFullPath().makeRelative().toString());
if (getExternalLabel() != null) {
text.append(" (").append(getExternalLabel()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
}
return text.toString();
};
@Override
public String getPath() {
return container.getProjectRelativePath().toString();
}
@Override
public Object getAdapter(@SuppressWarnings("rawtypes") Class clazz) {
if (clazz == IContainer.class || clazz == IResource.class || clazz == IFolder.class) {
return container;
}
if (clazz == IProject.class && container instanceof IProject) {
return container;
}
return null;
}
@Override
public int hashCode() {
return super.hashCode() * 17 + container.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof FolderScriptPath) {
return super.equals(obj) && container.equals(((FolderScriptPath) obj).container);
}
return false;
}
@Override
public boolean isBelongToContainer(IPath path) {
IPath folderPath = getFullPath();
return PathUtils.isBelongToContainer(path, folderPath);
}
@Override
public boolean isInScope(IPath path, int resourceType) {
IPath folderPath = getFullPath();
IPath relativePath = PathUtils.getRelativePath(path, folderPath, resourceType);
return isInScope(relativePath, EclipsePathAdapter.INSTANCE);
}
public IPath getFullPath() {
return container.getFullPath();
}
}