/******************************************************************************* * 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) {} }