/*******************************************************************************
 * Copyright (c) 2006 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.validator.model;

import java.util.Map;

/**
 * IProblem is a generic self contained "marker" or "note" or "message"
 * that is generated as a result of the validation pass. Instances
 * of IProblem contain descriptive information about the problem 
 * discovered by the validator. 
 * <p>
 * For workbench use, instances if IProblem will be adapted to IMarker.
 * <p>
 * For use in other places, instances of IProblem can be flushed to a 
 * logger, send to a console, etc. 
 * <p>
 * The intention of the interface presented here is that it has no
 * dependencies other then the java runtime and the underlying 
 * "validation" model to which it belongs.
 * 
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Sep 18, 2006
 *
 */
@SuppressWarnings("nls")
public interface IProblem  {

	/** 
	 * Severity marker attribute.  A number from the set of error, warning and info
	 * severities defined by the platform.
	 *
	 * @see #SEVERITY_ERROR
	 * @see #SEVERITY_WARNING
	 * @see #SEVERITY_INFO
	 */
	public static final String SEVERITY = "severity"; //$NON-NLS-1$

	/** 
	 * Message marker attribute.  A localized string describing the nature
	 * of the marker (e.g., a name for a bookmark or task).  The content
	 * and form of this attribute is not specified or interpreted by the platform.
	 *
	 * @see #getAttribute(String, String)
	 */
	public static final String MESSAGE = "message"; //$NON-NLS-1$

	
	/** Message id */
	public static final String MESSAGE_ID = "message.id";

	/** Message arguments used to format the message */
	public static final String MESSAGE_ARGS = "message.args";


	
	/** 
	 * Location marker attribute.  The location is a human-readable (localized) string which
	 * can be used to distinguish between markers on a resource.  As such it 
	 * should be concise and aimed at users.  The content and 
	 * form of this attribute is not specified or interpreted by the platform.
	 *
	 * @see #getAttribute(String, String)
	 */
	public static final String LOCATION = "location"; //$NON-NLS-1$

	/** 
	 * Character start marker attribute.  An integer value indicating where a text
	 * marker starts.  This attribute is zero-relative and inclusive.
	 *
	 * @see #getAttribute(String, String)
	 */
	public static final String CHAR_START = "charStart"; //$NON-NLS-1$

	/** 
	 * Character end marker attribute.  An integer value indicating where a text
	 * marker ends.  This attribute is zero-relative and exclusive.
	 *
	 * @see #getAttribute(String, String)
	 */
	public static final String CHAR_END = "charEnd"; //$NON-NLS-1$

	/** 
	 * Line number marker attribute.  An integer value indicating the line number
	 * for a text marker.  This attribute is 1-relative.
	 *
	 * @see #getAttribute(String, String)
	 */
	public static final String LINE_NUMBER = "lineNumber"; //$NON-NLS-1$


	/**
	 * Line number marker attribute. An integer value indicating the line number
	 * for a text marker. This attribute is 1-relative.
	 */
	
	public static final String COLUMN_NUMBER = "columnNumber";
	
	
	/**
	 * The XPATH pointer into the problem node in the XML model space.
	 * 
	 */
	
	public static final String ADDRESS_XPATH = "address.xpath";

	/**
	 * The XPath pointer into the problem node in the model model space.
	 */
	
	public static final String ADDRESS_MODEL = "address.model";
	
	
	/*====================================================================
	 * Marker attributes values:
	 *====================================================================*/


	/** 
	 * Error severity constant (value 2) indicating an error state.
	 *
	 */
	public static final int SEVERITY_ERROR = 2;

	/** 
	 * Warning severity constant (value 1) indicating a warning.
	 *
	 */
	public static final int SEVERITY_WARNING = 1;

	/** 
	 * Info severity constant (value 0) indicating information only.
	 *
	 */
	public static final int SEVERITY_INFO = 0;

