blob: aa265ffbb16e0304be0c52e2298fb6e7157c444e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 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
*
* Contributors:
* IBM Corporation - initial API and implementation
* IBM Corporation - added support for requesting updates of a particular
* container for generic container operations.
* - canUpdateJsGlobalScopeContainer(IPath, IJavaScriptProject)
* - requestJsGlobalScopeContainerUpdate(IPath, IJavaScriptProject, IJsGlobalScopeContainer)
* IBM Corporation - allow initializers to provide a readable description
* of a container reference, ahead of actual resolution.
* - getDescription(IPath, IJavaScriptProject)
*******************************************************************************/
package org.eclipse.wst.jsdt.core;
import java.net.URI;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.jsdt.core.compiler.libraries.LibraryLocation;
import org.eclipse.wst.jsdt.internal.core.JavaModelStatus;
/**
* Abstract base implementation of all includepath container initializer.
* Includepath variable containers are used in conjunction with the
* "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer" extension point.
* <p>
* Clients should subclass this class to implement a specific includepath
* container initializer. The subclass must have a public 0-argument
* constructor and a concrete implementation of <code>initialize</code>.
* <p>
* Multiple includepath containers can be registered, each of them declares
* the container ID they can handle, so as to narrow the set of containers they
* can resolve, in other words, a container initializer is guaranteed to only be
* activated to resolve containers which match the ID they registered onto.
* <p>
* In case multiple container initializers collide on the same container ID, the first
* registered one will be invoked.
*
* @see IIncludePathEntry
* @see IJsGlobalScopeContainer
*
* Provisional API: This class/interface is part of an interim API that is still under development and expected to
* change significantly before reaching stability. It is being made available at this early stage to solicit feedback
* from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
* (repeatedly) as the API evolves.
*/
public abstract class JsGlobalScopeContainerInitializer implements IJsGlobalScopeContainerInitializer, IJsGlobalScopeContainer {
/**
* Status code indicating that an attribute is not supported.
*
* @see #getAccessRulesStatus(IPath, IJavaScriptProject)
* @see #getAttributeStatus(IPath, IJavaScriptProject, String)
* @see #getSourceAttachmentStatus(IPath, IJavaScriptProject)
*
*/
public static final int ATTRIBUTE_NOT_SUPPORTED = 1;
/**
* Status code indicating that an attribute is not modifiable.
*
* @see #getAccessRulesStatus(IPath, IJavaScriptProject)
* @see #getAttributeStatus(IPath, IJavaScriptProject, String)
* @see #getSourceAttachmentStatus(IPath, IJavaScriptProject)
*
*/
public static final int ATTRIBUTE_READ_ONLY = 2;
/**
* Creates a new includepath container initializer.
*/
public JsGlobalScopeContainerInitializer() {
// a includepath container initializer must have a public 0-argument constructor
}
public void initialize(IPath containerPath, IJavaScriptProject project) throws CoreException {
JavaScriptCore.setJsGlobalScopeContainer(containerPath, new IJavaScriptProject[] { project }, new IJsGlobalScopeContainer[] { getContainer(containerPath, project) }, null);
}
protected IJsGlobalScopeContainer getContainer(IPath containerPath, IJavaScriptProject project) {
return this;
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.core.IJsGlobalScopeContainerInitialzer#canUpdateJsGlobalScopeContainer(org.eclipse.core.runtime.IPath, org.eclipse.wst.jsdt.core.IJavaScriptProject)
*/
public boolean canUpdateJsGlobalScopeContainer(IPath containerPath, IJavaScriptProject project) {
if(project==null || containerPath==null) return true;
LibrarySuperType superType = project.getCommonSuperType();
return superType!=null && superType.getRawContainerPath().equals(getPath());
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.core.IJsGlobalScopeContainerInitialzer#requestJsGlobalScopeContainerUpdate(org.eclipse.core.runtime.IPath, org.eclipse.wst.jsdt.core.IJavaScriptProject, org.eclipse.wst.jsdt.core.IJsGlobalScopeContainer)
*/
public void requestJsGlobalScopeContainerUpdate(IPath containerPath, IJavaScriptProject project, IJsGlobalScopeContainer containerSuggestion) throws CoreException {
// By default, includepath container initializers do not accept updating containers
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.core.IJsGlobalScopeContainerInitialzer#getDescription(org.eclipse.core.runtime.IPath, org.eclipse.wst.jsdt.core.IJavaScriptProject)
*/
public String getDescription(IPath containerPath, IJavaScriptProject project) {
// By default, a container path is the only available description
return containerPath.makeRelative().toString();
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.core.IJsGlobalScopeContainerInitialzer#getFailureContainer(org.eclipse.core.runtime.IPath, org.eclipse.wst.jsdt.core.IJavaScriptProject)
*/
public IJsGlobalScopeContainer getFailureContainer(final IPath containerPath, IJavaScriptProject project) {
final String description = getDescription(containerPath, project);
return
new IJsGlobalScopeContainer() {
public IIncludePathEntry[] getIncludepathEntries() {
return new IIncludePathEntry[0];
}
public String getDescription() {
return description;
}
public int getKind() {
return 0;
}
public IPath getPath() {
return containerPath;
}
public String toString() {
return getDescription();
}
public String[] resolvedLibraryImport(String a) {
return new String[] {a};
}
};
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.core.IJsGlobalScopeContainerInitialzer#getComparisonID(org.eclipse.core.runtime.IPath, org.eclipse.wst.jsdt.core.IJavaScriptProject)
*/
public Object getComparisonID(IPath containerPath, IJavaScriptProject project) {
// By default, containers are identical if they have the same containerPath first segment,
// but this may be refined by other container initializer implementations.
if (containerPath == null) {
return null;
} else {
return containerPath.segment(0);
}
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.core.IJsGlobalScopeContainerInitialzer#getHostPath(org.eclipse.core.runtime.IPath, org.eclipse.wst.jsdt.core.IJavaScriptProject)
*/
public URI getHostPath(IPath path, IJavaScriptProject project) {
return null;
}
public boolean allowAttachJsDoc() { return true; }
/*
* returns a String of all SuperTypes provided by this library.
*/
public String[] containerSuperTypes() {return new String[0];}
/* Return a string of imports to replace the real imports for. necisary for toolkits and other t
* things that may have a certain import best for runtime but not best for building a model
*
*/
public String[] resolvedLibraryImport(String realImport) {
return new String[] {realImport};
}
public IIncludePathEntry[] getIncludepathEntries() {
LibraryLocation libLocation = getLibraryLocation();
char[][] filesInLibs = libLocation.getLibraryFileNames();
IIncludePathEntry[] entries = new IIncludePathEntry[filesInLibs.length];
for (int i = 0; i < entries.length; i++) {
IPath workingLibPath = new Path(libLocation.getLibraryPath(filesInLibs[i]));
entries[i] = JavaScriptCore.newLibraryEntry(workingLibPath.makeAbsolute(), null, null, new IAccessRule[0], new IIncludePathAttribute[0], true);
}
return entries;
}
public String getDescription() {
return null;
}
public int getKind() {
return K_APPLICATION;
}
public IPath getPath() {
return null;
}
/**
* Returns the access rules attribute status according to this initializer.
* <p>
* The returned {@link IStatus status} can have one of the following severities:
* <ul>
* <li>{@link IStatus#OK OK}: means that the attribute is supported
* <strong>and</strong> is modifiable</li>
* <li>{@link IStatus#ERROR ERROR}: means that either the attribute
* is not supported or is not modifiable.<br>
* In this case, the {@link IStatus#getCode() code}will have
* respectively the {@link #ATTRIBUTE_NOT_SUPPORTED} value
* or the {@link #ATTRIBUTE_READ_ONLY} value.</li>
* </ul>
* </p><p>
* The status message can contain more information.
* </p><p>
* If the subclass does not override this method, then the default behavior is
* to return {@link IStatus#OK OK} if and only if the includepath container can
* be updated (see {@link #canUpdateJsGlobalScopeContainer(IPath, IJavaScriptProject)}).
* </p>
*
* @param containerPath the path of the container which requires to be
* updated
* @param project the project for which the container is to be updated
* @return returns the access rules attribute status
*
*/
public IStatus getAccessRulesStatus(IPath containerPath, IJavaScriptProject project) {
if (canUpdateJsGlobalScopeContainer(containerPath, project)) {
return Status.OK_STATUS;
}
return new JavaModelStatus(ATTRIBUTE_READ_ONLY);
}
/**
* Returns the extra attribute status according to this initializer.
* <p>
* The returned {@link IStatus status} can have one of the following severities:
* <ul>
* <li>{@link IStatus#OK OK}: means that the attribute is supported
* <strong>and</strong> is modifiable</li>
* <li>{@link IStatus#ERROR ERROR}: means that either the attribute
* is not supported or is not modifiable.<br>
* In this case, the {@link IStatus#getCode() code}will have
* respectively the {@link #ATTRIBUTE_NOT_SUPPORTED} value
* or the {@link #ATTRIBUTE_READ_ONLY} value.</li>
* </ul>
* </p><p>
* The status message can contain more information.
* </p><p>
* If the subclass does not override this method, then the default behavior is
* to return {@link IStatus#OK OK} if and only if the includepath container can
* be updated (see {@link #canUpdateJsGlobalScopeContainer(IPath, IJavaScriptProject)}).
* </p>
*
* @param containerPath the path of the container which requires to be
* updated
* @param project the project for which the container is to be updated
* @param attributeKey the key of the extra attribute
* @return returns the extra attribute status
* @see IIncludePathAttribute
*/
public IStatus getAttributeStatus(IPath containerPath, IJavaScriptProject project, String attributeKey) {
if (canUpdateJsGlobalScopeContainer(containerPath, project)) {
return Status.OK_STATUS;
}
return new JavaModelStatus(ATTRIBUTE_READ_ONLY);
}
/**
* Returns the source attachment attribute status according to this initializer.
* <p>
* The returned {@link IStatus status} can have one of the following severities:
* <ul>
* <li>{@link IStatus#OK OK}: means that the attribute is supported
* <strong>and</strong> is modifiable</li>
* <li>{@link IStatus#ERROR ERROR}: means that either the attribute
* is not supported or is not modifiable.<br>
* In this case, the {@link IStatus#getCode() code}will have
* respectively the {@link #ATTRIBUTE_NOT_SUPPORTED} value
* or the {@link #ATTRIBUTE_READ_ONLY} value.</li>
* </ul>
* </p><p>
* The status message can contain more information.
* </p><p>
* If the subclass does not override this method, then the default behavior is
* to return {@link IStatus#OK OK} if and only if the includepath container can
* be updated (see {@link #canUpdateJsGlobalScopeContainer(IPath, IJavaScriptProject)}).
* </p>
*
* @param containerPath the path of the container which requires to be
* updated
* @param project the project for which the container is to be updated
* @return returns the source attachment attribute status
*/
public IStatus getSourceAttachmentStatus(IPath containerPath, IJavaScriptProject project) {
if (canUpdateJsGlobalScopeContainer(containerPath, project)) {
return Status.OK_STATUS;
}
return new JavaModelStatus(ATTRIBUTE_READ_ONLY);
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.core.IJsGlobalScopeContainerInitialzer#getInferenceID()
*/
public String getInferenceID()
{
return null;
}
public void removeFromProject(IJavaScriptProject project) {}
}