blob: 951ba8e6a19f5e1550dab8b8069dbae7e8b616a3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2007 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.wst.validation;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Assert;
import org.eclipse.wst.validation.internal.Tracing;
import org.eclipse.wst.validation.internal.ValConstants;
import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
/**
* This class provides a way for a validator to return messages, that are easily converted into IMarkers.
* <p>
* This class is completely optional for validators. A validator can choose to directly manage IMarkers.
* However, some validators want to be used in multiple contexts, for example as-you-type validation and
* batch validation. For these types of validators it is not possible for them to use only IMarkers, because
* often the Resource has not been saved yet.
* </p>
*/
public class ValidatorMessage {
/** Associate some arbitrary attributes with a message. */
private Map<String, Object> _map = new HashMap<String, Object>(5);
private IResource _resource;
/** The type of marker. */
private String _type;
/**
* Create a new validation message.
*
* @param message The localized message that will be displayed to the user.
*
* @param resource the resource that the message is associated with.
*/
public static ValidatorMessage create(String message, IResource resource){
ValidatorMessage msg = new ValidatorMessage();
msg._type = ValConstants.ProblemMarker;
msg._resource = resource;
msg.setAttribute(IMarker.MESSAGE, ValidationPlugin.getPlugin().isDebugging() ? Tracing.timestampIt(message): message);
return msg;
}
private ValidatorMessage(){}
/**
* Returns the attribute with the given name. The result is an instance of one
* of the following classes: <code>String</code>, <code>Integer</code>,
* or <code>Boolean</code>.
* Returns <code>null</code> if the attribute is undefined.
*
* @param attributeName the name of the attribute
* @return the value, or <code>null</code> if the attribute is undefined.
*/
public Object getAttribute(String attributeName){
return _map.get(attributeName);
}
/**
* Returns the integer-valued attribute with the given name.
* Returns the given default value if the attribute is undefined.
* or the marker does not exist or is not an integer value.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
*/
public int getAttribute(String attributeName, int defaultValue){
Integer value = null;
try {
value = (Integer)_map.get(attributeName);
}
catch (Exception e){
// eat it
}
if (value == null)return defaultValue;
return value.intValue();
}
/**
* Returns the string-valued attribute with the given name.
* Returns the given default value if the attribute is undefined
* or the marker does not exist or is not a string value.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
*/
public String getAttribute(String attributeName, String defaultValue){
String value = null;
try {
value = (String)_map.get(attributeName);
}
catch (Exception e){
// eat it
}
if (value == null)return defaultValue;
return value;
}
/**
* Returns the boolean-valued attribute with the given name.
* Returns the given default value if the attribute is undefined
* or the marker does not exist or is not a boolean value.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
*/
public boolean getAttribute(String attributeName, boolean defaultValue){
Boolean value = null;
try {
value = (Boolean)_map.get(attributeName);
}
catch (Exception e){
// eat it
}
if (value == null)return defaultValue;
return value.booleanValue();
}
/**
* Returns a map with all the attributes for the marker.
* If the marker has no attributes then <code>null</code> is returned.
*
* @return a map of attribute keys and values (key type : <code>String</code>
* value type : <code>String</code>, <code>Integer</code>, or
* <code>Boolean</code>) or <code>null</code>.
*/
public Map getAttributes() {
return _map;
}
/**
* Returns the resource with which this marker is associated.
*
* @return the resource with which this marker is associated
*/
public IResource getResource(){
return _resource;
}
/**
* Returns the type of this marker. The returned marker type will not be
* <code>null</code>.
*
* @return the type of this marker
*/
public String getType() {
return _type;
}
/**
* Sets the integer-valued attribute with the given name.
* <p>
* This method changes resources; these changes will be reported
* in a subsequent resource change event, including an indication
* that this marker has been modified.
* </p>
*
* @param attributeName the name of the attribute
* @param value the value
*/
public void setAttribute(String attributeName, int value){
_map.put(attributeName, new Integer(value));
}
/**
* Sets the attribute with the given name. The value must be <code>null</code> or
* an instance of one of the following classes:
* <code>String</code>, <code>Integer</code>, or <code>Boolean</code>.
*
* @param attributeName the name of the attribute
* @param value the value, or <code>null</code> if the attribute is to be undefined
*/
public void setAttribute(String attributeName, Object value){
_map.put(attributeName, value);
}
/**
* Sets the boolean-valued attribute with the given name.
*
* @param attributeName the name of the attribute
* @param value the value
*/
public void setAttribute(String attributeName, boolean value){
_map.put(attributeName, value ? Boolean.TRUE : Boolean.FALSE);
}
/**
* Sets the given attribute key-value pairs on this marker.
* The values must be <code>null</code> or an instance of
* one of the following classes: <code>String</code>,
* <code>Integer</code>, or <code>Boolean</code>.
* If a value is <code>null</code>, the new value of the
* attribute is considered to be undefined.
*
* @param attributeNames an array of attribute names
* @param values an array of attribute values
*/
public void setAttributes(String[] attributeNames, Object[] values){
Assert.isTrue(attributeNames.length == values.length);
for (int i=0; i<attributeNames.length; i++){
setAttribute(attributeNames[i], values[i]);
}
}
/**
* Sets the attributes for this marker to be the ones contained in the
* given table. The values must be an instance of one of the following classes:
* <code>String</code>, <code>Integer</code>, or <code>Boolean</code>.
* Attributes previously set on the marker but not included in the given map
* are considered to be removals. Setting the given map to be <code>null</code>
* is equivalent to removing all marker attributes.
*
* @param attributes a map of attribute names to attribute values
* (key type : <code>String</code> value type : <code>String</code>,
* <code>Integer</code>, or <code>Boolean</code>) or <code>null</code>
*/
public void setAttributes(Map<String, Object> attributes) {
_map.clear();
_map.putAll(attributes);
}
}