/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.core; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.ClasspathContainerInitializer; import org.eclipse.jdt.core.IClasspathContainer; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaModelStatus; import org.eclipse.jdt.core.IJavaModelStatusConstants; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.util.Messages; /** * @see IJavaModelStatus */ public class JavaModelStatus extends Status implements IJavaModelStatus, IJavaModelStatusConstants { /** * The elements related to the failure, or <code>null</code> if no elements are involved. */ protected IJavaElement[] elements= new IJavaElement[0]; /** * The path related to the failure, or <code>null</code> if no path is involved. */ protected IPath path; /** * The <code>String</code> related to the failure, or <code>null</code> if no * <code>String</code> is involved. */ protected String string; /** * Empty children */ protected final static IStatus[] NO_CHILDREN= new IStatus[] {}; protected IStatus[] children= NO_CHILDREN; /** * Singleton OK object */ public static final IJavaModelStatus VERIFIED_OK= new JavaModelStatus(OK, OK, Messages.status_OK); /** * Constructs an Java model status with no corresponding elements. */ public JavaModelStatus() { // no code for an multi-status super(ERROR, JavaCore.PLUGIN_ID, 0, "JavaModelStatus", null); //$NON-NLS-1$ } /** * Constructs an Java model status with no corresponding elements. */ public JavaModelStatus(int code) { super(ERROR, JavaCore.PLUGIN_ID, code, "JavaModelStatus", null); //$NON-NLS-1$ this.elements= JavaElement.NO_ELEMENTS; } /** * Constructs an Java model status with the given corresponding elements. */ public JavaModelStatus(int code, IJavaElement[] elements) { super(ERROR, JavaCore.PLUGIN_ID, code, "JavaModelStatus", null); //$NON-NLS-1$ this.elements= elements; this.path= null; } /** * Constructs an Java model status with no corresponding elements. */ public JavaModelStatus(int code, String string) { this(ERROR, code, string); } /** * Constructs an Java model status with no corresponding elements. */ public JavaModelStatus(int severity, int code, String string) { super(severity, JavaCore.PLUGIN_ID, code, "JavaModelStatus", null); //$NON-NLS-1$ this.elements= JavaElement.NO_ELEMENTS; this.path= null; this.string= string; } /** * Constructs an Java model status with no corresponding elements. */ public JavaModelStatus(int code, Throwable throwable) { super(ERROR, JavaCore.PLUGIN_ID, code, "JavaModelStatus", throwable); //$NON-NLS-1$ this.elements= JavaElement.NO_ELEMENTS; } /** * Constructs an Java model status with no corresponding elements. */ public JavaModelStatus(int code, IPath path) { super(ERROR, JavaCore.PLUGIN_ID, code, "JavaModelStatus", null); //$NON-NLS-1$ this.elements= JavaElement.NO_ELEMENTS; this.path= path; } /** * Constructs an Java model status with the given corresponding element. */ public JavaModelStatus(int code, IJavaElement element) { this(code, new IJavaElement[] { element }); } /** * Constructs an Java model status with the given corresponding element and string */ public JavaModelStatus(int code, IJavaElement element, String string) { this(code, new IJavaElement[] { element }); this.string= string; } /** * Constructs an Java model status with the given corresponding element and path */ public JavaModelStatus(int code, IJavaElement element, IPath path) { this(code, new IJavaElement[] { element }); this.path= path; } /** * Constructs an Java model status with the given corresponding element, path and string */ public JavaModelStatus(int code, IJavaElement element, IPath path, String string) { this(code, new IJavaElement[] { element }); this.path= path; this.string= string; } /** * Constructs an Java model status with the given corresponding element and path */ public JavaModelStatus(int severity, int code, IJavaElement element, IPath path, String msg) { super(severity, JavaCore.PLUGIN_ID, code, "JavaModelStatus", null); //$NON-NLS-1$ this.elements= new IJavaElement[] { element }; this.path= path; this.string= msg; } /** * Constructs an Java model status with no corresponding elements. */ public JavaModelStatus(CoreException coreException) { super(ERROR, JavaCore.PLUGIN_ID, CORE_EXCEPTION, "JavaModelStatus", coreException); //$NON-NLS-1$ this.elements= JavaElement.NO_ELEMENTS; } protected int getBits() { int severity= 1 << (getCode() % 100 / 33); int category= 1 << ((getCode() / 100) + 3); return severity | category; } /** * @see IStatus */ public IStatus[] getChildren() { return this.children; } /** * @see IJavaModelStatus */ public IJavaElement[] getElements() { return this.elements; } /** * Returns the message that is relevant to the code of this status. */ public String getMessage() { Throwable exception= getException(); if (exception == null) { switch (getCode()) { case CORE_EXCEPTION: return Messages.status_coreException; case BUILDER_INITIALIZATION_ERROR: return Messages.build_initializationError; case BUILDER_SERIALIZATION_ERROR: return Messages.build_serializationError; case DEVICE_PATH: return Messages.bind(Messages.status_cannotUseDeviceOnPath, getPath().toString()); case DOM_EXCEPTION: return Messages.status_JDOMError; case ELEMENT_DOES_NOT_EXIST: return Messages.bind(Messages.element_doesNotExist, ((JavaElement)this.elements[0]).toStringWithAncestors()); case ELEMENT_NOT_ON_CLASSPATH: return Messages.bind(Messages.element_notOnClasspath, ((JavaElement)this.elements[0]).toStringWithAncestors()); case EVALUATION_ERROR: return Messages.bind(Messages.status_evaluationError, this.string); case INDEX_OUT_OF_BOUNDS: return Messages.status_indexOutOfBounds; case INVALID_CONTENTS: return Messages.status_invalidContents; case INVALID_DESTINATION: return Messages.bind(Messages.status_invalidDestination, ((JavaElement)this.elements[0]).toStringWithAncestors()); case INVALID_ELEMENT_TYPES: StringBuffer buff= new StringBuffer(Messages.operation_notSupported); for (int i= 0; i < this.elements.length; i++) { if (i > 0) { buff.append(", "); //$NON-NLS-1$ } buff.append(((JavaElement)this.elements[i]).toStringWithAncestors()); } return buff.toString(); case INVALID_NAME: return Messages.bind(Messages.status_invalidName, this.string); case INVALID_PACKAGE: return Messages.bind(Messages.status_invalidPackage, this.string); case INVALID_PATH: if (this.string != null) { return this.string; } else { return Messages.bind( Messages.status_invalidPath, new String[] { getPath() == null ? "null" : getPath().toString() } //$NON-NLS-1$ ); } case INVALID_PROJECT: return Messages.bind(Messages.status_invalidProject, this.string); case INVALID_RESOURCE: return Messages.bind(Messages.status_invalidResource, this.string); case INVALID_RESOURCE_TYPE: return Messages.bind(Messages.status_invalidResourceType, this.string); case INVALID_SIBLING: if (this.string != null) { return Messages.bind(Messages.status_invalidSibling, this.string); } else { return Messages.bind(Messages.status_invalidSibling, ((JavaElement)this.elements[0]).toStringWithAncestors()); } case IO_EXCEPTION: return Messages.status_IOException; case NAME_COLLISION: if (this.elements != null && this.elements.length > 0) { IJavaElement element= this.elements[0]; if (element instanceof PackageFragment && ((PackageFragment)element).isDefaultPackage()) { return Messages.operation_cannotRenameDefaultPackage; } } if (this.string != null) { return this.string; } else { return Messages.bind(Messages.status_nameCollision, ""); //$NON-NLS-1$ } case NO_ELEMENTS_TO_PROCESS: return Messages.operation_needElements; case NULL_NAME: return Messages.operation_needName; case NULL_PATH: return Messages.operation_needPath; case NULL_STRING: return Messages.operation_needString; case PATH_OUTSIDE_PROJECT: return Messages.bind(Messages.operation_pathOutsideProject, new String[] { this.string, ((JavaElement)this.elements[0]).toStringWithAncestors() }); case READ_ONLY: IJavaElement element= this.elements[0]; String name= element.getElementName(); if (element instanceof IPackageFragment && name.equals(IPackageFragment.DEFAULT_PACKAGE_NAME)) { return Messages.status_defaultPackageReadOnly; } return Messages.bind(Messages.status_readOnly, name); case RELATIVE_PATH: return Messages.bind(Messages.operation_needAbsolutePath, getPath().toString()); case TARGET_EXCEPTION: return Messages.status_targetException; case UPDATE_CONFLICT: return Messages.status_updateConflict; case NO_LOCAL_CONTENTS: return Messages.bind(Messages.status_noLocalContents, getPath().toString()); case CP_CONTAINER_PATH_UNBOUND: IJavaProject javaProject= (IJavaProject)this.elements[0]; ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(this.path.segment(0)); String description= null; if (initializer != null) description= initializer.getDescription(this.path, javaProject); if (description == null) description= this.path.makeRelative().toString(); return Messages.bind(Messages.classpath_unboundContainerPath, new String[] { description, javaProject.getElementName() }); case INVALID_CP_CONTAINER_ENTRY: javaProject= (IJavaProject)this.elements[0]; IClasspathContainer container= null; description= null; try { container= JavaCore.getClasspathContainer(this.path, javaProject); } catch (JavaModelException e) { // project doesn't exist: ignore } if (container == null) { initializer= JavaCore.getClasspathContainerInitializer(this.path.segment(0)); if (initializer != null) description= initializer.getDescription(this.path, javaProject); } else { description= container.getDescription(); } if (description == null) description= this.path.makeRelative().toString(); return Messages.bind(Messages.classpath_invalidContainer, new String[] { description, javaProject.getElementName() }); case CP_VARIABLE_PATH_UNBOUND: javaProject= (IJavaProject)this.elements[0]; return Messages.bind(Messages.classpath_unboundVariablePath, new String[] { this.path.makeRelative().toString(), javaProject.getElementName() }); case CLASSPATH_CYCLE: javaProject= (IJavaProject)this.elements[0]; return Messages.bind(Messages.classpath_cycle, javaProject.getElementName()); case DISABLED_CP_EXCLUSION_PATTERNS: javaProject= (IJavaProject)this.elements[0]; String projectName= javaProject.getElementName(); IPath newPath= this.path; if (this.path.segment(0).toString().equals(projectName)) { newPath= this.path.removeFirstSegments(1); } return Messages.bind(Messages.classpath_disabledInclusionExclusionPatterns, new String[] { newPath.makeRelative().toString(), projectName }); case DISABLED_CP_MULTIPLE_OUTPUT_LOCATIONS: javaProject= (IJavaProject)this.elements[0]; projectName= javaProject.getElementName(); newPath= this.path; if (this.path.segment(0).toString().equals(projectName)) { newPath= this.path.removeFirstSegments(1); } return Messages.bind(Messages.classpath_disabledMultipleOutputLocations, new String[] { newPath.makeRelative().toString(), projectName }); case CANNOT_RETRIEVE_ATTACHED_JAVADOC: if (this.elements != null && this.elements.length == 1) { if (this.string != null) { return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, ((JavaElement)this.elements[0]).toStringWithAncestors(), this.string); } return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, ((JavaElement)this.elements[0]).toStringWithAncestors(), ""); //$NON-NLS-1$ } if (this.string != null) { return Messages.bind(Messages.status_cannot_retrieve_attached_javadoc, this.string, "");//$NON-NLS-1$ } break; case UNKNOWN_JAVADOC_FORMAT: return Messages.bind(Messages.status_unknown_javadoc_format, ((JavaElement)this.elements[0]).toStringWithAncestors()); case DEPRECATED_VARIABLE: javaProject= (IJavaProject)this.elements[0]; return Messages.bind(Messages.classpath_deprecated_variable, new String[] { this.path.segment(0).toString(), javaProject.getElementName(), this.string }); } if (this.string != null) { return this.string; } else { return ""; //$NON-NLS-1$ } } else { String message= exception.getMessage(); if (message != null) { return message; } else { return exception.toString(); } } } /** * @see IJavaModelStatus#getPath() */ public IPath getPath() { return this.path; } /** * @see IStatus#getSeverity() */ public int getSeverity() { if (this.children == NO_CHILDREN) return super.getSeverity(); int severity= -1; for (int i= 0, max= this.children.length; i < max; i++) { int childrenSeverity= this.children[i].getSeverity(); if (childrenSeverity > severity) { severity= childrenSeverity; } } return severity; } /** * @see IJavaModelStatus#getString() * @deprecated */ public String getString() { return this.string; } /** * @see IJavaModelStatus#isDoesNotExist() */ public boolean isDoesNotExist() { int code= getCode(); return code == ELEMENT_DOES_NOT_EXIST || code == ELEMENT_NOT_ON_CLASSPATH; } /** * @see IStatus#isMultiStatus() */ public boolean isMultiStatus() { return this.children != NO_CHILDREN; } /** * @see IStatus#isOK() */ public boolean isOK() { return getCode() == OK; } /** * @see IStatus#matches(int) */ public boolean matches(int mask) { if (!isMultiStatus()) { return matches(this, mask); } else { for (int i= 0, max= this.children.length; i < max; i++) { if (matches((JavaModelStatus)this.children[i], mask)) return true; } return false; } } /** * Helper for matches(int). */ protected boolean matches(JavaModelStatus status, int mask) { int severityMask= mask & 0x7; int categoryMask= mask & ~0x7; int bits= status.getBits(); return ((severityMask == 0) || (bits & severityMask) != 0) && ((categoryMask == 0) || (bits & categoryMask) != 0); } /** * Creates and returns a new <code>IJavaModelStatus</code> that is a a multi-status status. * * @see IStatus#isMultiStatus() */ public static IJavaModelStatus newMultiStatus(IJavaModelStatus[] children) { JavaModelStatus jms= new JavaModelStatus(); jms.children= children; return jms; } /** * Returns a printable representation of this exception for debugging purposes. */ public String toString() { if (this == VERIFIED_OK) { return "JavaModelStatus[OK]"; //$NON-NLS-1$ } StringBuffer buffer= new StringBuffer(); buffer.append("Java Model Status ["); //$NON-NLS-1$ buffer.append(getMessage()); buffer.append("]"); //$NON-NLS-1$ return buffer.toString(); } }