All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.aspectj.bridge.IMessage Maven / Gradle / Ivy

Go to download

The AspectJ matcher can be used for matching pointcuts independently of any AspectJ compilation or weaving steps. Most notably, this can be used by frameworks such as Spring AOP which utilise the @AspectJ pointcut syntax but implement aspect weaving in a way independent of AspectJ, e.g. using dynamic proxies.

There is a newer version: 1.9.22.1
Show newest version
/* *******************************************************************
 * Copyright (c) 1999-2001 Xerox Corporation,
 *               2002 Palo Alto Research Center, Incorporated (PARC).
 * All rights reserved.
 * This program and the accompanying materials are made available
 * under the terms of the Eclipse Public License v 2.0
 * which accompanies this distribution and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
 *
 * Contributors:
 *     Xerox/PARC     initial implementation
 * ******************************************************************/

package org.aspectj.bridge;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Wrap message with any associated throwable or source location.
 */
public interface IMessage {
	/** no messages */
	IMessage[] RA_IMessage = new IMessage[0];

	// int values must sync with KINDS order below
	Kind WEAVEINFO = new Kind("weaveinfo", 5);
	Kind INFO = new Kind("info", 10);
	Kind USAGE = new Kind("usage", 15);
	Kind DEBUG = new Kind("debug", 20);
	Kind TASKTAG = new Kind("task", 25); // represents a 'TODO' from eclipse - produced by the compiler and
																// consumed by AJDT
																Kind WARNING = new Kind("warning", 30);
	Kind ERROR = new Kind("error", 40);
	Kind FAIL = new Kind("fail", 50);
	Kind ABORT = new Kind("abort", 60);
	// XXX prefer another Kind to act as selector for "any",
	// but can't prohibit creating messages with it.
	// public static final Kind ANY = new Kind("any-selector", 0);

	/**
	 * list of Kind in precedence order. 0 is less than IMessage.Kind#COMPARATOR.compareTo(KINDS.get(i), KINDS.get(i + 1))
	 */
	List KINDS = Collections.unmodifiableList(Arrays.asList(new Kind[] { WEAVEINFO, INFO, USAGE, DEBUG, TASKTAG,
			WARNING, ERROR, FAIL, ABORT }));

	/** @return non-null String with simple message */
	String getMessage();

	/** @return the kind of this message */
	Kind getKind();

	/** @return true if this is an error */
	boolean isError();

	/** @return true if this is a warning */
	boolean isWarning();

	/** @return true if this is an internal debug message */
	boolean isDebug();

	/** @return true if this is a compiler usage message */
	boolean isUsage();

	/** @return true if this is information for the user */
	boolean isInfo();

	/** @return true if the process is aborting */
	boolean isAbort(); // XXX ambiguous

	/** @return true if this is a task tag message */
	boolean isTaskTag();

	/** @return true if something failed */
	boolean isFailed();

	/** Caller can verify if this message came about because of a DEOW */
	boolean getDeclared();

	/** Return the ID of the message where applicable, see IProblem for list of valid IDs */
	int getID();

	/** Return the start position of the problem (inclusive), or -1 if unknown. */
	int getSourceStart();

	/** Return the end position of the problem (inclusive), or -1 if unknown. */
	int getSourceEnd();

	/** @return Throwable associated with this message, or null if none */
	Throwable getThrown();

	/** @return source location associated with this message, or null if none */
	ISourceLocation getSourceLocation();

	final class Kind implements Comparable {
		public static final Comparator COMPARATOR = new Comparator() {
			public int compare(IMessage.Kind one, IMessage.Kind two) {
				if (null == one) {
					return (null == two ? 0 : -1);
				} else if (null == two) {
					return 1;
				} else if (one == two) {
					return 0;
				} else {
					return (one.precedence - two.precedence);
				}
			}
		};

		/**
		 * @param kind the Kind floor
		 * @return false if kind is null or this has less precedence than kind, true otherwise.
		 */
		public boolean isSameOrLessThan(Kind kind) {
			return (0 >= COMPARATOR.compare(this, kind));
		}

		public int compareTo(IMessage.Kind other) {
			return COMPARATOR.compare(this, other);
		}

		private final int precedence;
		private final String name;

		private Kind(String name, int precedence) {
			this.name = name;
			this.precedence = precedence;
		}

		public String toString() {
			return name;
		}
	}

	/**
	 * @return Detailed information about the message. For example, for declare error/warning messages this returns information
	 *         about the corresponding join point's static part.
	 */
	String getDetails();

	/**
	 * @return List of ISourceLocation instances that indicate additional source locations relevent to this message as
	 *         specified by the message creator. The list should not include the primary source location associated with the message
	 *         which can be obtained from getSourceLocation().
	 * 

* An example of using extra locations would be in a warning message that * flags all shadow locations that will go unmatched due to a pointcut definition * being based on a subtype of a defining type. * @see AspectJ bug 41952 */ /** * Return a List of ISourceLocation instances that indicate additional source locations relevent to this message as * specified by the message creator. The list should not include the primary source location associated with the message * which can be obtained from getSourceLocation(). *

* An example of using extra locations would be in a warning message that * flags all shadow locations that will go unmatched due to a pointcut definition * being based on a subtype of a defining type. *

* * @return a list of additional source locations * @see AspectJ bug 41952 */ List getExtraSourceLocations(); }