/*******************************************************************************
* Copyright (c) 2008, 2015 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.ui.internal.views.markers;
import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.actions.SimpleWildcardTester;
/**
* The property tester used to test the attributes of the Marker
*
* @since 3.5
* @author Prakash G.R.
*
*/
public class MarkerPropertyTester extends PropertyTester {
/**
* An attribute indicating the marker priority (value
* <code>"priority"</code>). The attribute value in xml must be one of
* <code>IMarker.PRIORITY_LOW,
* IMarker.PRIORITY_NORMAL, or IMarker.PRIORITY_HIGH</code>
*/
public static final String PRIORITY = IMarker.PRIORITY;
/**
* An attribute indicating the marker severity (value
* <code>"severity"</code>). The attribute value in xml in xml must be one
* of <code>IMarker.SEVERITY_ERROR,
* IMarker.SEVERITY_WARNING, or IMarker.SEVERITY_INFO</code>
*/
public static final String SEVERITY = IMarker.SEVERITY;
/**
* An attribute indicating whether the marker is considered done (value
* <code>"done"</code>). The attribute value in xml must be one of
* <code>"true" or "false"</code>.
*/
public static final String DONE = IMarker.DONE;
/**
* An attribute indicating the marker message (value <code>"message"</code>
* ). The attribute value in xml is unconstrained. "*" may be used at the
* start or the end to represent "one or more characters".
*/
public static final String MESSAGE = IMarker.MESSAGE;
/**
* An attribute indicating the marker type (value <code>"type"</code>). The
* attribute value in xml should match one of the marker types defined in
* the workbench's marker extension point. Common examples are
* <code>IMarker.TASK, IMarker.BOOKMARK, and IMarker.MARKER</code>.
*/
public static final String TYPE = "type"; //$NON-NLS-1$
/**
* An attribute indicating the marker super type (value
* <code>"superType"</code>). The attribute value in xml should match one of
* the marker types defined in the workbench's marker extension point.
* Common examples are
* <code>IMarker.TASK, IMarker.BOOKMARK, and IMarker.MARKER</code>.
*/
public static final String SUPER_TYPE = "superType"; //$NON-NLS-1$
/**
* An attribute indicating the type of resource associated with the marker
* (value <code>"resourceType"</code>). The attribute value in xml must be
* one of <code>IResource.FILE, IResource.PROJECT, IResource.FOLDER,
* or IResource.ROOT</code>.
*/
public static final String RESOURCE_TYPE = "resourceType"; //$NON-NLS-1$
/**
* Create a new instance of the receiver.
*/
public MarkerPropertyTester() {
}
@Override
public boolean test(Object receiver, String property, Object[] args,
Object expectedValue) {
return test(((IMarker) receiver), property, expectedValue.toString());
}
/**
* Returns whether the specific integer attribute matches a value.
*/
private static boolean testIntegerAttribute(IMarker marker,
String attrName, String value) {
Integer i1, i2;
try {
i1 = (Integer) marker.getAttribute(attrName);
if (i1 == null) {
return false;
}
} catch (CoreException e) {
return false;
}
try {
i2 = Integer.valueOf(value);
} catch (NumberFormatException e) {
return false;
}
return i1.equals(i2);
}
/**
* Tests the attribute's value for the given marker
*
* @param marker
* - The marker
* @param attributeName
* - Name of the attribute
* @param expectedValue
* - Value to test for
* @return - true, if the value is same as expected, false otherwise
*/
public static boolean test(IMarker marker, String attributeName,
String expectedValue) {
if (TYPE.equals(attributeName)) {
try {
return expectedValue.equals(marker.getType());
} catch (CoreException e) {
return false;
}
} else if (SUPER_TYPE.equals(attributeName)) {
try {
return marker.isSubtypeOf(expectedValue);
} catch (CoreException e) {
return false;
}
} else if (PRIORITY.equals(attributeName)) {
return testIntegerAttribute(marker, IMarker.PRIORITY, expectedValue);
} else if (SEVERITY.equals(attributeName)) {
return testIntegerAttribute(marker, IMarker.SEVERITY, expectedValue);
} else if (MESSAGE.equals(attributeName)) {
try {
String msg = (String) marker.getAttribute(IMarker.MESSAGE);
if (msg == null) {
return false;
}
return SimpleWildcardTester.testWildcardIgnoreCase(
expectedValue, msg);
} catch (CoreException e) {
return false;
}
} else if (DONE.equals(attributeName)) {
try {
expectedValue = expectedValue.toLowerCase();
Boolean done = (Boolean) marker.getAttribute(IMarker.DONE);
if (done == null) {
return false;
}
return (done.booleanValue() == expectedValue.equals("true"));//$NON-NLS-1$
} catch (CoreException e) {
return false;
}
} else if (RESOURCE_TYPE.equals(attributeName)) {
int desiredType = 0;
try {
desiredType = Integer.parseInt(expectedValue);
} catch (NumberFormatException eNumberFormat) {
}
if (!(desiredType == IResource.FILE
|| desiredType == IResource.FOLDER
|| desiredType == IResource.PROJECT || desiredType == IResource.ROOT)) {
return false;
}
return (marker.getResource().getType() & desiredType) > 0;
}
return false;
}
}