/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.internal.core; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaProject; import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpeclipse.PHPCore; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IProjectNature; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.QualifiedName; /** * Handle for a Java Project. * *

A Java Project internally maintains a devpath that corresponds * to the project's classpath. The classpath may include source folders * from the current project; jars in the current project, other projects, * and the local file system; and binary folders (output location) of other * projects. The Java Model presents source elements corresponding to output * .class files in other projects, and thus uses the devpath rather than * the classpath (which is really a compilation path). The devpath mimics * the classpath, except has source folder entries in place of output * locations in external projects. * *

Each JavaProject has a NameLookup facility that locates elements * on by name, based on the devpath. * * @see IJavaProject */ public class JavaProject extends Openable implements IJavaProject , IProjectNature { /** * Whether the underlying file system is case sensitive. */ protected static final boolean IS_CASE_SENSITIVE = !new File("Temp").equals(new File("temp")); //$NON-NLS-1$ //$NON-NLS-2$ /** * An empty array of strings indicating that a project doesn't have any prerequesite projects. */ protected static final String[] NO_PREREQUISITES = new String[0]; /** * The platform project this IJavaProject is based on */ protected IProject fProject; /** * Name of file containing project classpath */ public static final String CLASSPATH_FILENAME = ".classpath"; //$NON-NLS-1$ /** * Name of file containing custom project preferences */ public static final String PREF_FILENAME = ".jprefs"; //$NON-NLS-1$ /** * Value of the project's raw classpath if the .classpath file contains invalid entries. */ // public static final IClasspathEntry[] INVALID_CLASSPATH = new IClasspathEntry[0]; private static final String CUSTOM_DEFAULT_OPTION_VALUE = "#\r\n\r#custom-non-empty-default-value#\r\n\r#"; //$NON-NLS-1$ /** * Returns a canonicalized path from the given external path. * Note that the return path contains the same number of segments * and it contains a device only if the given path contained one. * @see java.io.File for the definition of a canonicalized path */ public static IPath canonicalizedPath(IPath externalPath) { if (externalPath == null) return null; // if (JavaModelManager.VERBOSE) { // System.out.println("JAVA MODEL - Canonicalizing " + externalPath.toString()); //$NON-NLS-1$ // } if (IS_CASE_SENSITIVE) { // if (JavaModelManager.VERBOSE) { // System.out.println("JAVA MODEL - Canonical path is original path (file system is case sensitive)"); //$NON-NLS-1$ // } return externalPath; } // if not external path, return original path IWorkspace workspace = ResourcesPlugin.getWorkspace(); if (workspace == null) return externalPath; // protection during shutdown (30487) if (workspace.getRoot().findMember(externalPath) != null) { // if (JavaModelManager.VERBOSE) { // System.out.println("JAVA MODEL - Canonical path is original path (member of workspace)"); //$NON-NLS-1$ // } return externalPath; } IPath canonicalPath = null; try { canonicalPath = new Path(new File(externalPath.toOSString()).getCanonicalPath()); } catch (IOException e) { // default to original path // if (JavaModelManager.VERBOSE) { // System.out.println("JAVA MODEL - Canonical path is original path (IOException)"); //$NON-NLS-1$ // } return externalPath; } IPath result; int canonicalLength = canonicalPath.segmentCount(); if (canonicalLength == 0) { // the java.io.File canonicalization failed // if (JavaModelManager.VERBOSE) { // System.out.println("JAVA MODEL - Canonical path is original path (canonical path is empty)"); //$NON-NLS-1$ // } return externalPath; } else if (externalPath.isAbsolute()) { result = canonicalPath; } else { // if path is relative, remove the first segments that were added by the java.io.File canonicalization // e.g. 'lib/classes.zip' was converted to 'd:/myfolder/lib/classes.zip' int externalLength = externalPath.segmentCount(); if (canonicalLength >= externalLength) { result = canonicalPath.removeFirstSegments(canonicalLength - externalLength); } else { // if (JavaModelManager.VERBOSE) { // System.out.println("JAVA MODEL - Canonical path is original path (canonical path is " + canonicalPath.toString() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ // } return externalPath; } } // keep device only if it was specified (this is because File.getCanonicalPath() converts '/lib/classed.zip' to 'd:/lib/classes/zip') if (externalPath.getDevice() == null) { result = result.setDevice(null); } // if (JavaModelManager.VERBOSE) { // System.out.println("JAVA MODEL - Canonical path is " + result.toString()); //$NON-NLS-1$ // } return result; } /** * Constructor needed for IProject.getNature() and IProject.addNature(). * * @see #setProject */ public JavaProject() { super(JAVA_PROJECT, null, null); } public JavaProject(IProject project, IJavaElement parent) { super(JAVA_PROJECT, parent, project.getName()); fProject = project; } /** * Adds a builder to the build spec for the given project. */ protected void addToBuildSpec(String builderID) throws CoreException { IProjectDescription description = getProject().getDescription(); ICommand javaCommand = getJavaCommand(description); if (javaCommand == null) { // Add a Java command to the build spec ICommand command = description.newCommand(); command.setBuilderName(builderID); setJavaCommand(description, command); } } // protected void closing(Object info) throws JavaModelException { // // // forget source attachment recommendations // IPackageFragmentRoot[] roots = this.getPackageFragmentRoots(); // for (int i = 0; i < roots.length; i++) { // if (roots[i] instanceof JarPackageFragmentRoot){ // ((JarPackageFragmentRoot) roots[i]).setSourceAttachmentProperty(null); // } // } // // super.closing(info); // } /** * Internal computation of an expanded classpath. It will eliminate duplicates, and produce copies * of exported classpath entries to avoid possible side-effects ever after. */ // private void computeExpandedClasspath( // JavaProject initialProject, // boolean ignoreUnresolvedVariable, // boolean generateMarkerOnError, // HashSet visitedProjects, // ObjectVector accumulatedEntries) throws JavaModelException { // // if (visitedProjects.contains(this)){ // return; // break cycles if any // } // visitedProjects.add(this); // // if (generateMarkerOnError && !this.equals(initialProject)){ // generateMarkerOnError = false; // } // IClasspathEntry[] immediateClasspath = // getResolvedClasspath(ignoreUnresolvedVariable, generateMarkerOnError); // // IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); // for (int i = 0, length = immediateClasspath.length; i < length; i++){ // IClasspathEntry entry = immediateClasspath[i]; // // boolean isInitialProject = this.equals(initialProject); // if (isInitialProject || entry.isExported()){ // // accumulatedEntries.add(entry); // // // recurse in project to get all its indirect exports (only consider exported entries from there on) // if (entry.getEntryKind() == ClasspathEntry.CPE_PROJECT) { // IResource member = workspaceRoot.findMember(entry.getPath()); // if (member != null && member.getType() == IResource.PROJECT){ // double check if bound to project (23977) // IProject projRsc = (IProject) member; // if (JavaProject.hasJavaNature(projRsc)) { // JavaProject project = (JavaProject) JavaCore.create(projRsc); // project.computeExpandedClasspath( // initialProject, // ignoreUnresolvedVariable, // generateMarkerOnError, // visitedProjects, // accumulatedEntries); // } // } // } // } // } // } /** * Returns (local/all) the package fragment roots identified by the given project's classpath. * Note: this follows project classpath references to find required project contributions, * eliminating duplicates silently. * Only works with resolved entries */ // public IPackageFragmentRoot[] computePackageFragmentRoots(IClasspathEntry[] resolvedClasspath, boolean retrieveExportedRoots) throws JavaModelException { // // ObjectVector accumulatedRoots = new ObjectVector(); // computePackageFragmentRoots( // resolvedClasspath, // accumulatedRoots, // new HashSet(5), // rootIDs // true, // inside original project // true, // check existency // retrieveExportedRoots); // IPackageFragmentRoot[] rootArray = new IPackageFragmentRoot[accumulatedRoots.size()]; // accumulatedRoots.copyInto(rootArray); // return rootArray; // } // // /** // * Computes the package fragment roots identified by the given entry. // * Only works with resolved entry // */ // public IPackageFragmentRoot[] computePackageFragmentRoots(IClasspathEntry resolvedEntry) { // try { // return // computePackageFragmentRoots( // new IClasspathEntry[]{ resolvedEntry }, // false // don't retrieve exported roots // ); // } catch (JavaModelException e) { // return new IPackageFragmentRoot[] {}; // } // } /** * Returns the package fragment roots identified by the given entry. In case it refers to * a project, it will follow its classpath so as to find exported roots as well. * Only works with resolved entry */ // public void computePackageFragmentRoots( // IClasspathEntry resolvedEntry, // ObjectVector accumulatedRoots, // HashSet rootIDs, // boolean insideOriginalProject, // boolean checkExistency, // boolean retrieveExportedRoots) throws JavaModelException { // // String rootID = ((ClasspathEntry)resolvedEntry).rootID(); // if (rootIDs.contains(rootID)) return; // // IPath projectPath = getProject().getFullPath(); // IPath entryPath = resolvedEntry.getPath(); // IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); // // switch(resolvedEntry.getEntryKind()){ // // // source folder // case IClasspathEntry.CPE_SOURCE : // // if (projectPath.isPrefixOf(entryPath)){ // if (checkExistency) { // Object target = JavaModel.getTarget(workspaceRoot, entryPath, checkExistency); // if (target == null) return; // // if (target instanceof IFolder || target instanceof IProject){ // accumulatedRoots.add( // getPackageFragmentRoot((IResource)target)); // rootIDs.add(rootID); // } // } else { // IPackageFragmentRoot root = getFolderPackageFragmentRoot(entryPath); // if (root != null) { // accumulatedRoots.add(root); // rootIDs.add(rootID); // } // } // } // break; // // // internal/external JAR or folder // case IClasspathEntry.CPE_LIBRARY : // // if (!insideOriginalProject && !resolvedEntry.isExported()) return; // // if (checkExistency) { // Object target = JavaModel.getTarget(workspaceRoot, entryPath, checkExistency); // if (target == null) return; // // if (target instanceof IResource){ // // internal target // IResource resource = (IResource) target; // IPackageFragmentRoot root = getPackageFragmentRoot(resource); // if (root != null) { // accumulatedRoots.add(root); // rootIDs.add(rootID); // } // } else { // // external target - only JARs allowed // if (((java.io.File)target).isFile() && (Util.isArchiveFileName(entryPath.lastSegment()))) { // accumulatedRoots.add( // new JarPackageFragmentRoot(entryPath, this)); // rootIDs.add(rootID); // } // } // } else { // IPackageFragmentRoot root = getPackageFragmentRoot(entryPath); // if (root != null) { // accumulatedRoots.add(root); // rootIDs.add(rootID); // } // } // break; // // // recurse into required project // case IClasspathEntry.CPE_PROJECT : // // if (!retrieveExportedRoots) return; // if (!insideOriginalProject && !resolvedEntry.isExported()) return; // // IResource member = workspaceRoot.findMember(entryPath); // if (member != null && member.getType() == IResource.PROJECT){// double check if bound to project (23977) // IProject requiredProjectRsc = (IProject) member; // if (JavaProject.hasJavaNature(requiredProjectRsc)){ // special builder binary output // rootIDs.add(rootID); // JavaProject requiredProject = (JavaProject)JavaCore.create(requiredProjectRsc); // requiredProject.computePackageFragmentRoots( // requiredProject.getResolvedClasspath(true), // accumulatedRoots, // rootIDs, // false, // checkExistency, // retrieveExportedRoots); // } // break; // } // } // } /** * Returns (local/all) the package fragment roots identified by the given project's classpath. * Note: this follows project classpath references to find required project contributions, * eliminating duplicates silently. * Only works with resolved entries */ // public void computePackageFragmentRoots( // IClasspathEntry[] resolvedClasspath, // ObjectVector accumulatedRoots, // HashSet rootIDs, // boolean insideOriginalProject, // boolean checkExistency, // boolean retrieveExportedRoots) throws JavaModelException { // // if (insideOriginalProject){ // rootIDs.add(rootID()); // } // for (int i = 0, length = resolvedClasspath.length; i < length; i++){ // computePackageFragmentRoots( // resolvedClasspath[i], // accumulatedRoots, // rootIDs, // insideOriginalProject, // checkExistency, // retrieveExportedRoots); // } // } /** * Compute the file name to use for a given shared property */ public String computeSharedPropertyFileName(QualifiedName qName) { return '.' + qName.getLocalName(); } /** * Configure the project with Java nature. */ public void configure() throws CoreException { // register Java builder addToBuildSpec(PHPeclipsePlugin.BUILDER_PARSER_ID); } /* * Returns whether the given resource is accessible through the children or the non-Java resources of this project. * Returns true if the resource is not in the project. * Assumes that the resource is a folder or a file. */ // public boolean contains(IResource resource) { // // IClasspathEntry[] classpath; // IPath output; // try { // classpath = getResolvedClasspath(true); // output = getOutputLocation(); // } catch (JavaModelException e) { // return false; // } // // IPath fullPath = resource.getFullPath(); // IPath innerMostOutput = output.isPrefixOf(fullPath) ? output : null; // IClasspathEntry innerMostEntry = null; // for (int j = 0, cpLength = classpath.length; j < cpLength; j++) { // IClasspathEntry entry = classpath[j]; // // IPath entryPath = entry.getPath(); // if ((innerMostEntry == null || innerMostEntry.getPath().isPrefixOf(entryPath)) // && entryPath.isPrefixOf(fullPath)) { // innerMostEntry = entry; // } // IPath entryOutput = classpath[j].getOutputLocation(); // if (entryOutput != null && entryOutput.isPrefixOf(fullPath)) { // innerMostOutput = entryOutput; // } // } // if (innerMostEntry != null) { // // special case prj==src and nested output location // if (innerMostOutput != null && innerMostOutput.segmentCount() > 1 // output isn't project // && innerMostEntry.getPath().segmentCount() == 1) { // 1 segment must be project name // return false; // } // if (resource instanceof IFolder) { // // folders are always included in src/lib entries // return true; // } // switch (innerMostEntry.getEntryKind()) { // case IClasspathEntry.CPE_SOURCE: // // .class files are not visible in source folders // return !Util.isClassFileName(fullPath.lastSegment()); // case IClasspathEntry.CPE_LIBRARY: // // .java files are not visible in library folders // return !Util.isJavaFileName(fullPath.lastSegment()); // } // } // if (innerMostOutput != null) { // return false; // } // return true; // } /** * Record a new marker denoting a classpath problem */ // IMarker createClasspathProblemMarker(IJavaModelStatus status) { // // IMarker marker = null; // int severity; // String[] arguments = new String[0]; // boolean isCycleProblem = false, isClasspathFileFormatProblem = false; // switch (status.getCode()) { // // case IJavaModelStatusConstants.CLASSPATH_CYCLE : // isCycleProblem = true; // if (JavaCore.ERROR.equals(getOption(JavaCore.CORE_CIRCULAR_CLASSPATH, true))) { // severity = IMarker.SEVERITY_ERROR; // } else { // severity = IMarker.SEVERITY_WARNING; // } // break; // // case IJavaModelStatusConstants.INVALID_CLASSPATH_FILE_FORMAT : // isClasspathFileFormatProblem = true; // severity = IMarker.SEVERITY_ERROR; // break; // // default: // IPath path = status.getPath(); // if (path != null) arguments = new String[] { path.toString() }; // if (JavaCore.ERROR.equals(getOption(JavaCore.CORE_INCOMPLETE_CLASSPATH, true))) { // severity = IMarker.SEVERITY_ERROR; // } else { // severity = IMarker.SEVERITY_WARNING; // } // break; // } // // try { // marker = getProject().createMarker(IJavaModelMarker.BUILDPATH_PROBLEM_MARKER); // marker.setAttributes( // new String[] { // IMarker.MESSAGE, // IMarker.SEVERITY, // IMarker.LOCATION, // IJavaModelMarker.CYCLE_DETECTED, // IJavaModelMarker.CLASSPATH_FILE_FORMAT, // IJavaModelMarker.ID, // IJavaModelMarker.ARGUMENTS , // }, // new Object[] { // status.getMessage(), // new Integer(severity), // Util.bind("classpath.buildPath"),//$NON-NLS-1$ // isCycleProblem ? "true" : "false",//$NON-NLS-1$ //$NON-NLS-2$ // isClasspathFileFormatProblem ? "true" : "false",//$NON-NLS-1$ //$NON-NLS-2$ // new Integer(status.getCode()), // Util.getProblemArgumentsForMarker(arguments) , // } // ); // } catch (CoreException e) { // } // return marker; // } /** * Returns a new element info for this element. */ // protected OpenableElementInfo createElementInfo() { // // return new JavaProjectElementInfo(); // } /** * Reads and decode an XML classpath string */ // protected IClasspathEntry[] decodeClasspath(String xmlClasspath, boolean createMarker, boolean logProblems) { // // ArrayList paths = new ArrayList(); // IClasspathEntry defaultOutput = null; // try { // if (xmlClasspath == null) return null; // StringReader reader = new StringReader(xmlClasspath); // Element cpElement; // // try { // DocumentBuilder parser = // DocumentBuilderFactory.newInstance().newDocumentBuilder(); // cpElement = parser.parse(new InputSource(reader)).getDocumentElement(); // } catch (SAXException e) { // throw new IOException(Util.bind("file.badFormat")); //$NON-NLS-1$ // } catch (ParserConfigurationException e) { // throw new IOException(Util.bind("file.badFormat")); //$NON-NLS-1$ // } finally { // reader.close(); // } // // if (!cpElement.getNodeName().equalsIgnoreCase("classpath")) { //$NON-NLS-1$ // throw new IOException(Util.bind("file.badFormat")); //$NON-NLS-1$ // } // NodeList list = cpElement.getElementsByTagName("classpathentry"); //$NON-NLS-1$ // int length = list.getLength(); // // for (int i = 0; i < length; ++i) { // Node node = list.item(i); // if (node.getNodeType() == Node.ELEMENT_NODE) { // IClasspathEntry entry = ClasspathEntry.elementDecode((Element)node, this); // if (entry != null){ // if (entry.getContentKind() == ClasspathEntry.K_OUTPUT) { // defaultOutput = entry; // separate output // } else { // paths.add(entry); // } // } // } // } // } catch (IOException e) { // // bad format // if (createMarker && this.getProject().isAccessible()) { // this.createClasspathProblemMarker(new JavaModelStatus( // IJavaModelStatusConstants.INVALID_CLASSPATH_FILE_FORMAT, // Util.bind("classpath.xmlFormatError", this.getElementName(), e.getMessage()))); //$NON-NLS-1$ // } // if (logProblems) { // Util.log(e, // "Exception while retrieving "+ this.getPath() //$NON-NLS-1$ // +"/.classpath, will mark classpath as invalid"); //$NON-NLS-1$ // } // return INVALID_CLASSPATH; // } catch (Assert.AssertionFailedException e) { // // failed creating CP entries from file // if (createMarker && this.getProject().isAccessible()) { // this.createClasspathProblemMarker(new JavaModelStatus( // IJavaModelStatusConstants.INVALID_CLASSPATH_FILE_FORMAT, // Util.bind("classpath.illegalEntryInClasspathFile", this.getElementName(), e.getMessage()))); //$NON-NLS-1$ // } // if (logProblems) { // Util.log(e, // "Exception while retrieving "+ this.getPath() //$NON-NLS-1$ // +"/.classpath, will mark classpath as invalid"); //$NON-NLS-1$ // } // return INVALID_CLASSPATH; // } // int pathSize = paths.size(); // if (pathSize > 0 || defaultOutput != null) { // IClasspathEntry[] entries = new IClasspathEntry[pathSize + (defaultOutput == null ? 0 : 1)]; // paths.toArray(entries); // if (defaultOutput != null) entries[pathSize] = defaultOutput; // ensure output is last item // return entries; // } else { // return null; // } // } /** /** * Removes the Java nature from the project. */ public void deconfigure() throws CoreException { // deregister Java builder removeFromBuildSpec(PHPeclipsePlugin.BUILDER_PARSER_ID); } // // /** // * Returns a default class path. // * This is the root of the project // */ // protected IClasspathEntry[] defaultClasspath() throws JavaModelException { // // return new IClasspathEntry[] { // JavaCore.newSourceEntry(getProject().getFullPath())}; // } /** * Returns a default output location. * This is the project bin folder */ protected IPath defaultOutputLocation() throws JavaModelException { return getProject().getFullPath().append("bin"); //$NON-NLS-1$ } /** * Returns the XML String encoding of the class path. */ // protected String encodeClasspath(IClasspathEntry[] classpath, IPath outputLocation, boolean useLineSeparator) throws JavaModelException { // // Document document = new DocumentImpl(); // Element cpElement = document.createElement("classpath"); //$NON-NLS-1$ // document.appendChild(cpElement); // // for (int i = 0; i < classpath.length; ++i) { // cpElement.appendChild(((ClasspathEntry)classpath[i]).elementEncode(document, getProject().getFullPath())); // } // // if (outputLocation != null) { // outputLocation = outputLocation.removeFirstSegments(1); // outputLocation = outputLocation.makeRelative(); // Element oElement = document.createElement("classpathentry"); //$NON-NLS-1$ // oElement.setAttribute("kind", ClasspathEntry.kindToString(ClasspathEntry.K_OUTPUT)); //$NON-NLS-1$ // oElement.setAttribute("path", outputLocation.toString()); //$NON-NLS-1$ // cpElement.appendChild(oElement); // } // // // produce a String output // try { // ByteArrayOutputStream s = new ByteArrayOutputStream(); // OutputFormat format = new OutputFormat(); // if (useLineSeparator) { // format.setIndenting(true); // format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$ // } else { // format.setPreserveSpace(true); // } // Serializer serializer = // SerializerFactory.getSerializerFactory(Method.XML).makeSerializer( // new OutputStreamWriter(s, "UTF8"), //$NON-NLS-1$ // format); // serializer.asDOMSerializer().serialize(document); // return s.toString("UTF8"); //$NON-NLS-1$ // } catch (IOException e) { // throw new JavaModelException(e, IJavaModelStatusConstants.IO_EXCEPTION); // } // } // /** * Returns true if this handle represents the same Java project * as the given handle. Two handles represent the same * project if they are identical or if they represent a project with * the same underlying resource and occurrence counts. * * @see JavaElement#equals */ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof JavaProject)) return false; JavaProject other = (JavaProject) o; return getProject().equals(other.getProject()) && fOccurrenceCount == other.fOccurrenceCount; } public boolean exists() { if (!hasJavaNature(fProject)) return false; return super.exists(); } /** * @see IJavaProject */ // public IJavaElement findElement(IPath path) throws JavaModelException { // // if (path == null || path.isAbsolute()) { // throw new JavaModelException( // new JavaModelStatus(IJavaModelStatusConstants.INVALID_PATH, path)); // } // try { // // String extension = path.getFileExtension(); // if (extension == null) { // String packageName = path.toString().replace(IPath.SEPARATOR, '.'); // // IPackageFragment[] pkgFragments = // getNameLookup().findPackageFragments(packageName, false); // if (pkgFragments == null) { // return null; // // } else { // // try to return one that is a child of this project // for (int i = 0, length = pkgFragments.length; i < length; i++) { // // IPackageFragment pkgFragment = pkgFragments[i]; // if (this.equals(pkgFragment.getParent().getParent())) { // return pkgFragment; // } // } // // default to the first one // return pkgFragments[0]; // } // } else if ( // extension.equalsIgnoreCase("java") //$NON-NLS-1$ // || extension.equalsIgnoreCase("class")) { //$NON-NLS-1$ // IPath packagePath = path.removeLastSegments(1); // String packageName = packagePath.toString().replace(IPath.SEPARATOR, '.'); // String typeName = path.lastSegment(); // typeName = typeName.substring(0, typeName.length() - extension.length() - 1); // String qualifiedName = null; // if (packageName.length() > 0) { // qualifiedName = packageName + "." + typeName; //$NON-NLS-1$ // } else { // qualifiedName = typeName; // } // IType type = // getNameLookup().findType( // qualifiedName, // false, // NameLookup.ACCEPT_CLASSES | NameLookup.ACCEPT_INTERFACES); // if (type != null) { // return type.getParent(); // } else { // return null; // } // } else { // // unsupported extension // return null; // } // } catch (JavaModelException e) { // if (e.getStatus().getCode() // == IJavaModelStatusConstants.ELEMENT_DOES_NOT_EXIST) { // return null; // } else { // throw e; // } // } // } /** * @see IJavaProject */ // public IPackageFragment findPackageFragment(IPath path) // throws JavaModelException { // // return findPackageFragment0(JavaProject.canonicalizedPath(path)); // } /** * non path canonicalizing version */ // public IPackageFragment findPackageFragment0(IPath path) // throws JavaModelException { // // return getNameLookup().findPackageFragment(path); // } /** * @see IJavaProject */ // public IPackageFragmentRoot findPackageFragmentRoot(IPath path) // throws JavaModelException { // // return findPackageFragmentRoot0(JavaProject.canonicalizedPath(path)); // } /** * no path canonicalization */ // public IPackageFragmentRoot findPackageFragmentRoot0(IPath path) // throws JavaModelException { // // IPackageFragmentRoot[] allRoots = this.getAllPackageFragmentRoots(); // if (!path.isAbsolute()) { // throw new IllegalArgumentException(Util.bind("path.mustBeAbsolute")); //$NON-NLS-1$ // } // for (int i= 0; i < allRoots.length; i++) { // IPackageFragmentRoot classpathRoot= allRoots[i]; // if (classpathRoot.getPath().equals(path)) { // return classpathRoot; // } // } // return null; // } /** * @see IJavaProject */ // public IPackageFragmentRoot[] findPackageFragmentRoots(IClasspathEntry entry) { // try { // IClasspathEntry[] classpath = this.getRawClasspath(); // for (int i = 0, length = classpath.length; i < length; i++) { // if (classpath[i].equals(entry)) { // entry may need to be resolved // return // computePackageFragmentRoots( // getResolvedClasspath(new IClasspathEntry[] {entry}, null, true, false, null/*no reverse map*/), // false); // don't retrieve exported roots // } // } // } catch (JavaModelException e) { // } // return new IPackageFragmentRoot[] {}; // } // /** * @see IJavaProject#findType(String) */ // public IType findType(String fullyQualifiedName) throws JavaModelException { // IType type = // this.getNameLookup().findType( // fullyQualifiedName, // false, // NameLookup.ACCEPT_CLASSES | NameLookup.ACCEPT_INTERFACES); // if (type == null) { // // try to find enclosing type // int lastDot = fullyQualifiedName.lastIndexOf('.'); // if (lastDot == -1) return null; // type = this.findType(fullyQualifiedName.substring(0, lastDot)); // if (type != null) { // type = type.getType(fullyQualifiedName.substring(lastDot+1)); // if (!type.exists()) { // return null; // } // } // } // return type; // } /** * @see IJavaProject#findType(String, String) */ // public IType findType(String packageName, String typeQualifiedName) throws JavaModelException { // return // this.getNameLookup().findType( // typeQualifiedName, // packageName, // false, // NameLookup.ACCEPT_CLASSES | NameLookup.ACCEPT_INTERFACES); // } // // /** // * Remove all markers denoting classpath problems // */ // protected void flushClasspathProblemMarkers(boolean flushCycleMarkers, boolean flushClasspathFormatMarkers) { // try { // IProject project = getProject(); // if (project.exists()) { // IMarker[] markers = project.findMarkers(IJavaModelMarker.BUILDPATH_PROBLEM_MARKER, false, IResource.DEPTH_ZERO); // for (int i = 0, length = markers.length; i < length; i++) { // IMarker marker = markers[i]; // if (flushCycleMarkers && flushClasspathFormatMarkers) { // marker.delete(); // } else { // String cycleAttr = (String)marker.getAttribute(IJavaModelMarker.CYCLE_DETECTED); // String classpathFileFormatAttr = (String)marker.getAttribute(IJavaModelMarker.CLASSPATH_FILE_FORMAT); // if ((flushCycleMarkers == (cycleAttr != null && cycleAttr.equals("true"))) //$NON-NLS-1$ // && (flushClasspathFormatMarkers == (classpathFileFormatAttr != null && classpathFileFormatAttr.equals("true")))){ //$NON-NLS-1$ // marker.delete(); // } // } // } // } // } catch (CoreException e) { // } // } // // /** // * @see Openable // */ // protected boolean generateInfos( // OpenableElementInfo info, // IProgressMonitor pm, // Map newElements, // IResource underlyingResource) throws JavaModelException { // // boolean validInfo = false; // try { // if (getProject().isOpen()) { // // put the info now, because computing the roots requires it // JavaModelManager.getJavaModelManager().putInfo(this, info); // // // compute the pkg fragment roots // updatePackageFragmentRoots(); // // // remember the timestamps of external libraries the first time they are looked up // IClasspathEntry[] resolvedClasspath = getResolvedClasspath(true/*ignore unresolved variable*/); // for (int i = 0, length = resolvedClasspath.length; i < length; i++) { // IClasspathEntry entry = resolvedClasspath[i]; // if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) { // IPath path = entry.getPath(); // Object target = JavaModel.getTarget(ResourcesPlugin.getWorkspace().getRoot(), path, true); // if (target instanceof java.io.File) { // Map externalTimeStamps = JavaModelManager.getJavaModelManager().deltaProcessor.externalTimeStamps; // if (externalTimeStamps.get(path) == null) { // long timestamp = DeltaProcessor.getTimeStamp((java.io.File)target); // externalTimeStamps.put(path, new Long(timestamp)); // } // } // } // } // // // only valid if reaches here // validInfo = true; // } // } finally { // if (!validInfo) // JavaModelManager.getJavaModelManager().removeInfo(this); // } // return validInfo; // } /** * @see IJavaProject */ // public IPackageFragmentRoot[] getAllPackageFragmentRoots() // throws JavaModelException { // // return computePackageFragmentRoots(getResolvedClasspath(true), true); // } // // /** // * Returns the classpath entry that refers to the given path // * or null if there is no reference to the path. // */ // public IClasspathEntry getClasspathEntryFor(IPath path) // throws JavaModelException { // // IClasspathEntry[] entries = getExpandedClasspath(true); // for (int i = 0; i < entries.length; i++) { // if (entries[i].getPath().equals(path)) { // return entries[i]; // } // } // return null; // } /* * Returns the cycle marker associated with this project or null if none. */ // public IMarker getCycleMarker(){ // try { // IProject project = getProject(); // if (project.exists()) { // IMarker[] markers = project.findMarkers(IJavaModelMarker.BUILDPATH_PROBLEM_MARKER, false, IResource.DEPTH_ZERO); // for (int i = 0, length = markers.length; i < length; i++) { // IMarker marker = markers[i]; // String cycleAttr = (String)marker.getAttribute(IJavaModelMarker.CYCLE_DETECTED); // if (cycleAttr != null && cycleAttr.equals("true")){ //$NON-NLS-1$ // return marker; // } // } // } // } catch (CoreException e) { // } // return null; // } // // /** // * This is a helper method returning the expanded classpath for the project, as a list of classpath entries, // * where all classpath variable entries have been resolved and substituted with their final target entries. // * All project exports have been appended to project entries. // */ // public IClasspathEntry[] getExpandedClasspath(boolean ignoreUnresolvedVariable) throws JavaModelException { // // return getExpandedClasspath(ignoreUnresolvedVariable, false); // } /** * Internal variant which can create marker on project for invalid entries, * it will also perform classpath expansion in presence of project prerequisites * exporting their entries. */ // public IClasspathEntry[] getExpandedClasspath( // boolean ignoreUnresolvedVariable, // boolean generateMarkerOnError) throws JavaModelException { // // ObjectVector accumulatedEntries = new ObjectVector(); // computeExpandedClasspath(this, ignoreUnresolvedVariable, generateMarkerOnError, new HashSet(5), accumulatedEntries); // // IClasspathEntry[] expandedPath = new IClasspathEntry[accumulatedEntries.size()]; // accumulatedEntries.copyInto(expandedPath); // // return expandedPath; // } /** * Returns the char that marks the start of this handles * contribution to a memento. */ protected char getHandleMementoDelimiter() { return JEM_JAVAPROJECT; } /** * Find the specific Java command amongst the build spec of a given description */ private ICommand getJavaCommand(IProjectDescription description) throws CoreException { ICommand[] commands = description.getBuildSpec(); for (int i = 0; i < commands.length; ++i) { if (commands[i].getBuilderName().equals(PHPeclipsePlugin.BUILDER_PARSER_ID)) { return commands[i]; } } return null; } // // /** // * Convenience method that returns the specific type of info for a Java project. // */ // protected JavaProjectElementInfo getJavaProjectElementInfo() // throws JavaModelException { // // return (JavaProjectElementInfo) getElementInfo(); // } /** * @see IJavaProject */ // public NameLookup getNameLookup() throws JavaModelException { // // JavaProjectElementInfo info = getJavaProjectElementInfo(); // // lock on the project info to avoid race condition // synchronized(info){ // NameLookup nameLookup; // if ((nameLookup = info.getNameLookup()) == null){ // info.setNameLookup(nameLookup = new NameLookup(this)); // } // return nameLookup; // } // } // // /** // * Returns an array of non-java resources contained in the receiver. // */ // public Object[] getNonJavaResources() throws JavaModelException { // // return ((JavaProjectElementInfo) getElementInfo()).getNonJavaResources(this); // } /** * @see org.eclipse.jdt.core.IJavaProject#getOption(String, boolean) */ // public String getOption(String optionName, boolean inheritJavaCoreOptions) { // // if (JavaModelManager.OptionNames.contains(optionName)){ // // Preferences preferences = getPreferences(); // if (preferences == null || preferences.isDefault(optionName)) { // return inheritJavaCoreOptions ? PHPCore.getOption(optionName) : null; // } // return preferences.getString(optionName).trim(); // } // return null; // } /** * @see org.eclipse.jdt.core.IJavaProject#getOptions(boolean) */ // public Map getOptions(boolean inheritJavaCoreOptions) { // // // initialize to the defaults from JavaCore options pool // Map options = inheritJavaCoreOptions ? PHPCore.getOptions() : new Hashtable(5); // // Preferences preferences = getPreferences(); // if (preferences == null) return options; // cannot do better (non-Java project) // HashSet optionNames = JavaModelManager.OptionNames; // // // get preferences set to their default // if (inheritJavaCoreOptions){ // String[] defaultPropertyNames = preferences.defaultPropertyNames(); // for (int i = 0; i < defaultPropertyNames.length; i++){ // String propertyName = defaultPropertyNames[i]; // if (optionNames.contains(propertyName)){ // options.put(propertyName, preferences.getDefaultString(propertyName).trim()); // } // } // } // // get custom preferences not set to their default // String[] propertyNames = preferences.propertyNames(); // for (int i = 0; i < propertyNames.length; i++){ // String propertyName = propertyNames[i]; // if (optionNames.contains(propertyName)){ // options.put(propertyName, preferences.getString(propertyName).trim()); // } // } // return options; // } /** * @see IJavaProject */ // public IPath getOutputLocation() throws JavaModelException { // // JavaModelManager.PerProjectInfo perProjectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfoCheckExistence(fProject); // IPath outputLocation = perProjectInfo.outputLocation; // if (outputLocation != null) return outputLocation; // // // force to read classpath - will position output location as well // this.getRawClasspath(); // outputLocation = perProjectInfo.outputLocation; // if (outputLocation == null) { // return defaultOutputLocation(); // } // return outputLocation; // } // // /** // * @return A handle to the package fragment root identified by the given path. // * This method is handle-only and the element may or may not exist. Returns // * null if unable to generate a handle from the path (for example, // * an absolute path that has less than 1 segment. The path may be relative or // * absolute. // */ // public IPackageFragmentRoot getPackageFragmentRoot(IPath path) { // if (!path.isAbsolute()) { // path = getPath().append(path); // } // int segmentCount = path.segmentCount(); // switch (segmentCount) { // case 0: // return null; // case 1: // // default root // return getPackageFragmentRoot(getProject()); // default: // // a path ending with .jar/.zip is still ambiguous and could still resolve to a source/lib folder // // thus will try to guess based on existing resource // if (Util.isArchiveFileName(path.lastSegment())) { // IResource resource = getProject().getWorkspace().getRoot().findMember(path); // if (resource != null && resource.getType() == IResource.FOLDER){ // return getPackageFragmentRoot(resource); // } // return getPackageFragmentRoot0(path); // } else { // return getPackageFragmentRoot(getProject().getWorkspace().getRoot().getFolder(path)); // } // } // } // // /** // * The path is known to match a source/library folder entry. // */ // public IPackageFragmentRoot getFolderPackageFragmentRoot(IPath path) { // if (path.segmentCount() == 1) { // default project root // return getPackageFragmentRoot(getProject()); // } // return getPackageFragmentRoot(getProject().getWorkspace().getRoot().getFolder(path)); // } // // /** // * @see IJavaProject // */ // public IPackageFragmentRoot getPackageFragmentRoot(IResource resource) { // // switch (resource.getType()) { // case IResource.FILE: // if (Util.isArchiveFileName(resource.getName())) { // return new JarPackageFragmentRoot(resource, this); // } else { // return null; // } // case IResource.FOLDER: // return new PackageFragmentRoot(resource, this, resource.getName()); // case IResource.PROJECT: // return new PackageFragmentRoot(resource, this, ""); //$NON-NLS-1$ // default: // return null; // } // } // // /** // * @see IJavaProject // */ // public IPackageFragmentRoot getPackageFragmentRoot(String jarPath) { // // return getPackageFragmentRoot0(JavaProject.canonicalizedPath(new Path(jarPath))); // } // // /** // * no path canonicalization // */ // public IPackageFragmentRoot getPackageFragmentRoot0(IPath jarPath) { // // return new JarPackageFragmentRoot(jarPath, this); // } // // /** // * @see IJavaProject // */ // public IPackageFragmentRoot[] getPackageFragmentRoots() // throws JavaModelException { // // Object[] children; // int length; // IPackageFragmentRoot[] roots; // // System.arraycopy( // children = getChildren(), // 0, // roots = new IPackageFragmentRoot[length = children.length], // 0, // length); // // return roots; // } /** * @see IJavaProject * @deprecated */ // public IPackageFragmentRoot[] getPackageFragmentRoots(IClasspathEntry entry) { // return findPackageFragmentRoots(entry); // } /** * Returns the package fragment root prefixed by the given path, or * an empty collection if there are no such elements in the model. */ // protected IPackageFragmentRoot[] getPackageFragmentRoots(IPath path) // // throws JavaModelException { // IPackageFragmentRoot[] roots = getAllPackageFragmentRoots(); // ArrayList matches = new ArrayList(); // // for (int i = 0; i < roots.length; ++i) { // if (path.isPrefixOf(roots[i].getPath())) { // matches.add(roots[i]); // } // } // IPackageFragmentRoot[] copy = new IPackageFragmentRoot[matches.size()]; // matches.toArray(copy); // return copy; // } /** * @see IJavaProject */ // public IPackageFragment[] getPackageFragments() throws JavaModelException { // // IPackageFragmentRoot[] roots = getPackageFragmentRoots(); // return getPackageFragmentsInRoots(roots); // } /** * Returns all the package fragments found in the specified * package fragment roots. */ // public IPackageFragment[] getPackageFragmentsInRoots(IPackageFragmentRoot[] roots) { // // ArrayList frags = new ArrayList(); // for (int i = 0; i < roots.length; i++) { // IPackageFragmentRoot root = roots[i]; // try { // IJavaElement[] rootFragments = root.getChildren(); // for (int j = 0; j < rootFragments.length; j++) { // frags.add(rootFragments[j]); // } // } catch (JavaModelException e) { // // do nothing // } // } // IPackageFragment[] fragments = new IPackageFragment[frags.size()]; // frags.toArray(fragments); // return fragments; // } /* * @see IJavaElement */ public IPath getPath() { return this.getProject().getFullPath(); } /** * @see IJavaProject */ public IProject getProject() { return fProject; } /** * Returns the project custom preference pool. * Project preferences may include custom encoding. */ // public Preferences getPreferences(){ // IProject project = getProject(); // if (!JavaProject.hasJavaNature(project)) return null; // JavaModelManager.PerProjectInfo perProjectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfo(project, true); // Preferences preferences = perProjectInfo.preferences; // if (preferences != null) return preferences; // preferences = loadPreferences(); // if (preferences == null) preferences = new Preferences(); // perProjectInfo.preferences = preferences; // return preferences; // } /** * @see IJavaProject */ // public IClasspathEntry[] getRawClasspath() throws JavaModelException { // // JavaModelManager.PerProjectInfo perProjectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfoCheckExistence(fProject); // IClasspathEntry[] classpath = perProjectInfo.classpath; // if (classpath != null) return classpath; // classpath = this.readClasspathFile(false/*don't create markers*/, true/*log problems*/); // // // extract out the output location // IPath outputLocation = null; // if (classpath != null && classpath.length > 0) { // IClasspathEntry entry = classpath[classpath.length - 1]; // if (entry.getContentKind() == ClasspathEntry.K_OUTPUT) { // outputLocation = entry.getPath(); // IClasspathEntry[] copy = new IClasspathEntry[classpath.length - 1]; // System.arraycopy(classpath, 0, copy, 0, copy.length); // classpath = copy; // } // } // if (classpath == null) { // return defaultClasspath(); // } // /* Disable validate: classpath can contain CP variables and container that need to be resolved // if (classpath != INVALID_CLASSPATH // && !JavaConventions.validateClasspath(this, classpath, outputLocation).isOK()) { // classpath = INVALID_CLASSPATH; // } // */ // perProjectInfo.classpath = classpath; // perProjectInfo.outputLocation = outputLocation; // return classpath; // } /** * @see IJavaProject#getRequiredProjectNames */ // public String[] getRequiredProjectNames() throws JavaModelException { // // return this.projectPrerequisites(getResolvedClasspath(true)); // } /** * @see IJavaProject */ // public IClasspathEntry[] getResolvedClasspath(boolean ignoreUnresolvedEntry) // throws JavaModelException { // // return // this.getResolvedClasspath( // ignoreUnresolvedEntry, // false); // generateMarkerOnError // } /** * Internal variant which can create marker on project for invalid entries * and caches the resolved classpath on perProjectInfo */ // public IClasspathEntry[] getResolvedClasspath( // boolean ignoreUnresolvedEntry, // boolean generateMarkerOnError) // throws JavaModelException { // // JavaModelManager manager = JavaModelManager.getJavaModelManager(); // JavaModelManager.PerProjectInfo perProjectInfo = manager.getPerProjectInfoCheckExistence(fProject); // // // reuse cache if not needing to refresh markers or checking bound variables // if (ignoreUnresolvedEntry && !generateMarkerOnError && perProjectInfo != null){ // // resolved path is cached on its info // IClasspathEntry[] infoPath = perProjectInfo.lastResolvedClasspath; // if (infoPath != null) return infoPath; // } // Map reverseMap = perProjectInfo == null ? null : new HashMap(5); // IClasspathEntry[] resolvedPath = getResolvedClasspath( // getRawClasspath(), // generateMarkerOnError ? getOutputLocation() : null, // ignoreUnresolvedEntry, // generateMarkerOnError, // reverseMap); // // if (perProjectInfo != null){ // if (perProjectInfo.classpath == null // .classpath file could not be read // && generateMarkerOnError // && JavaProject.hasJavaNature(fProject)) { // this.createClasspathProblemMarker(new JavaModelStatus( // IJavaModelStatusConstants.INVALID_CLASSPATH_FILE_FORMAT, // Util.bind("classpath.cannotReadClasspathFile", this.getElementName()))); //$NON-NLS-1$ // } // // perProjectInfo.lastResolvedClasspath = resolvedPath; // perProjectInfo.resolvedPathToRawEntries = reverseMap; // } // return resolvedPath; // } /** * Internal variant which can process any arbitrary classpath */ // public IClasspathEntry[] getResolvedClasspath( // IClasspathEntry[] classpathEntries, // IPath projectOutputLocation, // only set if needing full classpath validation (and markers) // boolean ignoreUnresolvedEntry, // if unresolved entries are met, should it trigger initializations // boolean generateMarkerOnError, // Map reverseMap) // can be null if not interested in reverse mapping // throws JavaModelException { // // IJavaModelStatus status; // if (generateMarkerOnError){ // flushClasspathProblemMarkers(false, false); // } // // int length = classpathEntries.length; // ArrayList resolvedEntries = new ArrayList(); // // for (int i = 0; i < length; i++) { // // IClasspathEntry rawEntry = classpathEntries[i]; // IPath resolvedPath; // status = null; // // /* validation if needed */ // if (generateMarkerOnError || !ignoreUnresolvedEntry) { // status = JavaConventions.validateClasspathEntry(this, rawEntry, false); // if (generateMarkerOnError && !status.isOK()) createClasspathProblemMarker(status); // } // // switch (rawEntry.getEntryKind()){ // // case IClasspathEntry.CPE_VARIABLE : // // IClasspathEntry resolvedEntry = JavaCore.getResolvedClasspathEntry(rawEntry); // if (resolvedEntry == null) { // if (!ignoreUnresolvedEntry) throw new JavaModelException(status); // } else { // if (reverseMap != null && reverseMap.get(resolvedPath = resolvedEntry.getPath()) == null) reverseMap.put(resolvedPath , rawEntry); // resolvedEntries.add(resolvedEntry); // } // break; // // case IClasspathEntry.CPE_CONTAINER : // // IClasspathContainer container = JavaCore.getClasspathContainer(rawEntry.getPath(), this); // if (container == null){ // if (!ignoreUnresolvedEntry) throw new JavaModelException(status); // break; // } // // IClasspathEntry[] containerEntries = container.getClasspathEntries(); // if (containerEntries == null) break; // // // container was bound // for (int j = 0, containerLength = containerEntries.length; j < containerLength; j++){ // IClasspathEntry cEntry = containerEntries[j]; // // if (generateMarkerOnError) { // IJavaModelStatus containerStatus = JavaConventions.validateClasspathEntry(this, cEntry, false); // if (!containerStatus.isOK()) createClasspathProblemMarker(containerStatus); // } // // if container is exported, then its nested entries must in turn be exported (21749) // if (rawEntry.isExported()){ // cEntry = new ClasspathEntry(cEntry.getContentKind(), // cEntry.getEntryKind(), cEntry.getPath(), // cEntry.getExclusionPatterns(), cEntry.getSourceAttachmentPath(), // cEntry.getSourceAttachmentRootPath(), cEntry.getOutputLocation(), // true); // duplicate container entry for tagging it as exported // } // if (reverseMap != null && reverseMap.get(resolvedPath = cEntry.getPath()) == null) reverseMap.put(resolvedPath, rawEntry); // resolvedEntries.add(cEntry); // } // break; // // default : // // if (reverseMap != null && reverseMap.get(resolvedPath = rawEntry.getPath()) == null) reverseMap.put(resolvedPath, rawEntry); // resolvedEntries.add(rawEntry); // // } // } // // IClasspathEntry[] resolvedPath = new IClasspathEntry[resolvedEntries.size()]; // resolvedEntries.toArray(resolvedPath); // // if (generateMarkerOnError && projectOutputLocation != null) { // status = JavaConventions.validateClasspath(this, resolvedPath, projectOutputLocation); // if (!status.isOK()) createClasspathProblemMarker(status); // } // return resolvedPath; // } /* * @see IJavaElement */ public IResource getResource() { return this.getProject(); } /** * @see IJavaProject */ // public ISearchableNameEnvironment getSearchableNameEnvironment() // throws JavaModelException { // // JavaProjectElementInfo info = getJavaProjectElementInfo(); // if (info.getSearchableEnvironment() == null) { // info.setSearchableEnvironment(new SearchableEnvironment(this)); // } // return info.getSearchableEnvironment(); // } /** * Retrieve a shared property on a project. If the property is not defined, answers null. * Note that it is orthogonal to IResource persistent properties, and client code has to decide * which form of storage to use appropriately. Shared properties produce real resource files which * can be shared through a VCM onto a server. Persistent properties are not shareable. * * @see JavaProject#setSharedProperty(String, String) */ // public String getSharedProperty(String key) throws CoreException { // // String property = null; // IFile rscFile = getProject().getFile(key); // if (rscFile.exists()) { // property = new String(Util.getResourceContentsAsByteArray(rscFile)); // } // return property; // } /** * @see JavaElement */ // public SourceMapper getSourceMapper() { // // return null; // } /** * @see IJavaElement */ public IResource getUnderlyingResource() throws JavaModelException { if (!exists()) throw newNotPresentException(); return getProject(); } /** * @see IJavaProject */ // public boolean hasBuildState() { // // return JavaModelManager.getJavaModelManager().getLastBuiltState(this.getProject(), null) != null; // } /** * @see IJavaProject */ // public boolean hasClasspathCycle(IClasspathEntry[] preferredClasspath) { // HashSet cycleParticipants = new HashSet(); // updateCycleParticipants(preferredClasspath, new ArrayList(2), cycleParticipants, ResourcesPlugin.getWorkspace().getRoot(), new HashSet(2)); // return !cycleParticipants.isEmpty(); // } // public boolean hasCycleMarker(){ // return this.getCycleMarker() != null; // } public int hashCode() { return fProject.hashCode(); } /** * Returns true if the given project is accessible and it has * a java nature, otherwise false. */ public static boolean hasJavaNature(IProject project) { try { return project.hasNature(PHPeclipsePlugin.PHP_NATURE_ID); } catch (CoreException e) { // project does not exist or is not open } return false; } /** * Answers true if the project potentially contains any source. A project which has no source is immutable. */ // public boolean hasSource() { // // // look if any source folder on the classpath // // no need for resolved path given source folder cannot be abstracted // IClasspathEntry[] entries; // try { // entries = this.getRawClasspath(); // } catch (JavaModelException e) { // return true; // unsure // } // for (int i = 0, max = entries.length; i < max; i++) { // if (entries[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) { // return true; // } // } // return false; // } /** * Compare current classpath with given one to see if any different. * Note that the argument classpath contains its binary output. */ // public boolean isClasspathEqualsTo(IClasspathEntry[] newClasspath, IPath newOutputLocation, IClasspathEntry[] otherClasspathWithOutput) // throws JavaModelException { // // if (otherClasspathWithOutput != null && otherClasspathWithOutput.length > 0) { // // int length = otherClasspathWithOutput.length; // if (length == newClasspath.length + 1) { // // output is amongst file entries (last one) // // // compare classpath entries // for (int i = 0; i < length - 1; i++) { // if (!otherClasspathWithOutput[i].equals(newClasspath[i])) // return false; // } // // compare binary outputs // IClasspathEntry output = otherClasspathWithOutput[length - 1]; // if (output.getContentKind() == ClasspathEntry.K_OUTPUT // && output.getPath().equals(newOutputLocation)) // return true; // } // } // return false; // } /* * @see IJavaProject */ // public boolean isOnClasspath(IJavaElement element) { // IPath path = element.getPath(); // switch (element.getElementType()) { // case IJavaElement.PACKAGE_FRAGMENT_ROOT: // if (!((IPackageFragmentRoot)element).isArchive()) { // // ensure that folders are only excluded if all of their children are excluded // path = path.append("*"); //$NON-NLS-1$ // } // break; // case IJavaElement.PACKAGE_FRAGMENT: // if (!((IPackageFragmentRoot)element.getParent()).isArchive()) { // // ensure that folders are only excluded if all of their children are excluded // path = path.append("*"); //$NON-NLS-1$ // } // break; // } // return this.isOnClasspath(path); // } // private boolean isOnClasspath(IPath path) { // IClasspathEntry[] classpath; // try { // classpath = this.getResolvedClasspath(true/*ignore unresolved variable*/); // } catch(JavaModelException e){ // return false; // not a Java project // } // for (int i = 0; i < classpath.length; i++) { // IClasspathEntry entry = classpath[i]; // if (entry.getPath().isPrefixOf(path) // && !Util.isExcluded(path, ((ClasspathEntry)entry).fullExclusionPatternChars())) { // return true; // } // } // return false; // } /* * @see IJavaProject */ // public boolean isOnClasspath(IResource resource) { // IPath path = resource.getFullPath(); // // // ensure that folders are only excluded if all of their children are excluded // if (resource.getType() == IResource.FOLDER) { // path = path.append("*"); //$NON-NLS-1$ // } // // return this.isOnClasspath(path); // } /* * load preferences from a shareable format (VCM-wise) */ public Preferences loadPreferences() { Preferences preferences = new Preferences(); // File prefFile = getProject().getLocation().append(PREF_FILENAME).toFile(); IPath projectMetaLocation = getProject().getPluginWorkingLocation(PHPCore.getPlugin().getDescriptor()); if (projectMetaLocation != null) { File prefFile = projectMetaLocation.append(PREF_FILENAME).toFile(); if (prefFile.exists()) { // load preferences from file InputStream in = null; try { in = new BufferedInputStream(new FileInputStream(prefFile)); preferences.load(in); return preferences; } catch (IOException e) { // problems loading preference store - quietly ignore } finally { if (in != null) { try { in.close(); } catch (IOException e) { // ignore problems with close } } } } } return null; } /** * @see IJavaProject#newEvaluationContext */ // public IEvaluationContext newEvaluationContext() { // // return new EvaluationContextWrapper(new EvaluationContext(), this); // } /** * @see IJavaProject */ // public ITypeHierarchy newTypeHierarchy( // IRegion region, // IProgressMonitor monitor) // throws JavaModelException { // // if (region == null) { // throw new IllegalArgumentException(Util.bind("hierarchy.nullRegion"));//$NON-NLS-1$ // } // CreateTypeHierarchyOperation op = // new CreateTypeHierarchyOperation(null, region, this, true); // runOperation(op, monitor); // return op.getResult(); // } /** * @see IJavaProject */ // public ITypeHierarchy newTypeHierarchy( // IType type, // IRegion region, // IProgressMonitor monitor) // throws JavaModelException { // // if (type == null) { // throw new IllegalArgumentException(Util.bind("hierarchy.nullFocusType"));//$NON-NLS-1$ // } // if (region == null) { // throw new IllegalArgumentException(Util.bind("hierarchy.nullRegion"));//$NON-NLS-1$ // } // CreateTypeHierarchyOperation op = // new CreateTypeHierarchyOperation(type, region, this, true); // runOperation(op, monitor); // return op.getResult(); // } /** * Open project if resource isn't closed */ // protected void openWhenClosed(IProgressMonitor pm) throws JavaModelException { // // if (!this.fProject.isOpen()) { // throw newNotPresentException(); // } else { // super.openWhenClosed(pm); // } // } // public String[] projectPrerequisites(IClasspathEntry[] entries) // throws JavaModelException { // // ArrayList prerequisites = new ArrayList(); // // need resolution // entries = getResolvedClasspath(entries, null, true, false, null/*no reverse map*/); // for (int i = 0, length = entries.length; i < length; i++) { // IClasspathEntry entry = entries[i]; // if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) { // prerequisites.add(entry.getPath().lastSegment()); // } // } // int size = prerequisites.size(); // if (size == 0) { // return NO_PREREQUISITES; // } else { // String[] result = new String[size]; // prerequisites.toArray(result); // return result; // } // } /** * Reads the .classpath file from disk and returns the list of entries it contains (including output location entry) * Returns null if .classfile is not present. * Returns INVALID_CLASSPATH if it has a format problem. */ // protected IClasspathEntry[] readClasspathFile(boolean createMarker, boolean logProblems) { // // try { // String xmlClasspath = getSharedProperty(CLASSPATH_FILENAME); // if (xmlClasspath == null) return null; // return decodeClasspath(xmlClasspath, createMarker, logProblems); // } catch(CoreException e) { // // file does not exist (or not accessible) // if (createMarker && this.getProject().isAccessible()) { // this.createClasspathProblemMarker(new JavaModelStatus( // IJavaModelStatusConstants.INVALID_CLASSPATH_FILE_FORMAT, // Util.bind("classpath.cannotReadClasspathFile", this.getElementName()))); //$NON-NLS-1$ // } // if (logProblems) { // Util.log(e, // "Exception while retrieving "+ this.getPath() //$NON-NLS-1$ // +"/.classpath, will revert to default classpath"); //$NON-NLS-1$ // } // } // return null; // } /** * Removes the given builder from the build spec for the given project. */ protected void removeFromBuildSpec(String builderID) throws CoreException { IProjectDescription description = getProject().getDescription(); ICommand[] commands = description.getBuildSpec(); for (int i = 0; i < commands.length; ++i) { if (commands[i].getBuilderName().equals(builderID)) { ICommand[] newCommands = new ICommand[commands.length - 1]; System.arraycopy(commands, 0, newCommands, 0, i); System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1); description.setBuildSpec(newCommands); getProject().setDescription(description, null); return; } } } /** * @see JavaElement#rootedAt(IJavaProject) */ public IJavaElement rootedAt(IJavaProject project) { return project; } /** * Answers an ID which is used to distinguish project/entries during package * fragment root computations */ public String rootID(){ return "[PRJ]"+this.getProject().getFullPath(); //$NON-NLS-1$ } /** * Saves the classpath in a shareable format (VCM-wise) only when necessary, that is, if it is semantically different * from the existing one in file. Will never write an identical one. * * @return Return whether the .classpath file was modified. */ // public boolean saveClasspath(IClasspathEntry[] newClasspath, IPath newOutputLocation) throws JavaModelException { // // if (!getProject().exists()) return false; // // IClasspathEntry[] fileEntries = readClasspathFile(false /*don't create markers*/, false/*don't log problems*/); // if (fileEntries != null && isClasspathEqualsTo(newClasspath, newOutputLocation, fileEntries)) { // // no need to save it, it is the same // return false; // } // // // actual file saving // try { // setSharedProperty(CLASSPATH_FILENAME, encodeClasspath(newClasspath, newOutputLocation, true)); // return true; // } catch (CoreException e) { // throw new JavaModelException(e); // } // } /** * Save project custom preferences to shareable file (.jprefs) */ private void savePreferences(Preferences preferences) { IProject project = getProject(); if (!JavaProject.hasJavaNature(project)) return; // ignore if (preferences == null || (!preferences.needsSaving() && preferences.propertyNames().length != 0)) { // nothing to save return; } // preferences need to be saved // the preferences file is located in the plug-in's state area // at a well-known name (.jprefs) // File prefFile = getProject().getLocation().append(PREF_FILENAME).toFile(); File prefFile = project.getPluginWorkingLocation(PHPCore.getPlugin().getDescriptor()).append(PREF_FILENAME).toFile(); if (preferences.propertyNames().length == 0) { // there are no preference settings // rather than write an empty file, just delete any existing file if (prefFile.exists()) { prefFile.delete(); // don't worry if delete unsuccessful } return; } // write file, overwriting an existing one OutputStream out = null; try { // do it as carefully as we know how so that we don't lose/mangle // the setting in times of stress out = new BufferedOutputStream(new FileOutputStream(prefFile)); preferences.store(out, null); } catch (IOException e) { // problems saving preference store - quietly ignore } finally { if (out != null) { try { out.close(); } catch (IOException e) { // ignore problems with close } } } } /** * Update the Java command in the build spec (replace existing one if present, * add one first if none). */ private void setJavaCommand( IProjectDescription description, ICommand newCommand) throws CoreException { ICommand[] oldCommands = description.getBuildSpec(); ICommand oldJavaCommand = getJavaCommand(description); ICommand[] newCommands; if (oldJavaCommand == null) { // Add a Java build spec before other builders (1FWJK7I) newCommands = new ICommand[oldCommands.length + 1]; System.arraycopy(oldCommands, 0, newCommands, 1, oldCommands.length); newCommands[0] = newCommand; } else { for (int i = 0, max = oldCommands.length; i < max; i++) { if (oldCommands[i] == oldJavaCommand) { oldCommands[i] = newCommand; break; } } newCommands = oldCommands; } // Commit the spec change into the project description.setBuildSpec(newCommands); getProject().setDescription(description, null); } /** * @see org.eclipse.jdt.core.IJavaProject#setOptions(Map) */ // public void setOptions(Map newOptions) { // // Preferences preferences; // setPreferences(preferences = new Preferences()); // always reset (26255) // if (newOptions != null){ // Iterator keys = newOptions.keySet().iterator(); // while (keys.hasNext()){ // String key = (String)keys.next(); // if (!JavaModelManager.OptionNames.contains(key)) continue; // unrecognized option // // no filtering for encoding (custom encoding for project is allowed) // String value = (String)newOptions.get(key); // preferences.setDefault(key, CUSTOM_DEFAULT_OPTION_VALUE); // empty string isn't the default (26251) // preferences.setValue(key, value); // } // } // // // persist options // savePreferences(preferences); // } /** * @see IJavaProject */ // public void setOutputLocation(IPath path, IProgressMonitor monitor) // throws JavaModelException { // // if (path == null) { // throw new IllegalArgumentException(Util.bind("path.nullpath")); //$NON-NLS-1$ // } // if (path.equals(getOutputLocation())) { // return; // } // this.setRawClasspath(SetClasspathOperation.ReuseClasspath, path, monitor); // } /* * Set cached preferences, no preference file is saved, only info is updated */ // public void setPreferences(Preferences preferences) { // IProject project = getProject(); // if (!JavaProject.hasJavaNature(project)) return; // ignore // JavaModelManager.PerProjectInfo perProjectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfo(project, true); // perProjectInfo.preferences = preferences; // } /** * Sets the underlying kernel project of this Java project, * and fills in its parent and name. * Called by IProject.getNature(). * * @see IProjectNature#setProject */ public void setProject(IProject project) { fProject = project; fParent = JavaModelManager.getJavaModelManager().getJavaModel(); fName = project.getName(); } /** * @see IJavaProject */ // public void setRawClasspath( // IClasspathEntry[] entries, // IPath outputLocation, // IProgressMonitor monitor) // throws JavaModelException { // // setRawClasspath( // entries, // outputLocation, // monitor, // true, // canChangeResource (as per API contract) // getResolvedClasspath(true), // ignoreUnresolvedVariable // true, // needValidation // true); // need to save // } // public void setRawClasspath( // IClasspathEntry[] newEntries, // IPath newOutputLocation, // IProgressMonitor monitor, // boolean canChangeResource, // IClasspathEntry[] oldResolvedPath, // boolean needValidation, // boolean needSave) // throws JavaModelException { // // JavaModelManager manager = // (JavaModelManager) JavaModelManager.getJavaModelManager(); // try { // IClasspathEntry[] newRawPath = newEntries; // if (newRawPath == null) { //are we already with the default classpath // newRawPath = defaultClasspath(); // } // SetClasspathOperation op = // new SetClasspathOperation( // this, // oldResolvedPath, // newRawPath, // newOutputLocation, // canChangeResource, // needValidation, // needSave); // runOperation(op, monitor); // // } catch (JavaModelException e) { // manager.flush(); // throw e; // } // } /** * @see IJavaProject */ // public void setRawClasspath( // IClasspathEntry[] entries, // IProgressMonitor monitor) // throws JavaModelException { // // setRawClasspath( // entries, // SetClasspathOperation.ReuseOutputLocation, // monitor, // true, // canChangeResource (as per API contract) // getResolvedClasspath(true), // ignoreUnresolvedVariable // true, // needValidation // true); // need to save // } /** * NOTE: null specifies default classpath, and an empty * array specifies an empty classpath. * * @exception NotPresentException if this project does not exist. */ // protected void setRawClasspath0(IClasspathEntry[] rawEntries) // throws JavaModelException { // // JavaModelManager.PerProjectInfo info = JavaModelManager.getJavaModelManager().getPerProjectInfoCheckExistence(fProject); // // synchronized (info) { // if (rawEntries != null) { // info.classpath = rawEntries; // } // // // clear cache of resolved classpath // info.lastResolvedClasspath = null; // info.resolvedPathToRawEntries = null; // } // } /** * Record a shared persistent property onto a project. * Note that it is orthogonal to IResource persistent properties, and client code has to decide * which form of storage to use appropriately. Shared properties produce real resource files which * can be shared through a VCM onto a server. Persistent properties are not shareable. * * shared properties end up in resource files, and thus cannot be modified during * delta notifications (a CoreException would then be thrown). * * @see JavaProject#getSharedProperty(String key) */ public void setSharedProperty(String key, String value) throws CoreException { IFile rscFile = getProject().getFile(key); InputStream inputStream = new ByteArrayInputStream(value.getBytes()); // update the resource content if (rscFile.exists()) { if (rscFile.isReadOnly()) { // provide opportunity to checkout read-only .classpath file (23984) ResourcesPlugin.getWorkspace().validateEdit(new IFile[]{rscFile}, null); } rscFile.setContents(inputStream, IResource.FORCE, null); } else { rscFile.create(inputStream, IResource.FORCE, null); } } /** * Update cycle markers for all java projects */ // public static void updateAllCycleMarkers() throws JavaModelException { // // //long start = System.currentTimeMillis(); // // JavaModelManager manager = JavaModelManager.getJavaModelManager(); // IJavaProject[] projects = manager.getJavaModel().getJavaProjects(); // IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); // // HashSet cycleParticipants = new HashSet(); // HashSet traversed = new HashSet(); // int length = projects.length; // // // compute cycle participants // ArrayList prereqChain = new ArrayList(); // for (int i = 0; i < length; i++){ // JavaProject project = (JavaProject)projects[i]; // if (!traversed.contains(project.getPath())){ // prereqChain.clear(); // project.updateCycleParticipants(null, prereqChain, cycleParticipants, workspaceRoot, traversed); // } // } // //System.out.println("updateAllCycleMarkers: " + (System.currentTimeMillis() - start) + " ms"); // // for (int i = 0; i < length; i++){ // JavaProject project = (JavaProject)projects[i]; // // if (cycleParticipants.contains(project.getPath())){ // IMarker cycleMarker = project.getCycleMarker(); // String circularCPOption = project.getOption(JavaCore.CORE_CIRCULAR_CLASSPATH, true); // int circularCPSeverity = JavaCore.ERROR.equals(circularCPOption) ? IMarker.SEVERITY_ERROR : IMarker.SEVERITY_WARNING; // if (cycleMarker != null) { // // update existing cycle marker if needed // try { // int existingSeverity = ((Integer)cycleMarker.getAttribute(IMarker.SEVERITY)).intValue(); // if (existingSeverity != circularCPSeverity) { // cycleMarker.setAttribute(IMarker.SEVERITY, circularCPSeverity); // } // } catch (CoreException e) { // throw new JavaModelException(e); // } // } else { // // create new marker // project.createClasspathProblemMarker( // new JavaModelStatus(IJavaModelStatusConstants.CLASSPATH_CYCLE, project)); // } // } else { // project.flushClasspathProblemMarkers(true, false); // } // } // } // // /** // * If a cycle is detected, then cycleParticipants contains all the paths of projects involved in this cycle (directly and indirectly), // * no cycle if the set is empty (and started empty) // */ // public void updateCycleParticipants( // IClasspathEntry[] preferredClasspath, // ArrayList prereqChain, // HashSet cycleParticipants, // IWorkspaceRoot workspaceRoot, // HashSet traversed){ // // IPath path = this.getPath(); // prereqChain.add(path); // traversed.add(path); // try { // IClasspathEntry[] classpath = preferredClasspath == null ? getResolvedClasspath(true) : preferredClasspath; // for (int i = 0, length = classpath.length; i < length; i++) { // IClasspathEntry entry = classpath[i]; // // if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT){ // IPath prereqProjectPath = entry.getPath(); // int index = cycleParticipants.contains(prereqProjectPath) ? 0 : prereqChain.indexOf(prereqProjectPath); // if (index >= 0) { // refer to cycle, or in cycle itself // for (int size = prereqChain.size(); index < size; index++) { // cycleParticipants.add(prereqChain.get(index)); // } // } else { // if (!traversed.contains(prereqProjectPath)) { // IResource member = workspaceRoot.findMember(prereqProjectPath); // if (member != null && member.getType() == IResource.PROJECT){ // JavaProject project = (JavaProject)JavaCore.create((IProject)member); // project.updateCycleParticipants(null, prereqChain, cycleParticipants, workspaceRoot, traversed); // } // } // } // } // } // } catch(JavaModelException e){ // } // prereqChain.remove(path); // } /** * Reset the collection of package fragment roots (local ones) - only if opened. * Need to check *all* package fragment roots in order to reset NameLookup */ // public void updatePackageFragmentRoots(){ // // if (this.isOpen()) { // try { // JavaProjectElementInfo info = getJavaProjectElementInfo(); // // IClasspathEntry[] classpath = getResolvedClasspath(true); // NameLookup lookup = info.getNameLookup(); // if (lookup != null){ // IPackageFragmentRoot[] oldRoots = lookup.fPackageFragmentRoots; // IPackageFragmentRoot[] newRoots = computePackageFragmentRoots(classpath, true); // checkIdentical: { // compare all pkg fragment root lists // if (oldRoots.length == newRoots.length){ // for (int i = 0, length = oldRoots.length; i < length; i++){ // if (!oldRoots[i].equals(newRoots[i])){ // break checkIdentical; // } // } // return; // no need to update // } // } // info.setNameLookup(null); // discard name lookup (hold onto roots) // } // info.setNonJavaResources(null); // info.setChildren( // computePackageFragmentRoots(classpath, false)); // // } catch(JavaModelException e){ // try { // close(); // could not do better // } catch(JavaModelException ex){ // } // } // } // } }