/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.core.workspace; 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; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; /** * ModelStatus * * @since 8.0 */ public class ModelStatusImpl extends Status implements ModelStatus, ModelStatusConstants, IResourceStatus { private static final String DEFAULT_STATUS_NAME = "ModelStatus"; //$NON-NLS-1$ /** * The elements related to the failure, or <code>null</code> if no elements are involved. */ protected ModelWorkspaceItem[] fElements = new ModelWorkspaceItem[0]; /** * The path related to the failure, or <code>null</code> if no path is involved. */ protected IPath fPath; /** * The <code>String</code> related to the failure, or <code>null</code> if no <code>String</code> is involved. */ protected String fString; /** * Empty children */ protected final static IStatus[] fgEmptyChildren = new IStatus[] {}; protected IStatus[] fChildren = fgEmptyChildren; /** * Singleton OK object */ public static final ModelStatus VERIFIED_OK = new ModelStatusImpl(OK, OK, ModelerCore.Util.getString("status.OK")); //$NON-NLS-1$ /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl() { // no code for an multi-status super(ERROR, ModelerCore.PLUGIN_ID, 0, DEFAULT_STATUS_NAME, null); } /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl( int code ) { super(ERROR, ModelerCore.PLUGIN_ID, code, DEFAULT_STATUS_NAME, null); fElements = ModelWorkspaceItemInfo.fgEmptyChildren; } /** * Constructs a model status with the given corresponding elements. */ public ModelStatusImpl( int code, ModelWorkspaceItem[] elements ) { super(ERROR, ModelerCore.PLUGIN_ID, code, DEFAULT_STATUS_NAME, null); fElements = elements; fPath = null; } /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl( int code, String string ) { this(ERROR, code, string); } /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl( int severity, int code, String string ) { super(severity, ModelerCore.PLUGIN_ID, code, DEFAULT_STATUS_NAME, null); fElements = ModelWorkspaceItemInfo.fgEmptyChildren; fPath = null; fString = string; } /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl( int code, Throwable throwable ) { super(ERROR, ModelerCore.PLUGIN_ID, code, DEFAULT_STATUS_NAME, throwable); fElements = ModelWorkspaceItemInfo.fgEmptyChildren; } /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl( int code, Throwable throwable, String msg ) { super(ERROR, ModelerCore.PLUGIN_ID, code, DEFAULT_STATUS_NAME, throwable); fElements = ModelWorkspaceItemInfo.fgEmptyChildren; fString = msg; } /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl( int code, IPath path ) { super(ERROR, ModelerCore.PLUGIN_ID, code, DEFAULT_STATUS_NAME, null); fElements = ModelWorkspaceItemInfo.fgEmptyChildren; fPath = path; } /** * Constructs a model status with the given corresponding element. */ public ModelStatusImpl( int code, ModelWorkspaceItem element ) { this(code, new ModelWorkspaceItem[] {element}); } /** * Constructs a model status with the given corresponding element and string */ public ModelStatusImpl( int code, ModelWorkspaceItem element, String string ) { this(code, new ModelWorkspaceItem[] {element}); fString = string; } /** * Constructs a model status with the given corresponding element and path */ public ModelStatusImpl( int code, ModelWorkspaceItem element, IPath path ) { this(code, new ModelWorkspaceItem[] {element}); fPath = path; } /** * Constructs a model status with no corresponding elements. */ public ModelStatusImpl( CoreException coreException ) { super(ERROR, ModelerCore.PLUGIN_ID, CORE_EXCEPTION, DEFAULT_STATUS_NAME, coreException); fElements = ModelWorkspaceItemInfo.fgEmptyChildren; } protected int getBits() { int severity = 1 << (getCode() % 100 / 33); int category = 1 << ((getCode() / 100) + 3); return severity | category; } /** * @see IStatus */ @Override public IStatus[] getChildren() { return fChildren; } @Override public ModelWorkspaceItem[] getModelWorkspaceItems() { return fElements; } /** * Returns the message that is relevant to the code of this status. */ @Override public String getMessage() { Throwable exception = getException(); if (exception == null) { switch (getCode()) { case CORE_EXCEPTION: return ModelerCore.Util.getString("status.coreException"); //$NON-NLS-1$ case ITEM_DOES_NOT_EXIST: return ModelerCore.Util.getString("element.doesNotExist", ((ModelWorkspaceItemImpl)fElements[0]).toStringWithAncestors()); //$NON-NLS-1$ case INDEX_OUT_OF_BOUNDS: return ModelerCore.Util.getString("status.indexOutOfBounds"); //$NON-NLS-1$ case INVALID_CONTENTS: return ModelerCore.Util.getString("status.invalidContents"); //$NON-NLS-1$ case INVALID_DESTINATION: return ModelerCore.Util.getString("status.invalidDestination", ((ModelWorkspaceItemImpl)fElements[0]).toStringWithAncestors()); //$NON-NLS-1$ case INVALID_ITEM_TYPES: StringBuffer buff = new StringBuffer(ModelerCore.Util.getString("operation.notSupported")); //$NON-NLS-1$ for (int i = 0; i < fElements.length; i++) { if (i > 0) { buff.append(", "); //$NON-NLS-1$ } buff.append(((ModelWorkspaceItemImpl)fElements[i]).toStringWithAncestors()); } return buff.toString(); case INVALID_NAME: return ModelerCore.Util.getString("status.invalidName", fString); //$NON-NLS-1$ case INVALID_PATH: if (fString != null) { return fString; } return ModelerCore.Util.getString("status.invalidPath", getPath() == null ? "null" : getPath().toString()); //$NON-NLS-1$ //$NON-NLS-2$ case INVALID_PROJECT: return ModelerCore.Util.getString("status.invalidProject", fString); //$NON-NLS-1$ case INVALID_RESOURCE: return ModelerCore.Util.getString("status.invalidResource", fString); //$NON-NLS-1$ case INVALID_RESOURCE_TYPE: return ModelerCore.Util.getString("status.invalidResourceType", fString); //$NON-NLS-1$ case INVALID_SIBLING: if (fString != null) { return ModelerCore.Util.getString("status.invalidSibling", fString); //$NON-NLS-1$ } return ModelerCore.Util.getString("status.invalidSibling", ((ModelWorkspaceItemImpl)fElements[0]).toStringWithAncestors()); //$NON-NLS-1$ case IO_EXCEPTION: return ModelerCore.Util.getString("status.IOException"); //$NON-NLS-1$ case NAME_COLLISION: if (fString != null) { return fString; } return ModelerCore.Util.getString("status.nameCollision", ""); //$NON-NLS-1$ //$NON-NLS-2$ case NO_ITEMS_TO_PROCESS: return ModelerCore.Util.getString("operation.needElements"); //$NON-NLS-1$ case NULL_NAME: return ModelerCore.Util.getString("operation.needName"); //$NON-NLS-1$ case NULL_PATH: return ModelerCore.Util.getString("operation.needPath"); //$NON-NLS-1$ case NULL_STRING: return ModelerCore.Util.getString("operation.needString"); //$NON-NLS-1$ case PATH_OUTSIDE_PROJECT: return ModelerCore.Util.getString("operation.pathOutsideProject", fString, ((ModelWorkspaceItemImpl)fElements[0]).toStringWithAncestors()); //$NON-NLS-1$ case READ_ONLY: ModelWorkspaceItem element = fElements[0]; String name = element.getItemName(); return ModelerCore.Util.getString("status.readOnly", name); //$NON-NLS-1$ case RELATIVE_PATH: return ModelerCore.Util.getString("operation.needAbsolutePath", getPath().toString()); //$NON-NLS-1$ case TARGET_EXCEPTION: return ModelerCore.Util.getString("status.targetException"); //$NON-NLS-1$ case UPDATE_CONFLICT: return ModelerCore.Util.getString("status.updateConflict"); //$NON-NLS-1$ case NO_LOCAL_CONTENTS: return ModelerCore.Util.getString("status.noLocalContents", getPath().toString()); //$NON-NLS-1$ } if (fString != null) { return fString; } return ""; // //$NON-NLS-1$ } String message = exception.getMessage(); if (message != null) { return message; } return exception.toString(); } @Override public IPath getPath() { return fPath; } /** * @see IStatus#getSeverity() */ @Override 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; } @Override public boolean isDoesNotExist() { return getCode() == ITEM_DOES_NOT_EXIST; } /** * @see IStatus#isMultiStatus() */ @Override public boolean isMultiStatus() { return fChildren != fgEmptyChildren; } /** * @see IStatus#isOK() */ @Override public boolean isOK() { return getCode() == OK; } /** * @see IStatus#matches(int) */ @Override public boolean matches( int mask ) { if (!isMultiStatus()) { return matches(this, mask); } for (int i = 0, max = fChildren.length; i < max; i++) { if (matches((ModelStatusImpl)fChildren[i], mask)) return true; } return false; } /** * Helper for matches(int). */ protected boolean matches( ModelStatusImpl 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); } /** * Adds the given status to this multi-status. * * @param status the new child status */ public void add( IStatus status ) { CoreArgCheck.isNotNull(status); IStatus[] result = new IStatus[fChildren.length + 1]; System.arraycopy(fChildren, 0, result, 0, fChildren.length); result[result.length - 1] = status; fChildren = result; int newSev = status.getSeverity(); if (newSev > getSeverity()) { setSeverity(newSev); } } /** * Adds all of the children of the given status to this multi-status. Does nothing if the given status has no children (which * includes the case where it is not a multi-status). * * @param status the status whose children are to be added to this one */ public void addAll( IStatus status ) { CoreArgCheck.isNotNull(status); IStatus[] statuses = status.getChildren(); for (int i = 0; i < statuses.length; i++) { add(statuses[i]); } } /** * Creates and returns a new <code>IJavaModelStatus</code> that is a a multi-status status. * * @see IStatus#isMultiStatus() */ public static ModelStatus newMultiStatus( ModelStatus[] children ) { ModelStatusImpl result = new ModelStatusImpl(); result.fChildren = children; return result; } /** * Returns a printable representation of this exception for debugging purposes. */ @Override public String toString() { if (this == VERIFIED_OK) { return "ModelStatusImpl[OK]"; //$NON-NLS-1$ } StringBuffer buffer = new StringBuffer(); buffer.append("Model Status ["); //$NON-NLS-1$ buffer.append(getMessage()); buffer.append("]"); //$NON-NLS-1$ return buffer.toString(); } }