/******************************************************************************* * 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 net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaModelStatus; import net.sourceforge.phpdt.core.IJavaModelStatusConstants; import net.sourceforge.phpdt.core.JavaCore; import net.sourceforge.phpdt.internal.core.util.Util; import org.eclipse.core.resources.IResourceStatus; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; /** * @see IJavaModelStatus */ public class JavaModelStatus extends Status implements IJavaModelStatus, IJavaModelStatusConstants, IResourceStatus { /** * The elements related to the failure, or null if no * elements are involved. */ protected IJavaElement[] fElements = new IJavaElement[0]; /** * The path related to the failure, or null if no path is * involved. */ protected IPath fPath; /** * The String related to the failure, or null * if no String is involved. */ protected String fString; /** * Empty children */ protected final static IStatus[] fgEmptyChildren = new IStatus[] {}; protected IStatus[] fChildren = fgEmptyChildren; /** * Shared empty collection used for efficiency. */ protected static IJavaElement[] fgObjectEmptyChildren = new IJavaElement[] {}; /** * Singleton OK object */ public static final IJavaModelStatus VERIFIED_OK = new JavaModelStatus(OK, OK, Util.bind("status.OK")); //$NON-NLS-1$ /** * 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$ // fElements= JavaElementInfo.fgEmptyChildren; fElements = fgObjectEmptyChildren; } /** * 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$ fElements = elements; fPath = 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$ // fElements= JavaElementInfo.fgEmptyChildren; fElements = fgObjectEmptyChildren; fPath = null; fString = 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$ // fElements= JavaElementInfo.fgEmptyChildren; fElements = fgObjectEmptyChildren; } /** * 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$ // fElements= JavaElementInfo.fgEmptyChildren; fElements = fgObjectEmptyChildren; fPath = 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 }); fString = 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 }); fPath = path; } /** * 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$ // fElements= JavaElementInfo.fgEmptyChildren; fElements = fgObjectEmptyChildren; } protected int getBits() { int severity = 1 << (getCode() % 100 / 33); int category = 1 << ((getCode() / 100) + 3); return severity | category; } /** * @see IStatus */ public IStatus[] getChildren() { return fChildren; } /** * @see IJavaModelStatus */ public IJavaElement[] getElements() { return fElements; } /** * 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 Util.bind("status.coreException"); //$NON-NLS-1$ case BUILDER_INITIALIZATION_ERROR: return Util.bind("build.initializationError"); //$NON-NLS-1$ case BUILDER_SERIALIZATION_ERROR: return Util.bind("build.serializationError"); //$NON-NLS-1$ case DEVICE_PATH: return Util.bind( "status.cannotUseDeviceOnPath", getPath().toString()); //$NON-NLS-1$ case DOM_EXCEPTION: return Util.bind("status.JDOMError"); //$NON-NLS-1$ // case ELEMENT_DOES_NOT_EXIST: // return // ProjectPrefUtil.bind("element.doesNotExist",((JavaElement)fElements[0]).toStringWithAncestors()); // //$NON-NLS-1$ case EVALUATION_ERROR: return Util.bind("status.evaluationError", fString); //$NON-NLS-1$ case INDEX_OUT_OF_BOUNDS: return Util.bind("status.indexOutOfBounds"); //$NON-NLS-1$ case INVALID_CONTENTS: return Util.bind("status.invalidContents"); //$NON-NLS-1$ // case INVALID_DESTINATION: // return ProjectPrefUtil.bind("status.invalidDestination", // ((JavaElement)fElements[0]).toStringWithAncestors()); // //$NON-NLS-1$ // // case INVALID_ELEMENT_TYPES: // StringBuffer buff= new // StringBuffer(ProjectPrefUtil.bind("operation.notSupported")); // //$NON-NLS-1$ // for (int i= 0; i < fElements.length; i++) { // if (i > 0) { // buff.append(", "); //$NON-NLS-1$ // } // buff.append(((JavaElement)fElements[i]).toStringWithAncestors()); // } // return buff.toString(); case INVALID_NAME: return Util.bind("status.invalidName", fString); //$NON-NLS-1$ case INVALID_PACKAGE: return Util.bind("status.invalidPackage", fString); //$NON-NLS-1$ case INVALID_PATH: if (fString != null) { return fString; } else { return Util .bind( "status.invalidPath", getPath() == null ? "null" : getPath().toString()); //$NON-NLS-1$ //$NON-NLS-2$ } case INVALID_PROJECT: return Util.bind("status.invalidProject", fString); //$NON-NLS-1$ case INVALID_RESOURCE: return Util.bind("status.invalidResource", fString); //$NON-NLS-1$ case INVALID_RESOURCE_TYPE: return Util.bind("status.invalidResourceType", fString); //$NON-NLS-1$ // case INVALID_SIBLING: // if (fString != null) { // return ProjectPrefUtil.bind("status.invalidSibling", // fString); //$NON-NLS-1$ // } else { // return ProjectPrefUtil.bind("status.invalidSibling", // ((JavaElement)fElements[0]).toStringWithAncestors()); // //$NON-NLS-1$ // } case IO_EXCEPTION: return Util.bind("status.IOException"); //$NON-NLS-1$ // case NAME_COLLISION: // if (fElements != null && fElements.length > 0) { // IJavaElement element = fElements[0]; // String name = element.getElementName(); // if (element instanceof IPackageFragment && // name.equals(IPackageFragment.DEFAULT_PACKAGE_NAME)) { // return // ProjectPrefUtil.bind("operation.cannotRenameDefaultPackage"); // //$NON-NLS-1$ // } // } // if (fString != null) { // return fString; // } else { // return ProjectPrefUtil.bind("status.nameCollision", ""); // //$NON-NLS-1$ //$NON-NLS-2$ // } case NO_ELEMENTS_TO_PROCESS: return Util.bind("operation.needElements"); //$NON-NLS-1$ case NULL_NAME: return Util.bind("operation.needName"); //$NON-NLS-1$ case NULL_PATH: return Util.bind("operation.needPath"); //$NON-NLS-1$ case NULL_STRING: return Util.bind("operation.needString"); //$NON-NLS-1$ // case PATH_OUTSIDE_PROJECT: // return ProjectPrefUtil.bind("operation.pathOutsideProject", // fString, // ((JavaElement)fElements[0]).toStringWithAncestors()); // //$NON-NLS-1$ // // case READ_ONLY: // IJavaElement element = fElements[0]; // String name = element.getElementName(); // if (element instanceof IPackageFragment && // name.equals(IPackageFragment.DEFAULT_PACKAGE_NAME)) { // return ProjectPrefUtil.bind("status.defaultPackageReadOnly"); // //$NON-NLS-1$ // } // return ProjectPrefUtil.bind("status.readOnly", name); // //$NON-NLS-1$ case RELATIVE_PATH: return Util.bind( "operation.needAbsolutePath", getPath().toString()); //$NON-NLS-1$ case TARGET_EXCEPTION: return Util.bind("status.targetException"); //$NON-NLS-1$ case UPDATE_CONFLICT: return Util.bind("status.updateConflict"); //$NON-NLS-1$ case NO_LOCAL_CONTENTS: return Util .bind("status.noLocalContents", getPath().toString()); //$NON-NLS-1$ // case CP_CONTAINER_PATH_UNBOUND: // IPath path = this.fPath; // IJavaProject javaProject = (IJavaProject)fElements[0]; // ClasspathContainerInitializer initializer = // PHPCore.getClasspathContainerInitializer(path.segment(0)); // String description = null; // if (initializer != null) description = // initializer.getDescription(path, javaProject); // if (description == null) description = // path.makeRelative().toString(); // return ProjectPrefUtil.bind("classpath.unboundContainerPath", // description); //$NON-NLS-1$ // // case INVALID_CP_CONTAINER_ENTRY: // path = this.fPath; // javaProject = (IJavaProject)fElements[0]; // IClasspathContainer container = null; // description = null; // try { // container = PHPCore.getClasspathContainer(path, javaProject); // } catch(JavaModelException e){ // } // if (container == null) { // initializer = // PHPCore.getClasspathContainerInitializer(path.segment(0)); // if (initializer != null) description = // initializer.getDescription(path, javaProject); // } else { // description = container.getDescription(); // } // if (description == null) description = // path.makeRelative().toString(); // return ProjectPrefUtil.bind("classpath.invalidContainer", // description); //$NON-NLS-1$ // // case CP_VARIABLE_PATH_UNBOUND: // path = this.fPath; // return ProjectPrefUtil.bind("classpath.unboundVariablePath", // path.makeRelative().toString()); //$NON-NLS-1$ // // case CLASSPATH_CYCLE: // javaProject = (IJavaProject)fElements[0]; // return ProjectPrefUtil.bind("classpath.cycle", // javaProject.getElementName()); //$NON-NLS-1$ // case DISABLED_CP_EXCLUSION_PATTERNS: // path = this.fPath; // return // ProjectPrefUtil.bind("classpath.disabledExclusionPatterns", // path.makeRelative().toString()); //$NON-NLS-1$ // // case DISABLED_CP_MULTIPLE_OUTPUT_LOCATIONS: // path = this.fPath; // return // ProjectPrefUtil.bind("classpath.disabledMultipleOutputLocations", // path.makeRelative().toString()); //$NON-NLS-1$ } if (fString != null) { return fString; } 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 fPath; } /** * @see IStatus#getSeverity() */ public int getSeverity() { if (fChildren == fgEmptyChildren) return super.getSeverity(); int severity = -1; for (int i = 0, max = fChildren.length; i < max; i++) { int childrenSeverity = fChildren[i].getSeverity(); if (childrenSeverity > severity) { severity = childrenSeverity; } } return severity; } /** * @see IJavaModelStatus#getString() * @deprecated */ public String getString() { return fString; } /** * @see IJavaModelStatus#isDoesNotExist() */ public boolean isDoesNotExist() { return getCode() == ELEMENT_DOES_NOT_EXIST; } /** * @see IStatus#isMultiStatus() */ public boolean isMultiStatus() { return fChildren != fgEmptyChildren; } /** * @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 = fChildren.length; i < max; i++) { if (matches((JavaModelStatus) fChildren[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 IJavaModelStatus that is a a * multi-status status. * * @see IStatus#isMultiStatus() */ public static IJavaModelStatus newMultiStatus(IJavaModelStatus[] children) { JavaModelStatus jms = new JavaModelStatus(); jms.fChildren = 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(); } }