123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /* *******************************************************************
- * 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 v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Xerox/PARC initial implementation
- * ******************************************************************/
-
- package org.aspectj.bridge;
-
- import java.util.Enumeration;
- import java.util.Hashtable;
-
- import org.aspectj.util.LangUtil;
-
- /**
- * Wrap an IMessageHandler to count messages handled. Messages being ignored by the delegate IMessageHandler are not counted.
- */
- public class CountingMessageHandler implements IMessageHandler {
-
- public final IMessageHandler delegate;
- public final CountingMessageHandler proxy;
- private final Hashtable<IMessage.Kind, IntHolder> counters;
-
- public static CountingMessageHandler makeCountingMessageHandler(IMessageHandler handler) {
- if (handler instanceof CountingMessageHandler) {
- return (CountingMessageHandler) handler;
- } else {
- return new CountingMessageHandler(handler);
- }
- }
-
- public CountingMessageHandler(IMessageHandler delegate) {
- LangUtil.throwIaxIfNull(delegate, "delegate");
- this.delegate = delegate;
- this.counters = new Hashtable<>();
- proxy = (delegate instanceof CountingMessageHandler ? (CountingMessageHandler) delegate : null);
- }
-
- /** @return delegate.handleMessage(IMessage) */
- public boolean handleMessage(IMessage message) throws AbortException {
- if (null != proxy) {
- return proxy.handleMessage(message);
- }
- if (null != message) {
- IMessage.Kind kind = message.getKind();
- if (!isIgnoring(kind)) {
- increment(kind);
- }
- }
- return delegate.handleMessage(message);
- }
-
- /** @return delegate.isIgnoring(IMessage.Kind) */
- public boolean isIgnoring(IMessage.Kind kind) {
- return delegate.isIgnoring(kind);
- }
-
- /**
- * Delegate
- *
- * @see org.aspectj.bridge.IMessageHandler#isIgnoring(org.aspectj.bridge.IMessage.Kind)
- * @param kind
- */
- public void dontIgnore(IMessage.Kind kind) {
- delegate.dontIgnore(kind);
- }
-
- /**
- * Delegate
- *
- * @see org.aspectj.bridge.IMessageHandler#ignore(org.aspectj.bridge.IMessage.Kind)
- * @param kind
- */
- public void ignore(IMessage.Kind kind) {
- delegate.ignore(kind);
- }
-
- /** @return delegate.toString() */
- public String toString() {
- return delegate.toString();
- }
-
- /**
- * Return count of messages seen through this interface.
- *
- * @param kind the IMessage.Kind of the messages to count (if null, count all)
- * @param orGreater if true, then count this kind and any considered greater by the ordering of IMessage.Kind.COMPARATOR
- * @return number of messages of this kind (optionally or greater)
- * @see IMessage.Kind.COMPARATOR
- */
- public int numMessages(IMessage.Kind kind, boolean orGreater) {
- if (null != proxy) {
- return proxy.numMessages(kind, orGreater);
- }
- int result = 0;
- if (null == kind) {
- for (Enumeration<IntHolder> enu = counters.elements(); enu.hasMoreElements();) {
- result += (enu.nextElement()).count;
- }
- } else if (!orGreater) {
- result = numMessages(kind);
- } else {
- for (IMessage.Kind k : IMessage.KINDS) {
- if (kind.isSameOrLessThan(k)) {
- result += numMessages(k);
- }
- }
- }
- return result;
- }
-
- /**
- * @return true if 0 is less than <code>numMessages(IMessage.ERROR, true)</code>
- */
- public boolean hasErrors() {
- return (0 < numMessages(IMessage.ERROR, true));
- }
-
- private int numMessages(IMessage.Kind kind) {
- if (null != proxy) {
- return proxy.numMessages(kind);
- }
- IntHolder counter = counters.get(kind);
- return (null == counter ? 0 : counter.count);
- }
-
- private void increment(IMessage.Kind kind) {
- if (null != proxy) {
- throw new IllegalStateException("not called when proxying");
- }
-
- IntHolder counter = counters.get(kind);
- if (null == counter) {
- counter = new IntHolder();
- counters.put(kind, counter);
- }
- counter.count++;
- }
-
- private static class IntHolder {
- int count;
- }
-
- public void reset() {
- if (proxy != null) {
- proxy.reset();
- }
- counters.clear();
- }
-
- }
|