	/**
	 * The Node on which the problem is being reported.
	 * 
	 */
	public static final String NODE = "node"; //$NON-NLS-1$

	/**
	 * The fix messages, how to fix the problem.
	 */
	
	public static final String FIX = "fixMessage"; //$NON-NLS-1$

	/**
	 * The rule name that produced this problem.
	 */
	public static final String RULE = "ruleName";  //$NON-NLS-1$

	/**
	 * The description of the rule which produced this problem.
	 */
	public static final String RULE_DESC = "ruleDescription";  //$NON-NLS-1$

	
		
	/**
	 * A further context associating this problem with something
	 * that would be useful in dereferencing the problem in the model. 
	 */
	
	public static final String CONTEXT = "context.name"; //$NON-NLS-1$


	/**
	 * In case the model is completely hoarked and we don't even have
	 * a Process or any sort of context, we still want to be able to
	 * report this as a problem. This is the emf Resource that is in error.
	 * @see Bugzilla 324165
	 */
	public static final String ERESOURCE = "eResource"; //$NON-NLS-1$
	
	/**
	 * This is the name of the Java Resource bundle 
	 * from which the fill method of IProblem will 
	 * get the error descriptions that it will push
	 * into it's attributes.
	 * <p>
	 * 
	 * For example, "org.eclipse.bpel.rules.messages"
	 * 
	 */
	
	public static final String BUNDLE_NAME = "bundleName"; //$NON-NLS-1$

	/**
	 * Static analysis code related to this problem in the space of the validator.
	 * 
	 */
	
	public static final String SA_CODE = "staticAnalysisCode"; //$NON-NLS-1$

	/**
	 * The class that we start from searching for message bundles
	 */
	public static final String BUNDLE_CLAZZ = "bundle.clazz";

	/** 
	 * The java exception that is to be associated with this problem. 
	 * This is typically only used for reporting fatal code errors, for which a little 
	 * extra help is necessary.
	 * 
	 */
	
	public static final String EXCEPTION = "exception";

	

	
	/**
	 * Tests this marker for equality with the given object.
	 * Two markers are equal if their id and resource are both equal.
	 * 
	 * @param object the other object
	 * @return an indication of whether the objects are equal
	 */
	public boolean equals (Object object);

	/**
	 * 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 <T> the type 
	 * @param attributeName the name of the attribute
	 * @return the value, or <code>null</code> if the attribute is undefined.
	 */
	
	public <T extends Object> T getAttribute (String attributeName);

	/**
	 * Returns the 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 <T> 
	 * @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 <T extends Object> T getAttribute ( String attributeName, T defaultValue) ;
	
	/**
	 * 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<String,Object> getAttributes();


	/**
	 * Returns the time at which this marker was created.
	 *
	 * @return the difference, measured in milliseconds, between the time at which
	 *    this marker was created and midnight, January 1, 1970 UTC, or <code>0L</code>
	 *    if the creation time is not known (this can occur in workspaces created using v2.0 or earlier).
	 * @since 2.1
	 */
	public long getCreationTime();

	/**
	 * Returns the id of the marker.  The id of a marker is unique
	 * relative to the resource with which the marker is associated.
	 * Marker IDS are not globally unique.
	 *
	 * @return the id of the marker 
	 */
	
	public long getId();


	/**
	 * Sets the 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 <T> 
	 * @param attributeName the name of the attribute
	 * @param value the value
	 */

	public <T extends Object> void setAttribute(String attributeName, T value);

	
	/**
	 * 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 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);
	
	
	/**
	 * Fill the appropriate information in the problem (attributes and such)
	 * that relate the message id that is passed as the argument.
	 * <p>
	 * For this to be successful, contractually at least, the property
	 * BUNDLE_NAME must be set in the problem prior to invoking fill().    
	 *
	 * @param msgId the message id
	 * @param args the arguments to pass
	 */
	
	public void fill ( String msgId, Object ... args);
}
