JavaCore extends Plugin

/*******************************************************************************
2  * Copyright (c) 2000, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  * IBM Corporation - added the following constants:
11  * COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE
12  * COMPILER_PB_STATIC_ACCESS_RECEIVER
13  * COMPILER_TASK_TAGS
14  * CORE_CIRCULAR_CLASSPATH
15  * CORE_INCOMPLETE_CLASSPATH
16  * IBM Corporation - added run(IWorkspaceRunnable, IProgressMonitor)
17  * IBM Corporation - added exclusion patterns to source classpath entries
18  * IBM Corporation - added specific output location to source classpath entries
19  * IBM Corporation - added the following constants:
20  * CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER
21  * CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER
22  * CLEAN
23  * IBM Corporation - added getClasspathContainerInitializer(String)
24  * IBM Corporation - added the following constants:
25  * CODEASSIST_ARGUMENT_PREFIXES
26  * CODEASSIST_ARGUMENT_SUFFIXES
27  * CODEASSIST_FIELD_PREFIXES
28  * CODEASSIST_FIELD_SUFFIXES
29  * CODEASSIST_LOCAL_PREFIXES
30  * CODEASSIST_LOCAL_SUFFIXES
31  * CODEASSIST_STATIC_FIELD_PREFIXES
32  * CODEASSIST_STATIC_FIELD_SUFFIXES
33  * COMPILER_PB_CHAR_ARRAY_IN_STRING_CONCATENATION
34  * IBM Corporation - added the following constants:
35  * COMPILER_PB_LOCAL_VARIABLE_HIDING
36  * COMPILER_PB_SPECIAL_PARAMETER_HIDING_FIELD
37  * COMPILER_PB_FIELD_HIDING
38  * COMPILER_PB_POSSIBLE_ACCIDENTAL_BOOLEAN_ASSIGNMENT
39  * CORE_INCOMPATIBLE_JDK_LEVEL
40  * VERSION_1_5
41  * COMPILER_PB_EMPTY_STATEMENT
42  * IBM Corporation - added the following constants:
43  * COMPILER_PB_INDIRECT_STATIC_ACCESS
44  * COMPILER_PB_BOOLEAN_METHOD_THROWING_EXCEPTION
45  * COMPILER_PB_UNNECESSARY_CAST
46  * IBM Corporation - added the following constants:
47  * COMPILER_PB_INVALID_JAVADOC
48  * COMPILER_PB_INVALID_JAVADOC_TAGS
49  * COMPILER_PB_INVALID_JAVADOC_TAGS_VISIBILITY
50  * COMPILER_PB_MISSING_JAVADOC_TAGS
51  * COMPILER_PB_MISSING_JAVADOC_TAGS_VISIBILITY
52  * COMPILER_PB_MISSING_JAVADOC_TAGS_OVERRIDING
53  * COMPILER_PB_MISSING_JAVADOC_COMMENTS
54  * COMPILER_PB_MISSING_JAVADOC_COMMENTS_VISIBILITY
55  * COMPILER_PB_MISSING_JAVADOC_COMMENTS_OVERRIDING
56  * COMPILER_PB_DEPRECATION_WHEN_OVERRIDING_DEPRECATED_METHOD
57  * COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION_WHEN_OVERRIDING
58  * IBM Corporation - added the following constants:
59  * TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC
60  * IBM Corporation - added the following constants:
61  * COMPILER_PB_FALLTHROUGH_CASE
62  * COMPILER_PB_PARAMETER_ASSIGNMENT
63  * COMPILER_PB_NULL_REFERENCE
64  * IBM Corporation - added the following constants:
65  * CODEASSIST_DEPRECATION_CHECK
66  * IBM Corporation - added the following constants:
67  * COMPILER_PB_POTENTIAL_NULL_REFERENCE
68  * COMPILER_PB_REDUNDANT_NULL_CHECK
69  * IBM Corporation - added the following constants:
70  * COMPILER_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE
71  *******************************************************************************/
72 package org.eclipse.jdt.core;
73 
74 import java.io.File  JavaDoc;
75 import java.util.ArrayList  JavaDoc;
76 import java.util.HashMap  JavaDoc;
77 import java.util.Hashtable  JavaDoc;
78 import java.util.Map  JavaDoc;
79 
80 import org.eclipse.core.resources.IContainer;
81 import org.eclipse.core.resources.IFile;
82 import org.eclipse.core.resources.IFolder;
83 import org.eclipse.core.resources.IMarker;
84 import org.eclipse.core.resources.IMarkerDelta;
85 import org.eclipse.core.resources.IProject;
86 import org.eclipse.core.resources.IResource;
87 import org.eclipse.core.resources.IResourceChangeEvent;
88 import org.eclipse.core.resources.IResourceChangeListener;
89 import org.eclipse.core.resources.IWorkspace;
90 import org.eclipse.core.resources.IWorkspaceRoot;
91 import org.eclipse.core.resources.IWorkspaceRunnable;
92 import org.eclipse.core.resources.ResourcesPlugin;
93 import org.eclipse.core.runtime.Assert;
94 import org.eclipse.core.runtime.CoreException;
95 import org.eclipse.core.runtime.IConfigurationElement;
96 import org.eclipse.core.runtime.IExtension;
97 import org.eclipse.core.runtime.IExtensionPoint;
98 import org.eclipse.core.runtime.IPath;
99 import org.eclipse.core.runtime.IProgressMonitor;
100 import org.eclipse.core.runtime.OperationCanceledException;
101 import org.eclipse.core.runtime.Platform;
102 import org.eclipse.core.runtime.Plugin;
103 import org.eclipse.core.runtime.QualifiedName;
104 import org.eclipse.core.runtime.SubProgressMonitor;
105 import org.eclipse.core.runtime.jobs.ISchedulingRule;
106 import org.eclipse.jdt.core.compiler.CharOperation;
107 import org.eclipse.jdt.core.search.IJavaSearchConstants;
108 import org.eclipse.jdt.core.search.IJavaSearchScope;
109 import org.eclipse.jdt.core.search.SearchEngine;
110 import org.eclipse.jdt.core.search.SearchPattern;
111 import org.eclipse.jdt.core.search.TypeNameRequestor;
112 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
113 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
114 import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
115 import org.eclipse.jdt.internal.core.*;
116 import org.eclipse.jdt.internal.core.builder.JavaBuilder;
117 import org.eclipse.jdt.internal.core.builder.State;
118 import org.eclipse.jdt.internal.core.util.MementoTokenizer;
119 import org.eclipse.jdt.internal.core.util.Messages;
120 import org.eclipse.jdt.internal.core.util.Util;
121 import org.osgi.framework.BundleContext;
122 
123 /**
124  * The plug-in runtime class for the Java model plug-in containing the core
125  * (UI-free) support for Java projects.
126  * <p>
127  * Like all plug-in runtime classes (subclasses of <code>Plugin</code>), this
128  * class is automatically instantiated by the platform when the plug-in gets
129  * activated. Clients must not attempt to instantiate plug-in runtime classes
130  * directly.
131  * </p>
132  * <p>
133  * The single instance of this class can be accessed from any plug-in declaring
134  * the Java model plug-in as a prerequisite via
135  * <code>JavaCore.getJavaCore()</code>. The Java model plug-in will be activated
136  * automatically if not already active.
137  * </p>
138  */
139 public final class JavaCore extends Plugin {
140 
141     private static final IResource[] NO_GENERATED_RESOURCES = new IResource[0];
142 
143     private static Plugin JAVA_CORE_PLUGIN = null;
144     /**
145      * The plug-in identifier of the Java core support
146      * (value <code>"org.eclipse.jdt.core"</code>).
147      */
148     public static final String  JavaDoc PLUGIN_ID = "org.eclipse.jdt.core" ; //$NON-NLS-1$
149 
150     /**
151      * The identifier for the Java builder
152      * (value <code>"org.eclipse.jdt.core.javabuilder"</code>).
153      */
154     public static final String  JavaDoc BUILDER_ID = PLUGIN_ID + ".javabuilder" ; //$NON-NLS-1$
155 
156     /**
157      * The identifier for the Java model
158      * (value <code>"org.eclipse.jdt.core.javamodel"</code>).
159      */
160     public static final String  JavaDoc MODEL_ID = PLUGIN_ID + ".javamodel" ; //$NON-NLS-1$
161 
162     /**
163      * The identifier for the Java nature
164      * (value <code>"org.eclipse.jdt.core.javanature"</code>).
165      * The presence of this nature on a project indicates that it is
166      * Java-capable.
167      *
168      * @see org.eclipse.core.resources.IProject#hasNature(java.lang.String)
169      */
170     public static final String  JavaDoc NATURE_ID = PLUGIN_ID + ".javanature" ; //$NON-NLS-1$
171 
172     /**
173      * Name of the handle id attribute in a Java marker.
174      */
175     protected static final String  JavaDoc ATT_HANDLE_ID =
176         "org.eclipse.jdt.internal.core.JavaModelManager.handleId" ; //$NON-NLS-1$
177 
178     /**
179      * Name of the User Library Container id.
180      * @since 3.0
181      */
182     public static final String  JavaDoc USER_LIBRARY_CONTAINER_ID= "org.eclipse.jdt.USER_LIBRARY"; //$NON-NLS-1$
183 
184     // *************** Possible IDs for configurable options. ********************
185 
186     /**
187      * Possible configurable option ID.
188      * @see #getDefaultOptions()
189      */
190     public static final String  JavaDoc COMPILER_LOCAL_VARIABLE_ATTR = PLUGIN_ID + ".compiler.debug.localVariable"; //$NON-NLS-1$
191 /**
192      * Possible configurable option ID.
193      * @see #getDefaultOptions()
194      */
195     public static final String  JavaDoc COMPILER_LINE_NUMBER_ATTR = PLUGIN_ID + ".compiler.debug.lineNumber"; //$NON-NLS-1$
196 /**
197      * Possible configurable option ID.
198      * @see #getDefaultOptions()
199      */
200     public static final String  JavaDoc COMPILER_SOURCE_FILE_ATTR = PLUGIN_ID + ".compiler.debug.sourceFile"; //$NON-NLS-1$
201 /**
202      * Possible configurable option ID.
203      * @see #getDefaultOptions()
204      */
205     public static final String  JavaDoc COMPILER_CODEGEN_UNUSED_LOCAL = PLUGIN_ID + ".compiler.codegen.unusedLocal"; //$NON-NLS-1$
206 /**
207      * Possible configurable option ID.
208      * @see #getDefaultOptions()
209      */
210     public static final String  JavaDoc COMPILER_CODEGEN_TARGET_PLATFORM = PLUGIN_ID + ".compiler.codegen.targetPlatform"; //$NON-NLS-1$
211 /**
212      * Possible configurable option ID.
213      * @see #getDefaultOptions()
214      * @since 3.0
215      */
216     public static final String  JavaDoc COMPILER_CODEGEN_INLINE_JSR_BYTECODE = PLUGIN_ID + ".compiler.codegen.inlineJsrBytecode"; //$NON-NLS-1$
217 /**
218      * Possible configurable option ID.
219      * @see #getDefaultOptions()
220      * @since 3.0
221      */
222     public static final String  JavaDoc COMPILER_DOC_COMMENT_SUPPORT = PLUGIN_ID + ".compiler.doc.comment.support"; //$NON-NLS-1$
223 /**
224      * Possible configurable option ID.
225      * @see #getDefaultOptions()
226      * @deprecated - discontinued since turning off would violate language specs
227      */
228     public static final String  JavaDoc COMPILER_PB_UNREACHABLE_CODE = PLUGIN_ID + ".compiler.problem.unreachableCode"; //$NON-NLS-1$
229 /**
230      * Possible configurable option ID.
231      * @see #getDefaultOptions()
232      * @deprecated - discontinued since turning off would violate language specs
233      */
234     public static final String  JavaDoc COMPILER_PB_INVALID_IMPORT = PLUGIN_ID + ".compiler.problem.invalidImport"; //$NON-NLS-1$
235 /**
236      * Possible configurable option ID.
237      * @see #getDefaultOptions()
238      */
239     public static final String  JavaDoc COMPILER_PB_OVERRIDING_PACKAGE_DEFAULT_METHOD = PLUGIN_ID + ".compiler.problem.overridingPackageDefaultMethod"; //$NON-NLS-1$
240 /**
241      * Possible configurable option ID.
242      * @see #getDefaultOptions()
243      */
244     public static final String  JavaDoc COMPILER_PB_METHOD_WITH_CONSTRUCTOR_NAME = PLUGIN_ID + ".compiler.problem.methodWithConstructorName"; //$NON-NLS-1$
245 /**
246      * Possible configurable option ID.
247      * @see #getDefaultOptions()
248      */
249     public static final String  JavaDoc COMPILER_PB_DEPRECATION = PLUGIN_ID + ".compiler.problem.deprecation"; //$NON-NLS-1$
250 /**
251      * Possible configurable option ID.
252      * @see #getDefaultOptions()
253      * @since 2.1
254      */
255     public static final String  JavaDoc COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE = PLUGIN_ID + ".compiler.problem.deprecationInDeprecatedCode"; //$NON-NLS-1$
256 /**
257      * Possible configurable option ID.
258      * @see #getDefaultOptions()
259      * @since 3.0
260      */
261     public static final String  JavaDoc COMPILER_PB_DEPRECATION_WHEN_OVERRIDING_DEPRECATED_METHOD = "org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod"; //$NON-NLS-1$
262 /**
263      * Possible configurable option ID.
264      * @see #getDefaultOptions()
265      */
266     public static final String  JavaDoc COMPILER_PB_HIDDEN_CATCH_BLOCK = PLUGIN_ID + ".compiler.problem.hiddenCatchBlock"; //$NON-NLS-1$
267 /**
268      * Possible configurable option ID.
269      * @see #getDefaultOptions()
270      */
271     public static final String  JavaDoc COMPILER_PB_UNUSED_LOCAL = PLUGIN_ID + ".compiler.problem.unusedLocal"; //$NON-NLS-1$
272 /**
273      * Possible configurable option ID.
274      * @see #getDefaultOptions()
275      */
276     public static final String  JavaDoc COMPILER_PB_UNUSED_PARAMETER = PLUGIN_ID + ".compiler.problem.unusedParameter"; //$NON-NLS-1$
277 /**
278      * Possible configurable option ID.
279      * @see #getDefaultOptions()
280      * @since 2.1
281      */
282     public static final String  JavaDoc COMPILER_PB_UNUSED_PARAMETER_WHEN_IMPLEMENTING_ABSTRACT = PLUGIN_ID + ".compiler.problem.unusedParameterWhenImplementingAbstract"; //$NON-NLS-1$
283 /**
284      * Possible configurable option ID.
285      * @see #getDefaultOptions()
286      * @since 2.1
287      */
288     public static final String  JavaDoc COMPILER_PB_UNUSED_PARAMETER_WHEN_OVERRIDING_CONCRETE = PLUGIN_ID + ".compiler.problem.unusedParameterWhenOverridingConcrete"; //$NON-NLS-1$
289 /**
290      * Possible configurable option ID.
291      * @see #getDefaultOptions()
292      * @since 3.3
293      */
294     public static final String  JavaDoc COMPILER_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE = PLUGIN_ID + ".compiler.problem.unusedParameterIncludeDocCommentReference"; //$NON-NLS-1$
295 /**
296      * Possible configurable option ID.
297      * @see #getDefaultOptions()
298      * @since 2.0
299      */
300     public static final String  JavaDoc COMPILER_PB_UNUSED_IMPORT = PLUGIN_ID + ".compiler.problem.unusedImport"; //$NON-NLS-1$
301 /**
302      * Possible configurable option ID.
303      * @see #getDefaultOptions()
304      */
305     public static final String  JavaDoc COMPILER_PB_SYNTHETIC_ACCESS_EMULATION = PLUGIN_ID + ".compiler.problem.syntheticAccessEmulation"; //$NON-NLS-1$
306 /**
307      * Possible configurable option ID.
308      * @see #getDefaultOptions()
309      * @since 2.0
310      */
311     public static final String  JavaDoc COMPILER_PB_NON_NLS_STRING_LITERAL = PLUGIN_ID + ".compiler.problem.nonExternalizedStringLiteral"; //$NON-NLS-1$
312 /**
313      * Possible configurable option ID.
314      * @see #getDefaultOptions()
315      * @since 2.0
316      */
317     public static final String  JavaDoc COMPILER_PB_ASSERT_IDENTIFIER = PLUGIN_ID + ".compiler.problem.assertIdentifier"; //$NON-NLS-1$
318 /**
319      * Possible configurable option ID.
320      * @see #getDefaultOptions()
321      * @since 3.1
322      */
323     public static final String  JavaDoc COMPILER_PB_ENUM_IDENTIFIER = PLUGIN_ID + ".compiler.problem.enumIdentifier"; //$NON-NLS-1$
324 /**
325      * Possible configurable option ID.
326      * @see #getDefaultOptions()
327      * @since 2.1
328      */
329     public static final String  JavaDoc COMPILER_PB_STATIC_ACCESS_RECEIVER = PLUGIN_ID + ".compiler.problem.staticAccessReceiver"; //$NON-NLS-1$
330 /**
331      * Possible configurable option ID.
332      * @see #getDefaultOptions()
333      * @since 3.0
334      */
335     public static final String  JavaDoc COMPILER_PB_INDIRECT_STATIC_ACCESS = PLUGIN_ID + ".compiler.problem.indirectStaticAccess"; //$NON-NLS-1$
336 /**
337      * Possible configurable option ID.
338      * @see #getDefaultOptions()
339      * @since 2.1
340      */
341     public static final String  JavaDoc COMPILER_PB_NO_EFFECT_ASSIGNMENT = PLUGIN_ID + ".compiler.problem.noEffectAssignment"; //$NON-NLS-1$
342 /**
343      * Possible configurable option ID.
344      * @see #getDefaultOptions()
345      * @since 2.1
346      */
347     public static final String  JavaDoc COMPILER_PB_INCOMPATIBLE_NON_INHERITED_INTERFACE_METHOD = PLUGIN_ID + ".compiler.problem.incompatibleNonInheritedInterfaceMethod"; //$NON-NLS-1$
348 /**
349      * Possible configurable option ID.
350      * @see #getDefaultOptions()
351      * @since 2.1
352      */
353     public static final String  JavaDoc COMPILER_PB_UNUSED_PRIVATE_MEMBER = PLUGIN_ID + ".compiler.problem.unusedPrivateMember"; //$NON-NLS-1$
354 /**
355      * Possible configurable option ID.
356      * @see #getDefaultOptions()
357      * @since 3.0
358      */
359     public static final String  JavaDoc COMPILER_PB_LOCAL_VARIABLE_HIDING = PLUGIN_ID + ".compiler.problem.localVariableHiding"; //$NON-NLS-1$
360 /**
361      * Possible configurable option ID.
362      * @see #getDefaultOptions()
363      * @since 3.0
364      */
365     public static final String  JavaDoc COMPILER_PB_SPECIAL_PARAMETER_HIDING_FIELD = PLUGIN_ID + ".compiler.problem.specialParameterHidingField"; //$NON-NLS-1$
366 /**
367      * Possible configurable option ID.
368      * @see #getDefaultOptions()
369      * @since 3.0
370      */
371     public static final String  JavaDoc COMPILER_PB_FIELD_HIDING = PLUGIN_ID + ".compiler.problem.fieldHiding"; //$NON-NLS-1$
372 /**
373      * Possible configurable option ID.
374      * @see #getDefaultOptions()
375      * @since 3.1
376      */
377     public static final String  JavaDoc COMPILER_PB_TYPE_PARAMETER_HIDING = PLUGIN_ID + ".compiler.problem.typeParameterHiding"; //$NON-NLS-1$
378 /**
379      * Possible configurable option ID.
380      * @see #getDefaultOptions()
381      * @since 3.0
382      */
383     public static final String  JavaDoc COMPILER_PB_POSSIBLE_ACCIDENTAL_BOOLEAN_ASSIGNMENT = PLUGIN_ID + ".compiler.problem.possibleAccidentalBooleanAssignment"; //$NON-NLS-1$
384 /**
385      * Possible configurable option ID.
386      * @see #getDefaultOptions()
387      * @since 3.2
388      */
389     public static final String  JavaDoc COMPILER_PB_FALLTHROUGH_CASE = PLUGIN_ID + ".compiler.problem.fallthroughCase"; //$NON-NLS-1$
390 /**
391      * Possible configurable option ID.
392      * @see #getDefaultOptions()
393      * @since 3.0
394      */
395     public static final String  JavaDoc COMPILER_PB_EMPTY_STATEMENT = PLUGIN_ID + ".compiler.problem.emptyStatement"; //$NON-NLS-1$
396 /**
397      * Possible configurable option ID.
398      * @see #getDefaultOptions()
399      * @since 3.0
400      */
401     public static final String  JavaDoc COMPILER_PB_BOOLEAN_METHOD_THROWING_EXCEPTION = PLUGIN_ID + ".compiler.problem.booleanMethodThrowingException"; //$NON-NLS-1$
402 /**
403      * Possible configurable option ID.
404      * @see #getDefaultOptions()
405      * @since 3.0
406      */
407     public static final String  JavaDoc COMPILER_PB_UNNECESSARY_TYPE_CHECK = PLUGIN_ID + ".compiler.problem.unnecessaryTypeCheck"; //$NON-NLS-1$
408 /**
409      * Possible configurable option ID.
410      * @see #getDefaultOptions()
411      * @since 3.0
412      */
413     public static final String  JavaDoc COMPILER_PB_UNNECESSARY_ELSE = PLUGIN_ID + ".compiler.problem.unnecessaryElse"; //$NON-NLS-1$
414 /**
415      * Possible configurable option ID.
416      * @see #getDefaultOptions()
417      * @since 3.0
418      */
419     public static final String  JavaDoc COMPILER_PB_UNDOCUMENTED_EMPTY_BLOCK = PLUGIN_ID + ".compiler.problem.undocumentedEmptyBlock"; //$NON-NLS-1$
420 /**
421      * Possible configurable option ID.
422      * @see #getDefaultOptions()
423      * @since 3.0
424      */
425     public static final String  JavaDoc COMPILER_PB_FINALLY_BLOCK_NOT_COMPLETING = PLUGIN_ID + ".compiler.problem.finallyBlockNotCompletingNormally"; //$NON-NLS-1$
426 /**
427      * Possible configurable option ID.
428      * @see #getDefaultOptions()
429      * @since 3.0
430      */
431     public static final String  JavaDoc COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION = PLUGIN_ID + ".compiler.problem.unusedDeclaredThrownException"; //$NON-NLS-1$
432 /**
433      * Possible configurable option ID.
434      * @see #getDefaultOptions()
435      * @since 3.0
436      */
437     public static final String  JavaDoc COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION_WHEN_OVERRIDING = PLUGIN_ID + ".compiler.problem.unusedDeclaredThrownExceptionWhenOverriding"; //$NON-NLS-1$
438 /**
439      * Possible configurable option ID.
440      * @see #getDefaultOptions()
441      * @since 3.0
442      */
443     public static final String  JavaDoc COMPILER_PB_UNQUALIFIED_FIELD_ACCESS = PLUGIN_ID + ".compiler.problem.unqualifiedFieldAccess"; //$NON-NLS-1$
444 /**
445      * Possible configurable option ID.
446      * @see #getDefaultOptions()
447      * @deprecated - got renamed into {@link #COMPILER_PB_UNCHECKED_TYPE_OPERATION}
448      * @since 3.1
449      */
450     public static final String  JavaDoc COMPILER_PB_UNSAFE_TYPE_OPERATION = PLUGIN_ID + ".compiler.problem.uncheckedTypeOperation"; //$NON-NLS-1$
451 /**
452      * Possible configurable option ID.
453      * @see #getDefaultOptions()
454      * @since 3.1
455      */
456     public static final String  JavaDoc COMPILER_PB_UNCHECKED_TYPE_OPERATION = PLUGIN_ID + ".compiler.problem.uncheckedTypeOperation"; //$NON-NLS-1$
457 /**
458      * Possible configurable option ID.
459      * @see #getDefaultOptions()
460      * @since 3.2
461      */
462     public static final String  JavaDoc COMPILER_PB_RAW_TYPE_REFERENCE = PLUGIN_ID + ".compiler.problem.rawTypeReference"; //$NON-NLS-1$
463 /**
464      * Possible configurable option ID.
465      * @see #getDefaultOptions()
466      * @since 3.1
467      */
468     public static final String  JavaDoc COMPILER_PB_FINAL_PARAMETER_BOUND = PLUGIN_ID + ".compiler.problem.finalParameterBound"; //$NON-NLS-1$
469 /**
470      * Possible configurable option ID.
471      * @see #getDefaultOptions()
472      * @since 3.1
473      */
474     public static final String  JavaDoc COMPILER_PB_MISSING_SERIAL_VERSION = PLUGIN_ID + ".compiler.problem.missingSerialVersion"; //$NON-NLS-1$
475 /**
476      * Possible configurable option ID.
477      * @see #getDefaultOptions()
478      * @since 3.1
479      */
480     public static final String  JavaDoc COMPILER_PB_VARARGS_ARGUMENT_NEED_CAST = PLUGIN_ID + ".compiler.problem.varargsArgumentNeedCast"; //$NON-NLS-1$
481 /**
482      * Possible configurable option ID.
483      * @see #getDefaultOptions()
484      * @since 3.1
485      */
486     public static final String  JavaDoc COMPILER_PB_AUTOBOXING = PLUGIN_ID + ".compiler.problem.autoboxing"; //$NON-NLS-1$
487 /**
488      * Possible configurable option ID.
489      * @see #getDefaultOptions()
490      * @since 3.1
491      */
492     public static final String  JavaDoc COMPILER_PB_ANNOTATION_SUPER_INTERFACE = PLUGIN_ID + ".compiler.problem.annotationSuperInterface"; //$NON-NLS-1$
493 /**
494      * Possible configurable option ID.
495      * @see #getDefaultOptions()
496      * @since 3.1
497      */
498     public static final String  JavaDoc COMPILER_PB_MISSING_OVERRIDE_ANNOTATION = PLUGIN_ID + ".compiler.problem.missingOverrideAnnotation"; //$NON-NLS-1$
499 /**
500      * Possible configurable option ID.
501      * @see #getDefaultOptions()
502      * @since 3.1
503      */
504     public static final String  JavaDoc COMPILER_PB_MISSING_DEPRECATED_ANNOTATION = PLUGIN_ID + ".compiler.problem.missingDeprecatedAnnotation"; //$NON-NLS-1$
505 /**
506      * Possible configurable option ID.
507      * @see #getDefaultOptions()
508      * @since 3.1
509      */
510     public static final String  JavaDoc COMPILER_PB_INCOMPLETE_ENUM_SWITCH = PLUGIN_ID + ".compiler.problem.incompleteEnumSwitch"; //$NON-NLS-1$
511 /**
512      * Possible configurable option ID.
513      * @since 3.1
514      * @deprecated use {@link #COMPILER_PB_NULL_REFERENCE} instead
515      */
516     public static final String  JavaDoc COMPILER_PB_INCONSISTENT_NULL_CHECK = PLUGIN_ID + ".compiler.problem.inconsistentNullCheck"; //$NON-NLS-1$
517 /**
518      * Possible configurable option ID.
519      * @see #getDefaultOptions()
520      * @since 3.2
521      */
522     public static final String  JavaDoc COMPILER_PB_UNUSED_LABEL = PLUGIN_ID + ".compiler.problem.unusedLabel"; //$NON-NLS-1$
523 /**
524      * Possible configurable option ID.
525      * @see #getDefaultOptions()
526      * @since 3.0
527      */
528     public static final String  JavaDoc COMPILER_PB_INVALID_JAVADOC = PLUGIN_ID + ".compiler.problem.invalidJavadoc"; //$NON-NLS-1$
529 /**
530      * Possible configurable option ID.
531      * @see #getDefaultOptions()
532      * @since 3.0
533      */
534     public static final String  JavaDoc COMPILER_PB_INVALID_JAVADOC_TAGS = PLUGIN_ID + ".compiler.problem.invalidJavadocTags"; //$NON-NLS-1$
535 /**
536      * Possible configurable option ID.
537      * @see #getDefaultOptions()
538      * @since 3.1
539      */
540     public static final String  JavaDoc COMPILER_PB_INVALID_JAVADOC_TAGS__DEPRECATED_REF = PLUGIN_ID + ".compiler.problem.invalidJavadocTagsDeprecatedRef"; //$NON-NLS-1$
541 /**
542      * Possible configurable option ID.
543      * @see #getDefaultOptions()
544      * @since 3.1
545      */
546     public static final String  JavaDoc COMPILER_PB_INVALID_JAVADOC_TAGS__NOT_VISIBLE_REF = PLUGIN_ID + ".compiler.problem.invalidJavadocTagsNotVisibleRef"; //$NON-NLS-1$
547 /**
548      * Possible configurable option ID.
549      * @see #getDefaultOptions()
550      * @since 3.0
551      */
552     public static final String  JavaDoc COMPILER_PB_INVALID_JAVADOC_TAGS_VISIBILITY = PLUGIN_ID + ".compiler.problem.invalidJavadocTagsVisibility"; //$NON-NLS-1$
553 /**
554      * Possible configurable option ID.
555      * @see #getDefaultOptions()
556      * @since 3.0
557      */
558     public static final String  JavaDoc COMPILER_PB_MISSING_JAVADOC_TAGS = PLUGIN_ID + ".compiler.problem.missingJavadocTags"; //$NON-NLS-1$
559 /**
560      * Possible configurable option ID.
561      * @see #getDefaultOptions()
562      * @since 3.0
563      */
564     public static final String  JavaDoc COMPILER_PB_MISSING_JAVADOC_TAGS_VISIBILITY = PLUGIN_ID + ".compiler.problem.missingJavadocTagsVisibility"; //$NON-NLS-1$
565 /**
566      * Possible configurable option ID.
567      * @see #getDefaultOptions()
568      * @since 3.0
569      */
570     public static final String  JavaDoc COMPILER_PB_MISSING_JAVADOC_TAGS_OVERRIDING = PLUGIN_ID + ".compiler.problem.missingJavadocTagsOverriding"; //$NON-NLS-1$
571 /**
572      * Possible configurable option ID.
573      * @see #getDefaultOptions()
574      * @since 3.0
575      */
576     public static final String  JavaDoc COMPILER_PB_MISSING_JAVADOC_COMMENTS = PLUGIN_ID + ".compiler.problem.missingJavadocComments"; //$NON-NLS-1$
577 /**
578      * Possible configurable option ID.
579      * @see #getDefaultOptions()
580      * @since 3.0
581      */
582     public static final String  JavaDoc COMPILER_PB_MISSING_JAVADOC_COMMENTS_VISIBILITY = PLUGIN_ID + ".compiler.problem.missingJavadocCommentsVisibility"; //$NON-NLS-1$
583 /**
584      * Possible configurable option ID.
585      * @see #getDefaultOptions()
586      * @since 3.0
587      */
588     public static final String  JavaDoc COMPILER_PB_MISSING_JAVADOC_COMMENTS_OVERRIDING = PLUGIN_ID + ".compiler.problem.missingJavadocCommentsOverriding"; //$NON-NLS-1$
589 /**
590      * Possible configurable option ID.
591      * @see #getDefaultOptions()
592      * @since 2.1
593      */
594     public static final String  JavaDoc COMPILER_PB_CHAR_ARRAY_IN_STRING_CONCATENATION = PLUGIN_ID + ".compiler.problem.noImplicitStringConversion"; //$NON-NLS-1$
595 /**
596      * Possible configurable option ID.
597      * @see #getDefaultOptions()
598      * @since 2.0
599      */
600     public static final String  JavaDoc COMPILER_PB_MAX_PER_UNIT = PLUGIN_ID + ".compiler.maxProblemPerUnit"; //$NON-NLS-1$
601 /**
602      * Possible configurable option ID.
603      * @see #getDefaultOptions()
604      * @since 3.2
605      */
606     public static final String  JavaDoc COMPILER_PB_FATAL_OPTIONAL_ERROR = PLUGIN_ID + ".compiler.problem.fatalOptionalError"; //$NON-NLS-1$
607 /**
608      * Possible configurable option ID.
609      * @see #getDefaultOptions()
610      * @since 3.2
611      */
612     public static final String  JavaDoc COMPILER_PB_PARAMETER_ASSIGNMENT = PLUGIN_ID + ".compiler.problem.parameterAssignment"; //$NON-NLS-1$
613 /**
614      * Possible configurable option ID.
615      * @see #getDefaultOptions()
616      * @since 2.0
617      */
618     public static final String  JavaDoc COMPILER_SOURCE = PLUGIN_ID + ".compiler.source"; //$NON-NLS-1$
619 /**
620      * Possible configurable option ID.
621      * @see #getDefaultOptions()
622      * @since 2.0
623      */
624     public static final String  JavaDoc COMPILER_COMPLIANCE = PLUGIN_ID + ".compiler.compliance"; //$NON-NLS-1$
625 /**
626      * Possible configurable option ID.
627      * @see #getDefaultOptions()
628      * @since 2.1
629      */
630     public static final String  JavaDoc COMPILER_TASK_PRIORITIES = PLUGIN_ID + ".compiler.taskPriorities"; //$NON-NLS-1$
631 /**
632      * Possible configurable option value for COMPILER_TASK_PRIORITIES.
633      * @see #getDefaultOptions()
634      * @since 2.1
635      */
636     public static final String  JavaDoc COMPILER_TASK_PRIORITY_HIGH = "HIGH"; //$NON-NLS-1$
637 /**
638      * Possible configurable option value for COMPILER_TASK_PRIORITIES.
639      * @see #getDefaultOptions()
640      * @since 2.1
641      */
642     public static final String  JavaDoc COMPILER_TASK_PRIORITY_LOW = "LOW"; //$NON-NLS-1$
643 /**
644      * Possible configurable option value for COMPILER_TASK_PRIORITIES.
645      * @see #getDefaultOptions()
646      * @since 2.1
647      */
648     public static final String  JavaDoc COMPILER_TASK_PRIORITY_NORMAL = "NORMAL"; //$NON-NLS-1$
649 /**
650      * Possible configurable option ID.
651      * @see #getDefaultOptions()
652      * @since 2.1
653      */
654     public static final String  JavaDoc COMPILER_TASK_TAGS = PLUGIN_ID + ".compiler.taskTags"; //$NON-NLS-1$
655 /**
656      * Possible configurable option ID.
657      * @see #getDefaultOptions()
658      * @since 3.0
659      */
660     public static final String  JavaDoc COMPILER_TASK_CASE_SENSITIVE = PLUGIN_ID + ".compiler.taskCaseSensitive"; //$NON-NLS-1$
661 /**
662      * Possible configurable option ID.
663      * @see #getDefaultOptions()
664      * @since 3.1
665      */
666     public static final String  JavaDoc COMPILER_PB_FORBIDDEN_REFERENCE = PLUGIN_ID + ".compiler.problem.forbiddenReference"; //$NON-NLS-1$
667 /**
668      * Possible configurable option ID.
669      * @see #getDefaultOptions()
670      * @since 3.1
671      */
672     public static final String  JavaDoc COMPILER_PB_DISCOURAGED_REFERENCE = PLUGIN_ID + ".compiler.problem.discouragedReference"; //$NON-NLS-1$
673 /**
674      * Possible configurable option ID.
675      * @see #getDefaultOptions()
676      * @since 3.1
677      */
678     public static final String  JavaDoc COMPILER_PB_SUPPRESS_WARNINGS = PLUGIN_ID + ".compiler.problem.suppressWarnings"; //$NON-NLS-1$
679 /**
680      * Possible configurable option ID.
681      * @see #getDefaultOptions()
682      * @since 3.1
683      */
684     public static final String  JavaDoc COMPILER_PB_UNHANDLED_WARNING_TOKEN = PLUGIN_ID + ".compiler.problem.unhandledWarningToken"; //$NON-NLS-1$
685 /**
686      * Possible configurable option ID.
687      * @see #getDefaultOptions()
688      * @since 3.2
689      */
690     public static final String  JavaDoc COMPILER_PB_NULL_REFERENCE = PLUGIN_ID + ".compiler.problem.nullReference"; //$NON-NLS-1$
691 /**
692      * Possible configurable option ID.
693      * @see #getDefaultOptions()
694      * @since 3.3
695      */
696     public static final String  JavaDoc COMPILER_PB_POTENTIAL_NULL_REFERENCE = PLUGIN_ID + ".compiler.problem.potentialNullReference"; //$NON-NLS-1$
697 /**
698      * Possible configurable option ID.
699      * @see #getDefaultOptions()
700      * @since 3.3
701      */
702     public static final String  JavaDoc COMPILER_PB_REDUNDANT_NULL_CHECK = PLUGIN_ID + ".compiler.problem.redundantNullCheck"; //$NON-NLS-1$
703 /**
704      * Possible configurable option ID.
705      * @see #getDefaultOptions()
706      * @since 3.3
707      */
708     public static final String  JavaDoc COMPILER_PB_OVERRIDING_METHOD_WITHOUT_SUPER_INVOCATION = PLUGIN_ID + ".compiler.problem.overridingMethodWithoutSuperInvocation"; //$NON-NLS-1$
709 /**
710      * Possible configurable option ID.
711      * @see #getDefaultOptions()
712      */
713     public static final String  JavaDoc CORE_JAVA_BUILD_ORDER = PLUGIN_ID + ".computeJavaBuildOrder"; //$NON-NLS-1$
714 /**
715      * Possible configurable option ID.
716      * @see #getDefaultOptions()
717      * @since 2.0
718      */
719     public static final String  JavaDoc CORE_JAVA_BUILD_RESOURCE_COPY_FILTER = PLUGIN_ID + ".builder.resourceCopyExclusionFilter"; //$NON-NLS-1$
720 /**
721      * Possible configurable option ID.
722      * @see #getDefaultOptions()
723      * @since 2.1
724      */
725     public static final String  JavaDoc CORE_JAVA_BUILD_DUPLICATE_RESOURCE = PLUGIN_ID + ".builder.duplicateResourceTask"; //$NON-NLS-1$
726 /**
727      * Possible configurable option ID.
728      * @see #getDefaultOptions()
729      * @since 2.1
730      */
731     public static final String  JavaDoc CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER = PLUGIN_ID + ".builder.cleanOutputFolder"; //$NON-NLS-1$
732 /**
733      * Possible configurable option ID.
734      * @see #getDefaultOptions()
735      * @since 3.2
736      */
737     public static final String  JavaDoc CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER = PLUGIN_ID + ".builder.recreateModifiedClassFileInOutputFolder"; //$NON-NLS-1$
738 /**
739      * Possible configurable option ID.
740      * @see #getDefaultOptions()
741      * @since 2.1
742      */
743     public static final String  JavaDoc CORE_INCOMPLETE_CLASSPATH = PLUGIN_ID + ".incompleteClasspath"; //$NON-NLS-1$
744 /**
745      * Possible configurable option ID.
746      * @see #getDefaultOptions()
747      * @since 2.1
748      */
749     public static final String  JavaDoc CORE_CIRCULAR_CLASSPATH = PLUGIN_ID + ".circularClasspath"; //$NON-NLS-1$
750 /**
751      * Possible configurable option ID.
752      * @see #getDefaultOptions()
753      * @since 3.0
754      */
755     public static final String  JavaDoc CORE_INCOMPATIBLE_JDK_LEVEL = PLUGIN_ID + ".incompatibleJDKLevel"; //$NON-NLS-1$
756 /**
757      * Possible configurable option ID.
758      * @see #getDefaultOptions()
759      * @since 2.0
760      */
761     public static final String  JavaDoc CORE_JAVA_BUILD_INVALID_CLASSPATH = PLUGIN_ID + ".builder.invalidClasspath"; //$NON-NLS-1$
762 /**
763      * Possible configurable option ID.
764      * @see #getDefaultOptions()
765      * @since 2.0
766      */
767     public static final String  JavaDoc CORE_ENCODING = PLUGIN_ID + ".encoding"; //$NON-NLS-1$
768 /**
769      * Possible configurable option ID.
770      * @see #getDefaultOptions()
771      * @since 2.1
772      */
773     public static final String  JavaDoc CORE_ENABLE_CLASSPATH_EXCLUSION_PATTERNS = PLUGIN_ID + ".classpath.exclusionPatterns"; //$NON-NLS-1$
774 /**
775      * Possible configurable option ID.
776      * @see #getDefaultOptions()
777      * @since 2.1
778      */
779     public static final String  JavaDoc CORE_ENABLE_CLASSPATH_MULTIPLE_OUTPUT_LOCATIONS = PLUGIN_ID + ".classpath.multipleOutputLocations"; //$NON-NLS-1$
780 /**
781      * Default task tag
782      * @deprecated Use {@link #DEFAULT_TASK_TAGS} instead
783      * @since 2.1
784      */
785     public static final String  JavaDoc DEFAULT_TASK_TAG = "TODO"; //$NON-NLS-1$
786 /**
787      * Default task priority
788      * @deprecated Use {@link #DEFAULT_TASK_PRIORITIES} instead
789      * @since 2.1
790      */
791     public static final String  JavaDoc DEFAULT_TASK_PRIORITY = "NORMAL"; //$NON-NLS-1$
792 /**
793      * Default task tag
794      * @since 3.0
795      */
796     public static final String  JavaDoc DEFAULT_TASK_TAGS = "TODO,FIXME,XXX"; //$NON-NLS-1$
797 /**
798      * Default task priority
799      * @since 3.0
800      */
801     public static final String  JavaDoc DEFAULT_TASK_PRIORITIES = "NORMAL,HIGH,NORMAL"; //$NON-NLS-1$
802 /**
803      * Possible configurable option ID.
804      * @see #getDefaultOptions()
805      * @since 2.0
806      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_BRACE_POSITION_FOR_ANONYMOUS_TYPE_DECLARATION},
807      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_BRACE_POSITION_FOR_BLOCK} ,
808      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_BRACE_POSITION_FOR_CONSTRUCTOR_DECLARATION},
809      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_BRACE_POSITION_FOR_METHOD_DECLARATION},
810      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_BRACE_POSITION_FOR_SWITCH},
811      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_BRACE_POSITION_FOR_TYPE_DECLARATION} instead
812      */
813     public static final String  JavaDoc FORMATTER_NEWLINE_OPENING_BRACE = PLUGIN_ID + ".formatter.newline.openingBrace"; //$NON-NLS-1$
814 /**
815      * Possible configurable option ID.
816      * @see #getDefaultOptions()
817      * @since 2.0
818      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_INSERT_NEW_LINE_BEFORE_CATCH_IN_TRY_STATEMENT},
819      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_INSERT_NEW_LINE_BEFORE_ELSE_IN_IF_STATEMENT},
820      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_INSERT_NEW_LINE_BEFORE_FINALLY_IN_TRY_STATEMENT},
821      * {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_INSERT_NEW_LINE_BEFORE_WHILE_IN_DO_STATEMENT} instead.
822      */
823     public static final String  JavaDoc FORMATTER_NEWLINE_CONTROL = PLUGIN_ID + ".formatter.newline.controlStatement"; //$NON-NLS-1$
824 /**
825      * Possible configurable option ID.
826      * @see #getDefaultOptions()
827      * @since 2.0
828      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_COMPACT_ELSE_IF} instead
829      */
830     public static final String  JavaDoc FORMATTER_NEWLINE_ELSE_IF = PLUGIN_ID + ".formatter.newline.elseIf"; //$NON-NLS-1$
831 /**
832      * Possible configurable option ID.
833      * @see #getDefaultOptions()
834      * @since 2.0
835      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_INSERT_NEW_LINE_IN_EMPTY_BLOCK} instead
836      */
837     public static final String  JavaDoc FORMATTER_NEWLINE_EMPTY_BLOCK = PLUGIN_ID + ".formatter.newline.emptyBlock"; //$NON-NLS-1$
838 /**
839      * Possible configurable option ID.
840      * @see #getDefaultOptions()
841      * @since 2.0
842      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE} instead
843      */
844     public static final String  JavaDoc FORMATTER_CLEAR_BLANK_LINES = PLUGIN_ID + ".formatter.newline.clearAll"; //$NON-NLS-1$
845 /**
846      * Possible configurable option ID.
847      * @see #getDefaultOptions()
848      * @since 2.0
849      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_LINE_SPLIT} instead
850      */
851     public static final String  JavaDoc FORMATTER_LINE_SPLIT = PLUGIN_ID + ".formatter.lineSplit"; //$NON-NLS-1$
852 /**
853      * Possible configurable option ID.
854      * @see #getDefaultOptions()
855      * @since 2.0
856      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR} instead
857      */
858     public static final String  JavaDoc FORMATTER_COMPACT_ASSIGNMENT = PLUGIN_ID + ".formatter.style.assignment"; //$NON-NLS-1$
859 /**
860      * Possible configurable option ID.
861      * @see #getDefaultOptions()
862      * @since 2.0
863      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_TAB_CHAR}} instead
864      */
865     public static final String  JavaDoc FORMATTER_TAB_CHAR = PLUGIN_ID + ".formatter.tabulation.char"; //$NON-NLS-1$
866 /**
867      * Possible configurable option ID.
868      * @see #getDefaultOptions()
869      * @since 2.0
870      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_TAB_SIZE} instead
871      */
872     public static final String  JavaDoc FORMATTER_TAB_SIZE = PLUGIN_ID + ".formatter.tabulation.size"; //$NON-NLS-1$
873 /**
874      * Possible configurable option ID
875      * @see #getDefaultOptions()
876      * @since 2.1
877      * @deprecated Use {@link org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_INSERT_SPACE_AFTER_CLOSING_PAREN_IN_CAST} instead
878      */
879     public static final String  JavaDoc FORMATTER_SPACE_CASTEXPRESSION = PLUGIN_ID + ".formatter.space.castexpression"; //$NON-NLS-1$
880 /**
881      * Possible configurable option ID.
882      * @see #getDefaultOptions()
883      * @since 2.0
884      */
885     public static final String  JavaDoc CODEASSIST_VISIBILITY_CHECK = PLUGIN_ID + ".codeComplete.visibilityCheck"; //$NON-NLS-1$
886 /**
887      * Possible configurable option ID.
888      * @see #getDefaultOptions()
889      * @since 3.2
890      */
891     public static final String  JavaDoc CODEASSIST_DEPRECATION_CHECK = PLUGIN_ID + ".codeComplete.deprecationCheck"; //$NON-NLS-1$
892 /**
893      * Possible configurable option ID.
894      * @see #getDefaultOptions()
895      * @since 3.2
896      */
897     public static final String  JavaDoc CODEASSIST_CAMEL_CASE_MATCH = PLUGIN_ID + ".codeComplete.camelCaseMatch"; //$NON-NLS-1$
898 /**
899      * Possible configurable option ID.
900      * @see #getDefaultOptions()
901      * @since 2.0
902      */
903     public static final String  JavaDoc CODEASSIST_IMPLICIT_QUALIFICATION = PLUGIN_ID + ".codeComplete.forceImplicitQualification"; //$NON-NLS-1$
904 /**
905      * Possible configurable option ID.
906      * @see #getDefaultOptions()
907      * @since 2.1
908      */
909     public static final String  JavaDoc CODEASSIST_FIELD_PREFIXES = PLUGIN_ID + ".codeComplete.fieldPrefixes"; //$NON-NLS-1$
910 /**
911      * Possible configurable option ID.
912      * @see #getDefaultOptions()
913      * @since 2.1
914      */
915     public static final String  JavaDoc CODEASSIST_STATIC_FIELD_PREFIXES = PLUGIN_ID + ".codeComplete.staticFieldPrefixes"; //$NON-NLS-1$
916 /**
917      * Possible configurable option ID.
918      * @see #getDefaultOptions()
919      * @since 2.1
920      */
921     public static final String  JavaDoc CODEASSIST_LOCAL_PREFIXES = PLUGIN_ID + ".codeComplete.localPrefixes"; //$NON-NLS-1$
922 /**
923      * Possible configurable option ID.
924      * @see #getDefaultOptions()
925      * @since 2.1
926      */
927     public static final String  JavaDoc CODEASSIST_ARGUMENT_PREFIXES = PLUGIN_ID + ".codeComplete.argumentPrefixes"; //$NON-NLS-1$
928 /**
929      * Possible configurable option ID.
930      * @see #getDefaultOptions()
931      * @since 2.1
932      */
933     public static final String  JavaDoc CODEASSIST_FIELD_SUFFIXES = PLUGIN_ID + ".codeComplete.fieldSuffixes"; //$NON-NLS-1$
934 /**
935      * Possible configurable option ID.
936      * @see #getDefaultOptions()
937      * @since 2.1
938      */
939     public static final String  JavaDoc CODEASSIST_STATIC_FIELD_SUFFIXES = PLUGIN_ID + ".codeComplete.staticFieldSuffixes"; //$NON-NLS-1$
940 /**
941      * Possible configurable option ID.
942      * @see #getDefaultOptions()
943      * @since 2.1
944      */
945     public static final String  JavaDoc CODEASSIST_LOCAL_SUFFIXES = PLUGIN_ID + ".codeComplete.localSuffixes"; //$NON-NLS-1$
946 /**
947      * Possible configurable option ID.
948      * @see #getDefaultOptions()
949      * @since 2.1
950      */
951     public static final String  JavaDoc CODEASSIST_ARGUMENT_SUFFIXES = PLUGIN_ID + ".codeComplete.argumentSuffixes"; //$NON-NLS-1$
952 /**
953      * Possible configurable option ID.
954      * @see #getDefaultOptions()
955      * @since 3.1
956      */
957     public static final String  JavaDoc CODEASSIST_FORBIDDEN_REFERENCE_CHECK= PLUGIN_ID + ".codeComplete.forbiddenReferenceCheck"; //$NON-NLS-1$
958 /**
959      * Possible configurable option ID.
960      * @see #getDefaultOptions()
961      * @since 3.1
962      */
963     public static final String  JavaDoc CODEASSIST_DISCOURAGED_REFERENCE_CHECK= PLUGIN_ID + ".codeComplete.discouragedReferenceCheck"; //$NON-NLS-1$
964 /**
965      * Possible configurable option ID.
966      * @see #getDefaultOptions()
967      * @since 3.3
968      */
969     public static final String  JavaDoc CODEASSIST_SUGGEST_STATIC_IMPORTS= PLUGIN_ID + ".codeComplete.suggestStaticImports"; //$NON-NLS-1$
970 /**
971      * Possible configurable option ID.
972      * @see #getDefaultOptions()
973      * @since 3.2
974      */
975     public static final String  JavaDoc TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC = PLUGIN_ID + ".timeoutForParameterNameFromAttachedJavadoc"; //$NON-NLS-1$
976 
977     /**
978      * Possible configurable option value.
979      * @see #getDefaultOptions()
980      */
981     public static final String  JavaDoc GENERATE = "generate"; //$NON-NLS-1$
982 /**
983      * Possible configurable option value.
984      * @see #getDefaultOptions()
985      */
986     public static final String  JavaDoc DO_NOT_GENERATE = "do not generate"; //$NON-NLS-1$
987 /**
988      * Possible configurable option value.
989      * @see #getDefaultOptions()
990      */
991     public static final String  JavaDoc PRESERVE = "preserve"; //$NON-NLS-1$
992 /**
993      * Possible configurable option value.
994      * @see #getDefaultOptions()
995      */
996     public static final String  JavaDoc OPTIMIZE_OUT = "optimize out"; //$NON-NLS-1$
997 /**
998      * Possible configurable option value.
999      * @see #getDefaultOptions()
1000     */
1001    public static final String  JavaDoc VERSION_1_1 = "1.1"; //$NON-NLS-1$
1002 /**
1003     * Possible configurable option value.
1004     * @see #getDefaultOptions()
1005     */
1006    public static final String  JavaDoc VERSION_1_2 = "1.2"; //$NON-NLS-1$
1007 /**
1008     * Possible configurable option value.
1009     * @see #getDefaultOptions()
1010     * @since 2.0
1011     */
1012    public static final String  JavaDoc VERSION_1_3 = "1.3"; //$NON-NLS-1$
1013 /**
1014     * Possible configurable option value.
1015     * @see #getDefaultOptions()
1016     * @since 2.0
1017     */
1018    public static final String  JavaDoc VERSION_1_4 = "1.4"; //$NON-NLS-1$
1019 /**
1020     * Possible configurable option value.
1021     * @see #getDefaultOptions()
1022     * @since 3.0
1023     */
1024    public static final String  JavaDoc VERSION_1_5 = "1.5"; //$NON-NLS-1$
1025 /**
1026     * Possible configurable option value.
1027     * @see #getDefaultOptions()
1028     * @since 3.2
1029     */
1030    public static final String  JavaDoc VERSION_1_6 = "1.6"; //$NON-NLS-1$
1031 /**
1032     * Possible configurable option value.
1033     * @see #getDefaultOptions()
1034     * @since 3.3
1035     */
1036    public static final String  JavaDoc VERSION_1_7 = "1.7"; //$NON-NLS-1$
1037 /**
1038     * Possible configurable option value.
1039     * @see #getDefaultOptions()
1040     * @since 2.0
1041     */
1042    public static final String  JavaDoc ABORT = "abort"; //$NON-NLS-1$
1043 /**
1044     * Possible configurable option value.
1045     * @see #getDefaultOptions()
1046     */
1047    public static final String  JavaDoc ERROR = "error"; //$NON-NLS-1$
1048 /**
1049     * Possible configurable option value.
1050     * @see #getDefaultOptions()
1051     */
1052    public static final String  JavaDoc WARNING = "warning"; //$NON-NLS-1$
1053 /**
1054     * Possible configurable option value.
1055     * @see #getDefaultOptions()
1056     */
1057    public static final String  JavaDoc IGNORE = "ignore"; //$NON-NLS-1$
1058 /**
1059     * Possible configurable option value.
1060     * @see #getDefaultOptions()
1061     */
1062    public static final String  JavaDoc COMPUTE = "compute"; //$NON-NLS-1$
1063 /**
1064     * Possible configurable option value.
1065     * @see #getDefaultOptions()
1066     * @since 2.0
1067     */
1068    public static final String  JavaDoc INSERT = "insert"; //$NON-NLS-1$
1069 /**
1070     * Possible configurable option value.
1071     * @see #getDefaultOptions()
1072     * @since 2.0
1073     */
1074    public static final String  JavaDoc DO_NOT_INSERT = "do not insert"; //$NON-NLS-1$
1075 /**
1076     * Possible configurable option value.
1077     * @see #getDefaultOptions()
1078     * @since 2.0
1079     */
1080    public static final String  JavaDoc PRESERVE_ONE = "preserve one"; //$NON-NLS-1$
1081 /**
1082     * Possible configurable option value.
1083     * @see #getDefaultOptions()
1084     * @since 2.0
1085     */
1086    public static final String  JavaDoc CLEAR_ALL = "clear all"; //$NON-NLS-1$
1087 /**
1088     * Possible configurable option value.
1089     * @see #getDefaultOptions()
1090     * @since 2.0
1091     */
1092    public static final String  JavaDoc NORMAL = "normal"; //$NON-NLS-1$
1093 /**
1094     * Possible configurable option value.
1095     * @see #getDefaultOptions()
1096     * @since 2.0
1097     */
1098    public static final String  JavaDoc COMPACT = "compact"; //$NON-NLS-1$
1099 /**
1100     * Possible configurable option value.
1101     * @see #getDefaultOptions()
1102     * @since 2.0
1103     */
1104    public static final String  JavaDoc TAB = "tab"; //$NON-NLS-1$
1105 /**
1106     * Possible configurable option value.
1107     * @see #getDefaultOptions()
1108     * @since 2.0
1109     */
1110    public static final String  JavaDoc SPACE = "space"; //$NON-NLS-1$
1111 /**
1112     * Possible configurable option value.
1113     * @see #getDefaultOptions()
1114     * @since 2.0
1115     */
1116    public static final String  JavaDoc ENABLED = "enabled"; //$NON-NLS-1$
1117 /**
1118     * Possible configurable option value.
1119     * @see #getDefaultOptions()
1120     * @since 2.0
1121     */
1122    public static final String  JavaDoc DISABLED = "disabled"; //$NON-NLS-1$
1123 /**
1124     * Possible configurable option value.
1125     * @see #getDefaultOptions()
1126     * @since 2.1
1127     */
1128    public static final String  JavaDoc CLEAN = "clean"; //$NON-NLS-1$
1129 /**
1130     * Possible configurable option value.
1131     * @see #getDefaultOptions()
1132     * @since 3.0
1133     */
1134    public static final String  JavaDoc PUBLIC = "public"; //$NON-NLS-1$
1135 /**
1136     * Possible configurable option value.
1137     * @see #getDefaultOptions()
1138     * @since 3.0
1139     */
1140    public static final String  JavaDoc PROTECTED = "protected"; //$NON-NLS-1$
1141 /**
1142     * Possible configurable option value.
1143     * @see #getDefaultOptions()
1144     * @since 3.0
1145     */
1146    public static final String  JavaDoc DEFAULT = "default"; //$NON-NLS-1$
1147 /**
1148     * Possible configurable option value.
1149     * @see #getDefaultOptions()
1150     * @since 3.0
1151     */
1152    public static final String  JavaDoc PRIVATE = "private"; //$NON-NLS-1$
1153 /**
1154     * Possible configurable option value.
1155     * @see #getDefaultOptions()
1156     * @since 3.1
1157     */
1158    public static final String  JavaDoc NEVER = "never"; //$NON-NLS-1$
1159
1160    /**
1161     * Value of the content-type for Java source files. Use this value to retrieve the Java content type
1162     * from the content type manager, and to add new Java-like extensions to this content type.
1163     *
1164     * @see org.eclipse.core.runtime.content.IContentTypeManager#getContentType(String)
1165     * @see #getJavaLikeExtensions()
1166     * @since 3.2
1167     */
1168    public static final String  JavaDoc JAVA_SOURCE_CONTENT_TYPE = JavaCore.PLUGIN_ID+".javaSource" ; //$NON-NLS-1$
1169
1170    /**
1171     * Creates the Java core plug-in.
1172     * <p>
1173     * The plug-in instance is created automatically by the
1174     * Eclipse platform. Clients must not call.
1175     * </p>
1176     *
1177     * @since 3.0
1178     */
1179    public JavaCore() {
1180        super();
1181        JAVA_CORE_PLUGIN = this;
1182    }
1183
1184    /**
1185     * Adds the given listener for changes to Java elements.
1186     * Has no effect if an identical listener is already registered.
1187     *
1188     * This listener will only be notified during the POST_CHANGE resource change notification
1189     * and any reconcile operation (POST_RECONCILE).
1190     * For finer control of the notification, use <code>addElementChangedListener(IElementChangedListener,int)</code>,
1191     * which allows to specify a different eventMask.
1192     *
1193     * @param listener the listener
1194     * @see ElementChangedEvent
1195     */
1196    public static void addElementChangedListener(IElementChangedListener listener) {
1197        addElementChangedListener(listener, ElementChangedEvent.POST_CHANGE | ElementChangedEvent.POST_RECONCILE);
1198    }
1199
1200    /**
1201     * Adds the given listener for changes to Java elements.
1202     * Has no effect if an identical listener is already registered.
1203     * After completion of this method, the given listener will be registered for exactly
1204     * the specified events. If they were previously registered for other events, they
1205     * will be deregistered.
1206     * <p>
1207     * Once registered, a listener starts receiving notification of changes to
1208     * java elements in the model. The listener continues to receive
1209     * notifications until it is replaced or removed.
1210     * </p>
1211     * <p>
1212     * Listeners can listen for several types of event as defined in <code>ElementChangeEvent</code>.
1213     * Clients are free to register for any number of event types however if they register
1214     * for more than one, it is their responsibility to ensure they correctly handle the
1215     * case where the same java element change shows up in multiple notifications.
1216     * Clients are guaranteed to receive only the events for which they are registered.
1217     * </p>
1218     *
1219     * @param listener the listener
1220     * @param eventMask the bit-wise OR of all event types of interest to the listener
1221     * @see IElementChangedListener
1222     * @see ElementChangedEvent
1223     * @see #removeElementChangedListener(IElementChangedListener)
1224     * @since 2.0
1225     */
1226    public static void addElementChangedListener(IElementChangedListener listener, int eventMask) {
1227        JavaModelManager.getJavaModelManager().deltaState.addElementChangedListener(listener, eventMask);
1228    }
1229
1230    /**
1231     * Configures the given marker attribute map for the given Java element.
1232     * Used for markers, which denote a Java element rather than a resource.
1233     *
1234     * @param attributes the mutable marker attribute map (key type: <code>String</code>,
1235     * value type: <code>String</code>)
1236     * @param element the Java element for which the marker needs to be configured
1237     */
1238    public static void addJavaElementMarkerAttributes(
1239        Map  JavaDoc attributes,
1240        IJavaElement element) {
1241        if (element instanceof IMember)
1242            element = ((IMember) element).getClassFile();
1243        if (attributes != null && element != null)
1244            attributes.put(ATT_HANDLE_ID, element.getHandleIdentifier());
1245    }
1246
1247    private static void addNonJavaResources(Object  JavaDoc[] nonJavaResources,
1248            IContainer container,
1249            int rootPathSegmentCounts,
1250            ArrayList  JavaDoc collector) {
1251        for (int i = 0, max = nonJavaResources.length; i < max; i++) {
1252            Object  JavaDoc nonJavaResource = nonJavaResources[i];
1253            if (nonJavaResource instanceof IFile) {
1254                IFile file = (IFile) nonJavaResource;
1255                IPath path = file.getFullPath().removeFirstSegments(rootPathSegmentCounts);
1256                IResource member = container.findMember(path);
1257                if (member != null && member.exists()) {
1258                    collector.add(member);
1259                }
1260            } else if (nonJavaResource instanceof IFolder) {
1261                IFolder folder = (IFolder) nonJavaResource;
1262                IResource[] members = null;
1263                try {
1264                    members = folder.members();
1265                } catch (CoreException e) {
1266                    // ignore
1267 }
1268                if (members != null) {
1269                    addNonJavaResources(members, container, rootPathSegmentCounts, collector);
1270                }
1271            }
1272        }
1273    }
1274
1275    /**
1276     * Adds the given listener for POST_CHANGE resource change events to the Java core.
1277     * The listener is guaranteed to be notified of the POST_CHANGE resource change event before
1278     * the Java core starts processing the resource change event itself.
1279     * <p>
1280     * Has no effect if an identical listener is already registered.
1281     * </p>
1282     *
1283     * @param listener the listener
1284     * @see #removePreProcessingResourceChangedListener(IResourceChangeListener)
1285     * @since 3.0
1286     * @deprecated use addPreProcessingResourceChangedListener(listener, IResourceChangeEvent.POST_CHANGE) instead
1287     */
1288    public static void addPreProcessingResourceChangedListener(IResourceChangeListener listener) {
1289        addPreProcessingResourceChangedListener(listener, IResourceChangeEvent.POST_CHANGE);
1290    }
1291
1292    /**
1293     * Adds the given listener for resource change events of the given types to the Java core.
1294     * The listener is guaranteed to be notified of the resource change event before
1295     * the Java core starts processing the resource change event itself.
1296     * <p>
1297     * If an identical listener is already registered, the given event types are added to the event types
1298     * of interest to the listener.
1299     * </p>
1300     * <p>
1301     * Supported event types are:
1302     * <ul>
1303     * <li>{@link IResourceChangeEvent#PRE_BUILD}</li>
1304     * <li>{@link IResourceChangeEvent#POST_BUILD}</li>
1305     * <li>{@link IResourceChangeEvent#POST_CHANGE}</li>
1306     * <li>{@link IResourceChangeEvent#PRE_DELETE}</li>
1307     * <li>{@link IResourceChangeEvent#PRE_CLOSE}</li>
1308     * </ul>
1309     * This list may increase in the future.
1310     * </p>
1311     *
1312     * @param listener the listener
1313     * @param eventMask the bit-wise OR of all event types of interest to the
1314     * listener
1315     * @see #removePreProcessingResourceChangedListener(IResourceChangeListener)
1316     * @see IResourceChangeEvent
1317     * @since 3.2
1318     */
1319    public static void addPreProcessingResourceChangedListener(IResourceChangeListener listener, int eventMask) {
1320        JavaModelManager.getJavaModelManager().deltaState.addPreResourceChangedListener(listener, eventMask);
1321    }
1322
1323    /**
1324     * Configures the given marker for the given Java element.
1325     * Used for markers, which denote a Java element rather than a resource.
1326     *
1327     * @param marker the marker to be configured
1328     * @param element the Java element for which the marker needs to be configured
1329     * @exception CoreException if the <code>IMarker.setAttribute</code> on the marker fails
1330     */
1331    public void configureJavaElementMarker(IMarker marker, IJavaElement element)
1332        throws CoreException {
1333        if (element instanceof IMember)
1334            element = ((IMember) element).getClassFile();
1335        if (marker != null && element != null)
1336            marker.setAttribute(ATT_HANDLE_ID, element.getHandleIdentifier());
1337    }
1338
1339    /**
1340     * Returns the Java model element corresponding to the given handle identifier
1341     * generated by <code>IJavaElement.getHandleIdentifier()</code>, or
1342     * <code>null</code> if unable to create the associated element.
1343     *
1344     * @param handleIdentifier the given handle identifier
1345     * @return the Java element corresponding to the handle identifier
1346     */
1347    public static IJavaElement create(String  JavaDoc handleIdentifier) {
1348        return create(handleIdentifier, DefaultWorkingCopyOwner.PRIMARY);
1349    }
1350
1351    /**
1352     * Returns the Java model element corresponding to the given handle identifier
1353     * generated by <code>IJavaElement.getHandleIdentifier()</code>, or
1354     * <code>null</code> if unable to create the associated element.
1355     * If the returned Java element is an <code>ICompilationUnit</code>, its owner
1356     * is the given owner if such a working copy exists, otherwise the compilation unit
1357     * is a primary compilation unit.
1358     *
1359     * @param handleIdentifier the given handle identifier
1360     * @param owner the owner of the returned compilation unit, ignored if the returned
1361     * element is not a compilation unit
1362     * @return the Java element corresponding to the handle identifier
1363     * @since 3.0
1364     */
1365    public static IJavaElement create(String  JavaDoc handleIdentifier, WorkingCopyOwner owner) {
1366        if (handleIdentifier == null) {
1367            return null;
1368        }
1369        MementoTokenizer memento = new MementoTokenizer(handleIdentifier);
1370        JavaModel model = JavaModelManager.getJavaModelManager().getJavaModel();
1371        return model.getHandleFromMemento(memento, owner);
1372    }
1373
1374    /**
1375     * Returns the Java element corresponding to the given file, or
1376     * <code>null</code> if unable to associate the given file
1377     * with a Java element.
1378     *
1379     * <p>The file must be one of:<ul>
1380     * <li>a file with one of the {@link JavaCore#getJavaLikeExtensions()
1381     * Java-like extensions} - the element returned is the corresponding <code>ICompilationUnit</code></li>
1382     * <li>a <code>.class</code> file - the element returned is the corresponding <code>IClassFile</code></li>
1383     * <li>a <code>.jar</code> file - the element returned is the corresponding <code>IPackageFragmentRoot</code></li>
1384     * </ul>
1385     * <p>
1386     * Creating a Java element has the side effect of creating and opening all of the
1387     * element's parents if they are not yet open.
1388     *
1389     * @param file the given file
1390     * @return the Java element corresponding to the given file, or
1391     * <code>null</code> if unable to associate the given file
1392     * with a Java element
1393     */
1394    public static IJavaElement create(IFile file) {
1395        return JavaModelManager.create(file, null/*unknown java project*/);
1396    }
1397    /**
1398     * Returns the package fragment or package fragment root corresponding to the given folder, or
1399     * <code>null</code> if unable to associate the given folder with a Java element.
1400     * <p>
1401     * Note that a package fragment root is returned rather than a default package.
1402     * <p>
1403     * Creating a Java element has the side effect of creating and opening all of the
1404     * element's parents if they are not yet open.
1405     *
1406     * @param folder the given folder
1407     * @return the package fragment or package fragment root corresponding to the given folder, or
1408     * <code>null</code> if unable to associate the given folder with a Java element
1409     */
1410    public static IJavaElement create(IFolder folder) {
1411        return JavaModelManager.create(folder, null/*unknown java project*/);
1412    }
1413    /**
1414     * Returns the Java project corresponding to the given project.
1415     * <p>
1416     * Creating a Java Project has the side effect of creating and opening all of the
1417     * project's parents if they are not yet open.
1418     * <p>
1419     * Note that no check is done at this time on the existence or the java nature of this project.
1420     *
1421     * @param project the given project
1422     * @return the Java project corresponding to the given project, null if the given project is null
1423     */
1424    public static IJavaProject create(IProject project) {
1425        if (project == null) {
1426            return null;
1427        }
1428        JavaModel javaModel = JavaModelManager.getJavaModelManager().getJavaModel();
1429        return javaModel.getJavaProject(project);
1430    }
1431    /**
1432     * Returns the Java element corresponding to the given resource, or
1433     * <code>null</code> if unable to associate the given resource
1434     * with a Java element.
1435     * <p>
1436     * The resource must be one of:<ul>
1437     * <li>a project - the element returned is the corresponding <code>IJavaProject</code></li>
1438     * <li>a file with one of the {@link JavaCore#getJavaLikeExtensions()
1439     * Java-like extensions} - the element returned is the corresponding <code>ICompilationUnit</code></li>
1440     * <li>a <code>.class</code> file - the element returned is the corresponding <code>IClassFile</code></li>
1441     * <li>a <code>.jar</code> file - the element returned is the corresponding <code>IPackageFragmentRoot</code></li>
1442     * <li>a folder - the element returned is the corresponding <code>IPackageFragmentRoot</code>
1443     * or <code>IPackageFragment</code></li>
1444     * <li>the workspace root resource - the element returned is the <code>IJavaModel</code></li>
1445     * </ul>
1446     * <p>
1447     * Creating a Java element has the side effect of creating and opening all of the
1448     * element's parents if they are not yet open.
1449     *
1450     * @param resource the given resource
1451     * @return the Java element corresponding to the given resource, or
1452     * <code>null</code> if unable to associate the given resource
1453     * with a Java element
1454     */
1455    public static IJavaElement create(IResource resource) {
1456        return JavaModelManager.create(resource, null/*unknown java project*/);
1457    }
1458    /**
1459     * Returns the Java element corresponding to the given file, its project being the given
1460     * project. Returns <code>null</code> if unable to associate the given resource
1461     * with a Java element.
1462     *<p>
1463     * The resource must be one of:<ul>
1464     * <li>a project - the element returned is the corresponding <code>IJavaProject</code></li>
1465     * <li>a file with one of the {@link JavaCore#getJavaLikeExtensions()
1466     * Java-like extensions} - the element returned is the corresponding <code>ICompilationUnit</code></li>
1467     * <li>a <code>.class</code> file - the element returned is the corresponding <code>IClassFile</code></li>
1468     * <li>a <code>.jar</code> file - the element returned is the corresponding <code>IPackageFragmentRoot</code></li>
1469     * <li>a folder - the element returned is the corresponding <code>IPackageFragmentRoot</code>
1470     * or <code>IPackageFragment</code></li>
1471     * <li>the workspace root resource - the element returned is the <code>IJavaModel</code></li>
1472     * </ul>
1473     * <p>
1474     * Creating a Java element has the side effect of creating and opening all of the
1475     * element's parents if they are not yet open.
1476     *
1477     * @param resource the given resource
1478     * @return the Java element corresponding to the given file, or
1479     * <code>null</code> if unable to associate the given file
1480     * with a Java element
1481     * @since 3.3
1482     */
1483    public static IJavaElement create(IResource resource, IJavaProject project) {
1484        return JavaModelManager.create(resource, project);
1485    }
1486    /**
1487     * Returns the Java model.
1488     *
1489     * @param root the given root
1490     * @return the Java model, or <code>null</code> if the root is null
1491     */
1492    public static IJavaModel create(IWorkspaceRoot root) {
1493        if (root == null) {
1494            return null;
1495        }
1496        return JavaModelManager.getJavaModelManager().getJavaModel();
1497    }
1498    /**
1499     * Creates and returns a class file element for
1500     * the given <code>.class</code> file. Returns <code>null</code> if unable
1501     * to recognize the class file.
1502     *
1503     * @param file the given <code>.class</code> file
1504     * @return a class file element for the given <code>.class</code> file, or <code>null</code> if unable
1505     * to recognize the class file
1506     */
1507    public static IClassFile createClassFileFrom(IFile file) {
1508        return JavaModelManager.createClassFileFrom(file, null);
1509    }
1510    /**
1511     * Creates and returns a compilation unit element for
1512     * the given source file (i.e. a file with one of the {@link JavaCore#getJavaLikeExtensions()
1513     * Java-like extensions}). Returns <code>null</code> if unable
1514     * to recognize the compilation unit.
1515     *
1516     * @param file the given source file
1517     * @return a compilation unit element for the given source file, or <code>null</code> if unable
1518     * to recognize the compilation unit
1519     */
1520    public static ICompilationUnit createCompilationUnitFrom(IFile file) {
1521        return JavaModelManager.createCompilationUnitFrom(file, null/*unknown java project*/);
1522    }
1523    /**
1524     * Creates and returns a handle for the given JAR file.
1525     * The Java model associated with the JAR's project may be
1526     * created as a side effect.
1527     *
1528     * @param file the given JAR file
1529     * @return a handle for the given JAR file, or <code>null</code> if unable to create a JAR package fragment root.
1530     * (for example, if the JAR file represents a non-Java resource)
1531     */
1532    public static IPackageFragmentRoot createJarPackageFragmentRootFrom(IFile file) {
1533        return JavaModelManager.createJarPackageFragmentRootFrom(file, null/*unknown java project*/);
1534    }
1535
1536    /**
1537     * Answers the project specific value for a given classpath container.
1538     * In case this container path could not be resolved, then will answer <code>null</code>.
1539     * Both the container path and the project context are supposed to be non-null.
1540     * <p>
1541     * The containerPath is a formed by a first ID segment followed with extra segments, which can be
1542     * used as additional hints for resolution. If no container was ever recorded for this container path
1543     * onto this project (using <code>setClasspathContainer</code>, then a
1544     * <code>ClasspathContainerInitializer</code> will be activated if any was registered for this container
1545     * ID onto the extension point "org.eclipse.jdt.core.classpathContainerInitializer".
1546     * <p>
1547     * There is no assumption that the returned container must answer the exact same containerPath
1548     * when requested <code>IClasspathContainer#getPath</code>.
1549     * Indeed, the containerPath is just an indication for resolving it to an actual container object.
1550     * <p>
1551     * Classpath container values are persisted locally to the workspace, but
1552     * are not preserved from a session to another. It is thus highly recommended to register a
1553     * <code>ClasspathContainerInitializer</code> for each referenced container
1554     * (through the extension point "org.eclipse.jdt.core.ClasspathContainerInitializer").
1555     * <p>
1556     * @param containerPath the name of the container, which needs to be resolved
1557     * @param project a specific project in which the container is being resolved
1558     * @return the corresponding classpath container or <code>null</code> if unable to find one.
1559     *
1560     * @exception JavaModelException if an exception occurred while resolving the container, or if the resolved container
1561     * contains illegal entries (contains CPE_CONTAINER entries or null entries).
1562     *
1563     * @see ClasspathContainerInitializer
1564     * @see IClasspathContainer
1565     * @see #setClasspathContainer(IPath, IJavaProject[], IClasspathContainer[], IProgressMonitor)
1566     * @since 2.0
1567     */
1568    public static IClasspathContainer getClasspathContainer(IPath containerPath, IJavaProject project) throws JavaModelException {
1569
1570        JavaModelManager manager = JavaModelManager.getJavaModelManager();
1571        IClasspathContainer container = manager.getClasspathContainer(containerPath, project);
1572        if (container == JavaModelManager.CONTAINER_INITIALIZATION_IN_PROGRESS) {
1573            return manager.getPreviousSessionContainer(containerPath, project);
1574        }
1575        return container;
1576    }
1577
1578    /**
1579     * Helper method finding the classpath container initializer registered for a given classpath container ID
1580     * or <code>null</code> if none was found while iterating over the contributions to extension point to
1581     * the extension point "org.eclipse.jdt.core.classpathContainerInitializer".
1582     * <p>
1583     * A containerID is the first segment of any container path, used to identify the registered container initializer.
1584     * <p>
1585     * @param containerID - a containerID identifying a registered initializer
1586     * @return ClasspathContainerInitializer - the registered classpath container initializer or <code>null</code> if
1587     * none was found.
1588     * @since 2.1
1589     */
1590    public static ClasspathContainerInitializer getClasspathContainerInitializer(String  JavaDoc containerID) {
1591        HashMap  JavaDoc containerInitializersCache = JavaModelManager.getJavaModelManager().containerInitializersCache;
1592        ClasspathContainerInitializer initializer = (ClasspathContainerInitializer) containerInitializersCache.get(containerID);
1593        if (initializer == null) {
1594            initializer = computeClasspathContainerInitializer(containerID);
1595            if (initializer == null)
1596                return null;
1597            containerInitializersCache.put(containerID, initializer);
1598        }
1599        return initializer;
1600    }
1601
1602    private static ClasspathContainerInitializer computeClasspathContainerInitializer(String  JavaDoc containerID) {
1603        Plugin jdtCorePlugin = JavaCore.getPlugin();
1604        if (jdtCorePlugin == null) return null;
1605
1606        IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(JavaCore.PLUGIN_ID, JavaModelManager.CPCONTAINER_INITIALIZER_EXTPOINT_ID);
1607        if (extension != null) {
1608            IExtension[] extensions = extension.getExtensions();
1609            for(int i = 0; i < extensions.length; i++){
1610                IConfigurationElement [] configElements = extensions[i].getConfigurationElements();
1611                for(int j = 0; j < configElements.length; j++){
1612                    IConfigurationElement configurationElement = configElements[j];
1613                    String  JavaDoc initializerID = configurationElement.getAttribute("id"); //$NON-NLS-1$
1614 if (initializerID != null && initializerID.equals(containerID)){
1615                        if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED)
1616                            verbose_found_container_initializer(containerID, configurationElement);
1617                        try {
1618                            Object  JavaDoc execExt = configurationElement.createExecutableExtension("class"); //$NON-NLS-1$
1619 if (execExt instanceof ClasspathContainerInitializer){
1620                                return (ClasspathContainerInitializer)execExt;
1621                            }
1622                        } catch(CoreException e) {
1623                            // executable extension could not be created: ignore this initializer
1624 if (JavaModelManager.CP_RESOLVE_VERBOSE) {
1625                                verbose_failed_to_instanciate_container_initializer(containerID, configurationElement);
1626                                e.printStackTrace();
1627                            }
1628                        }
1629                    }
1630                }
1631            }
1632        }
1633        return null;
1634    }
1635
1636    private static void verbose_failed_to_instanciate_container_initializer(String  JavaDoc containerID, IConfigurationElement configurationElement) {
1637        Util.verbose(
1638            "CPContainer INIT - failed to instanciate initializer\n" + //$NON-NLS-1$
1639 " container ID: " + containerID + '\n' + //$NON-NLS-1$
1640 " class: " + configurationElement.getAttribute("class"), //$NON-NLS-1$ //$NON-NLS-2$
1641 System.err);
1642    }
1643
1644    private static void verbose_found_container_initializer(String  JavaDoc containerID, IConfigurationElement configurationElement) {
1645        Util.verbose(
1646            "CPContainer INIT - found initializer\n" + //$NON-NLS-1$
1647 " container ID: " + containerID + '\n' + //$NON-NLS-1$
1648 " class: " + configurationElement.getAttribute("class")); //$NON-NLS-1$ //$NON-NLS-2$
1649 }
1650
1651    /**
1652     * Returns the path held in the given classpath variable.
1653     * Returns <code>null</code> if unable to bind.
1654     * <p>
1655     * Classpath variable values are persisted locally to the workspace, and
1656     * are preserved from session to session.
1657     * <p>
1658     * Note that classpath variables can be contributed registered initializers for,
1659     * using the extension point "org.eclipse.jdt.core.classpathVariableInitializer".
1660     * If an initializer is registered for a variable, its persisted value will be ignored:
1661     * its initializer will thus get the opportunity to rebind the variable differently on
1662     * each session.
1663     *
1664     * @param variableName the name of the classpath variable
1665     * @return the path, or <code>null</code> if none
1666     * @see #setClasspathVariable(String, IPath)
1667     */
1668    public static IPath getClasspathVariable(final String  JavaDoc variableName) {
1669
1670        JavaModelManager manager = JavaModelManager.getJavaModelManager();
1671        IPath variablePath = manager.variableGet(variableName);
1672        if (variablePath == JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS){
1673            return manager.getPreviousSessionVariable(variableName);
1674        }
1675
1676        if (variablePath != null) {
1677            if (variablePath == JavaModelManager.CP_ENTRY_IGNORE_PATH)
1678                return null;
1679            return variablePath;
1680        }
1681
1682        // even if persisted value exists, initializer is given priority, only if no initializer is found the persisted value is reused
1683 final ClasspathVariableInitializer initializer = JavaCore.getClasspathVariableInitializer(variableName);
1684        if (initializer != null){
1685            if (JavaModelManager.CP_RESOLVE_VERBOSE)
1686                verbose_triggering_variable_initialization(variableName, initializer);
1687            if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED)
1688                verbose_triggering_variable_initialization_invocation_trace();
1689            manager.variablePut(variableName, JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS); // avoid initialization cycles
1690 boolean ok = false;
1691            try {
1692                // let OperationCanceledException go through
1693 // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=59363)
1694 initializer.initialize(variableName);
1695
1696                variablePath = manager.variableGet(variableName); // initializer should have performed side-effect
1697 if (variablePath == JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS) return null; // break cycle (initializer did not init or reentering call)
1698 if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED)
1699                    verbose_variable_value_after_initialization(variableName, variablePath);
1700                manager.variablesWithInitializer.add(variableName);
1701                ok = true;
1702            } catch (RuntimeException  JavaDoc e) {
1703                if (JavaModelManager.CP_RESOLVE_VERBOSE)
1704                    e.printStackTrace();
1705                throw e;
1706            } catch (Error  JavaDoc e) {
1707                if (JavaModelManager.CP_RESOLVE_VERBOSE)
1708                    e.printStackTrace();
1709                throw e;
1710            } finally {
1711                if (!ok) JavaModelManager.getJavaModelManager().variablePut(variableName, null); // flush cache
1712 }
1713        } else {
1714            if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED)
1715                verbose_no_variable_initializer_found(variableName);
1716        }
1717        return variablePath;
1718    }
1719
1720    private static void verbose_no_variable_initializer_found(String  JavaDoc variableName) {
1721        Util.verbose(
1722            "CPVariable INIT - no initializer found\n" + //$NON-NLS-1$
1723 " variable: " + variableName); //$NON-NLS-1$
1724 }
1725
1726    private static void verbose_variable_value_after_initialization(String  JavaDoc variableName, IPath variablePath) {
1727        Util.verbose(
1728            "CPVariable INIT - after initialization\n" + //$NON-NLS-1$
1729 " variable: " + variableName +'\n' + //$NON-NLS-1$
1730 " variable path: " + variablePath); //$NON-NLS-1$
1731 }
1732
1733    private static void verbose_triggering_variable_initialization(String  JavaDoc variableName, ClasspathVariableInitializer initializer) {
1734        Util.verbose(
1735            "CPVariable INIT - triggering initialization\n" + //$NON-NLS-1$
1736 " variable: " + variableName + '\n' + //$NON-NLS-1$
1737 " initializer: " + initializer); //$NON-NLS-1$
1738 }
1739
1740    private static void verbose_triggering_variable_initialization_invocation_trace() {
1741        Util.verbose(
1742            "CPVariable INIT - triggering initialization\n" + //$NON-NLS-1$
1743 " invocation trace:"); //$NON-NLS-1$
1744 new Exception  JavaDoc("<Fake exception>").printStackTrace(System.out); //$NON-NLS-1$
1745 }
1746
1747    /**
1748     * Returns deprecation message of a given classpath variable.
1749     *
1750     * @param variableName
1751     * @return A string if the classpath variable is deprecated, <code>null</code> otherwise.
1752     * @since 3.3
1753     */
1754    public static String  JavaDoc getClasspathVariableDeprecationMessage(String  JavaDoc variableName) {
1755        return (String  JavaDoc) JavaModelManager.getJavaModelManager().deprecatedVariables.get(variableName);
1756    }
1757
1758    /**
1759     * Helper method finding the classpath variable initializer registered for a given classpath variable name
1760     * or <code>null</code> if none was found while iterating over the contributions to extension point to
1761     * the extension point "org.eclipse.jdt.core.classpathVariableInitializer".
1762     * <p>
1763     * @param variable the given variable
1764     * @return ClasspathVariableInitializer - the registered classpath variable initializer or <code>null</code> if
1765     * none was found.
1766     * @since 2.1
1767     */
1768    public static ClasspathVariableInitializer getClasspathVariableInitializer(String  JavaDoc variable){
1769
1770        Plugin jdtCorePlugin = JavaCore.getPlugin();
1771        if (jdtCorePlugin == null) return null;
1772
1773        IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(JavaCore.PLUGIN_ID, JavaModelManager.CPVARIABLE_INITIALIZER_EXTPOINT_ID);
1774        if (extension != null) {
1775            IExtension[] extensions = extension.getExtensions();
1776            for(int i = 0; i < extensions.length; i++){
1777                IConfigurationElement [] configElements = extensions[i].getConfigurationElements();
1778                for(int j = 0; j < configElements.length; j++){
1779                    IConfigurationElement configElement = configElements[j];
1780                    try {
1781                        String  JavaDoc varAttribute = configElement.getAttribute("variable"); //$NON-NLS-1$
1782 if (variable.equals(varAttribute)) {
1783                            if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED)
1784                                verbose_found_variable_initializer(variable, configElement);
1785                            Object  JavaDoc execExt = configElement.createExecutableExtension("class"); //$NON-NLS-1$
1786 if (execExt instanceof ClasspathVariableInitializer){
1787                                ClasspathVariableInitializer initializer = (ClasspathVariableInitializer)execExt;
1788                                String  JavaDoc deprecatedAttribute = configElement.getAttribute("deprecated"); //$NON-NLS-1$
1789 if (deprecatedAttribute != null) {
1790                                    JavaModelManager.getJavaModelManager().deprecatedVariables.put(variable, deprecatedAttribute);
1791                                }
1792                                String  JavaDoc readOnlyAttribute = configElement.getAttribute("readOnly"); //$NON-NLS-1$
1793 if (JavaModelManager.TRUE.equals(readOnlyAttribute)) {
1794                                    JavaModelManager.getJavaModelManager().readOnlyVariables.add(variable);
1795                                }
1796                                return initializer;
1797                            }
1798                        }
1799                    } catch(CoreException e){
1800                        // executable extension could not be created: ignore this initializer
1801 if (JavaModelManager.CP_RESOLVE_VERBOSE) {
1802                            verbose_failed_to_instanciate_variable_initializer(variable, configElement);
1803                            e.printStackTrace();
1804                        }
1805                    }
1806                }
1807            }
1808        }
1809        return null;
1810    }
1811
1812    private static void verbose_failed_to_instanciate_variable_initializer(String  JavaDoc variable, IConfigurationElement configElement) {
1813        Util.verbose(
1814            "CPContainer INIT - failed to instanciate initializer\n" + //$NON-NLS-1$
1815 " variable: " + variable + '\n' + //$NON-NLS-1$
1816 " class: " + configElement.getAttribute("class"), //$NON-NLS-1$ //$NON-NLS-2$
1817 System.err);
1818    }
1819
1820    private static void verbose_found_variable_initializer(String  JavaDoc variable, IConfigurationElement configElement) {
1821        Util.verbose(
1822            "CPVariable INIT - found initializer\n" + //$NON-NLS-1$
1823 " variable: " + variable + '\n' + //$NON-NLS-1$
1824 " class: " + configElement.getAttribute("class")); //$NON-NLS-1$ //$NON-NLS-2$
1825 }
1826
1827    /**
1828     * Returns the names of all known classpath variables.
1829     * <p>
1830     * Classpath variable values are persisted locally to the workspace, and
1831     * are preserved from session to session.
1832     * <p>
1833     *
1834     * @return the list of classpath variable names
1835     * @see #setClasspathVariable(String, IPath)
1836     */
1837    public static String  JavaDoc[] getClasspathVariableNames() {
1838        return JavaModelManager.getJavaModelManager().variableNames();
1839    }
1840
1841    /**
1842     * Returns a table of all known configurable options with their default values.
1843     * These options allow to configure the behaviour of the underlying components.
1844     * The client may safely use the result as a template that they can modify and
1845     * then pass to <code>setOptions</code>.
1846     *
1847     * Helper constants have been defined on JavaCore for each of the option ID and
1848     * their possible constant values.
1849     *
1850     * Note: more options might be added in further releases.
1851     * <pre>
1852     * RECOGNIZED OPTIONS:
1853     *
1854     * COMPILER / Setting Compliance Level
1855     * Select the compliance level for the compiler. In "1.3" mode, source and target settings
1856     * should not go beyond "1.3" level.
1857     * - option id: "org.eclipse.jdt.core.compiler.compliance"
1858     * - possible values: { "1.3", "1.4", "1.5", "1.6", "1.7" }
1859     * - default: "1.4"
1860     *
1861     * COMPILER / Setting Source Compatibility Mode
1862     * Specify whether which source level compatibility is used. From 1.4 on, 'assert' is a keyword
1863     * reserved for assertion support. Also note, than when toggling to 1.4 mode, the target VM
1864     * level should be set to "1.4" and the compliance mode should be "1.4".
1865     * Source level 1.5 is necessary to enable generics, autoboxing, covariance, annotations, enumerations
1866     * enhanced for loop, static imports and varargs. Once toggled, the target VM level should be set to "1.5"
1867     * and the compliance mode should be "1.5".
1868     * Source level 1.6 is necessary to enable the computation of stack map tables. Once toggled, the target
1869     * VM level should be set to "1.6" and the compliance mode should be "1.6".
1870     * Once the source level 1.7 is toggled, the target VM level should be set to "1.7" and the compliance mode
1871     * should be "1.7".
1872     * - option id: "org.eclipse.jdt.core.compiler.source"
1873     * - possible values: { "1.3", "1.4", "1.5", "1.6", "1.7" }
1874     * - default: "1.3"
1875     *
1876     * COMPILER / Defining Target Java Platform
1877     * For binary compatibility reason, .class files can be tagged to with certain VM versions and later.
1878     * Note that "1.4" target requires to toggle compliance mode to "1.4", "1.5" target requires
1879     * to toggle compliance mode to "1.5", "1.6" target requires to toggle compliance mode to "1.6" and
1880     * "1.7" target requires to toggle compliance mode to "1.7".
1881     * - option id: "org.eclipse.jdt.core.compiler.codegen.targetPlatform"
1882     * - possible values: { "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7" }
1883     * - default: "1.2"
1884     *
1885     * COMPILER / Generating Local Variable Debug Attribute
1886     * When generated, this attribute will enable local variable names
1887     * to be displayed in debugger, only in place where variables are
1888     * definitely assigned (.class file is then bigger)
1889     * - option id: "org.eclipse.jdt.core.compiler.debug.localVariable"
1890     * - possible values: { "generate", "do not generate" }
1891     * - default: "generate"
1892     *
1893     * COMPILER / Generating Line Number Debug Attribute
1894     * When generated, this attribute will enable source code highlighting in debugger
1895     * (.class file is then bigger).
1896     * - option id: "org.eclipse.jdt.core.compiler.debug.lineNumber"
1897     * - possible values: { "generate", "do not generate" }
1898     * - default: "generate"
1899     *
1900     * COMPILER / Generating Source Debug Attribute
1901     * When generated, this attribute will enable the debugger to present the
1902     * corresponding source code.
1903     * - option id: "org.eclipse.jdt.core.compiler.debug.sourceFile"
1904     * - possible values: { "generate", "do not generate" }
1905     * - default: "generate"
1906     *
1907     * COMPILER / Preserving Unused Local Variables
1908     * Unless requested to preserve unused local variables (that is, never read), the
1909     * compiler will optimize them out, potentially altering debugging
1910     * - option id: "org.eclipse.jdt.core.compiler.codegen.unusedLocal"
1911     * - possible values: { "preserve", "optimize out" }
1912     * - default: "preserve"
1913     *
1914     * COMPILER / Inline JSR Bytecode Instruction
1915     * When enabled, the compiler will no longer generate JSR instructions, but rather inline corresponding
1916     * subroutine code sequences (mostly corresponding to try finally blocks). The generated code will thus
1917     * get bigger, but will load faster on virtual machines since the verification process is then much simpler.
1918     * This mode is anticipating support for the Java Specification Request 202.
1919     * Note that JSR inlining is optional only for target platform lesser than 1.5. From 1.5 on, the JSR
1920     * inlining is mandatory (also see related setting "org.eclipse.jdt.core.compiler.codegen.targetPlatform").
1921     * - option id: "org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode"
1922     * - possible values: { "enabled", "disabled" }
1923     * - default: "disabled"
1924     *
1925     * COMPILER / Javadoc Comment Support
1926     * When this support is disabled, the compiler will ignore all javadoc problems options settings
1927     * and will not report any javadoc problem. It will also not find any reference in javadoc comment and
1928     * DOM AST Javadoc node will be only a flat text instead of having structured tag elements.
1929     * - option id: "org.eclipse.jdt.core.compiler.doc.comment.support"
1930     * - possible values: { "enabled", "disabled" }
1931     * - default: "enabled"
1932     *
1933     * COMPILER / Reporting Attempt to Override Package-Default Method
1934     * A package default method is not visible in a different package, and thus
1935     * cannot be overridden. When enabling this option, the compiler will signal
1936     * such scenarii either as an error or a warning.
1937     * - option id: "org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod"
1938     * - possible values: { "error", "warning", "ignore" }
1939     * - default: "warning"
1940     *
1941     * COMPILER / Reporting Method With Constructor Name
1942     * Naming a method with a constructor name is generally considered poor
1943     * style programming. When enabling this option, the compiler will signal such
1944     * scenarii either as an error or a warning.
1945     * - option id: "org.eclipse.jdt.core.compiler.problem.methodWithConstructorName"
1946     * - possible values: { "error", "warning", "ignore" }
1947     * - default: "warning"
1948     *
1949     * COMPILER / Reporting Deprecation
1950     * When enabled, the compiler will signal use of deprecated API either as an
1951     * error or a warning.
1952     * - option id: "org.eclipse.jdt.core.compiler.problem.deprecation"
1953     * - possible values: { "error", "warning", "ignore" }
1954     * - default: "warning"
1955     *
1956     * COMPILER / Reporting Deprecation Inside Deprecated Code
1957     * When enabled, the compiler will signal use of deprecated API inside deprecated code.
1958     * The severity of the problem is controlled with option "org.eclipse.jdt.core.compiler.problem.deprecation".
1959     * - option id: "org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode"
1960     * - possible values: { "enabled", "disabled" }
1961     * - default: "disabled"
1962     *
1963     * COMPILER / Reporting Deprecation When Overriding Deprecated Method
1964     * When enabled, the compiler will signal the declaration of a method overriding a deprecated one.
1965     * The severity of the problem is controlled with option "org.eclipse.jdt.core.compiler.problem.deprecation".
1966     * - option id: "org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod"
1967     * - possible values: { "enabled", "disabled" }
1968     * - default: "disabled"
1969     *
1970     * COMPILER / Reporting Hidden Catch Block
1971     * Locally to a try statement, some catch blocks may hide others . For example,
1972     * try { throw new java.io.CharConversionException();
1973     * } catch (java.io.CharConversionException e) {
1974     * } catch (java.io.IOException e) {}.
1975     * When enabling this option, the compiler will issue an error or a warning for hidden
1976     * catch blocks corresponding to checked exceptions
1977     * - option id: "org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock"
1978     * - possible values: { "error", "warning", "ignore" }
1979     * - default: "warning"
1980     *
1981     * COMPILER / Reporting Unused Local
1982     * When enabled, the compiler will issue an error or a warning for unused local
1983     * variables (that is, variables never read from)
1984     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedLocal"
1985     * - possible values: { "error", "warning", "ignore" }
1986     * - default: "ignore"
1987     *
1988     * COMPILER / Reporting Unused Parameter
1989     * When enabled, the compiler will issue an error or a warning for unused method
1990     * parameters (that is, parameters never read from)
1991     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedParameter"
1992     * - possible values: { "error", "warning", "ignore" }
1993     * - default: "ignore"
1994     *
1995     * COMPILER / Reporting Unused Parameter if Implementing Abstract Method
1996     * When enabled, the compiler will signal unused parameters in abstract method implementations.
1997     * The severity of the problem is controlled with option "org.eclipse.jdt.core.compiler.problem.unusedParameter".
1998     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract"
1999     * - possible values: { "enabled", "disabled" }
2000     * - default: "disabled"
2001     *
2002     * COMPILER / Reporting Unused Parameter if Overriding Concrete Method
2003     * When enabled, the compiler will signal unused parameters in methods overriding concrete ones.
2004     * The severity of the problem is controlled with option "org.eclipse.jdt.core.compiler.problem.unusedParameter".
2005     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete"
2006     * - possible values: { "enabled", "disabled" }
2007     * - default: "disabled"
2008     *
2009     * COMPILER / Consider Reference in Doc Comment for Unused Parameter Check
2010     * When enabled, the compiler will consider doc comment references to parameters (i.e. @param clauses) for the unused
2011     * parameter check. Thus, documented parameters will be considered as mandated as per doc contract.
2012     * The severity of the unused parameter problem is controlled with option "org.eclipse.jdt.core.compiler.problem.unusedParameter".
2013     * Note: this option has no effect until the doc comment support is enabled according to the 
2014     * option "org.eclipse.jdt.core.compiler.doc.comment.support".
2015     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocReference"
2016     * - possible values: { "enabled", "disabled" }
2017     * - default: "enabled"
2018     *
2019     * COMPILER / Reporting Unused Import
2020     * When enabled, the compiler will issue an error or a warning for unused import
2021     * reference
2022     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedImport"
2023     * - possible values: { "error", "warning", "ignore" }
2024     * - default: "warning"
2025     *
2026     * COMPILER / Reporting Unused Private Members
2027     * When enabled, the compiler will issue an error or a warning whenever a private
2028     * method or field is declared but never used within the same unit.
2029     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedPrivateMember"
2030     * - possible values: { "error", "warning", "ignore" }
2031     * - default: "ignore"
2032     *
2033     * COMPILER / Reporting Assignment with no Effect
2034     * When enabled, the compiler will issue an error or a warning whenever an assignment
2035     * has no effect (e.g 'x = x').
2036     * - option id: "org.eclipse.jdt.core.compiler.problem.noEffectAssignment"
2037     * - possible values: { "error", "warning", "ignore" }
2038     * - default: "warning"
2039     *
2040     * COMPILER / Reporting Empty Statements and Unnecessary Semicolons
2041     * When enabled, the compiler will issue an error or a warning if an empty statement or a
2042     * unnecessary semicolon is encountered.
2043     * - option id: "org.eclipse.jdt.core.compiler.problem.emptyStatement"
2044     * - possible values: { "error", "warning", "ignore" }
2045     * - default: "ignore"
2046     *
2047     * COMPILER / Reporting Unnecessary Type Check
2048     * When enabled, the compiler will issue an error or a warning when a cast or an instanceof operation
2049     * is unnecessary.
2050     * - option id: "org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck"
2051     * - possible values: { "error", "warning", "ignore" }
2052     * - default: "ignore"
2053     *
2054     * COMPILER / Reporting Unnecessary Else
2055     * When enabled, the compiler will issue an error or a warning when a statement is unnecessarily
2056     * nested within an else clause (in situation where then clause is not completing normally).
2057     * - option id: "org.eclipse.jdt.core.compiler.problem.unnecessaryElse"
2058     * - possible values: { "error", "warning", "ignore" }
2059     * - default: "ignore"
2060     *
2061     * COMPILER / Reporting Synthetic Access Emulation
2062     * When enabled, the compiler will issue an error or a warning whenever it emulates
2063     * access to a non-accessible member of an enclosing type. Such access can have
2064     * performance implications.
2065     * - option id: "org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation"
2066     * - possible values: { "error", "warning", "ignore" }
2067     * - default: "ignore"
2068     *
2069     * COMPILER / Reporting Non-Externalized String Literal
2070     * When enabled, the compiler will issue an error or a warning for non externalized
2071     * String literal (that is, not tagged with //$NON-NLS-<n>$).
2072     * - option id: "org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral"
2073     * - possible values: { "error", "warning", "ignore" }
2074     * - default: "ignore"
2075     *
2076     * COMPILER / Reporting Usage of 'assert' Identifier
2077     * When enabled, the compiler will issue an error or a warning whenever 'assert' is
2078     * used as an identifier (reserved keyword in 1.4)
2079     * - option id: "org.eclipse.jdt.core.compiler.problem.assertIdentifier"
2080     * - possible values: { "error", "warning", "ignore" }
2081     * - default: "warning"
2082     *
2083     * COMPILER / Reporting Usage of 'enum' Identifier
2084     * When enabled, the compiler will issue an error or a warning whenever 'enum' is
2085     * used as an identifier (reserved keyword in 1.5)
2086     * - option id: "org.eclipse.jdt.core.compiler.problem.enumIdentifier"
2087     * - possible values: { "error", "warning", "ignore" }
2088     * - default: "warning"
2089     *
2090     * COMPILER / Reporting Non-Static Reference to a Static Member
2091     * When enabled, the compiler will issue an error or a warning whenever a static field
2092     * or method is accessed with an expression receiver. A reference to a static member should
2093     * be qualified with a type name.
2094     * - option id: "org.eclipse.jdt.core.compiler.problem.staticAccessReceiver"
2095     * - possible values: { "error", "warning", "ignore" }
2096     * - default: "warning"
2097     *
2098     * COMPILER / Reporting Indirect Reference to a Static Member
2099     * When enabled, the compiler will issue an error or a warning whenever a static field
2100     * or method is accessed in an indirect way. A reference to a static member should
2101     * preferably be qualified with its declaring type name.
2102     * - option id: "org.eclipse.jdt.core.compiler.problem.indirectStaticAccess"
2103     * - possible values: { "error", "warning", "ignore" }
2104     * - default: "ignore"
2105     *
2106     * COMPILER / Reporting Interface Method not Compatible with non-Inherited Methods
2107     * When enabled, the compiler will issue an error or a warning whenever an interface
2108     * defines a method incompatible with a non-inherited Object method. Until this conflict
2109     * is resolved, such an interface cannot be implemented, For example,
2110     * interface I {
2111     * int clone();
2112     * }
2113     * - option id: "org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod"
2114     * - possible values: { "error", "warning", "ignore" }
2115     * - default: "warning"
2116     *
2117     * COMPILER / Reporting Usage of char[] Expressions in String Concatenations
2118     * When enabled, the compiler will issue an error or a warning whenever a char[] expression
2119     * is used in String concatenations (for example, "hello" + new char[]{'w','o','r','l','d'}).
2120     * - option id: "org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion"
2121     * - possible values: { "error", "warning", "ignore" }
2122     * - default: "warning"
2123     *
2124     * COMPILER / Reporting Local Variable Declaration Hiding another Variable
2125     * When enabled, the compiler will issue an error or a warning whenever a local variable
2126     * declaration is hiding some field or local variable (either locally, inherited or defined in enclosing type).
2127     * - option id: "org.eclipse.jdt.core.compiler.problem.localVariableHiding"
2128     * - possible values: { "error", "warning", "ignore" }
2129     * - default: "ignore"
2130     *
2131     * COMPILER / Reporting Field Declaration Hiding another Variable
2132     * When enabled, the compiler will issue an error or a warning whenever a field
2133     * declaration is hiding some field or local variable (either locally, inherited or defined in enclosing type).
2134     * - option id: "org.eclipse.jdt.core.compiler.problem.fieldHiding"
2135     * - possible values: { "error", "warning", "ignore" }
2136     * - default: "ignore"
2137     *
2138     * COMPILER / Reporting Special Parameter Hiding another Field
2139     * When enabled, the compiler will signal cases where a constructor or setter method parameter declaration
2140     * is hiding some field (either locally, inherited or defined in enclosing type).
2141     * The severity of the problem is controlled with option "org.eclipse.jdt.core.compiler.problem.localVariableHiding".
2142     * - option id: "org.eclipse.jdt.core.compiler.problem.specialParameterHidingField"
2143     * - possible values: { "enabled", "disabled" }
2144     * - default: "disabled"
2145     *
2146     * COMPILER / Reporting Type Declaration Hiding another Type
2147     * When enabled, the compiler will issue an error or a warning in situations where a type parameter
2148     * declaration is hiding some type, when a nested type is hiding some type parameter, or when
2149     * a nested type is hiding another nested type defined in same unit.
2150     * - option id: "org.eclipse.jdt.core.compiler.problem.typeParameterHiding"
2151     * - possible values: { "error", "warning", "ignore" }
2152     * - default: "warning"
2153     *
2154     * COMPILER / Reporting Possible Accidental Boolean Assignment
2155     * When enabled, the compiler will issue an error or a warning if a boolean assignment is acting as the condition
2156     * of a control statement (where it probably was meant to be a boolean comparison).
2157     * - option id: "org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment"
2158     * - possible values: { "error", "warning", "ignore" }
2159     * - default: "ignore"
2160     *
2161     * COMPILER / Reporting Undocumented Empty Block
2162     * When enabled, the compiler will issue an error or a warning when an empty block is detected and it is not
2163     * documented with any comment.
2164     * - option id: "org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock"
2165     * - possible values: { "error", "warning", "ignore" }
2166     * - default: "ignore"
2167     *
2168     * COMPILER / Reporting Finally Blocks Not Completing Normally
2169     * When enabled, the compiler will issue an error or a warning when a finally block does not complete normally.
2170     * - option id: "org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally"
2171     * - possible values: { "error", "warning", "ignore" }
2172     * - default: "warning"
2173     *
2174     * COMPILER / Reporting Unused Declared Thrown Exception
2175     * When enabled, the compiler will issue an error or a warning when a method or a constructor is declaring a
2176     * thrown checked exception, but never actually raises it in its body.
2177     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException"
2178     * - possible values: { "error", "warning", "ignore" }
2179     * - default: "ignore"
2180     *
2181     * COMPILER / Reporting Unused Declared Thrown Exception in Overridind Method
2182     * When disabled, the compiler will not include overriding methods in its diagnosis for unused declared
2183     * thrown exceptions.
2184     * <br>
2185     * The severity of the problem is controlled with option "org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException".
2186     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding"
2187     * - possible values: { "enabled", "disabled" }
2188     * - default: "disabled"
2189     *
2190     * COMPILER / Reporting Unqualified Access to Field
2191     * When enabled, the compiler will issue an error or a warning when a field is access without any qualification.
2192     * In order to improve code readability, it should be qualified, e.g. 'x' should rather be written 'this.x'.
2193     * - option id: "org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess"
2194     * - possible values: { "error", "warning", "ignore" }
2195     * - default: "ignore"
2196     *
2197     * COMPILER / Reporting Unchecked Type Operation
2198     * When enabled, the compiler will issue an error or a warning whenever an operation involves generic types, and potentially
2199     * invalidates type safety since involving raw types (e.g. invoking #foo(X<String>) with arguments (X)).
2200     * - option id: "org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation"
2201     * - possible values: { "error", "warning", "ignore" }
2202     * - default: "warning"
2203     *
2204     * COMPILER / Reporting Raw Type Reference
2205     * When enabled, the compiler will issue an error or a warning when detecting references to raw types. Raw types are
2206     * discouraged, and are intended to help interfacing with legacy code. In the future, the language specification may
2207     * reject raw references to generic types.
2208     * - option id: "org.eclipse.jdt.core.compiler.problem.rawTypeReference"
2209     * - possible values: { "error", "warning", "ignore" }
2210     * - default: "warning"
2211     *
2212     * COMPILER / Reporting final Bound for Type Parameter
2213     * When enabled, the compiler will issue an error or a warning whenever a generic type parameter is associated with a
2214     * bound corresponding to a final type; since final types cannot be further extended, the parameter is pretty useless.
2215     * - option id: "org.eclipse.jdt.core.compiler.problem.finalParameterBound"
2216     * - possible values: { "error", "warning", "ignore" }
2217     * - default: "warning"
2218     *
2219     * COMPILER / Reporting Missing Declaration of serialVersionUID Field on Serializable Class
2220     * When enabled, the compiler will issue an error or a warning whenever a serializable class is missing a local declaration
2221     * of a serialVersionUID field. This field must be declared as static final and be of type long.
2222     * - option id: "org.eclipse.jdt.core.compiler.problem.missingSerialVersion"
2223     * - possible values: { "error", "warning", "ignore" }
2224     * - default: "warning"
2225     *
2226     * COMPILER / Reporting Varargs Argument Needing a Cast in Method/Constructor Invocation
2227     * When enabled, the compiler will issue an error or a warning whenever a varargs arguments should be cast
2228     * when passed to a method/constructor invocation. (e.g. Class.getMethod(String name, Class ... args )
2229     * invoked with arguments ("foo", null)).
2230     * - option id: "org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast"
2231     * - possible values: { "error", "warning", "ignore" }
2232     * - default: "warning"
2233     *
2234     * COMPILER / Reporting Null Dereference
2235     * When enabled, the compiler will issue an error or a warning whenever a
2236     * variable that is statically known to hold a null value is used to
2237     * access a field or method.
2238     *
2239     * - option id: "org.eclipse.jdt.core.compiler.problem.nullReference"
2240     * - possible values: { "error", "warning", "ignore" }
2241     * - default: "ignore"
2242     *
2243     * COMPILER / Reporting Potential Null Dereference
2244     * When enabled, the compiler will issue an error or a warning whenever a
2245     * variable that has formerly been tested against null but is not (no more)
2246     * statically known to hold a non-null value is used to access a field or
2247     * method.
2248     *
2249     * - option id: "org.eclipse.jdt.core.compiler.problem.potentialNullReference"
2250     * - possible values: { "error", "warning", "ignore" }
2251     * - default: "ignore"
2252     *
2253     * COMPILER / Reporting Redundant Null Check
2254     * When enabled, the compiler will issue an error or a warning whenever a
2255     * variable that is statically known to hold a null or a non-null value
2256     * is tested against null.
2257     *
2258     * - option id: "org.eclipse.jdt.core.compiler.problem.redundantNullCheck"
2259     * - possible values: { "error", "warning", "ignore" }
2260     * - default: "ignore"
2261     *
2262     * COMPILER / Reporting Use of Annotation Type as Super Interface
2263     * When enabled, the compiler will issue an error or a warning whenever an annotation type is used
2264     * as a super-interface. Though legal, this is discouraged.
2265     * - option id: "org.eclipse.jdt.core.compiler.problem.annotationSuperInterface"
2266     * - possible values: { "error", "warning", "ignore" }
2267     * - default: "warning"
2268     *
2269     * COMPILER / Reporting Missing @Override Annotation
2270     * When enabled, the compiler will issue an error or a warning whenever encountering a method
2271     * declaration which overrides a superclass method but has no @Override annotation.
2272     * - option id: "org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation"
2273     * - possible values: { "error", "warning", "ignore" }
2274     * - default: "ignore"
2275     *
2276     * COMPILER / Reporting Missing @Deprecated Annotation
2277     * When enabled, the compiler will issue an error or a warning whenever encountering a declaration
2278     * carrying a @deprecated doc tag but having no corresponding @Deprecated annotation.
2279     * - option id: "org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation"
2280     * - possible values: { "error", "warning", "ignore" }
2281     * - default: "ignore"
2282     *
2283     * COMPILER / Reporting Incomplete Enum Switch
2284     * When enabled, the compiler will issue an error or a warning whenever
2285     * an enum constant has no corresponding case label in an enum switch
2286     * statement.
2287     * - option id: "org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch"
2288     * - possible values: { "error", "warning", "ignore" }
2289     * - default: "ignore"
2290     *
2291     * COMPILER / Reporting Boxing/Unboxing Conversion
2292     * When enabled, the compiler will issue an error or a warning whenever a boxing or an unboxing
2293     * conversion is performed.
2294     * - option id: "org.eclipse.jdt.core.compiler.problem.autoboxing"
2295     * - possible values: { "error", "warning", "ignore" }
2296     * - default: "ignore"
2297     *
2298     * COMPILER / Reporting Invalid Javadoc Comment
2299     * This is the generic control for the severity of Javadoc problems.
2300     * When enabled, the compiler will issue an error or a warning for a problem in Javadoc.
2301     * - option id: "org.eclipse.jdt.core.compiler.problem.invalidJavadoc"
2302     * - possible values: { "error", "warning", "ignore" }
2303     * - default: "ignore"
2304     *
2305     * COMPILER / Visibility Level For Invalid Javadoc Tags
2306     * Set the minimum visibility level for Javadoc tag problems. Below this level problems will be ignored.
2307     * - option id: "org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility"
2308     * - possible values: { "public", "protected", "default", "private" }
2309     * - default: "public"
2310     *
2311     * COMPILER / Reporting Invalid Javadoc Tags
2312     * When enabled, the compiler will signal unbound or unexpected reference tags in Javadoc.
2313     * A 'throws' tag referencing an undeclared exception would be considered as unexpected.
2314     * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the Javadoc;
2315     * also see the setting "org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility".
2316     * <br>
2317     * The severity of the problem is controlled with option "org.eclipse.jdt.core.compiler.problem.invalidJavadoc".
2318     * - option id: "org.eclipse.jdt.core.compiler.problem.invalidJavadocTags"
2319     * - possible values: { "disabled", "enabled" }
2320     * - default: "disabled"
2321     *
2322     * COMPILER / Reporting Invalid Javadoc Tags with Deprecated References
2323     * Specify whether the compiler will report deprecated references used in Javadoc tags.
2324     * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the Javadoc;
2325     * also see the setting "org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility".
2326     * - option id: "org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef"
2327     * - possible values: { "enabled", "disabled" }
2328     * - default: "disabled"
2329     *
2330     * COMPILER / Reporting Invalid Javadoc Tags with Not Visible References
2331     * Specify whether the compiler will report non-visible references used in Javadoc tags.
2332     * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the Javadoc;
2333     * also see the setting "org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility".
2334     * - option id: "org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef"
2335     * - possible values: { "enabled", "disabled" }
2336     * - default: "disabled"
2337     *
2338     * COMPILER / Reporting Missing Javadoc Tags
2339     * This is the generic control for the severity of Javadoc missing tag problems.
2340     * When enabled, the compiler will issue an error or a warning when tags are missing in Javadoc comments.
2341     * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the Javadoc;
2342     * also see the setting "org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility".
2343     * <br>
2344     * - option id: "org.eclipse.jdt.core.compiler.problem.missingJavadocTags"
2345     * - possible values: { "error", "warning", "ignore" }
2346     * - default: "ignore"
2347     *
2348     * COMPILER / Visibility Level For Missing Javadoc Tags
2349     * Set the minimum visibility level for Javadoc missing tag problems. Below this level problems will be ignored.
2350     * - option id: "org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility"
2351     * - possible values: { "public", "protected", "default", "private" }
2352     * - default: "public"
2353     *
2354     * COMPILER / Reporting Missing Javadoc Tags on Overriding Methods
2355     * Specify whether the compiler will verify overriding methods in order to report Javadoc missing tag problems.
2356     * - option id: "org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding"
2357     * - possible values: { "enabled", "disabled" }
2358     * - default: "disabled"
2359     *
2360     * COMPILER / Reporting Missing Javadoc Comments
2361     * This is the generic control for the severity of missing Javadoc comment problems.
2362     * When enabled, the compiler will issue an error or a warning when Javadoc comments are missing.
2363     * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the expected Javadoc;
2364     * also see the setting "org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility".
2365     * <br>
2366     * - option id: "org.eclipse.jdt.core.compiler.problem.missingJavadocComments"
2367     * - possible values: { "error", "warning", "ignore" }
2368     * - default: "ignore"
2369     *
2370     * COMPILER / Visibility Level For Missing Javadoc Comments
2371     * Set the minimum visibility level for missing Javadoc problems. Below this level problems will be ignored.
2372     * - option id: "org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility"
2373     * - possible values: { "public", "protected", "default", "private" }
2374     * - default: "public"
2375     *
2376     * COMPILER / Reporting Missing Javadoc Comments on Overriding Methods
2377     * Specify whether the compiler will verify overriding methods in order to report missing Javadoc comment problems.
2378     * - option id: "org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding"
2379     * - possible values: { "enabled", "disabled" }
2380     * - default: "disabled"
2381     *
2382     * COMPILER / Maximum Number of Problems Reported per Compilation Unit
2383     * Specify the maximum number of problems reported on each compilation unit.
2384     * - option id: "org.eclipse.jdt.core.compiler.maxProblemPerUnit"
2385     * - possible values: "<n>" where <n> is zero or a positive integer (if zero then all problems are reported).
2386     * - default: "100"
2387     *
2388     * COMPILER / Treating Optional Error as Fatal
2389     * When enabled, optional errors (i.e. optional problems which severity is set to "error") will be treated as standard
2390     * compiler errors, yielding problem methods/types preventing from running offending code until the issue got resolved.
2391     * When disabled, optional errors are only considered as warnings, still carrying an error indication to make them more
2392     * severe. Note that by default, errors are fatal, whether they are optional or not.
2393     * - option id: "org.eclipse.jdt.core.compiler.problem.fatalOptionalError"
2394     * - possible values: { "enabled", "disabled" }
2395     * - default: "enabled"
2396     *
2397     * COMPILER / Defining the Automatic Task Tags
2398     * When the tag list is not empty, the compiler will issue a task marker whenever it encounters
2399     * one of the corresponding tags inside any comment in Java source code.
2400     * Generated task messages will start with the tag, and range until the next line separator,
2401     * comment ending, or tag.
2402     * When a given line of code bears multiple tags, each tag will be reported separately.
2403     * Moreover, a tag immediately followed by another tag will be reported using the contents of the
2404     * next non-empty tag of the line, if any.
2405     * Note that tasks messages are trimmed. If a tag is starting with a letter or digit, then it cannot be leaded by
2406     * another letter or digit to be recognized ("fooToDo" will not be recognized as a task for tag "ToDo", but "foo#ToDo"
2407     * will be detected for either tag "ToDo" or "#ToDo"). Respectively, a tag ending with a letter or digit cannot be followed
2408     * by a letter or digit to be recognized ("ToDofoo" will not be recognized as a task for tag "ToDo", but "ToDo:foo" will
2409     * be detected either for tag "ToDo" or "ToDo:").
2410     * - option id: "org.eclipse.jdt.core.compiler.taskTags"
2411     * - possible values: { "<tag>[,<tag>]*" } where <tag> is a String without any wild-card or leading/trailing spaces
2412     * - default: "TODO,FIXME,XXX"
2413     *
2414     * COMPILER / Defining the Automatic Task Priorities
2415     * In parallel with the Automatic Task Tags, this list defines the priorities (high, normal or low)
2416     * of the task markers issued by the compiler.
2417     * If the default is specified, the priority of each task marker is "NORMAL".
2418     * - option id: "org.eclipse.jdt.core.compiler.taskPriorities"
2419     * - possible values: { "<priority>[,<priority>]*" } where <priority> is one of "HIGH", "NORMAL" or "LOW"
2420     * - default: "NORMAL,HIGH,NORMAL"
2421     *
2422     * COMPILER / Determining whether task tags are case-sensitive
2423     * When enabled, task tags are considered in a case-sensitive way.
2424     * - option id: "org.eclipse.jdt.core.compiler.taskCaseSensitive"
2425     * - possible values: { "enabled", "disabled" }
2426     * - default: "enabled"
2427     *
2428     * COMPILER / Reporting Forbidden Reference to Type with Restricted Access
2429     * When enabled, the compiler will issue an error or a warning when referring to a type that is non accessible, as defined according
2430     * to the access rule specifications.
2431     * - option id: "org.eclipse.jdt.core.compiler.problem.forbiddenReference"
2432     * - possible values: { "error", "warning", "ignore" }
2433     * - default: "warning"
2434     *
2435     * COMPILER / Reporting Discouraged Reference to Type with Restricted Access
2436     * When enabled, the compiler will issue an error or a warning when referring to a type with discouraged access, as defined according
2437     * to the access rule specifications.
2438     * - option id: "org.eclipse.jdt.core.compiler.problem.discouragedReference"
2439     * - possible values: { "error", "warning", "ignore" }
2440     * - default: "warning"
2441     *
2442     * COMPILER / Determining Effect of @SuppressWarnings
2443     * When enabled, the @SuppressWarnings annotation can be used to suppress some compiler warnings.
2444     * When disabled, all @SupressWarnings annotations are ignored; i.e., warnings are reported.
2445     * - option id: "org.eclipse.jdt.core.compiler.problem.suppressWarnings"
2446     * - possible values: { "enabled", "disabled" }
2447     * - default: "enabled"
2448     *
2449     * COMPILER / Reporting Unhandled Warning Token for @SuppressWarnings
2450     * When enabled, the compiler will issue an error or a warning when encountering a token
2451     * it cannot handle inside a @SuppressWarnings annotation.
2452     * - option id: "org.eclipse.jdt.core.compiler.problem.unhandledWarningToken"
2453     * - possible values: { "error", "warning", "ignore" }
2454     * - default: "warning"
2455     *
2456     * COMPILER / Reporting Unreferenced Label
2457     * When enabled, the compiler will issue an error or a warning when encountering a labeled statement which label
2458     * is never explicitly referenced. A label is considered to be referenced if its name explicitly appears behind a break
2459     * or continue statement; for instance the following label would be considered unreferenced; LABEL: { break; }
2460     * - option id: "org.eclipse.jdt.core.compiler.problem.unusedLabel"
2461     * - possible values: { "error", "warning", "ignore" }
2462     * - default: "warning"
2463     *
2464     * COMPILER / Reporting Parameter Assignment
2465     * When enabled, the compiler will issue an error or a warning if a parameter is
2466     * assigned to.
2467     * - option id: "org.eclipse.jdt.core.compiler.problem.parameterAssignment"
2468     * - possible values: { "error", "warning", "ignore" }
2469     * - default: "ignore"
2470     *
2471     * COMPILER / Reporting Switch Fall-Through Case
2472     * When enabled, the compiler will issue an error or a warning if a case may be
2473     * entered by falling through previous case. Empty cases are allowed.
2474     * - option id: "org.eclipse.jdt.core.compiler.problem.fallthroughCase"
2475     * - possible values: { "error", "warning", "ignore" }
2476     * - default: "ignore"
2477     *
2478     * COMPILER / Reporting Overriding method that doesn't call the super method invocation
2479     * When enabled, the compiler will issue an error or a warning if a method is overriding a method without calling
2480     * the super invocation.
2481     * - option id: "org.eclipse.jdt.core.compiler.problem.overridingMethodWithoutSuperInvocation"
2482     * - possible values: { "error", "warning", "ignore" }
2483     * - default: "ignore"
2484     *
2485     * BUILDER / Specifying Filters for Resource Copying Control
2486     * Allow to specify some filters to control the resource copy process.
2487     * - option id: "org.eclipse.jdt.core.builder.resourceCopyExclusionFilter"
2488     * - possible values: { "<name>[,<name>]* } where <name> is a file name pattern (* and ? wild-cards allowed)
2489     * or the name of a folder which ends with '/'
2490     * - default: ""
2491     *
2492     * BUILDER / Abort if Invalid Classpath
2493     * Allow to toggle the builder to abort if the classpath is invalid
2494     * - option id: "org.eclipse.jdt.core.builder.invalidClasspath"
2495     * - possible values: { "abort", "ignore" }
2496     * - default: "abort"
2497     *
2498     * BUILDER / Cleaning Output Folder(s)
2499     * Indicate whether the JavaBuilder is allowed to clean the output folders
2500     * when performing full build operations.
2501     * - option id: "org.eclipse.jdt.core.builder.cleanOutputFolder"
2502     * - possible values: { "clean", "ignore" }
2503     * - default: "clean"
2504     *
2505     * BUILDER / Recreate Modified class files in Output Folder
2506     * Indicate whether the JavaBuilder should check for any changes to .class files
2507     * in the output folders while performing incremental build operations. If changes
2508     * are detected to managed .class files, then a full build is performed, otherwise
2509     * the changes are left as is. Tools further altering generated .class files, like optimizers,
2510     * should ensure this option remains set in its default state of ignore.
2511     * - option id: "org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder"
2512     * - possible values: { "enabled", "ignore" }
2513     * - default: "ignore"
2514     *
2515     * BUILDER / Reporting Duplicate Resources
2516     * Indicate the severity of the problem reported when more than one occurrence
2517     * of a resource is to be copied into the output location.
2518     * - option id: "org.eclipse.jdt.core.builder.duplicateResourceTask"
2519     * - possible values: { "error", "warning" }
2520     * - default: "warning"
2521     *
2522     * JAVACORE / Computing Project Build Order
2523     * Indicate whether JavaCore should enforce the project build order to be based on
2524     * the classpath prerequisite chain. When requesting to compute, this takes over
2525     * the platform default order (based on project references).
2526     * - option id: "org.eclipse.jdt.core.computeJavaBuildOrder"
2527     * - possible values: { "compute", "ignore" }
2528     * - default: "ignore"
2529     *
2530     * JAVACORE / Default Source Encoding Format
2531     * Get the default encoding format of source files. This value is
2532     * immutable and preset to the result of ResourcesPlugin.getEncoding().
2533     * It is offered as a convenience shortcut only.
2534     * - option id: "org.eclipse.jdt.core.encoding"
2535     * - value: <immutable, platform default value>
2536     *
2537     * JAVACORE / Reporting Incomplete Classpath
2538     * Indicate the severity of the problem reported when an entry on the classpath does not exist,
2539     * is not legite or is not visible (for example, a referenced project is closed).
2540     * - option id: "org.eclipse.jdt.core.incompleteClasspath"
2541     * - possible values: { "error", "warning"}
2542     * - default: "error"
2543     *
2544     * JAVACORE / Reporting Classpath Cycle
2545     * Indicate the severity of the problem reported when a project is involved in a cycle.
2546     * - option id: "org.eclipse.jdt.core.circularClasspath"
2547     * - possible values: { "error", "warning" }
2548     * - default: "error"
2549     *
2550     * JAVACORE / Reporting Incompatible JDK Level for Required Binaries
2551     * Indicate the severity of the problem reported when a project prerequisites another project
2552     * or library with an incompatible target JDK level (e.g. project targeting 1.1 vm, but compiled against 1.4 libraries).
2553     * - option id: "org.eclipse.jdt.core.incompatibleJDKLevel"
2554     * - possible values: { "error", "warning", "ignore" }
2555     * - default: "ignore"
2556     *
2557     * JAVACORE / Enabling Usage of Classpath Exclusion Patterns
2558     * When disabled, no entry on a project classpath can be associated with
2559     * an exclusion pattern.
2560     * - option id: "org.eclipse.jdt.core.classpath.exclusionPatterns"
2561     * - possible values: { "enabled", "disabled" }
2562     * - default: "enabled"
2563     *
2564     * JAVACORE / Enabling Usage of Classpath Multiple Output Locations
2565     * When disabled, no entry on a project classpath can be associated with
2566     * a specific output location, preventing thus usage of multiple output locations.
2567     * - option id: "org.eclipse.jdt.core.classpath.multipleOutputLocations"
2568     * - possible values: { "enabled", "disabled" }
2569     * - default: "enabled"
2570     *
2571     * JAVACORE / Set the timeout value for retrieving the method's parameter names from javadoc
2572     * Timeout in milliseconds to retrieve the method's parameter names from javadoc.
2573     * If the value is 0, the parameter names are not fetched and the raw names are returned.
2574     * - option id: "org.eclipse.jdt.core.timeoutForParameterNameFromAttachedJavadoc"
2575     * - possible values: "<n>", where n is an integer greater than or equal to 0
2576     * - default: "50"
2577     *
2578     * DEPRECATED SEE DefaultCodeFormatterOptions: FORMATTER / Inserting New Line Before Opening Brace
2579     * When Insert, a new line is inserted before an opening brace, otherwise nothing
2580     * is inserted
2581     * - option id: "org.eclipse.jdt.core.formatter.newline.openingBrace"
2582     * - possible values: { "insert", "do not insert" }
2583     * - default: "do not insert"
2584     *
2585     * DEPRECATED SEE DefaultCodeFormatterOptions: FORMATTER / Inserting New Line Inside Control Statement
2586     * When Insert, a new line is inserted between } and following else, catch, finally
2587     * - option id: "org.eclipse.jdt.core.formatter.newline.controlStatement"
2588     * - possible values: { "insert", "do not insert" }
2589     * - default: "do not insert"
2590     *
2591     * DEPRECATED SEE DefaultCodeFormatterOptions: Clearing Blank Lines
2592     * When Clear all, all blank lines are removed. When Preserve one, only one is kept
2593     * and all others removed.
2594     * - option id: "org.eclipse.jdt.core.formatter.newline.clearAll"
2595     * - possible values: { "clear all", "preserve one" }
2596     * - default: "preserve one"
2597     *
2598     * DEPRECATED SEE DefaultCodeFormatterOptions: Inserting New Line Between Else/If
2599     * When Insert, a blank line is inserted between an else and an if when they are
2600     * contiguous. When choosing to not insert, else-if will be kept on the same
2601     * line when possible.
2602     * - option id: "org.eclipse.jdt.core.formatter.newline.elseIf"
2603     * - possible values: { "insert", "do not insert" }
2604     * - default: "do not insert"
2605     *
2606     * DEPRECATED SEE DefaultCodeFormatterOptions: Inserting New Line In Empty Block
2607     * When insert, a line break is inserted between contiguous { and }, if } is not followed
2608     * by a keyword.
2609     * - option id: "org.eclipse.jdt.core.formatter.newline.emptyBlock"
2610     * - possible values: { "insert", "do not insert" }
2611     * - default: "insert"
2612     *
2613     * DEPRECATED SEE DefaultCodeFormatterOptions: Splitting Lines Exceeding Length
2614     * Enable splitting of long lines (exceeding the configurable length). Length of 0 will
2615     * disable line splitting
2616     * - option id: "org.eclipse.jdt.core.formatter.lineSplit"
2617     * - possible values: "<n>", where n is zero or a positive integer
2618     * - default: "80"
2619     *
2620     * DEPRECATED SEE DefaultCodeFormatterOptions: Compacting Assignment
2621     * Assignments can be formatted asymmetrically, for example 'int x= 2;', when Normal, a space
2622     * is inserted before the assignment operator
2623     * - option id: "org.eclipse.jdt.core.formatter.style.assignment"
2624     * - possible values: { "compact", "normal" }
2625     * - default: "normal"
2626     *
2627     * DEPRECATED SEE DefaultCodeFormatterOptions: Defining Indentation Character
2628     * Either choose to indent with tab characters or spaces
2629     * - option id: "org.eclipse.jdt.core.formatter.tabulation.char"
2630     * - possible values: { "tab", "space" }
2631     * - default: "tab"
2632     *
2633     * DEPRECATED SEE DefaultCodeFormatterOptions: Defining Space Indentation Length
2634     * When using spaces, set the amount of space characters to use for each
2635     * indentation mark.
2636     * - option id: "org.eclipse.jdt.core.formatter.tabulation.size"
2637     * - possible values: "<n>", where n is a positive integer
2638     * - default: "4"
2639     *
2640     * DEPRECATED SEE DefaultCodeFormatterOptions: Inserting space in cast expression
2641     * When Insert, a space is added between the type and the expression in a cast expression.
2642     * - option id: "org.eclipse.jdt.core.formatter.space.castexpression"
2643     * - possible values: { "insert", "do not insert" }
2644     * - default: "insert"
2645     *
2646     * CODEASSIST / Activate Visibility Sensitive Completion
2647     * When active, completion doesn't show that you can not see
2648     * (for example, you can not see private methods of a super class).
2649     * - option id: "org.eclipse.jdt.core.codeComplete.visibilityCheck"
2650     * - possible values: { "enabled", "disabled" }
2651     * - default: "disabled"
2652     *
2653     * CODEASSIST / Activate Deprecation Sensitive Completion
2654     * When enabled, completion doesn't propose deprecated members and types.
2655     * - option id: "org.eclipse.jdt.core.codeComplete.deprecationCheck"
2656     * - possible values: { "enabled", "disabled" }
2657     * - default: "disabled"
2658     *
2659     * CODEASSIST / Automatic Qualification of Implicit Members
2660     * When active, completion automatically qualifies completion on implicit
2661     * field references and message expressions.
2662     * - option id: "org.eclipse.jdt.core.codeComplete.forceImplicitQualification"
2663     * - possible values: { "enabled", "disabled" }
2664     * - default: "disabled"
2665     *
2666     * CODEASSIST / Define the Prefixes for Field Name
2667     * When the prefixes is non empty, completion for field name will begin with
2668     * one of the proposed prefixes.
2669     * - option id: "org.eclipse.jdt.core.codeComplete.fieldPrefixes"
2670     * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card
2671     * - default: ""
2672     *
2673     * CODEASSIST / Define the Prefixes for Static Field Name
2674     * When the prefixes is non empty, completion for static field name will begin with
2675     * one of the proposed prefixes.
2676     * - option id: "org.eclipse.jdt.core.codeComplete.staticFieldPrefixes"
2677     * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card
2678     * - default: ""
2679     *
2680     * CODEASSIST / Define the Prefixes for Local Variable Name
2681     * When the prefixes is non empty, completion for local variable name will begin with
2682     * one of the proposed prefixes.
2683     * - option id: "org.eclipse.jdt.core.codeComplete.localPrefixes"
2684     * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card
2685     * - default: ""
2686     *
2687     * CODEASSIST / Define the Prefixes for Argument Name
2688     * When the prefixes is non empty, completion for argument name will begin with
2689     * one of the proposed prefixes.
2690     * - option id: "org.eclipse.jdt.core.codeComplete.argumentPrefixes"
2691     * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card
2692     * - default: ""
2693     *
2694     * CODEASSIST / Define the Suffixes for Field Name
2695     * When the suffixes is non empty, completion for field name will end with
2696     * one of the proposed suffixes.
2697     * - option id: "org.eclipse.jdt.core.codeComplete.fieldSuffixes"
2698     * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card
2699     * - default: ""
2700     *
2701     * CODEASSIST / Define the Suffixes for Static Field Name
2702     * When the suffixes is non empty, completion for static field name will end with
2703     * one of the proposed suffixes.
2704     * - option id: "org.eclipse.jdt.core.codeComplete.staticFieldSuffixes"
2705     * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card
2706     * - default: ""
2707     *
2708     * CODEASSIST / Define the Suffixes for Local Variable Name
2709     * When the suffixes is non empty, completion for local variable name will end with
2710     * one of the proposed suffixes.
2711     * - option id: "org.eclipse.jdt.core.codeComplete.localSuffixes"
2712     * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card
2713     * - default: ""
2714     *
2715     * CODEASSIST / Define the Suffixes for Argument Name
2716     * When the suffixes is non empty, completion for argument name will end with
2717     * one of the proposed suffixes.
2718     * - option id: "org.eclipse.jdt.core.codeComplete.argumentSuffixes"
2719     * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card
2720     * - default: ""
2721     *
2722     * CODEASSIST / Activate Forbidden Reference Sensitive Completion
2723     * When enabled, completion doesn't propose elements which match a
2724     * forbidden reference rule.
2725     * - option id: "org.eclipse.jdt.core.codeComplete.forbiddenReferenceCheck"
2726     * - possible values: { "enabled", "disabled" }
2727     * - default: "enabled"
2728     *
2729     * CODEASSIST / Activate Discouraged Reference Sensitive Completion
2730     * When enabled, completion doesn't propose elements which match a
2731     * discouraged reference rule.
2732     * - option id: "org.eclipse.jdt.core.codeComplete.discouragedReferenceCheck"
2733     * - possible values: { "enabled", "disabled" }
2734     * - default: "disabled"
2735     *
2736     * CODEASSIST / Activate Camel Case Sensitive Completion
2737     * When enabled, completion shows proposals whose name match the CamelCase
2738     * pattern.
2739     * - option id: "org.eclipse.jdt.core.codeComplete.camelCaseMatch"
2740     * - possible values: { "enabled", "disabled" }
2741     * - default: "enabled"
2742     *
2743     * CODEASSIST / Activate Suggestion of Static Import
2744     * When enabled, completion proposals can contain static import
2745     * pattern.
2746     * - option id: "org.eclipse.jdt.core.codeComplete.suggestStaticImports"
2747     * - possible values: { "enabled", "disabled" }
2748     * - default: "enabled"
2749     * </pre>
2750     */
2751    public static Hashtable  JavaDoc getDefaultOptions(){
2752        return JavaModelManager.getJavaModelManager().getDefaultOptions();
2753    }
2754
2755    /**
2756     * Returns the workspace root default charset encoding.
2757     *
2758     * @return the name of the default charset encoding for workspace root.
2759     * @see IContainer#getDefaultCharset()
2760     * @see ResourcesPlugin#getEncoding()
2761     * @since 3.0
2762     */
2763    public static String  JavaDoc getEncoding() {
2764        // Verify that workspace is not shutting down (see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=60687)
2765 IWorkspace workspace = ResourcesPlugin.getWorkspace();
2766        if (workspace != null) {
2767            try {
2768                return workspace.getRoot().getDefaultCharset();
2769            } catch (CoreException e) {
2770                // fails silently and return plugin global encoding if core exception occurs
2771 }
2772        }
2773        return ResourcesPlugin.getEncoding();
2774    }
2775
2776    /**
2777     * Returns an array that contains the resources generated by the Java builder when building the
2778     * compilation units contained in the given region.
2779     * <p>The contents of the array is accurate only if the elements of the given region have been built.</p>
2780     * <p>The given region can contain instances of:</p>
2781     * <ul>
2782     * <li><code>org.eclipse.jdt.core.ICompilationUnit</code></li>
2783     * <li><code>org.eclipse.jdt.core.IPackageFragment</code></li>
2784     * <li><code>org.eclipse.jdt.core.IPackageFragmentRoot</code></li>
2785     * <li><code>org.eclipse.jdt.core.IJavaProject</code></li>
2786     * </ul>
2787     * <p>All other types of <code>org.eclipse.jdt.core.IJavaElement</code> are ignored.</p>
2788     *
2789     * @param region the given region
2790     * @param includesNonJavaResources a flag that indicates if non-java resources should be included
2791     *
2792     * @return an array that contains the resources generated by the Java builder when building the
2793     * compilation units contained in the given region, an empty array if none
2794     * @exception IllegalArgumentException if the given region is <code>null</code>
2795     * @since 3.3
2796     */
2797    public static IResource[] getGeneratedResources(IRegion region, boolean includesNonJavaResources) {
2798        if (region == null) throw new IllegalArgumentException  JavaDoc("region cannot be null"); //$NON-NLS-1$
2799 IJavaElement[] elements = region.getElements();
2800        HashMap  JavaDoc projectsStates = new HashMap  JavaDoc();
2801        ArrayList  JavaDoc collector = new ArrayList  JavaDoc();
2802        for (int i = 0, max = elements.length; i < max; i++) {
2803            // collect all the java project
2804 IJavaElement element = elements[i];
2805            IJavaProject javaProject = element.getJavaProject();
2806            IProject project = javaProject.getProject();
2807            State state = null;
2808            State currentState = (State) projectsStates.get(project);
2809            if (currentState != null) {
2810                state = currentState;
2811            } else {
2812                state = (State) JavaModelManager.getJavaModelManager().getLastBuiltState(project, null);
2813                if (state != null) {
2814                    projectsStates.put(project, state);
2815                }
2816            }
2817            if (state == null) continue;
2818            if (element.getElementType() == IJavaElement.JAVA_PROJECT) {
2819                IPackageFragmentRoot[] roots = null;
2820                try {
2821                    roots = javaProject.getPackageFragmentRoots();
2822                } catch (JavaModelException e) {
2823                    // ignore
2824 }
2825                if (roots == null) continue;
2826                IRegion region2 = JavaCore.newRegion();
2827                for (int j = 0; j < roots.length; j++) {
2828                    region2.add(roots[j]);
2829                }
2830                IResource[] res = getGeneratedResources(region2, includesNonJavaResources);
2831                for (int j = 0, max2 = res.length; j < max2; j++) {
2832                    collector.add(res[j]);
2833                }
2834                continue;
2835            }
2836            IPath outputLocation = null;
2837            try {
2838                outputLocation = javaProject.getOutputLocation();
2839            } catch (JavaModelException e) {
2840                // ignore
2841 }
2842            IJavaElement root = element;
2843            while (root != null && root.getElementType() != IJavaElement.PACKAGE_FRAGMENT_ROOT) {
2844                root = root.getParent();
2845            }
2846            if (root == null) continue;
2847            IPackageFragmentRoot packageFragmentRoot = (IPackageFragmentRoot) root;
2848            int rootPathSegmentCounts = packageFragmentRoot.getPath().segmentCount();
2849            try {
2850                IClasspathEntry entry = packageFragmentRoot.getRawClasspathEntry();
2851                IPath entryOutputLocation = entry.getOutputLocation();
2852                if (entryOutputLocation != null) {
2853                    outputLocation = entryOutputLocation;
2854                }
2855            } catch (JavaModelException e) {
2856                e.printStackTrace();
2857            }
2858            if (outputLocation == null) continue;
2859            IContainer container = (IContainer) project.getWorkspace().getRoot().findMember(outputLocation);
2860            switch(element.getElementType()) {
2861                case IJavaElement.COMPILATION_UNIT :
2862                    // get the .class files generated when this element was built
2863 ICompilationUnit unit = (ICompilationUnit) element;
2864                    getGeneratedResource(unit, container, state, rootPathSegmentCounts, collector);
2865                    break;
2866                case IJavaElement.PACKAGE_FRAGMENT :
2867                    // collect all the .class files generated when all the units in this package were built
2868 IPackageFragment fragment = (IPackageFragment) element;
2869                    ICompilationUnit[] compilationUnits = null;
2870                    try {
2871                        compilationUnits = fragment.getCompilationUnits();
2872                    } catch (JavaModelException e) {
2873                        // ignore
2874 }
2875                    if (compilationUnits == null) continue;
2876                    for (int j = 0, max2 = compilationUnits.length; j < max2; j++) {
2877                        getGeneratedResource(compilationUnits[j], container, state, rootPathSegmentCounts, collector);
2878                    }
2879                    if (includesNonJavaResources) {
2880                        // retrieve all non-java resources from the output location using the package fragment path
2881 Object  JavaDoc[] nonJavaResources = null;
2882                        try {
2883                            nonJavaResources = fragment.getNonJavaResources();
2884                        } catch (JavaModelException e) {
2885                            // ignore
2886 }
2887                        if (nonJavaResources != null) {
2888                            addNonJavaResources(nonJavaResources, container, rootPathSegmentCounts, collector);
2889                        }
2890                    }
2891                    break;
2892                case IJavaElement.PACKAGE_FRAGMENT_ROOT :
2893                    // collect all the .class files generated when all the units in this package were built
2894 IPackageFragmentRoot fragmentRoot = (IPackageFragmentRoot) element;
2895                    if (fragmentRoot.isArchive()) continue;
2896                    IJavaElement[] children = null;
2897                    try {
2898                        children = fragmentRoot.getChildren();
2899                    } catch (JavaModelException e) {
2900                        // ignore
2901 }
2902                    if (children == null) continue;
2903                    for (int j = 0, max2 = children.length; j < max2; j++) {
2904                        fragment = (IPackageFragment) children[j];
2905                        ICompilationUnit[] units = null;
2906                        try {
2907                            units = fragment.getCompilationUnits();
2908                        } catch (JavaModelException e) {
2909                            // ignore
2910 }
2911                        if (units == null) continue;
2912                        for (int n = 0, max3 = units.length; n < max3; n++) {
2913                            getGeneratedResource(units[n], container, state, rootPathSegmentCounts, collector);
2914                        }
2915                        if (includesNonJavaResources) {
2916                            // retrieve all non-java resources from the output location using the package fragment path
2917 Object  JavaDoc[] nonJavaResources = null;
2918                            try {
2919                                nonJavaResources = fragment.getNonJavaResources();
2920                            } catch (JavaModelException e) {
2921                                // ignore
2922 }
2923                            if (nonJavaResources != null) {
2924                                addNonJavaResources(nonJavaResources, container, rootPathSegmentCounts, collector);
2925                            }
2926                        }
2927                    }
2928                    break;
2929            }
2930        }
2931        int size = collector.size();
2932        if (size != 0) {
2933            IResource[] result = new IResource[size];
2934            collector.toArray(result);
2935            return result;
2936        }
2937        return NO_GENERATED_RESOURCES;
2938    }
2939
2940    private static void getGeneratedResource(ICompilationUnit unit,
2941            IContainer container,
2942            State state,
2943            int rootPathSegmentCounts,
2944            ArrayList  JavaDoc collector) {
2945        IResource resource = unit.getResource();
2946        char[][] typeNames = state.getDefinedTypeNamesFor(resource.getProjectRelativePath().toString());
2947        if (typeNames != null) {
2948            IPath path = unit.getPath().removeFirstSegments(rootPathSegmentCounts).removeLastSegments(1);
2949            for (int j = 0, max2 = typeNames.length; j < max2; j++) {
2950                IPath localPath = path.append(new String  JavaDoc(typeNames[j]) + ".class"); //$NON-NLS-1$
2951 IResource member = container.findMember(localPath);
2952                if (member != null && member.exists()) {
2953                    collector.add(member);
2954                }
2955            }
2956        } else {
2957            IPath path = unit.getPath().removeFirstSegments(rootPathSegmentCounts).removeLastSegments(1);
2958            path = path.append(Util.getNameWithoutJavaLikeExtension(unit.getElementName()) + ".class"); //$NON-NLS-1$
2959 IResource member = container.findMember(path);
2960            if (member != null && member.exists()) {
2961                collector.add(member);
2962            }
2963        }
2964    }
2965
2966    /**
2967     * Returns the single instance of the Java core plug-in runtime class.
2968     * Equivalent to <code>(JavaCore) getPlugin()</code>.
2969     *
2970     * @return the single instance of the Java core plug-in runtime class
2971     */
2972    public static JavaCore getJavaCore() {
2973        return (JavaCore) getPlugin();
2974    }
2975
2976    /**
2977     * Returns the list of known Java-like extensions.
2978     * Java like extension are defined in the {@link org.eclipse.core.runtime.Platform#getContentTypeManager()
2979     * content type manager} for the {@link #JAVA_SOURCE_CONTENT_TYPE}.
2980     * Note that a Java-like extension doesn't include the leading dot ('.').
2981     * Also note that the "java" extension is always defined as a Java-like extension.
2982     *
2983     * @return the list of known Java-like extensions.
2984     * @since 3.2
2985     */
2986    public static String  JavaDoc[] getJavaLikeExtensions() {
2987        return CharOperation.toStrings(Util.getJavaLikeExtensions());
2988    }
2989
2990    /**
2991     * Helper method for returning one option value only. Equivalent to <code>(String)JavaCore.getOptions().get(optionName)</code>
2992     * Note that it may answer <code>null</code> if this option does not exist.
2993     * <p>
2994     * For a complete description of the configurable options, see <code>getDefaultOptions</code>.
2995     * </p>
2996     *
2997     * @param optionName the name of an option
2998     * @return the String value of a given option
2999     * @see JavaCore#getDefaultOptions()
3000     * @see JavaCorePreferenceInitializer for changing default settings
3001     * @since 2.0
3002     */
3003    public static String  JavaDoc getOption(String  JavaDoc optionName) {
3004        return JavaModelManager.getJavaModelManager().getOption(optionName);
3005    }
3006
3007    /**
3008     * Returns the table of the current options. Initially, all options have their default values,
3009     * and this method returns a table that includes all known options.
3010     * <p>For a complete description of the configurable options, see <code>getDefaultOptions</code>.</p>
3011     * <p>Returns a default set of options even if the platform is not running.</p>
3012     *
3013     * @return table of current settings of all options
3014     * (key type: <code>String</code>; value type: <code>String</code>)
3015     * @see #getDefaultOptions()
3016     * @see JavaCorePreferenceInitializer for changing default settings
3017     */
3018    public static Hashtable  JavaDoc getOptions() {
3019        return JavaModelManager.getJavaModelManager().getOptions();
3020    }
3021
3022    /**
3023     * Returns the single instance of the Java core plug-in runtime class.
3024     *
3025     * @return the single instance of the Java core plug-in runtime class
3026     */
3027    public static Plugin getPlugin() {
3028        return JAVA_CORE_PLUGIN;
3029    }
3030
3031    /**
3032     * This is a helper method, which returns the resolved classpath entry denoted
3033     * by a given entry (if it is a variable entry). It is obtained by resolving the variable
3034     * reference in the first segment. Returns <code>null</code> if unable to resolve using
3035     * the following algorithm:
3036     * <ul>
3037     * <li> if variable segment cannot be resolved, returns <code>null</code></li>
3038     * <li> finds a project, JAR or binary folder in the workspace at the resolved path location</li>
3039     * <li> if none finds an external JAR file or folder outside the workspace at the resolved path location </li>
3040     * <li> if none returns <code>null</code></li>
3041     * </ul>
3042     * <p>
3043     * Variable source attachment path and root path are also resolved and recorded in the resulting classpath entry.
3044     * <p>
3045     * NOTE: This helper method does not handle classpath containers, for which should rather be used
3046     * <code>JavaCore#getClasspathContainer(IPath, IJavaProject)</code>.
3047     * <p>
3048     *
3049     * @param entry the given variable entry
3050     * @return the resolved library or project classpath entry, or <code>null</code>
3051     * if the given variable entry could not be resolved to a valid classpath entry
3052     */
3053    public static IClasspathEntry getResolvedClasspathEntry(IClasspathEntry entry) {
3054
3055        if (entry.getEntryKind() != IClasspathEntry.CPE_VARIABLE)
3056            return entry;
3057
3058        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
3059        IPath resolvedPath = JavaCore.getResolvedVariablePath(entry.getPath());
3060        if (resolvedPath == null)
3061            return null;
3062
3063        Object  JavaDoc target = JavaModel.getTarget(workspaceRoot, resolvedPath, false);
3064        if (target == null)
3065            return null;
3066
3067        // inside the workspace
3068 if (target instanceof IResource) {
3069            IResource resolvedResource = (IResource) target;
3070            switch (resolvedResource.getType()) {
3071
3072                case IResource.PROJECT :
3073                    // internal project
3074 return JavaCore.newProjectEntry(
3075                            resolvedPath,
3076                            entry.getAccessRules(),
3077                            entry.combineAccessRules(),
3078                            entry.getExtraAttributes(),
3079                            entry.isExported());
3080                case IResource.FILE :
3081                    if (org.eclipse.jdt.internal.compiler.util.Util.isArchiveFileName(resolvedResource.getName())) {
3082                        // internal binary archive
3083 return JavaCore.newLibraryEntry(
3084                                resolvedPath,
3085                                getResolvedVariablePath(entry.getSourceAttachmentPath()),
3086                                getResolvedVariablePath(entry.getSourceAttachmentRootPath()),
3087                                entry.getAccessRules(),
3088                                entry.getExtraAttributes(),
3089                                entry.isExported());
3090                    }
3091                    break;
3092
3093                case IResource.FOLDER :
3094                    // internal binary folder
3095 return JavaCore.newLibraryEntry(
3096                            resolvedPath,
3097                            getResolvedVariablePath(entry.getSourceAttachmentPath()),
3098                            getResolvedVariablePath(entry.getSourceAttachmentRootPath()),
3099                            entry.getAccessRules(),
3100                            entry.getExtraAttributes(),
3101                            entry.isExported());
3102            }
3103        }
3104        // outside the workspace
3105 if (target instanceof File  JavaDoc) {
3106            File  JavaDoc externalFile = JavaModel.getFile(target);
3107            if (externalFile != null) {
3108                String  JavaDoc fileName = externalFile.getName().toLowerCase();
3109                if (fileName.endsWith(SuffixConstants.SUFFIX_STRING_jar) || fileName.endsWith(SuffixConstants.SUFFIX_STRING_zip)) {
3110                    // external binary archive
3111 return JavaCore.newLibraryEntry(
3112                            resolvedPath,
3113                            getResolvedVariablePath(entry.getSourceAttachmentPath()),
3114                            getResolvedVariablePath(entry.getSourceAttachmentRootPath()),
3115                            entry.getAccessRules(),
3116                            entry.getExtraAttributes(),
3117                            entry.isExported());
3118                }
3119            } else { // external binary folder
3120 if (resolvedPath.isAbsolute()){
3121                    return JavaCore.newLibraryEntry(
3122                            resolvedPath,
3123                            getResolvedVariablePath(entry.getSourceAttachmentPath()),
3124                            getResolvedVariablePath(entry.getSourceAttachmentRootPath()),
3125                            entry.getAccessRules(),
3126                            entry.getExtraAttributes(),
3127                            entry.isExported());
3128                }
3129            }
3130        }
3131        return null;
3132    }
3133
3134
3135    /**
3136     * Resolve a variable path (helper method).
3137     *
3138     * @param variablePath the given variable path
3139     * @return the resolved variable path or <code>null</code> if none
3140     */
3141    public static IPath getResolvedVariablePath(IPath variablePath) {
3142
3143        if (variablePath == null)
3144            return null;
3145        int count = variablePath.segmentCount();
3146        if (count == 0)
3147            return null;
3148
3149        // lookup variable
3150 String  JavaDoc variableName = variablePath.segment(0);
3151        IPath resolvedPath = JavaCore.getClasspathVariable(variableName);
3152        if (resolvedPath == null)
3153            return null;
3154
3155        // append path suffix
3156 if (count > 1) {
3157            resolvedPath = resolvedPath.append(variablePath.removeFirstSegments(1));
3158        }
3159        return resolvedPath;
3160    }
3161
3162    /**
3163     * Answers the shared working copies currently registered for this buffer factory.
3164     * Working copies can be shared by several clients using the same buffer factory,see
3165     * <code>IWorkingCopy.getSharedWorkingCopy</code>.
3166     *
3167     * @param factory the given buffer factory
3168     * @return the list of shared working copies for a given buffer factory
3169     * @since 2.0
3170     * @deprecated Use {@link #getWorkingCopies(WorkingCopyOwner)} instead
3171     */
3172    public static IWorkingCopy[] getSharedWorkingCopies(IBufferFactory factory){
3173
3174        // if factory is null, default factory must be used
3175 if (factory == null) factory = BufferManager.getDefaultBufferManager().getDefaultBufferFactory();
3176
3177        return getWorkingCopies(BufferFactoryWrapper.create(factory));
3178    }
3179
3180    /**
3181     * Returns the names of all defined user libraries. The corresponding classpath container path
3182     * is the name appended to the USER_LIBRARY_CONTAINER_ID.
3183     * @return Return an array containing the names of all known user defined.
3184     * @since 3.0
3185     */
3186    public static String  JavaDoc[] getUserLibraryNames() {
3187         return JavaModelManager.getUserLibraryManager().getUserLibraryNames();
3188    }
3189
3190    /**
3191     * Returns the working copies that have the given owner.
3192     * Only compilation units in working copy mode are returned.
3193     * If the owner is <code>null</code>, primary working copies are returned.
3194     *
3195     * @param owner the given working copy owner or <code>null</code> for primary working copy owner
3196     * @return the list of working copies for a given owner
3197     * @since 3.0
3198     */
3199    public static ICompilationUnit[] getWorkingCopies(WorkingCopyOwner owner){
3200
3201        JavaModelManager manager = JavaModelManager.getJavaModelManager();
3202        if (owner == null) owner = DefaultWorkingCopyOwner.PRIMARY;
3203        ICompilationUnit[] result = manager.getWorkingCopies(owner, false/*don't add primary WCs*/);
3204        if (result == null) return JavaModelManager.NO_WORKING_COPY;
3205        return result;
3206    }
3207
3208    /**
3209     * Initializes JavaCore internal structures to allow subsequent operations (such
3210     * as the ones that need a resolved classpath) to run full speed. A client may
3211     * choose to call this method in a background thread early after the workspace
3212     * has started so that the initialization is transparent to the user.
3213     * <p>
3214     * However calling this method is optional. Services will lazily perform
3215     * initialization when invoked. This is only a way to reduce initialization
3216     * overhead on user actions, if it can be performed before at some
3217     * appropriate moment.
3218     * </p><p>
3219     * This initialization runs accross all Java projects in the workspace. Thus the
3220     * workspace root scheduling rule is used during this operation.
3221     * </p><p>
3222     * This method may return before the initialization is complete. The
3223     * initialization will then continue in a background thread.
3224     * </p><p>
3225     * This method can be called concurrently.
3226     * </p>
3227     *
3228     * @param monitor a progress monitor, or <code>null</code> if progress
3229     * reporting and cancellation are not desired
3230     * @exception CoreException if the initialization fails,
3231     * the status of the exception indicates the reason of the failure
3232     * @since 3.1
3233     */
3234    public static void initializeAfterLoad(IProgressMonitor monitor) throws CoreException {
3235        try {
3236            if (monitor != null) monitor.beginTask(Messages.javamodel_initialization, 100);
3237
3238            // initialize all containers and variables
3239 JavaModelManager manager = JavaModelManager.getJavaModelManager();
3240            try {
3241                if (monitor != null) {
3242                    monitor.subTask(Messages.javamodel_configuring_classpath_containers);
3243                    manager.batchContainerInitializationsProgress.set(new SubProgressMonitor(monitor, 50)); // 50% of the time is spent in initializing containers and variables
3244 }
3245                
3246                // all classpaths in the workspace are going to be resolved, ensure that containers are initialized in one batch
3247 manager.batchContainerInitializations = true; 
3248                
3249                // avoid leaking source attachment properties (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=183413)
3250 IJavaProject[] projects = manager.getJavaModel().getJavaProjects();
3251                for (int i = 0, length = projects.length; i < length; i++) {
3252                    IClasspathEntry[] classpath;
3253                    try {
3254                        classpath = ((JavaProject) projects[i]).getResolvedClasspath();
3255                    } catch (JavaModelException e) {
3256                        // project no longer exist: ignore
3257 continue;
3258                    }
3259                    if (classpath != null) {
3260                        for (int j = 0, length2 = classpath.length; j < length2; j++) {
3261                            IClasspathEntry entry = classpath[j];
3262                            if (entry.getSourceAttachmentPath() != null)
3263                                Util.setSourceAttachmentProperty(entry.getPath(), null);
3264                            // else source might have been attached by IPackageFragmentRoot#attachSource(...), we keep it
3265 }
3266                    }
3267                }
3268                
3269                // initialize delta state
3270 manager.deltaState.rootsAreStale = true; // in case it was already initialized before we cleaned up the source attachment proprties
3271 manager.deltaState.initializeRoots();
3272            } finally {
3273                manager.batchContainerInitializationsProgress.set(null);
3274            }
3275
3276            // dummy query for waiting until the indexes are ready
3277 SearchEngine engine = new SearchEngine();
3278            IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
3279            try {
3280                if (monitor != null)
3281                    monitor.subTask(Messages.javamodel_configuring_searchengine);
3282                engine.searchAllTypeNames(
3283                    null,
3284                    SearchPattern.R_EXACT_MATCH,
3285                    "!@$#!@".toCharArray(), //$NON-NLS-1$
3286 SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE,
3287                    IJavaSearchConstants.CLASS,
3288                    scope,
3289                    new TypeNameRequestor() {
3290                        public void acceptType(
3291                            int modifiers,
3292                            char[] packageName,
3293                            char[] simpleTypeName,
3294                            char[][] enclosingTypeNames,
3295                            String  JavaDoc path) {
3296                            // no type to accept
3297 }
3298                    },
3299                    // will not activate index query caches if indexes are not ready, since it would take to long
3300 // to wait until indexes are fully rebuild
3301 IJavaSearchConstants.CANCEL_IF_NOT_READY_TO_SEARCH,
3302                    monitor == null ? null : new SubProgressMonitor(monitor, 49) // 49% of the time is spent in the dummy search
3303 );
3304            } catch (JavaModelException e) {
3305                // /search failed: ignore
3306 } catch (OperationCanceledException e) {
3307                if (monitor != null && monitor.isCanceled())
3308                    throw e;
3309                // else indexes were not ready: catch the exception so that jars are still refreshed
3310 }
3311
3312            // check if the build state version number has changed since last session
3313 // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=98969)
3314 if (monitor != null)
3315                monitor.subTask(Messages.javamodel_getting_build_state_number);
3316            QualifiedName qName = new QualifiedName(JavaCore.PLUGIN_ID, "stateVersionNumber"); //$NON-NLS-1$
3317 IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
3318            String  JavaDoc versionNumber = null;
3319            try {
3320                versionNumber = root.getPersistentProperty(qName);
3321            } catch (CoreException e) {
3322                // could not read version number: consider it is new
3323 }
3324            final JavaModel model = manager.getJavaModel();
3325            String  JavaDoc newVersionNumber = Byte.toString(State.VERSION);
3326            if (!newVersionNumber.equals(versionNumber)) {
3327                // build state version number has changed: touch every projects to force a rebuild
3328 if (JavaBuilder.DEBUG)
3329                    System.out.println("Build state version number has changed"); //$NON-NLS-1$
3330 IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
3331                    public void run(IProgressMonitor progressMonitor2) throws CoreException {
3332                        IJavaProject[] projects = null;
3333                        try {
3334                            projects = model.getJavaProjects();
3335                        } catch (JavaModelException e) {
3336                            // could not get Java projects: ignore
3337 }
3338                        if (projects != null) {
3339                            for (int i = 0, length = projects.length; i < length; i++) {
3340                                IJavaProject project = projects[i];
3341                                try {
3342                                    if (JavaBuilder.DEBUG)
3343                                        System.out.println("Touching " + project.getElementName()); //$NON-NLS-1$
3344 project.getProject().touch(progressMonitor2);
3345                                } catch (CoreException e) {
3346                                    // could not touch this project: ignore
3347 }
3348                            }
3349                        }
3350                    }
3351                };
3352                if (monitor != null)
3353                    monitor.subTask(Messages.javamodel_building_after_upgrade);
3354                try {
3355                    ResourcesPlugin.getWorkspace().run(runnable, monitor);
3356                } catch (CoreException e) {
3357                    // could not touch all projects
3358 }
3359                try {
3360                    root.setPersistentProperty(qName, newVersionNumber);
3361                } catch (CoreException e) {
3362                    Util.log(e, "Could not persist build state version number"); //$NON-NLS-1$
3363 }
3364            }
3365
3366            // ensure external jars are refreshed (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=93668)
3367 try {
3368                if (monitor != null)
3369                    monitor.subTask(Messages.javamodel_refreshing_external_jars);
3370                model.refreshExternalArchives(
3371                    null/*refresh all projects*/,
3372                    monitor == null ? null : new SubProgressMonitor(monitor, 1) // 1% of the time is spent in jar refresh
3373 );
3374            } catch (JavaModelException e) {
3375                // refreshing failed: ignore
3376 }
3377            
3378        } finally {
3379            if (monitor != null) monitor.done();
3380        }
3381    }
3382
3383    /**
3384     * Returns whether a given classpath variable is read-only or not.
3385     *
3386     * @param variableName
3387     * @return <code>true</code> if the classpath variable is read-only,
3388     * <code>false</code> otherwise.
3389     * @since 3.3
3390     */
3391    public static boolean isClasspathVariableReadOnly(String  JavaDoc variableName) {
3392        return JavaModelManager.getJavaModelManager().readOnlyVariables.contains(variableName);
3393    }
3394
3395    /**
3396     * Returns whether the given file name's extension is a Java-like extension.
3397     *
3398     * @return whether the given file name's extension is a Java-like extension
3399     * @see #getJavaLikeExtensions()
3400     * @since 3.2
3401     */
3402    public static boolean isJavaLikeFileName(String  JavaDoc fileName) {
3403        return Util.isJavaLikeFileName(fileName);
3404    }
3405
3406    /**
3407     * Returns whether the given marker references the given Java element.
3408     * Used for markers, which denote a Java element rather than a resource.
3409     *
3410     * @param element the element
3411     * @param marker the marker
3412     * @return <code>true</code> if the marker references the element, false otherwise
3413     * @exception CoreException if the <code>IMarker.getAttribute</code> on the marker fails
3414     */
3415    public static boolean isReferencedBy(IJavaElement element, IMarker marker) throws CoreException {
3416
3417        // only match units or classfiles
3418 if (element instanceof IMember){
3419            IMember member = (IMember) element;
3420            if (member.isBinary()){
3421                element = member.getClassFile();
3422            } else {
3423                element = member.getCompilationUnit();
3424            }
3425        }
3426        if (element == null) return false;
3427        if (marker == null) return false;
3428
3429        String  JavaDoc markerHandleId = (String  JavaDoc)marker.getAttribute(ATT_HANDLE_ID);
3430        if (markerHandleId == null) return false;
3431
3432        IJavaElement markerElement = JavaCore.create(markerHandleId);
3433        while (true){
3434            if (element.equals(markerElement)) return true; // external elements may still be equal with different handleIDs.
3435
3436            // cycle through enclosing types in case marker is associated with a classfile (15568)
3437 if (markerElement instanceof IClassFile){
3438                IType enclosingType = ((IClassFile)markerElement).getType().getDeclaringType();
3439                if (enclosingType != null){
3440                    markerElement = enclosingType.getClassFile(); // retry with immediate enclosing classfile
3441 continue;
3442                }
3443            }
3444            break;
3445        }
3446        return false;
3447    }
3448
3449    /**
3450     * Returns whether the given marker delta references the given Java element.
3451     * Used for markers deltas, which denote a Java element rather than a resource.
3452     *
3453     * @param element the element
3454     * @param markerDelta the marker delta
3455     * @return <code>true</code> if the marker delta references the element
3456     * @exception CoreException if the <code>IMarkerDelta.getAttribute</code> on the marker delta fails
3457     */
3458    public static boolean isReferencedBy(IJavaElement element, IMarkerDelta markerDelta) throws CoreException {
3459
3460        // only match units or classfiles
3461 if (element instanceof IMember){
3462            IMember member = (IMember) element;
3463            if (member.isBinary()){
3464                element = member.getClassFile();
3465            } else {
3466                element = member.getCompilationUnit();
3467            }
3468        }
3469        if (element == null) return false;
3470        if (markerDelta == null) return false;
3471
3472        String  JavaDoc markerDeltarHandleId = (String  JavaDoc)markerDelta.getAttribute(ATT_HANDLE_ID);
3473        if (markerDeltarHandleId == null) return false;
3474
3475        IJavaElement markerElement = JavaCore.create(markerDeltarHandleId);
3476        while (true){
3477            if (element.equals(markerElement)) return true; // external elements may still be equal with different handleIDs.
3478
3479            // cycle through enclosing types in case marker is associated with a classfile (15568)
3480 if (markerElement instanceof IClassFile){
3481                IType enclosingType = ((IClassFile)markerElement).getType().getDeclaringType();
3482                if (enclosingType != null){
3483                    markerElement = enclosingType.getClassFile(); // retry with immediate enclosing classfile
3484 continue;
3485                }
3486            }
3487            break;
3488        }
3489        return false;
3490    }
3491
3492    /**
3493     * Creates and returns a new access rule with the given file pattern and kind.
3494     * <p>
3495     * The rule kind is one of {@link IAccessRule#K_ACCESSIBLE}, {@link IAccessRule#K_DISCOURAGED},
3496     * or {@link IAccessRule#K_NON_ACCESSIBLE}, optionally combined with {@link IAccessRule#IGNORE_IF_BETTER},
3497     * e..g. <code>IAccessRule.K_NON_ACCESSIBLE | IAccessRule.IGNORE_IF_BETTER</code>.
3498     * </p>
3499     *
3500     * @param filePattern the file pattern this access rule should match
3501     * @param kind one of {@link IAccessRule#K_ACCESSIBLE}, {@link IAccessRule#K_DISCOURAGED},
3502     * or {@link IAccessRule#K_NON_ACCESSIBLE}, optionally combined with
3503     * {@link IAccessRule#IGNORE_IF_BETTER}
3504     * @return a new access rule
3505     * @since 3.1
3506     */
3507    public static IAccessRule newAccessRule(IPath filePattern, int kind) {
3508        return new ClasspathAccessRule(filePattern, kind);
3509    }
3510
3511    /**
3512     * Creates and returns a new classpath attribute with the given name and the given value.
3513     *
3514     * @return a new classpath attribute
3515     * @since 3.1
3516     */
3517    public static IClasspathAttribute newClasspathAttribute(String  JavaDoc name, String  JavaDoc value) {
3518        return new ClasspathAttribute(name, value);
3519    }
3520
3521    /**
3522     * Creates and returns a new classpath entry of kind <code>CPE_CONTAINER</code>
3523     * for the given path. This method is fully equivalent to calling
3524     * {@link #newContainerEntry(IPath, IAccessRule[], IClasspathAttribute[], boolean)
3525     * newContainerEntry(containerPath, new IAccessRule[0], new IClasspathAttribute[0], false)}.
3526     * <p>
3527     * @param containerPath the path identifying the container, it must be formed of two
3528     * segments
3529     * @return a new container classpath entry
3530     *
3531     * @see JavaCore#getClasspathContainer(IPath, IJavaProject)
3532     * @since 2.0
3533     */
3534    public static IClasspathEntry newContainerEntry(IPath containerPath) {
3535        return newContainerEntry(
3536        containerPath,
3537        ClasspathEntry.NO_ACCESS_RULES,
3538        ClasspathEntry.NO_EXTRA_ATTRIBUTES,
3539        false/*not exported*/);
3540    }
3541
3542    /**
3543     * Creates and returns a new classpath entry of kind <code>CPE_CONTAINER</code>
3544     * for the given path. This method is fully equivalent to calling
3545     * {@link #newContainerEntry(IPath, IAccessRule[], IClasspathAttribute[], boolean)
3546     * newContainerEntry(containerPath, new IAccessRule[0], new IClasspathAttribute[0], isExported)}.
3547     *
3548     * @param containerPath the path identifying the container, it must be formed of at least
3549     * one segment (ID+hints)
3550     * @param isExported a boolean indicating whether this entry is contributed to dependent
3551     * projects in addition to the output location
3552     * @return a new container classpath entry
3553     *
3554     * @see JavaCore#getClasspathContainer(IPath, IJavaProject)
3555     * @see JavaCore#setClasspathContainer(IPath, IJavaProject[], IClasspathContainer[], IProgressMonitor)
3556     * @since 2.0
3557     */
3558    public static IClasspathEntry newContainerEntry(IPath containerPath, boolean isExported) {
3559        return newContainerEntry(
3560            containerPath,
3561            ClasspathEntry.NO_ACCESS_RULES,
3562            ClasspathEntry.NO_EXTRA_ATTRIBUTES,
3563            isExported);
3564    }
3565
3566    /**
3567     * Creates and returns a new classpath entry of kind <code>CPE_CONTAINER</code>
3568     * for the given path. The path of the container will be used during resolution so as to map this
3569     * container entry to a set of other classpath entries the container is acting for.
3570     * <p>
3571     * A container entry allows to express indirect references to a set of libraries, projects and variable entries,
3572     * which can be interpreted differently for each Java project where it is used.
3573     * A classpath container entry can be resolved using <code>JavaCore.getResolvedClasspathContainer</code>,
3574     * and updated with <code>JavaCore.classpathContainerChanged</code>
3575     * <p>
3576     * A container is exclusively resolved by a <code>ClasspathContainerInitializer</code> registered onto the
3577     * extension point "org.eclipse.jdt.core.classpathContainerInitializer".
3578     * <p>
3579     * A container path must be formed of at least one segment, where: <ul>
3580     * <li> the first segment is a unique ID identifying the target container, there must be a container initializer registered
3581     * onto this ID through the extension point "org.eclipse.jdt.core.classpathContainerInitializer". </li>
3582     * <li> the remaining segments will be passed onto the initializer, and can be used as additional
3583     * hints during the initialization phase. </li>
3584     * </ul>
3585     * <p>
3586     * Example of an ClasspathContainerInitializer for a classpath container denoting a default JDK container:
3587     * <pre>
3588     * containerEntry = JavaCore.newContainerEntry(new Path("MyProvidedJDK/default"));
3589     *
3590     * <extension
3591     * point="org.eclipse.jdt.core.classpathContainerInitializer">
3592     * <containerInitializer
3593     * id="MyProvidedJDK"
3594     * class="com.example.MyInitializer"/>
3595     * </pre>
3596     * <p>
3597     * The access rules determine the set of accessible source and class files
3598     * in the container. If the list of access rules is empty, then all files
3599     * in this container are accessible.
3600     * See {@link IAccessRule} for a detailed description of access
3601     * rules. Note that if an entry defined by the container defines access rules,
3602     * then these access rules are combined with the given access rules.
3603     * The given access rules are considered first, then the entry's access rules are
3604     * considered.
3605     * </p>
3606     * <p>
3607     * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with
3608     * this entry. If no extra attributes are provided, an empty array must be passed in.<br>
3609     * Note that this list should not contain any duplicate name.
3610     * </p>
3611     * <p>
3612     * The <code>isExported</code> flag indicates whether this entry is contributed to dependent
3613     * projects. If not exported, dependent projects will not see any of the classes from this entry.
3614     * If exported, dependent projects will concatenate the accessible files patterns of this entry with the
3615     * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry
3616     * with the non accessible files patterns of the project.
3617     * </p>
3618     * <p>
3619     * Note that this operation does not attempt to validate classpath containers
3620     * or access the resources at the given paths.
3621     * </p>
3622     *
3623     * @param containerPath the path identifying the container, it must be formed of at least
3624     * one segment (ID+hints)
3625     * @param accessRules the possibly empty list of access rules for this entry
3626     * @param extraAttributes the possibly empty list of extra attributes to persist with this entry
3627     * @param isExported a boolean indicating whether this entry is contributed to dependent
3628     * projects in addition to the output location
3629     * @return a new container classpath entry
3630     *
3631     * @see JavaCore#getClasspathContainer(IPath, IJavaProject)
3632     * @see JavaCore#setClasspathContainer(IPath, IJavaProject[], IClasspathContainer[], IProgressMonitor)
3633     * @see JavaCore#newContainerEntry(IPath, boolean)
3634     * @see JavaCore#newAccessRule(IPath, int)
3635     * @since 3.1
3636     */
3637    public static IClasspathEntry newContainerEntry(
3638            IPath containerPath,
3639            IAccessRule[] accessRules,
3640            IClasspathAttribute[] extraAttributes,
3641            boolean isExported) {
3642
3643        if (containerPath == null) {
3644            Assert.isTrue(false, "Container path cannot be null"); //$NON-NLS-1$
3645 } else if (containerPath.segmentCount() < 1) {
3646            Assert.isTrue(
3647                false,
3648                "Illegal classpath container path: \'" + containerPath.makeRelative().toString() + "\', must have at least one segment (containerID+hints)"); //$NON-NLS-1$//$NON-NLS-2$
3649 }
3650        return new ClasspathEntry(
3651            IPackageFragmentRoot.K_SOURCE,
3652            IClasspathEntry.CPE_CONTAINER,
3653            containerPath,
3654            ClasspathEntry.INCLUDE_ALL, // inclusion patterns
3655 ClasspathEntry.EXCLUDE_NONE, // exclusion patterns
3656 null, // source attachment
3657 null, // source attachment root
3658 null, // specific output folder
3659 isExported,
3660            accessRules,
3661            true, // combine access rules
3662 extraAttributes);
3663    }
3664
3665    /**
3666     * Creates and returns a type hierarchy for all types in the given
3667     * region, considering subtypes within that region and considering types in the
3668     * working copies with the given owner.
3669     * In other words, the owner's working copies will take
3670     * precedence over their original compilation units in the workspace.
3671     * <p>
3672     * Note that if a working copy is empty, it will be as if the original compilation
3673     * unit had been deleted.
3674     * <p>
3675     *
3676     * @param monitor the given progress monitor
3677     * @param region the given region
3678     * @param owner the owner of working copies that take precedence over their original compilation units,
3679     * or <code>null</code> if the primary working copy owner should be used
3680     * @exception JavaModelException if an element in the region does not exist or if an
3681     * exception occurs while accessing its corresponding resource
3682     * @exception IllegalArgumentException if region is <code>null</code>
3683     * @return a type hierarchy for all types in the given
3684     * region, considering subtypes within that region
3685     * @since 3.1
3686     */
3687    public static ITypeHierarchy newTypeHierarchy(IRegion region, WorkingCopyOwner owner, IProgressMonitor monitor) throws JavaModelException {
3688        if (region == null) {
3689            throw new IllegalArgumentException  JavaDoc(Messages.hierarchy_nullRegion);
3690        }
3691        ICompilationUnit[] workingCopies = JavaModelManager.getJavaModelManager().getWorkingCopies(owner, true/*add primary working copies*/);
3692        CreateTypeHierarchyOperation op =
3693            new CreateTypeHierarchyOperation(region, workingCopies, null, true/*compute subtypes*/);
3694        op.runOperation(monitor);
3695        return op.getResult();
3696    }
3697
3698    /**
3699     * Creates and returns a new non-exported classpath entry of kind <code>CPE_LIBRARY</code> for the
3700     * JAR or folder identified by the given absolute path. This specifies that all package fragments
3701     * within the root will have children of type <code>IClassFile</code>.
3702     * This method is fully equivalent to calling
3703     * {@link #newLibraryEntry(IPath, IPath, IPath, IAccessRule[], IClasspathAttribute[], boolean)
3704     * newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IClasspathAttribute[0], false)}.
3705     *
3706     * @param path the absolute path of the binary archive
3707     * @param sourceAttachmentPath the absolute path of the corresponding source archive or folder,
3708     * or <code>null</code> if none. Note, since 3.0, an empty path is allowed to denote no source attachment.
3709     * and will be automatically converted to <code>null</code>.
3710     * @param sourceAttachmentRootPath the location of the root of the source files within the source archive or folder
3711     * or <code>null</code> if this location should be automatically detected.
3712     * @return a new library classpath entry
3713     */
3714    public static IClasspathEntry newLibraryEntry(
3715        IPath path,
3716        IPath sourceAttachmentPath,
3717        IPath sourceAttachmentRootPath) {
3718
3719        return newLibraryEntry(
3720            path,
3721            sourceAttachmentPath,
3722            sourceAttachmentRootPath,
3723            ClasspathEntry.NO_ACCESS_RULES,
3724            ClasspathEntry.NO_EXTRA_ATTRIBUTES,
3725            false/*not exported*/);
3726    }
3727
3728    /**
3729     * Creates and returns a new classpath entry of kind <code>CPE_LIBRARY</code> for the JAR or folder
3730     * identified by the given absolute path. This specifies that all package fragments within the root
3731     * will have children of type <code>IClassFile</code>.
3732     * This method is fully equivalent to calling
3733     * {@link #newLibraryEntry(IPath, IPath, IPath, IAccessRule[], IClasspathAttribute[], boolean)
3734     * newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IClasspathAttribute[0], isExported)}.
3735     *
3736     * @param path the absolute path of the binary archive
3737     * @param sourceAttachmentPath the absolute path of the corresponding source archive or folder,
3738     * or <code>null</code> if none. Note, since 3.0, an empty path is allowed to denote no source attachment.
3739     * and will be automatically converted to <code>null</code>.
3740     * @param sourceAttachmentRootPath the location of the root of the source files within the source archive or folder
3741     * or <code>null</code> if this location should be automatically detected.
3742     * @param isExported indicates whether this entry is contributed to dependent
3743     * projects in addition to the output location
3744     * @return a new library classpath entry
3745     * @since 2.0
3746     */
3747    public static IClasspathEntry newLibraryEntry(
3748        IPath path,
3749        IPath sourceAttachmentPath,
3750        IPath sourceAttachmentRootPath,
3751        boolean isExported) {
3752
3753        return newLibraryEntry(
3754            path,
3755            sourceAttachmentPath,
3756            sourceAttachmentRootPath,
3757            ClasspathEntry.NO_ACCESS_RULES,
3758            ClasspathEntry.NO_EXTRA_ATTRIBUTES,
3759            isExported);
3760    }
3761
3762    /**
3763     * Creates and returns a new classpath entry of kind <code>CPE_LIBRARY</code> for the JAR or folder
3764     * identified by the given absolute path. This specifies that all package fragments within the root
3765     * will have children of type <code>IClassFile</code>.
3766     * <p>
3767     * A library entry is used to denote a prerequisite JAR or root folder containing binaries.
3768     * The target JAR can either be defined internally to the workspace (absolute path relative
3769     * to the workspace root) or externally to the workspace (absolute path in the file system).
3770     * The target root folder can only be defined internally to the workspace (absolute path relative
3771     * to the workspace root). To use a binary folder external to the workspace, it must first be
3772     * linked (see IFolder#createLink(...)).
3773     * <p>
3774     * e.g. Here are some examples of binary path usage<ul>
3775     * <li><code> "c:\jdk1.2.2\jre\lib\rt.jar" </code> - reference to an external JAR on Windows</li>
3776     * <li><code> "/Project/someLib.jar" </code> - reference to an internal JAR on Windows or Linux</li>
3777     * <li><code> "/Project/classes/" </code> - reference to an internal binary folder on Windows or Linux</li>
3778     * </ul>
3779     * Note that on non-Windows platform, a path <code>"/some/lib.jar"</code> is ambiguous.
3780     * It can be a path to an external JAR (its file system path being <code>"/some/lib.jar"</code>)
3781     * or it can be a path to an internal JAR (<code>"some"</code> being a project in the workspace).
3782     * Such an ambiguity is solved when the classpath entry is used (e.g. in {@link IJavaProject#getPackageFragmentRoots()}).
3783     * If the resource <code>"lib.jar"</code> exists in project <code>"some"</code>, then it is considered an
3784     * internal JAR. Otherwise it is an external JAR.
3785     * <p>Also note that this operation does not attempt to validate or access the
3786     * resources at the given paths.
3787     * </p><p>
3788     * The access rules determine the set of accessible class files
3789     * in the library. If the list of access rules is empty then all files
3790     * in this library are accessible.
3791     * See {@link IAccessRule} for a detailed description of access
3792     * rules.
3793     * </p>
3794     * <p>
3795     * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with
3796     * this entry. If no extra attributes are provided, an empty array must be passed in.<br>
3797     * Note that this list should not contain any duplicate name.
3798     * </p>
3799     * <p>
3800     * The <code>isExported</code> flag indicates whether this entry is contributed to dependent
3801     * projects. If not exported, dependent projects will not see any of the classes from this entry.
3802     * If exported, dependent projects will concatenate the accessible files patterns of this entry with the
3803     * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry
3804     * with the non accessible files patterns of the project.
3805     * </p>
3806     *
3807     * @param path the absolute path of the binary archive
3808     * @param sourceAttachmentPath the absolute path of the corresponding source archive or folder,
3809     * or <code>null</code> if none. Note, since 3.0, an empty path is allowed to denote no source attachment.
3810     * and will be automatically converted to <code>null</code>.
3811     * @param sourceAttachmentRootPath the location of the root of the source files within the source archive or folder
3812     * or <code>null</code> if this location should be automatically detected.
3813     * @param accessRules the possibly empty list of access rules for this entry
3814     * @param extraAttributes the possibly empty list of extra attributes to persist with this entry
3815     * @param isExported indicates whether this entry is contributed to dependent
3816     * projects in addition to the output location
3817     * @return a new library classpath entry
3818     * @since 3.1
3819     */
3820    public static IClasspathEntry newLibraryEntry(
3821            IPath path,
3822            IPath sourceAttachmentPath,
3823            IPath sourceAttachmentRootPath,
3824            IAccessRule[] accessRules,
3825            IClasspathAttribute[] extraAttributes,
3826            boolean isExported) {
3827
3828        if (path == null) Assert.isTrue(false, "Library path cannot be null"); //$NON-NLS-1$
3829 if (!path.isAbsolute()) Assert.isTrue(false, "Path for IClasspathEntry must be absolute"); //$NON-NLS-1$
3830 if (sourceAttachmentPath != null) {
3831            if (sourceAttachmentPath.isEmpty()) {
3832                sourceAttachmentPath = null; // treat empty path as none
3833 } else if (!sourceAttachmentPath.isAbsolute()) {
3834                Assert.isTrue(false, "Source attachment path '" //$NON-NLS-1$
3835 + sourceAttachmentPath
3836                        + "' for IClasspathEntry must be absolute"); //$NON-NLS-1$
3837 }
3838        }
3839        return new ClasspathEntry(
3840            IPackageFragmentRoot.K_BINARY,
3841            IClasspathEntry.CPE_LIBRARY,
3842            JavaProject.canonicalizedPath(path),
3843            ClasspathEntry.INCLUDE_ALL, // inclusion patterns
3844 ClasspathEntry.EXCLUDE_NONE, // exclusion patterns
3845 sourceAttachmentPath,
3846            sourceAttachmentRootPath,
3847            null, // specific output folder
3848 isExported,
3849            accessRules,
3850            false, // no access rules to combine
3851 extraAttributes);
3852    }
3853
3854    /**
3855     * Creates and returns a new non-exported classpath entry of kind <code>CPE_PROJECT</code>
3856     * for the project identified by the given absolute path.
3857     * This method is fully equivalent to calling
3858     * {@link #newProjectEntry(IPath, IAccessRule[], boolean, IClasspathAttribute[], boolean)
3859     * newProjectEntry(path, new IAccessRule[0], true, new IClasspathAttribute[0], false)}.
3860     *
3861     * @param path the absolute path of the binary archive
3862     * @return a new project classpath entry
3863     */
3864    public static IClasspathEntry newProjectEntry(IPath path) {
3865        return newProjectEntry(path, false);
3866    }
3867
3868    /**
3869     * Creates and returns a new classpath entry of kind <code>CPE_PROJECT</code>
3870     * for the project identified by the given absolute path.
3871     * This method is fully equivalent to calling
3872     * {@link #newProjectEntry(IPath, IAccessRule[], boolean, IClasspathAttribute[], boolean)
3873     * newProjectEntry(path, new IAccessRule[0], true, new IClasspathAttribute[0], isExported)}.
3874     *
3875     * @param path the absolute path of the prerequisite project
3876     * @param isExported indicates whether this entry is contributed to dependent
3877     * projects in addition to the output location
3878     * @return a new project classpath entry
3879     * @since 2.0
3880     */
3881    public static IClasspathEntry newProjectEntry(IPath path, boolean isExported) {
3882
3883        if (!path.isAbsolute()) Assert.isTrue(false, "Path for IClasspathEntry must be absolute"); //$NON-NLS-1$
3884
3885        return newProjectEntry(
3886            path,
3887            ClasspathEntry.NO_ACCESS_RULES,
3888            true,
3889            ClasspathEntry.NO_EXTRA_ATTRIBUTES,
3890            isExported);
3891    }
3892
3893    /**
3894     * Creates and returns a new classpath entry of kind <code>CPE_PROJECT</code>
3895     * for the project identified by the given absolute path.
3896     * <p>
3897     * A project entry is used to denote a prerequisite project on a classpath.
3898     * The referenced project will be contributed as a whole, either as sources (in the Java Model, it
3899     * contributes all its package fragment roots) or as binaries (when building, it contributes its
3900     * whole output location).
3901     * </p>
3902     * <p>
3903     * A project reference allows to indirect through another project, independently from its internal layout.
3904     * </p><p>
3905     * The prerequisite project is referred to using an absolute path relative to the workspace root.
3906     * </p>
3907     * <p>
3908     * The access rules determine the set of accessible class files
3909     * in the project. If the list of access rules is empty then all files
3910     * in this project are accessible.
3911     * See {@link IAccessRule} for a detailed description of access rules.
3912     * </p>
3913     * <p>
3914     * The <code>combineAccessRules</code> flag indicates whether access rules of one (or more)
3915     * exported entry of the project should be combined with the given access rules. If they should
3916     * be combined, the given access rules are considered first, then the entry's access rules are
3917     * considered.
3918     * </p>
3919     * <p>
3920     * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with
3921     * this entry. If no extra attributes are provided, an empty array must be passed in.<br>
3922     * Note that this list should not contain any duplicate name.
3923     * </p>
3924     * <p>
3925     * The <code>isExported</code> flag indicates whether this entry is contributed to dependent
3926     * projects. If not exported, dependent projects will not see any of the classes from this entry.
3927     * If exported, dependent projects will concatenate the accessible files patterns of this entry with the
3928     * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry
3929     * with the non accessible files patterns of the project.
3930     * </p>
3931     *
3932     * @param path the absolute path of the prerequisite project
3933     * @param accessRules the possibly empty list of access rules for this entry
3934     * @param combineAccessRules whether the access rules of the project's exported entries should be combined with the given access rules
3935     * @param extraAttributes the possibly empty list of extra attributes to persist with this entry
3936     * @param isExported indicates whether this entry is contributed to dependent
3937     * projects in addition to the output location
3938     * @return a new project classpath entry
3939     * @since 3.1
3940     */
3941    public static IClasspathEntry newProjectEntry(
3942            IPath path,
3943            IAccessRule[] accessRules,
3944            boolean combineAccessRules,
3945            IClasspathAttribute[] extraAttributes,
3946            boolean isExported) {
3947
3948        if (!path.isAbsolute()) Assert.isTrue(false, "Path for IClasspathEntry must be absolute"); //$NON-NLS-1$
3949
3950        return new ClasspathEntry(
3951            IPackageFragmentRoot.K_SOURCE,
3952            IClasspathEntry.CPE_PROJECT,
3953            path,
3954            ClasspathEntry.INCLUDE_ALL, // inclusion patterns
3955 ClasspathEntry.EXCLUDE_NONE, // exclusion patterns
3956 null, // source attachment
3957 null, // source attachment root
3958 null, // specific output folder
3959 isExported,
3960            accessRules,
3961            combineAccessRules,
3962            extraAttributes);
3963    }
3964
3965    /**
3966     * Returns a new empty region.
3967     *
3968     * @return a new empty region
3969     */
3970    public static IRegion newRegion() {
3971        return new Region();
3972    }
3973
3974    /**
3975     * Creates and returns a new classpath entry of kind <code>CPE_SOURCE</code>
3976     * for all files in the project's source folder identified by the given
3977     * absolute workspace-relative path.
3978     * <p>
3979     * The convenience method is fully equivalent to:
3980     * <pre>
3981     * newSourceEntry(path, new IPath[] {}, new IPath[] {}, null);
3982     * </pre>
3983     * </p>
3984     *
3985     * @param path the absolute workspace-relative path of a source folder
3986     * @return a new source classpath entry
3987     * @see #newSourceEntry(IPath, IPath[], IPath[], IPath)
3988     */
3989    public static IClasspathEntry newSourceEntry(IPath path) {
3990
3991        return newSourceEntry(path, ClasspathEntry.INCLUDE_ALL, ClasspathEntry.EXCLUDE_NONE, null /*output location*/);
3992    }
3993
3994    /**
3995     * Creates and returns a new classpath entry of kind <code>CPE_SOURCE</code>
3996     * for the project's source folder identified by the given absolute
3997     * workspace-relative path but excluding all source files with paths
3998     * matching any of the given patterns.
3999     * <p>
4000     * The convenience method is fully equivalent to:
4001     * <pre>
4002     * newSourceEntry(path, new IPath[] {}, exclusionPatterns, null);
4003     * </pre>
4004     * </p>
4005     *
4006     * @param path the absolute workspace-relative path of a source folder
4007     * @param exclusionPatterns the possibly empty list of exclusion patterns
4008     * represented as relative paths
4009     * @return a new source classpath entry
4010     * @see #newSourceEntry(IPath, IPath[], IPath[], IPath)
4011     * @since 2.1
4012     */
4013    public static IClasspathEntry newSourceEntry(IPath path, IPath[] exclusionPatterns) {
4014
4015        return newSourceEntry(path, ClasspathEntry.INCLUDE_ALL, exclusionPatterns, null /*output location*/);
4016    }
4017
4018    /**
4019     * Creates and returns a new classpath entry of kind <code>CPE_SOURCE</code>
4020     * for the project's source folder identified by the given absolute
4021     * workspace-relative path but excluding all source files with paths
4022     * matching any of the given patterns, and associated with a specific output location
4023     * (that is, ".class" files are not going to the project default output location).
4024     * <p>
4025     * The convenience method is fully equivalent to:
4026     * <pre>
4027     * newSourceEntry(path, new IPath[] {}, exclusionPatterns, specificOutputLocation);
4028     * </pre>
4029     * </p>
4030     *
4031     * @param path the absolute workspace-relative path of a source folder
4032     * @param exclusionPatterns the possibly empty list of exclusion patterns
4033     * represented as relative paths
4034     * @param specificOutputLocation the specific output location for this source entry (<code>null</code> if using project default ouput location)
4035     * @return a new source classpath entry
4036     * @see #newSourceEntry(IPath, IPath[], IPath[], IPath)
4037     * @since 2.1
4038     */
4039    public static IClasspathEntry newSourceEntry(IPath path, IPath[] exclusionPatterns, IPath specificOutputLocation) {
4040
4041        return newSourceEntry(path, ClasspathEntry.INCLUDE_ALL, exclusionPatterns, specificOutputLocation);
4042    }
4043
4044    /**
4045     * Creates and returns a new classpath entry of kind <code>CPE_SOURCE</code>
4046     * for the project's source folder identified by the given absolute
4047     * workspace-relative path but excluding all source files with paths
4048     * matching any of the given patterns, and associated with a specific output location
4049     * (that is, ".class" files are not going to the project default output location).
4050     * <p>
4051     * The convenience method is fully equivalent to:
4052     * <pre>
4053     * newSourceEntry(path, new IPath[] {}, exclusionPatterns, specificOutputLocation, new IClasspathAttribute[] {});
4054     * </pre>
4055     * </p>
4056     *
4057     * @param path the absolute workspace-relative path of a source folder
4058     * @param inclusionPatterns the possibly empty list of inclusion patterns
4059     * represented as relative paths
4060     * @param exclusionPatterns the possibly empty list of exclusion patterns
4061     * represented as relative paths
4062     * @param specificOutputLocation the specific output location for this source entry (<code>null</code> if using project default ouput location)
4063     * @return a new source classpath entry
4064     * @see #newSourceEntry(IPath, IPath[], IPath[], IPath, IClasspathAttribute[])
4065     * @since 3.0
4066     */
4067    public static IClasspathEntry newSourceEntry(IPath path, IPath[] inclusionPatterns, IPath[] exclusionPatterns, IPath specificOutputLocation) {
4068        return newSourceEntry(path, inclusionPatterns, exclusionPatterns, specificOutputLocation, ClasspathEntry.NO_EXTRA_ATTRIBUTES);
4069    }
4070
4071    /**
4072     * Creates and returns a new classpath entry of kind <code>CPE_SOURCE</code>
4073     * for the project's source folder identified by the given absolute
4074     * workspace-relative path using the given inclusion and exclusion patterns
4075     * to determine which source files are included, and the given output path
4076     * to control the output location of generated files.
4077     * <p>
4078     * The source folder is referred to using an absolute path relative to the
4079     * workspace root, e.g. <code>/Project/src</code>. A project's source
4080     * folders are located with that project. That is, a source classpath
4081     * entry specifying the path <code>/P1/src</code> is only usable for
4082     * project <code>P1</code>.
4083     * </p>
4084     * <p>
4085     * The inclusion patterns determines the initial set of source files that
4086     * are to be included; the exclusion patterns are then used to reduce this
4087     * set. When no inclusion patterns are specified, the initial file set
4088     * includes all relevent files in the resource tree rooted at the source
4089     * entry's path. On the other hand, specifying one or more inclusion
4090     * patterns means that all <b>and only</b> files matching at least one of
4091     * the specified patterns are to be included. If exclusion patterns are
4092     * specified, the initial set of files is then reduced by eliminating files
4093     * matched by at least one of the exclusion patterns. Inclusion and
4094     * exclusion patterns look like relative file paths with wildcards and are
4095     * interpreted relative to the source entry's path. File patterns are
4096     * case-sensitive can contain '**', '*' or '?' wildcards (see
4097     * {@link IClasspathEntry#getExclusionPatterns()} for the full description
4098     * of their syntax and semantics). The resulting set of files are included
4099     * in the corresponding package fragment root; all package fragments within
4100     * the root will have children of type <code>ICompilationUnit</code>.
4101     * </p>
4102     * <p>
4103     * For example, if the source folder path is
4104     * <code>/Project/src</code>, there are no inclusion filters, and the
4105     * exclusion pattern is
4106     * <code>com/xyz/tests/**</code>, then source files
4107     * like <code>/Project/src/com/xyz/Foo.java</code>
4108     * and <code>/Project/src/com/xyz/utils/Bar.java</code> would be included,
4109     * whereas <code>/Project/src/com/xyz/tests/T1.java</code>
4110     * and <code>/Project/src/com/xyz/tests/quick/T2.java</code> would be
4111     * excluded.
4112     * </p>
4113     * <p>
4114     * Additionally, a source entry can be associated with a specific output location.
4115     * By doing so, the Java builder will ensure that the generated ".class" files will
4116     * be issued inside this output location, as opposed to be generated into the
4117     * project default output location (when output location is <code>null</code>).
4118     * Note that multiple source entries may target the same output location.
4119     * The output location is referred to using an absolute path relative to the
4120     * workspace root, e.g. <code>"/Project/bin"</code>, it must be located inside
4121     * the same project as the source folder.
4122     * </p>
4123     * <p>
4124     * Also note that all sources/binaries inside a project are contributed as
4125     * a whole through a project entry
4126     * (see <code>JavaCore.newProjectEntry</code>). Particular source entries
4127     * cannot be selectively exported.
4128     * </p>
4129     * <p>
4130     * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with
4131     * this entry. If no extra attributes are provided, an empty array must be passed in.<br>
4132     * Note that this list should not contain any duplicate name.
4133     * </p>
4134     *
4135     * @param path the absolute workspace-relative path of a source folder
4136     * @param inclusionPatterns the possibly empty list of inclusion patterns
4137     * represented as relative paths
4138     * @param exclusionPatterns the possibly empty list of exclusion patterns
4139     * represented as relative paths
4140     * @param specificOutputLocation the specific output location for this source entry (<code>null</code> if using project default ouput location)
4141     * @param extraAttributes the possibly empty list of extra attributes to persist with this entry
4142     * @return a new source classpath entry with the given exclusion patterns
4143     * @see IClasspathEntry#getInclusionPatterns()
4144     * @see IClasspathEntry#getExclusionPatterns()
4145     * @see IClasspathEntry#getOutputLocation()
4146     * @since 3.1
4147     */
4148    public static IClasspathEntry newSourceEntry(IPath path, IPath[] inclusionPatterns, IPath[] exclusionPatterns, IPath specificOutputLocation, IClasspathAttribute[] extraAttributes) {
4149
4150        if (path == null) Assert.isTrue(false, "Source path cannot be null"); //$NON-NLS-1$
4151 if (!path.isAbsolute()) Assert.isTrue(false, "Path for IClasspathEntry must be absolute"); //$NON-NLS-1$
4152 if (exclusionPatterns == null) Assert.isTrue(false, "Exclusion pattern set cannot be null"); //$NON-NLS-1$
4153 if (inclusionPatterns == null) Assert.isTrue(false, "Inclusion pattern set cannot be null"); //$NON-NLS-1$
4154
4155        return new ClasspathEntry(
4156            IPackageFragmentRoot.K_SOURCE,
4157            IClasspathEntry.CPE_SOURCE,
4158            path,
4159            inclusionPatterns,
4160            exclusionPatterns,
4161            null, // source attachment
4162 null, // source attachment root
4163 specificOutputLocation, // custom output location
4164 false,
4165            null,
4166            false, // no access rules to combine
4167 extraAttributes);
4168    }
4169
4170    /**
4171     * Creates and returns a new non-exported classpath entry of kind <code>CPE_VARIABLE</code>
4172     * for the given path. This method is fully equivalent to calling
4173     * {@link #newVariableEntry(IPath, IPath, IPath, IAccessRule[], IClasspathAttribute[], boolean)
4174     * newVariableEntry(variablePath, variableSourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IClasspathAttribute[0], false)}.
4175     *
4176     * @param variablePath the path of the binary archive; first segment is the
4177     * name of a classpath variable
4178     * @param variableSourceAttachmentPath the path of the corresponding source archive,
4179     * or <code>null</code> if none; if present, the first segment is the
4180     * name of a classpath variable (not necessarily the same variable
4181     * as the one that begins <code>variablePath</code>)
4182     * @param sourceAttachmentRootPath the location of the root of the source files within the source archive
4183     * or <code>null</code> if <code>variableSourceAttachmentPath</code> is also <code>null</code>
4184     * @return a new library classpath entry
4185     */
4186    public static IClasspathEntry newVariableEntry(
4187        IPath variablePath,
4188        IPath variableSourceAttachmentPath,
4189        IPath sourceAttachmentRootPath) {
4190
4191        return newVariableEntry(variablePath, variableSourceAttachmentPath, sourceAttachmentRootPath, false);
4192    }
4193
4194    /**
4195     * Creates and returns a new classpath entry of kind <code>CPE_VARIABLE</code>
4196     * for the given path. This method is fully equivalent to calling
4197     * {@link #newVariableEntry(IPath, IPath, IPath, IAccessRule[], IClasspathAttribute[], boolean)
4198     * newVariableEntry(variablePath, variableSourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IClasspathAttribute[0], isExported)}.
4199     *
4200     * @param variablePath the path of the binary archive; first segment is the
4201     * name of a classpath variable
4202     * @param variableSourceAttachmentPath the path of the corresponding source archive,
4203     * or <code>null</code> if none; if present, the first segment is the
4204     * name of a classpath variable (not necessarily the same variable
4205     * as the one that begins <code>variablePath</code>)
4206     * @param variableSourceAttachmentRootPath the location of the root of the source files within the source archive
4207     * or <code>null</code> if <code>variableSourceAttachmentPath</code> is also <code>null</code>
4208     * @param isExported indicates whether this entry is contributed to dependent
4209     * projects in addition to the output location
4210     * @return a new variable classpath entry
4211     * @since 2.0
4212     */
4213    public static IClasspathEntry newVariableEntry(
4214            IPath variablePath,
4215            IPath variableSourceAttachmentPath,
4216            IPath variableSourceAttachmentRootPath,
4217            boolean isExported) {
4218
4219        return newVariableEntry(
4220            variablePath,
4221            variableSourceAttachmentPath,
4222            variableSourceAttachmentRootPath,
4223            ClasspathEntry.NO_ACCESS_RULES,
4224            ClasspathEntry.NO_EXTRA_ATTRIBUTES,
4225            isExported);
4226    }
4227
4228    /**
4229     * Creates and returns a new classpath entry of kind <code>CPE_VARIABLE</code>
4230     * for the given path. The first segment of the path is the name of a classpath variable.
4231     * The trailing segments of the path will be appended to resolved variable path.
4232     * <p>
4233     * A variable entry allows to express indirect references on a classpath to other projects or libraries,
4234     * depending on what the classpath variable is referring.
4235     * <p>
4236     * It is possible to register an automatic initializer (<code>ClasspathVariableInitializer</code>),
4237     * which will be invoked through the extension point "org.eclipse.jdt.core.classpathVariableInitializer".
4238     * After resolution, a classpath variable entry may either correspond to a project or a library entry.
4239     * <p>
4240     * e.g. Here are some examples of variable path usage<ul>
4241     * <li> "JDTCORE" where variable <code>JDTCORE</code> is
4242     * bound to "c:/jars/jdtcore.jar". The resolved classpath entry is denoting the library "c:\jars\jdtcore.jar"</li>
4243     * <li> "JDTCORE" where variable <code>JDTCORE</code> is
4244     * bound to "/Project_JDTCORE". The resolved classpath entry is denoting the project "/Project_JDTCORE"</li>
4245     * <li> "PLUGINS/com.example/example.jar" where variable <code>PLUGINS</code>
4246     * is bound to "c:/eclipse/plugins". The resolved classpath entry is denoting the library "c:\eclipse\plugins\com.example\example.jar"</li>
4247     * </ul>
4248     * <p>
4249     * The access rules determine the set of accessible class files
4250     * in the project or library. If the list of access rules is empty then all files
4251     * in this project or library are accessible.
4252     * See {@link IAccessRule} for a detailed description of access rules.
4253     * </p>
4254     * <p>
4255     * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with
4256     * this entry. If no extra attributes are provided, an empty array must be passed in.<br>
4257     * Note that this list should not contain any duplicate name.
4258     * </p>
4259     * <p>
4260     * The <code>isExported</code> flag indicates whether this entry is contributed to dependent
4261     * projects. If not exported, dependent projects will not see any of the classes from this entry.
4262     * If exported, dependent projects will concatenate the accessible files patterns of this entry with the
4263     * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry
4264     * with the non accessible files patterns of the project.
4265     * </p>
4266     * <p>
4267     * Note that this operation does not attempt to validate classpath variables
4268     * or access the resources at the given paths.
4269     * </p>
4270     *
4271     * @param variablePath the path of the binary archive; first segment is the
4272     * name of a classpath variable
4273     * @param variableSourceAttachmentPath the path of the corresponding source archive,
4274     * or <code>null</code> if none; if present, the first segment is the
4275     * name of a classpath variable (not necessarily the same variable
4276     * as the one that begins <code>variablePath</code>)
4277     * @param variableSourceAttachmentRootPath the location of the root of the source files within the source archive
4278     * or <code>null</code> if <code>variableSourceAttachmentPath</code> is also <code>null</code>
4279     * @param accessRules the possibly empty list of access rules for this entry
4280     * @param extraAttributes the possibly empty list of extra attributes to persist with this entry
4281     * @param isExported indicates whether this entry is contributed to dependent
4282     * projects in addition to the output location
4283     * @return a new variable classpath entry
4284     * @since 3.1
4285     */
4286    public static IClasspathEntry newVariableEntry(
4287            IPath variablePath,
4288            IPath variableSourceAttachmentPath,
4289            IPath variableSourceAttachmentRootPath,
4290            IAccessRule[] accessRules,
4291            IClasspathAttribute[] extraAttributes,
4292            boolean isExported) {
4293
4294        if (variablePath == null) Assert.isTrue(false, "Variable path cannot be null"); //$NON-NLS-1$
4295 if (variablePath.segmentCount() < 1) {
4296            Assert.isTrue(
4297                false,
4298                "Illegal classpath variable path: \'" + variablePath.makeRelative().toString() + "\', must have at least one segment"); //$NON-NLS-1$//$NON-NLS-2$
4299 }
4300
4301        return new ClasspathEntry(
4302            IPackageFragmentRoot.K_SOURCE,
4303            IClasspathEntry.CPE_VARIABLE,
4304            variablePath,
4305            ClasspathEntry.INCLUDE_ALL, // inclusion patterns
4306 ClasspathEntry.EXCLUDE_NONE, // exclusion patterns
4307 variableSourceAttachmentPath, // source attachment
4308 variableSourceAttachmentRootPath, // source attachment root
4309 null, // specific output folder
4310 isExported,
4311            accessRules,
4312            false, // no access rules to combine
4313 extraAttributes);
4314    }
4315    /**
4316     * Removed the given classpath variable. Does nothing if no value was
4317     * set for this classpath variable.
4318     * <p>
4319     * This functionality cannot be used while the resource tree is locked.
4320     * <p>
4321     * Classpath variable values are persisted locally to the workspace, and
4322     * are preserved from session to session.
4323     * <p>
4324     *
4325     * @param variableName the name of the classpath variable
4326     * @see #setClasspathVariable(String, IPath)
4327     *
4328     * @deprecated Use {@link #removeClasspathVariable(String, IProgressMonitor)} instead
4329     */
4330    public static void removeClasspathVariable(String  JavaDoc variableName) {
4331        removeClasspathVariable(variableName, null);
4332    }
4333
4334    /**
4335     * Removed the given classpath variable. Does nothing if no value was
4336     * set for this classpath variable.
4337     * <p>
4338     * This functionality cannot be used while the resource tree is locked.
4339     * <p>
4340     * Classpath variable values are persisted locally to the workspace, and
4341     * are preserved from session to session.
4342     * <p>
4343     *
4344     * @param variableName the name of the classpath variable
4345     * @param monitor the progress monitor to report progress
4346     * @see #setClasspathVariable(String, IPath)
4347     */
4348    public static void removeClasspathVariable(String  JavaDoc variableName, IProgressMonitor monitor) {
4349        try {
4350            SetVariablesOperation operation = new SetVariablesOperation(new String  JavaDoc[]{ variableName}, new IPath[]{ null }, true/*update preferences*/);
4351            operation.runOperation(monitor);
4352        } catch (JavaModelException e) {
4353            Util.log(e, "Exception while removing variable " + variableName); //$NON-NLS-1$
4354 }
4355    }
4356
4357    /**
4358     * Removes the given element changed listener.
4359     * Has no affect if an identical listener is not registered.
4360     *
4361     * @param listener the listener
4362     */
4363    public static void removeElementChangedListener(IElementChangedListener listener) {
4364        JavaModelManager.getJavaModelManager().deltaState.removeElementChangedListener(listener);
4365    }
4366
4367    /**
4368     * Removes the file extension from the given file name, if it has a Java-like file
4369     * extension. Otherwise the file name itself is returned.
4370     * Note this removes the dot ('.') before the extension as well.
4371     *
4372     * @param fileName the name of a file
4373     * @return the fileName without the Java-like extension
4374     * @since 3.2
4375     */
4376    public static String  JavaDoc removeJavaLikeExtension(String  JavaDoc fileName) {
4377        return Util.getNameWithoutJavaLikeExtension(fileName);
4378    }
4379
4380    /**
4381     * Removes the given pre-processing resource changed listener.
4382     * <p>
4383     * Has no affect if an identical listener is not registered.
4384     *
4385     * @param listener the listener
4386     * @since 3.0
4387     */
4388    public static void removePreProcessingResourceChangedListener(IResourceChangeListener listener) {
4389        JavaModelManager.getJavaModelManager().deltaState.removePreResourceChangedListener(listener);
4390    }
4391
4392
4393
4394    /**
4395     * Runs the given action as an atomic Java model operation.
4396     * <p>
4397     * After running a method that modifies java elements,
4398     * registered listeners receive after-the-fact notification of
4399     * what just transpired, in the form of a element changed event.
4400     * This method allows clients to call a number of
4401     * methods that modify java elements and only have element
4402     * changed event notifications reported at the end of the entire
4403     * batch.
4404     * </p>
4405     * <p>
4406     * If this method is called outside the dynamic scope of another such
4407     * call, this method runs the action and then reports a single
4408     * element changed event describing the net effect of all changes
4409     * done to java elements by the action.
4410     * </p>
4411     * <p>
4412     * If this method is called in the dynamic scope of another such
4413     * call, this method simply runs the action.
4414     * </p>
4415     *
4416     * @param action the action to perform
4417     * @param monitor a progress monitor, or <code>null</code> if progress
4418     * reporting and cancellation are not desired
4419     * @exception CoreException if the operation failed.
4420     * @since 2.1
4421     */
4422    public static void run(IWorkspaceRunnable action, IProgressMonitor monitor) throws CoreException {
4423        run(action, ResourcesPlugin.getWorkspace().getRoot(), monitor);
4424    }
4425    /**
4426     * Runs the given action as an atomic Java model operation.
4427     * <p>
4428     * After running a method that modifies java elements,
4429     * registered listeners receive after-the-fact notification of
4430     * what just transpired, in the form of a element changed event.
4431     * This method allows clients to call a number of
4432     * methods that modify java elements and only have element
4433     * changed event notifications reported at the end of the entire
4434     * batch.
4435     * </p>
4436     * <p>
4437     * If this method is called outside the dynamic scope of another such
4438     * call, this method runs the action and then reports a single
4439     * element changed event describing the net effect of all changes
4440     * done to java elements by the action.
4441     * </p>
4442     * <p>
4443     * If this method is called in the dynamic scope of another such
4444     * call, this method simply runs the action.
4445     * </p>
4446     * <p>
4447     * The supplied scheduling rule is used to determine whether this operation can be
4448     * run simultaneously with workspace changes in other threads. See
4449     * <code>IWorkspace.run(...)</code> for more details.
4450     * </p>
4451     *
4452     * @param action the action to perform
4453     * @param rule the scheduling rule to use when running this operation, or
4454     * <code>null</code> if there are no scheduling restrictions for this operation.
4455     * @param monitor a progress monitor, or <code>null</code> if progress
4456     * reporting and cancellation are not desired
4457     * @exception CoreException if the operation failed.
4458     * @since 3.0
4459     */
4460    public static void run(IWorkspaceRunnable action, ISchedulingRule rule, IProgressMonitor monitor) throws CoreException {
4461        IWorkspace workspace = ResourcesPlugin.getWorkspace();
4462        if (workspace.isTreeLocked()) {
4463            new BatchOperation(action).run(monitor);
4464        } else {
4465            // use IWorkspace.run(...) to ensure that a build will be done in autobuild mode
4466 workspace.run(new BatchOperation(action), rule, IWorkspace.AVOID_UPDATE, monitor);
4467        }
4468    }
4469    /**
4470     * Bind a container reference path to some actual containers (<code>IClasspathContainer</code>).
4471     * This API must be invoked whenever changes in container need to be reflected onto the JavaModel.
4472     * Containers can have distinct values in different projects, therefore this API considers a
4473     * set of projects with their respective containers.
4474     * <p>
4475     * <code>containerPath</code> is the path under which these values can be referenced through
4476     * container classpath entries (<code>IClasspathEntry#CPE_CONTAINER</code>). A container path
4477     * is formed by a first ID segment followed with extra segments, which can be used as additional hints
4478     * for the resolution. The container ID is used to identify a <code>ClasspathContainerInitializer</code>
4479     * registered on the extension point "org.eclipse.jdt.core.classpathContainerInitializer".
4480     * <p>
4481     * There is no assumption that each individual container value passed in argument
4482     * (<code>respectiveContainers</code>) must answer the exact same path when requested
4483     * <code>IClasspathContainer#getPath</code>.
4484     * Indeed, the containerPath is just an indication for resolving it to an actual container object. It can be
4485     * delegated to a <code>ClasspathContainerInitializer</code>, which can be activated through the extension
4486     * point "org.eclipse.jdt.core.ClasspathContainerInitializer").
4487     * <p>
4488     * In reaction to changing container values, the JavaModel will be updated to reflect the new
4489     * state of the updated container. A combined Java element delta will be notified to describe the corresponding
4490     * classpath changes resulting from the container update. This operation is batched, and automatically eliminates
4491     * unnecessary updates (new container is same as old one). This operation acquires a lock on the workspace's root.
4492     * <p>
4493     * This functionality cannot be used while the workspace is locked, since
4494     * it may create/remove some resource markers.
4495     * <p>
4496     * Classpath container values are persisted locally to the workspace, but
4497     * are not preserved from a session to another. It is thus highly recommended to register a
4498     * <code>ClasspathContainerInitializer</code> for each referenced container
4499     * (through the extension point "org.eclipse.jdt.core.ClasspathContainerInitializer").
4500     * <p>
4501     * Note: setting a container to <code>null</code> will cause it to be lazily resolved again whenever
4502     * its value is required. In particular, this will cause a registered initializer to be invoked
4503     * again.
4504     * <p>
4505     * @param containerPath - the name of the container reference, which is being updated
4506     * @param affectedProjects - the set of projects for which this container is being bound
4507     * @param respectiveContainers - the set of respective containers for the affected projects
4508     * @param monitor a monitor to report progress
4509     * @throws JavaModelException
4510     * @see ClasspathContainerInitializer
4511     * @see #getClasspathContainer(IPath, IJavaProject)
4512     * @see IClasspathContainer
4513     * @since 2.0
4514     */
4515    public static void setClasspathContainer(IPath containerPath, IJavaProject[] affectedProjects, IClasspathContainer[] respectiveContainers, IProgressMonitor monitor) throws JavaModelException {
4516        if (affectedProjects.length != respectiveContainers.length)
4517            Assert.isTrue(false, "Projects and containers collections should have the same size"); //$NON-NLS-1$
4518 SetContainerOperation operation = new SetContainerOperation(containerPath, affectedProjects, respectiveContainers);
4519        operation.runOperation(monitor);
4520    }
4521
4522    /**
4523     * Sets the value of the given classpath variable.
4524     * The path must have at least one segment.
4525     * <p>
4526     * This functionality cannot be used while the resource tree is locked.
4527     * <p>
4528     * Classpath variable values are persisted locally to the workspace, and
4529     * are preserved from session to session.
4530     * <p>
4531     *
4532     * @param variableName the name of the classpath variable
4533     * @param path the path
4534     * @throws JavaModelException
4535     * @see #getClasspathVariable(String)
4536     *
4537     * @deprecated Use {@link #setClasspathVariable(String, IPath, IProgressMonitor)} instead
4538     */
4539    public static void setClasspathVariable(String  JavaDoc variableName, IPath path)
4540        throws JavaModelException {
4541
4542        setClasspathVariable(variableName, path, null);
4543    }
4544
4545    /**
4546     * Sets the value of the given classpath variable.
4547     * The path must not be null.
4548     * <p>
4549     * This functionality cannot be used while the resource tree is locked.
4550     * <p>
4551     * Classpath variable values are persisted locally to the workspace, and
4552     * are preserved from session to session.
4553     * <p>
4554     * Updating a variable with the same value has no effect.
4555     *
4556     * @param variableName the name of the classpath variable
4557     * @param path the path
4558     * @param monitor a monitor to report progress
4559     * @throws JavaModelException
4560     * @see #getClasspathVariable(String)
4561     */
4562    public static void setClasspathVariable(
4563        String  JavaDoc variableName,
4564        IPath path,
4565        IProgressMonitor monitor)
4566        throws JavaModelException {
4567
4568        if (path == null) Assert.isTrue(false, "Variable path cannot be null"); //$NON-NLS-1$
4569 setClasspathVariables(new String  JavaDoc[]{variableName}, new IPath[]{ path }, monitor);
4570    }
4571
4572    /**
4573     * Sets the values of all the given classpath variables at once.
4574     * Null paths can be used to request corresponding variable removal.
4575     * <p>
4576     * A combined Java element delta will be notified to describe the corresponding
4577     * classpath changes resulting from the variables update. This operation is batched,
4578     * and automatically eliminates unnecessary updates (new variable is same as old one).
4579     * This operation acquires a lock on the workspace's root.
4580     * <p>
4581     * This functionality cannot be used while the workspace is locked, since
4582     * it may create/remove some resource markers.
4583     * <p>
4584     * Classpath variable values are persisted locally to the workspace, and
4585     * are preserved from session to session.
4586     * <p>
4587     * Updating a variable with the same value has no effect.
4588     *
4589     * @param variableNames an array of names for the updated classpath variables
4590     * @param paths an array of path updates for the modified classpath variables (null
4591     * meaning that the corresponding value will be removed
4592     * @param monitor a monitor to report progress
4593     * @throws JavaModelException
4594     * @see #getClasspathVariable(String)
4595     * @since 2.0
4596     */
4597    public static void setClasspathVariables(
4598        String  JavaDoc[] variableNames,
4599        IPath[] paths,
4600        IProgressMonitor monitor)
4601        throws JavaModelException {
4602
4603        if (variableNames.length != paths.length) Assert.isTrue(false, "Variable names and paths collections should have the same size"); //$NON-NLS-1$
4604 SetVariablesOperation operation = new SetVariablesOperation(variableNames, paths, true/*update preferences*/);
4605        operation.runOperation(monitor);
4606    }
4607
4608    /**
4609     * Sets the default's compiler options inside the given options map according
4610     * to the given compliance.
4611     *
4612     * <p>The given compliance must be one of the compliance supported by the compiler.
4613     * See {@link #getDefaultOptions()} for a list of compliance values.</p>
4614     *
4615     * <p>The list of modified options is:</p>
4616     * <ul>
4617     * <li>{@link #COMPILER_CODEGEN_TARGET_PLATFORM}</li>
4618     * <li>{@link #COMPILER_SOURCE}</li>
4619     * <li>{@link #COMPILER_COMPLIANCE}</li>
4620     * <li>{@link #COMPILER_PB_ASSERT_IDENTIFIER}</li>
4621     * <li>{@link #COMPILER_PB_ENUM_IDENTIFIER}</li>
4622     * </ul>
4623     *
4624     * <p>If the given compliance is unknown, the given map is unmodified.</p>
4625     *
4626     * @param compliance the given compliance
4627     * @param options the given options map
4628     * @since 3.3
4629     */
4630    public static void setComplianceOptions(String  JavaDoc compliance, Map  JavaDoc options) {
4631        switch((int) (CompilerOptions.versionToJdkLevel(compliance) >>> 16)) {
4632            case ClassFileConstants.MAJOR_VERSION_1_3:
4633                options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_3);
4634                options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
4635                options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_1);
4636                options.put(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.IGNORE);
4637                options.put(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.IGNORE);
4638                break;
4639            case ClassFileConstants.MAJOR_VERSION_1_4:
4640                options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_4);
4641                options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_3);
4642                options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_2);
4643                options.put(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.WARNING);
4644                options.put(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.WARNING);
4645                break;
4646            case ClassFileConstants.MAJOR_VERSION_1_5:
4647                options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5);
4648                options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5);
4649                options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_5);
4650                options.put(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
4651                options.put(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);
4652                options.put(JavaCore.COMPILER_CODEGEN_INLINE_JSR_BYTECODE, JavaCore.ENABLED);
4653                break;
4654            case ClassFileConstants.MAJOR_VERSION_1_6:
4655                options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_6);
4656                options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_6);
4657                options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_6);
4658                options.put(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
4659                options.put(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);
4660                options.put(JavaCore.COMPILER_CODEGEN_INLINE_JSR_BYTECODE, JavaCore.ENABLED);
4661                break;
4662            case ClassFileConstants.MAJOR_VERSION_1_7:
4663                options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7);
4664                options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7);
4665                options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7);
4666                options.put(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
4667                options.put(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);
4668                options.put(JavaCore.COMPILER_CODEGEN_INLINE_JSR_BYTECODE, JavaCore.ENABLED);
4669        }
4670    }
4671
4672    /**
4673     * Sets the current table of options. All and only the options explicitly
4674     * included in the given table are remembered; all previous option settings
4675     * are forgotten, including ones not explicitly mentioned.
4676     * <p>
4677     * For a complete description of the configurable options, see
4678     * <code>getDefaultOptions</code>.
4679     * </p>
4680     *
4681     * @param newOptions
4682     * the new options (key type: <code>String</code>; value type:
4683     * <code>String</code>), or <code>null</code> to reset all
4684     * options to their default values
4685     * @see JavaCore#getDefaultOptions()
4686     * @see JavaCorePreferenceInitializer for changing default settings
4687     */
4688    public static void setOptions(Hashtable  JavaDoc newOptions) {
4689        JavaModelManager.getJavaModelManager().setOptions(newOptions);
4690    }
4691
4692    /* (non-Javadoc)
4693     * Shutdown the JavaCore plug-in.
4694     * <p>
4695     * De-registers the JavaModelManager as a resource changed listener and save participant.
4696     * <p>
4697     * @see org.eclipse.core.runtime.Plugin#stop(BundleContext)
4698     */
4699    public void stop(BundleContext context) throws Exception  JavaDoc {
4700        try {
4701            JavaModelManager.getJavaModelManager().shutdown();
4702        } finally {
4703            // ensure we call super.stop as the last thing
4704 super.stop(context);
4705        }
4706    }
4707
4708    /* (non-Javadoc)
4709     * Startup the JavaCore plug-in.
4710     * <p>
4711     * Registers the JavaModelManager as a resource changed listener and save participant.
4712     * Starts the background indexing, and restore saved classpath variable values.
4713     * <p>
4714     * @throws Exception
4715     * @see org.eclipse.core.runtime.Plugin#start(BundleContext)
4716     */
4717    public void start(BundleContext context) throws Exception  JavaDoc {
4718        super.start(context);
4719        JavaModelManager.getJavaModelManager().startup();
4720    }
4721}

Read more: http://kickjava.com/src/org/eclipse/jdt/core/JavaCore.java.htm#ixzz2tkFaV0QY

你可能感兴趣的:(JavaCore extends Plugin)