### Eclipse Workspace Patch 1.0
#P org.eclipse.jdt.core
Index: model/org/eclipse/jdt/core/IJavaModelStatusConstants.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaModelStatusConstants.java,v
retrieving revision 1.37
diff -u -r1.37 IJavaModelStatusConstants.java
--- model/org/eclipse/jdt/core/IJavaModelStatusConstants.java 10 May 2006 18:03:42 -0000 1.37
+++ model/org/eclipse/jdt/core/IJavaModelStatusConstants.java 10 Jan 2007 18:31:45 -0000
@@ -320,4 +320,16 @@
* @since 3.2
*/
public static final int UNKNOWN_JAVADOC_FORMAT = 1009;
+ /**
+ *
Status constant indicating that the variable is deprecated.
+ *
+ * @since 3.3
+ */
+ public static final int DEPRECATED_VARIABLE = 1010;
+ /**
+ * Status constant indicating that the variable is read-only.
+ *
+ * @since 3.3
+ */
+ public static final int READ_ONLY_VARIABLE = 1011;
}
Index: model/org/eclipse/jdt/core/IClasspathEntry.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IClasspathEntry.java,v
retrieving revision 1.59
diff -u -r1.59 IClasspathEntry.java
--- model/org/eclipse/jdt/core/IClasspathEntry.java 29 Sep 2006 17:13:57 -0000 1.59
+++ model/org/eclipse/jdt/core/IClasspathEntry.java 10 Jan 2007 18:31:45 -0000
@@ -15,7 +15,7 @@
/**
* An entry on a Java project classpath identifying one or more package fragment
* roots. A classpath entry has a content kind (either source,
- * K_SOURCE
, or binary, K_BINARY
), which is inherited
+ * {@link IPackageFragmentRoot#K_SOURCE}, or binary, {@link IPackageFragmentRoot#K_BINARY}), which is inherited
* by each package fragment root and package fragment associated with the entry.
*
* A classpath entry can refer to any of the following:
@@ -29,7 +29,7 @@
* represent compilation units. All compilation units will be compiled when
* the project is built. The classpath entry must specify the
* absolute path to the root folder. Entries of this kind are
- * associated with the CPE_SOURCE
constant.
+ * associated with the {@link #CPE_SOURCE} constant.
* Source classpath entries can carry inclusion and exclusion patterns for
* selecting which source files appear as compilation
* units and get compiled when the project is built.
@@ -40,7 +40,7 @@
* package fragments and .class
files. The classpath entry
* must specify the absolute path to the JAR (or root folder), and in case it refers
* to an external JAR, then there is no associated resource in the workbench. Entries
- * of this kind are associated with the CPE_LIBRARY
constant.
+ * of this kind are associated with the {@link #CPE_LIBRARY} constant.
*
* - A required project. In this case the entry identifies another project in
* the workspace. The required project is used as a binary library when compiling
@@ -51,50 +51,50 @@
* is performed against a required project's source code, and compilation is
* performed against a required project's last built state. The
* classpath entry must specify the absolute path to the
- * project. Entries of this kind are associated with the
CPE_PROJECT
+ * project. Entries of this kind are associated with the {@link #CPE_PROJECT}
* constant.
* Note: referencing a required project with a classpath entry refers to the source
* code or associated .class
files located in its output location.
* It will also automatically include any other libraries or projects that the required project's classpath
* refers to, iff the corresponding classpath entries are tagged as being exported
- * (IClasspathEntry#isExported
).
+ * ({@link IClasspathEntry#isExported}).
* Unless exporting some classpath entries, classpaths are not chained by default -
* each project must specify its own classpath in its entirety.
*
* - A path beginning in a classpath variable defined globally to the workspace.
- * Entries of this kind are associated with the
CPE_VARIABLE
constant.
- * Classpath variables are created using JavaCore#setClasspathVariable
,
+ * Entries of this kind are associated with the {@link #CPE_VARIABLE} constant.
+ * Classpath variables are created using {@link JavaCore#setClasspathVariable(String, IPath, org.eclipse.core.runtime.IProgressMonitor)},
* and gets resolved, to either a project or library entry, using
- * JavaCore#getResolvedClasspathVariable
.
- * It is also possible to register an automatic initializer (ClasspathVariableInitializer
),
+ * {@link JavaCore#getResolvedClasspathEntry(IClasspathEntry)}.
+ * It is also possible to register an automatic initializer ({@link ClasspathVariableInitializer}),
* which will be invoked through the extension point "org.eclipse.jdt.core.classpathVariableInitializer".
* After resolution, a classpath variable entry may either correspond to a project or a library entry.
*
* - A named classpath container identified by its container path.
* A classpath container provides a way to indirectly reference a set of classpath entries through
- * a classpath entry of kind
CPE_CONTAINER
. Typically, a classpath container can
+ * a classpath entry of kind {@link #CPE_CONTAINER}. Typically, a classpath container can
* be used to describe a complex library composed of multiple JARs, projects or classpath variables,
* considering also that containers can be mapped differently on each project. Several projects can
* reference the same generic container path, but have each of them actually bound to a different
* container object.
* The container path is a formed by a first ID segment followed with extra segments,
* which can be used as additional hints for resolving this container reference. If no container was ever
- * recorded for this container path onto this project (using setClasspathContainer
,
- * then a ClasspathContainerInitializer
will be activated if any was registered for this
+ * recorded for this container path onto this project (using {@link JavaCore#setClasspathContainer},
+ * then a {@link ClasspathContainerInitializer} will be activated if any was registered for this
* container ID onto the extension point "org.eclipse.jdt.core.classpathContainerInitializer".
- * A classpath container entry can be resolved explicitly using JavaCore#getClasspathContainer
+ * A classpath container entry can be resolved explicitly using {@link JavaCore#getClasspathContainer}
* and the resulting container entries can contain any non-container entry. In particular, it may contain variable
* entries, which in turn needs to be resolved before being directly used.
*
Also note that the container resolution APIs include an IJavaProject argument, so as to allow the same
* container path to be interpreted in different ways for different projects.
*
*
- * The result of IJavaProject#getResolvedClasspath
will have all entries of type
- * CPE_VARIABLE
and CPE_CONTAINER
resolved to a set of
- * CPE_SOURCE
, CPE_LIBRARY
or CPE_PROJECT
+ * The result of {@link IJavaProject#getResolvedClasspath} will have all entries of type
+ * {@link #CPE_VARIABLE} and {@link #CPE_CONTAINER} resolved to a set of
+ * {@link #CPE_SOURCE}, {@link #CPE_LIBRARY} or {@link #CPE_PROJECT}
* classpath entries.
*
- * Any classpath entry other than a source folder (kind CPE_SOURCE
) can
+ * Any classpath entry other than a source folder (kind {@link #CPE_SOURCE}) can
* be marked as being exported. Exported entries are automatically contributed to
* dependent projects, along with the project's default output folder, which is
* implicitly exported, and any auxiliary output folders specified on source
@@ -102,7 +102,7 @@
* followed by the any exported entries.
*
* This interface is not intended to be implemented by clients.
- * Classpath entries can be created via methods on JavaCore
.
+ * Classpath entries can be created via methods on {@link JavaCore}.
*
*
* @see JavaCore#newLibraryEntry(org.eclipse.core.runtime.IPath, org.eclipse.core.runtime.IPath, org.eclipse.core.runtime.IPath)
@@ -170,11 +170,11 @@
* Returns the kind of files found in the package fragments identified by this
* classpath entry.
*
- * @return IPackageFragmentRoot.K_SOURCE
for files containing
- * source code, and IPackageFragmentRoot.K_BINARY
for binary
+ * @return {@link IPackageFragmentRoot#K_SOURCE} for files containing
+ * source code, and {@link IPackageFragmentRoot#K_BINARY} for binary
* class files.
- * There is no specified value for an entry denoting a variable (CPE_VARIABLE
)
- * or a classpath container (CPE_CONTAINER
).
+ * There is no specified value for an entry denoting a variable ({@link #CPE_VARIABLE})
+ * or a classpath container ({@link #CPE_CONTAINER}).
*/
int getContentKind();
@@ -183,16 +183,16 @@
*
* @return one of:
*
- * CPE_SOURCE
- this entry describes a source root in
+ * - {@link #CPE_SOURCE} - this entry describes a source root in
its project
- *
CPE_LIBRARY
- this entry describes a folder or JAR
+ * - {@link #CPE_LIBRARY} - this entry describes a folder or JAR
containing binaries
- *
CPE_PROJECT
- this entry describes another project
+ * - {@link #CPE_PROJECT} - this entry describes another project
*
- *
CPE_VARIABLE
- this entry describes a project or library
+ * - {@link #CPE_VARIABLE} - this entry describes a project or library
* indirectly via a classpath variable in the first segment of the path
* *
- *
CPE_CONTAINER
- this entry describes set of entries
+ * - {@link #CPE_CONTAINER} - this entry describes set of entries
* referenced indirectly via a classpath container
*
*/
@@ -344,11 +344,11 @@
/**
* Returns the full path to the specific location where the builder writes
* .class
files generated for this source entry
- * (entry kind CPE_SOURCE
).
+ * (entry kind {@link #CPE_SOURCE}).
*
* Source entries can optionally be associated with a specific output location.
* If none is provided, the source entry will be implicitly associated with its project
- * default output location (see IJavaProject#getOutputLocation
).
+ * default output location (see {@link IJavaProject#getOutputLocation}).
*
* NOTE: A specific output location cannot coincidate with another source/library entry.
*
@@ -364,24 +364,24 @@
* Returns the path of this classpath entry.
*
* The meaning of the path of a classpath entry depends on its entry kind:
- * - Source code in the current project (
CPE_SOURCE
) -
+ * - Source code in the current project ({@link #CPE_SOURCE}) -
* The path associated with this entry is the absolute path to the root folder.
- * - A binary library in the current project (
CPE_LIBRARY
) - the path
+ * - A binary library in the current project ({@link #CPE_LIBRARY}) - the path
* associated with this entry is the absolute path to the JAR (or root folder), and
* in case it refers to an external JAR, then there is no associated resource in
* the workbench.
- *
- A required project (
CPE_PROJECT
) - the path of the entry denotes the
+ * - A required project ({@link #CPE_PROJECT}) - the path of the entry denotes the
* path to the corresponding project resource.
- * - A variable entry (
CPE_VARIABLE
) - the first segment of the path
+ * - A variable entry ({@link #CPE_VARIABLE}) - the first segment of the path
* is the name of a classpath variable. If this classpath variable
* is bound to the path P, the path of the corresponding classpath entry
* is computed by appending to P the segments of the returned
* path without the variable.
- * - A container entry (
CPE_CONTAINER
) - the path of the entry
+ * - A container entry ({@link #CPE_CONTAINER}) - the path of the entry
* is the name of the classpath container, which can be bound indirectly to a set of classpath
* entries after resolution. The containerPath is a formed by a first ID segment followed with
* extra segments that can be used as additional hints for resolving this container
- * reference (also see
IClasspathContainer
).
+ * reference (also see {@link IClasspathContainer}).
*
*
*
@@ -410,7 +410,7 @@
* Returns the path within the source archive or folder where package fragments
* are located. An empty path indicates that packages are located at
* the root of the source archive or folder. Returns a non-null
value
- * if and only if getSourceAttachmentPath
returns
+ * if and only if {@link #getSourceAttachmentPath} returns
* a non-null
value.
*
* @return the path within the source archive or folder, or null
if
@@ -421,7 +421,7 @@
/**
* Returns whether this entry is exported to dependent projects.
* Always returns false
for source entries (kind
- * CPE_SOURCE
), which cannot be exported.
+ * {@link #CPE_SOURCE}), which cannot be exported.
*
* @return true
if exported, and false
otherwise
* @since 2.0
Index: model/org/eclipse/jdt/core/ClasspathVariableInitializer.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ClasspathVariableInitializer.java,v
retrieving revision 1.12
diff -u -r1.12 ClasspathVariableInitializer.java
--- model/org/eclipse/jdt/core/ClasspathVariableInitializer.java 10 May 2006 18:03:42 -0000 1.12
+++ model/org/eclipse/jdt/core/ClasspathVariableInitializer.java 10 Jan 2007 18:31:45 -0000
@@ -25,6 +25,13 @@
*/
public abstract class ClasspathVariableInitializer {
+ /**
+ * Additional flags associated with the initializer
+ */
+ int flags = 0; // no flag
+ final static int DEPRECATED = 0x01;
+ final static int READ_ONLY = 0x02;
+
/**
* Creates a new classpath variable initializer.
*/
@@ -49,4 +56,24 @@
* @see JavaCore#setClasspathVariables(String[], org.eclipse.core.runtime.IPath[], org.eclipse.core.runtime.IProgressMonitor)
*/
public abstract void initialize(String variable);
+
+ /**
+ * Return whether the associated variable is deprecated or not.
+ *
+ * @return true
if the initialized variable is deprecated,
+ * false
otherwise.
+ */
+ public final boolean isDeprecated() {
+ return (this.flags & DEPRECATED) != 0;
+ }
+
+ /**
+ * Return whether the initialized variable is read-only or not.
+ *
+ * @return true
if the initialized variable is read-only,
+ * false
otherwise.
+ */
+ public final boolean isReadOnly() {
+ return (this.flags & READ_ONLY) != 0;
+ }
}
Index: model/org/eclipse/jdt/core/JavaCore.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java,v
retrieving revision 1.558
diff -u -r1.558 JavaCore.java
--- model/org/eclipse/jdt/core/JavaCore.java 27 Nov 2006 20:58:17 -0000 1.558
+++ model/org/eclipse/jdt/core/JavaCore.java 10 Jan 2007 18:31:47 -0000
@@ -1612,6 +1612,10 @@
return variablePath;
}
+ return initializeClasspathVariable(variableName, variablePath);
+ }
+
+ static IPath initializeClasspathVariable(final String variableName, IPath variablePath) {
// even if persisted value exists, initializer is given priority, only if no initializer is found the persisted value is reused
final ClasspathVariableInitializer initializer = JavaCore.getClasspathVariableInitializer(variableName);
if (initializer != null){
@@ -1623,6 +1627,7 @@
" invocation stack trace:"); //$NON-NLS-1$
new Exception("").printStackTrace(System.out); //$NON-NLS-1$
}
+ JavaModelManager manager = JavaModelManager.getJavaModelManager();
manager.variablePut(variableName, JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS); // avoid initialization cycles
boolean ok = false;
try {
@@ -1638,7 +1643,7 @@
" variable: " + variableName +'\n' + //$NON-NLS-1$
" variable path: " + variablePath); //$NON-NLS-1$
}
- manager.variablesWithInitializer.add(variableName);
+ manager.variablesWithInitializer.put(variableName, initializer.flags);
ok = true;
} catch (RuntimeException e) {
if (JavaModelManager.CP_RESOLVE_VERBOSE) {
@@ -1662,6 +1667,42 @@
}
return variablePath;
}
+ public static boolean isClasspathVariableDeprecated(final String variableName) {
+ JavaModelManager manager = JavaModelManager.getJavaModelManager();
+ IPath variablePath = manager.variableGet(variableName);
+ if (variablePath == JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS){
+ return false; // currently do not store previous session result
+ }
+
+ if (variablePath != null) {
+ if (variablePath == JavaModelManager.CP_ENTRY_IGNORE_PATH) {
+ return false;
+ }
+ } else {
+ initializeClasspathVariable(variableName, variablePath);
+ }
+
+ int flags = manager.variableFlagsGet(variableName);
+ return (flags & 0x01) != 0;
+ }
+ public static boolean isClasspathVariableReadOnly(final String variableName) {
+ JavaModelManager manager = JavaModelManager.getJavaModelManager();
+ IPath variablePath = manager.variableGet(variableName);
+ if (variablePath == JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS){
+ return false; // currently do not store previous session result
+ }
+
+ if (variablePath != null) {
+ if (variablePath == JavaModelManager.CP_ENTRY_IGNORE_PATH) {
+ return false;
+ }
+ } else {
+ initializeClasspathVariable(variableName, variablePath);
+ }
+
+ int flags = manager.variableFlagsGet(variableName);
+ return (flags & 0x02) != 0;
+ }
/**
* Helper method finding the classpath variable initializer registered for a given classpath variable name
@@ -1685,7 +1726,8 @@
IConfigurationElement [] configElements = extensions[i].getConfigurationElements();
for(int j = 0; j < configElements.length; j++){
try {
- String varAttribute = configElements[j].getAttribute("variable"); //$NON-NLS-1$
+ IConfigurationElement configElement = configElements[j];
+ String varAttribute = configElement.getAttribute("variable"); //$NON-NLS-1$
if (variable.equals(varAttribute)) {
if (JavaModelManager.CP_RESOLVE_VERBOSE) {
Util.verbose(
@@ -1695,7 +1737,16 @@
}
Object execExt = configElements[j].createExecutableExtension("class"); //$NON-NLS-1$
if (execExt instanceof ClasspathVariableInitializer){
- return (ClasspathVariableInitializer)execExt;
+ ClasspathVariableInitializer initializer = (ClasspathVariableInitializer)execExt;
+ String deprecatedAttribute = configElement.getAttribute("deprecated"); //$NON-NLS-1$
+ if (deprecatedAttribute != null) {
+ initializer.flags |= ClasspathVariableInitializer.DEPRECATED;
+ }
+ String readOnlyAttribute = configElement.getAttribute("readOnly"); //$NON-NLS-1$
+ if (JavaModelManager.TRUE.equals(readOnlyAttribute)) {
+ initializer.flags |= ClasspathVariableInitializer.READ_ONLY;
+ }
+ return initializer;
}
}
} catch(CoreException e){
Index: model/org/eclipse/jdt/internal/core/JavaModelOperation.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelOperation.java,v
retrieving revision 1.64
diff -u -r1.64 JavaModelOperation.java
--- model/org/eclipse/jdt/internal/core/JavaModelOperation.java 23 Nov 2005 15:41:57 -0000 1.64
+++ model/org/eclipse/jdt/internal/core/JavaModelOperation.java 10 Jan 2007 18:31:49 -0000
@@ -61,7 +61,7 @@
protected HashMap attributes;
public static final String HAS_MODIFIED_RESOURCE_ATTR = "hasModifiedResource"; //$NON-NLS-1$
- public static final String TRUE = "true"; //$NON-NLS-1$
+ public static final String TRUE = JavaModelManager.TRUE;
//public static final String FALSE = "false";
/**
Index: model/org/eclipse/jdt/internal/core/JavaModelStatus.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelStatus.java,v
retrieving revision 1.42
diff -u -r1.42 JavaModelStatus.java
--- model/org/eclipse/jdt/internal/core/JavaModelStatus.java 29 Mar 2006 03:08:48 -0000 1.42
+++ model/org/eclipse/jdt/internal/core/JavaModelStatus.java 10 Jan 2007 18:31:49 -0000
@@ -126,7 +126,7 @@
this(code, new IJavaElement[]{element});
this.string = string;
}
-
+
/**
* Constructs an Java model status with the given corresponding
* element and path
@@ -135,6 +135,17 @@
this(code, new IJavaElement[]{element});
this.path = path;
}
+
+ /**
+ * Constructs an Java model status with the given corresponding
+ * element and path
+ */
+ public JavaModelStatus(int severity, int code, IJavaElement element, IPath path) {
+ super(severity, JavaCore.PLUGIN_ID, code, "JavaModelStatus", null); //$NON-NLS-1$
+ this.elements= new IJavaElement[]{element};
+ this.path = path;
+ }
+
/**
* Constructs an Java model status with the given corresponding
* element, path and string
@@ -326,53 +337,63 @@
if (description == null) description = path.makeRelative().toString();
return Messages.bind(Messages.classpath_invalidContainer, new String[] {description, javaProject.getElementName()});
- case CP_VARIABLE_PATH_UNBOUND:
- javaProject = (IJavaProject)elements[0];
- return Messages.bind(Messages.classpath_unboundVariablePath, new String[] {path.makeRelative().toString(), javaProject.getElementName()});
-
- case CLASSPATH_CYCLE:
- javaProject = (IJavaProject)elements[0];
- return Messages.bind(Messages.classpath_cycle, javaProject.getElementName());
-
- case DISABLED_CP_EXCLUSION_PATTERNS:
- javaProject = (IJavaProject)elements[0];
- String projectName = javaProject.getElementName();
- IPath newPath = path;
- if (path.segment(0).toString().equals(projectName)) {
- newPath = path.removeFirstSegments(1);
- }
- return Messages.bind(Messages.classpath_disabledInclusionExclusionPatterns, new String[] {newPath.makeRelative().toString(), projectName});
-
- case DISABLED_CP_MULTIPLE_OUTPUT_LOCATIONS:
- javaProject = (IJavaProject)elements[0];
- projectName = javaProject.getElementName();
- newPath = path;
- if (path.segment(0).toString().equals(projectName)) {
- newPath = path.removeFirstSegments(1);
- }
- return Messages.bind(Messages.classpath_disabledMultipleOutputLocations, new String[] {newPath.makeRelative().toString(), projectName});
+ case CP_VARIABLE_PATH_UNBOUND:
+ javaProject = (IJavaProject)elements[0];
+ return Messages.bind(Messages.classpath_unboundVariablePath, new String[] {path.makeRelative().toString(), javaProject.getElementName()});
- case INCOMPATIBLE_JDK_LEVEL:
+ case CLASSPATH_CYCLE:
javaProject = (IJavaProject)elements[0];
- return Messages.bind(Messages.classpath_incompatibleLibraryJDKLevel, new String[]{
- javaProject.getElementName(),
- javaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true),
- path.makeRelative().toString(),
- string,
- });
- case CANNOT_RETRIEVE_ATTACHED_JAVADOC :
- if (elements != null && elements.length == 1) {
+ return Messages.bind(Messages.classpath_cycle, javaProject.getElementName());
+
+ case DISABLED_CP_EXCLUSION_PATTERNS:
+ javaProject = (IJavaProject)elements[0];
+ String projectName = javaProject.getElementName();
+ IPath newPath = path;
+ if (path.segment(0).toString().equals(projectName)) {
+ newPath = path.removeFirstSegments(1);
+ }
+ return Messages.bind(Messages.classpath_disabledInclusionExclusionPatterns, new String[] {newPath.makeRelative().toString(), projectName});
+
+ case DISABLED_CP_MULTIPLE_OUTPUT_LOCATIONS:
+ javaProject = (IJavaProject)elements[0];
+ projectName = javaProject.getElementName();
+ newPath = path;
+ if (path.segment(0).toString().equals(projectName)) {
+ newPath = path.removeFirstSegments(1);
+ }
+ return Messages.bind(Messages.classpath_disabledMultipleOutputLocations, new String[] {newPath.makeRelative().toString(), projectName});
+
+ case INCOMPATIBLE_JDK_LEVEL:
+ javaProject = (IJavaProject)elements[0];
+ return Messages.bind(Messages.classpath_incompatibleLibraryJDKLevel, new String[]{
+ javaProject.getElementName(),
+ javaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true),
+ path.makeRelative().toString(),
+ string,
+ });
+
+ case CANNOT_RETRIEVE_ATTACHED_JAVADOC :
+ if (elements != null && elements.length == 1) {
+ if (this.string != null) {
+ return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, ((JavaElement)elements[0]).toStringWithAncestors(), this.string);
+ }
+ return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, ((JavaElement)elements[0]).toStringWithAncestors(), ""); //$NON-NLS-1$
+ }
if (this.string != null) {
- return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, ((JavaElement)elements[0]).toStringWithAncestors(), this.string);
+ return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, this.string, "");//$NON-NLS-1$
}
- return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, ((JavaElement)elements[0]).toStringWithAncestors(), ""); //$NON-NLS-1$
- }
- if (this.string != null) {
- return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, this.string, "");//$NON-NLS-1$
- }
- break;
- case UNKNOWN_JAVADOC_FORMAT :
- return Messages.bind(Messages.status_unknown_javadoc_format, ((JavaElement)elements[0]).toStringWithAncestors());
+ break;
+
+ case UNKNOWN_JAVADOC_FORMAT :
+ return Messages.bind(Messages.status_unknown_javadoc_format, ((JavaElement)elements[0]).toStringWithAncestors());
+
+ case DEPRECATED_VARIABLE :
+ javaProject = (IJavaProject)elements[0];
+ return Messages.bind(Messages.classpath_deprecated_variable, new String[] {path.segment(0).toString(), javaProject.getElementName()});
+
+ case READ_ONLY_VARIABLE :
+ javaProject = (IJavaProject)elements[0];
+ return Messages.bind(Messages.classpath_read_only_variable, new String[] {path.segment(0).toString(), javaProject.getElementName()});
}
if (string != null) {
return string;
@@ -468,6 +489,14 @@
jms.children = children;
return jms;
}
+ public static IJavaModelStatus newMultiStatus(IJavaModelStatus status, IJavaModelStatus[] children) {
+ JavaModelStatus jmStatus = (JavaModelStatus) status;
+ JavaModelStatus jms = new JavaModelStatus(status.getSeverity(), status.getCode(), jmStatus.string);
+ jms.elements = jmStatus.elements;
+ jms.path = jmStatus.path;
+ jms.children = children;
+ return jms;
+ }
/**
* Returns a printable representation of this exception for debugging
* purposes.
Index: model/org/eclipse/jdt/internal/core/ClasspathEntry.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java,v
retrieving revision 1.94
diff -u -r1.94 ClasspathEntry.java
--- model/org/eclipse/jdt/internal/core/ClasspathEntry.java 3 Oct 2006 09:43:27 -0000 1.94
+++ model/org/eclipse/jdt/internal/core/ClasspathEntry.java 10 Jan 2007 18:31:47 -0000
@@ -26,6 +26,7 @@
import org.eclipse.core.runtime.AssertionFailedException;
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.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
@@ -1627,7 +1628,25 @@
if (entry == null){
return new JavaModelStatus(IJavaModelStatusConstants.CP_VARIABLE_PATH_UNBOUND, project, path);
}
- return validateClasspathEntry(project, entry, checkSourceAttachment, recurseInContainers);
+ IJavaModelStatus status = validateClasspathEntry(project, entry, checkSourceAttachment, recurseInContainers);
+
+ // variable may also be deprecated or read-only
+ String variableName = path.segment(0);
+ IJavaModelStatus[] children = new IJavaModelStatus[2];
+ int size = 0;
+ if (JavaCore.isClasspathVariableDeprecated(variableName)) {
+ children[size++] = new JavaModelStatus(IStatus.WARNING, IJavaModelStatusConstants.DEPRECATED_VARIABLE, project, path);
+ }
+ if (JavaCore.isClasspathVariableReadOnly(variableName)) {
+ children[size++] = new JavaModelStatus(IStatus.WARNING, IJavaModelStatusConstants.READ_ONLY_VARIABLE, project, path);
+ }
+ if (size > 0) {
+ if (size == 1) {
+ children = new IJavaModelStatus[] { children[0] };
+ }
+ status = JavaModelStatus.newMultiStatus(status, children);
+ }
+ return status;
} else {
return new JavaModelStatus(IJavaModelStatusConstants.INVALID_CLASSPATH, Messages.bind(Messages.classpath_illegalVariablePath, new String[] {entryPathMsg, projectName}));
}
Index: model/org/eclipse/jdt/internal/core/JavaModelManager.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java,v
retrieving revision 1.348
diff -u -r1.348 JavaModelManager.java
--- model/org/eclipse/jdt/internal/core/JavaModelManager.java 27 Nov 2006 20:46:06 -0000 1.348
+++ model/org/eclipse/jdt/internal/core/JavaModelManager.java 10 Jan 2007 18:31:49 -0000
@@ -86,7 +86,7 @@
* Classpath variables pool
*/
public HashMap variables = new HashMap(5);
- public HashSet variablesWithInitializer = new HashSet(5);
+ public HashtableOfObjectToInt variablesWithInitializer = new HashtableOfObjectToInt(5);
public HashMap previousSessionVariables = new HashMap(5);
private ThreadLocal variableInitializationInProgress = new ThreadLocal();
@@ -120,6 +120,7 @@
public final static String CP_CONTAINER_PREFERENCES_PREFIX = JavaCore.PLUGIN_ID+".classpathContainer."; //$NON-NLS-1$
public final static String CP_ENTRY_IGNORE = "####"; //$NON-NLS-1$
public final static IPath CP_ENTRY_IGNORE_PATH = new Path(CP_ENTRY_IGNORE);
+ public final static String TRUE = "true"; //$NON-NLS-1$
private final static int VARIABLES_AND_CONTAINERS_FILE_VERSION = 2;
@@ -278,9 +279,9 @@
continue;
}
// add config element in the group it belongs to
- if ("true".equals(configElement.getAttribute("modifiesEnvironment"))) //$NON-NLS-1$ //$NON-NLS-2$
+ if (TRUE.equals(configElement.getAttribute("modifiesEnvironment"))) //$NON-NLS-1$
modifyingEnv.add(configElement);
- else if ("true".equals(configElement.getAttribute("createsProblems"))) //$NON-NLS-1$ //$NON-NLS-2$
+ else if (TRUE.equals(configElement.getAttribute("createsProblems"))) //$NON-NLS-1$
creatingProblems.add(configElement);
else
others.add(configElement);
@@ -1124,12 +1125,12 @@
if (propertyName.startsWith(CP_VARIABLE_PREFERENCES_PREFIX)) {
String varName = propertyName.substring(CP_VARIABLE_PREFERENCES_PREFIX.length());
JavaModelManager manager = getJavaModelManager();
- if (manager.variablesWithInitializer.contains(varName)) {
+ if (manager.variablesWithInitializer.containsKey(varName)) {
// revert preference value as we will not apply it to JavaCore classpath variable
String oldValue = (String) event.getOldValue();
if (oldValue == null) {
// unexpected old value => remove variable from set
- manager.variablesWithInitializer.remove(varName);
+ manager.variablesWithInitializer.removeKey(varName);
} else {
manager.getInstancePreferences().put(varName, oldValue);
}
@@ -1200,58 +1201,58 @@
public void configurePluginDebugOptions(){
if(JavaCore.getPlugin().isDebugging()){
String option = Platform.getDebugOption(BUFFER_MANAGER_DEBUG);
- if(option != null) BufferManager.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) BufferManager.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(BUILDER_DEBUG);
- if(option != null) JavaBuilder.DEBUG = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) JavaBuilder.DEBUG = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(COMPILER_DEBUG);
- if(option != null) Compiler.DEBUG = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) Compiler.DEBUG = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(COMPLETION_DEBUG);
- if(option != null) CompletionEngine.DEBUG = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) CompletionEngine.DEBUG = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(CP_RESOLVE_DEBUG);
- if(option != null) JavaModelManager.CP_RESOLVE_VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) JavaModelManager.CP_RESOLVE_VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(DELTA_DEBUG);
- if(option != null) DeltaProcessor.DEBUG = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) DeltaProcessor.DEBUG = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(DELTA_DEBUG_VERBOSE);
- if(option != null) DeltaProcessor.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) DeltaProcessor.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(HIERARCHY_DEBUG);
- if(option != null) TypeHierarchy.DEBUG = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) TypeHierarchy.DEBUG = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(INDEX_MANAGER_DEBUG);
- if(option != null) JobManager.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) JobManager.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(JAVAMODEL_DEBUG);
- if(option != null) JavaModelManager.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) JavaModelManager.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(JAVAMODELCACHE_DEBUG);
- if(option != null) JavaModelCache.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) JavaModelCache.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(POST_ACTION_DEBUG);
- if(option != null) JavaModelOperation.POST_ACTION_VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) JavaModelOperation.POST_ACTION_VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(RESOLUTION_DEBUG);
- if(option != null) NameLookup.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) NameLookup.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(SEARCH_DEBUG);
- if(option != null) BasicSearchEngine.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) BasicSearchEngine.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(SELECTION_DEBUG);
- if(option != null) SelectionEngine.DEBUG = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) SelectionEngine.DEBUG = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(ZIP_ACCESS_DEBUG);
- if(option != null) JavaModelManager.ZIP_ACCESS_VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) JavaModelManager.ZIP_ACCESS_VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(SOURCE_MAPPER_DEBUG_VERBOSE);
- if(option != null) SourceMapper.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) SourceMapper.VERBOSE = option.equalsIgnoreCase(TRUE) ;
option = Platform.getDebugOption(ENABLE_NEW_FORMATTER);
- if(option != null) DefaultCodeFormatter.USE_NEW_FORMATTER = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) DefaultCodeFormatter.USE_NEW_FORMATTER = option.equalsIgnoreCase(TRUE) ;
}
// configure performance options
@@ -3949,7 +3950,7 @@
// Note: no need to close the Java model as this just removes Java element infos from the Java model cache
}
-
+
public synchronized IPath variableGet(String variableName){
// check initialization in progress first
HashSet initializations = variableInitializationInProgress();
@@ -3959,6 +3960,10 @@
return (IPath)this.variables.get(variableName);
}
+ public synchronized int variableFlagsGet(String variableName){
+ return this.variablesWithInitializer.get(variableName);
+ }
+
/*
* Returns the set of variable names that are being initialized in the current thread.
*/
@@ -4010,7 +4015,7 @@
public void variablePreferencesPut(String variableName, IPath variablePath) {
String variableKey = CP_VARIABLE_PREFERENCES_PREFIX+variableName;
if (variablePath == null) {
- this.variablesWithInitializer.remove(variableName);
+ this.variablesWithInitializer.removeKey(variableName);
getInstancePreferences().remove(variableKey);
} else {
getInstancePreferences().put(variableKey, variablePath.toString());
Index: schema/classpathVariableInitializer.exsd
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/schema/classpathVariableInitializer.exsd,v
retrieving revision 1.6
diff -u -r1.6 classpathVariableInitializer.exsd
--- schema/classpathVariableInitializer.exsd 24 May 2005 14:25:21 -0000 1.6
+++ schema/classpathVariableInitializer.exsd 10 Jan 2007 18:31:49 -0000
@@ -63,6 +63,23 @@
+
+
+
+ String explaining the reason why the associated variable is deprecated
+
+
+
+
+
+
+
+
+
+ Indicates that the associated variable cannot be modified
+
+
+
Index: model/org/eclipse/jdt/internal/core/util/messages.properties
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/messages.properties,v
retrieving revision 1.62
diff -u -r1.62 messages.properties
--- model/org/eclipse/jdt/internal/core/util/messages.properties 28 Jun 2006 08:52:07 -0000 1.62
+++ model/org/eclipse/jdt/internal/core/util/messages.properties 10 Jan 2007 18:31:49 -0000
@@ -167,6 +167,8 @@
classpath_disabledMultipleOutputLocations = Multiple output locations are disabled in project {1}, cannot associate entry: ''{0}'' with a specific output
classpath_incompatibleLibraryJDKLevel = Incompatible .class files version in required binaries. Project ''{0}'' is targeting a {1} runtime, but is compiled against ''{2}'' which requires a {3} runtime
classpath_duplicateEntryExtraAttribute = Duplicate extra attribute: ''{0}'' in classpath entry ''{1}'' for project {2}
+classpath_deprecated_variable = Classpath variable ''{0}'' in project {1} is deprecated
+classpath_read_only_variable = Classpath variable ''{0}'' in project {1} is read only
### miscellaneous
file_notFound = File not found: ''{0}''
Index: model/org/eclipse/jdt/internal/core/util/Messages.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Messages.java,v
retrieving revision 1.14
diff -u -r1.14 Messages.java
--- model/org/eclipse/jdt/internal/core/util/Messages.java 28 Jun 2006 08:52:07 -0000 1.14
+++ model/org/eclipse/jdt/internal/core/util/Messages.java 10 Jan 2007 18:31:49 -0000
@@ -161,6 +161,8 @@
public static String classpath_disabledMultipleOutputLocations;
public static String classpath_incompatibleLibraryJDKLevel;
public static String classpath_duplicateEntryExtraAttribute;
+ public static String classpath_deprecated_variable;
+ public static String classpath_read_only_variable;
public static String file_notFound;
public static String file_badFormat;
public static String path_nullPath;