/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2005-2005 Julian Hyde // Copyright (C) 2005-2011 Pentaho and others // All Rights Reserved. */ package mondrian.recorder; import mondrian.resource.MondrianResource; import java.util.ArrayList; import java.util.List; /** * Abstract implemention of the {@link MessageRecorder} interface. * * @author Richard M. Emberson */ public abstract class AbstractRecorder implements MessageRecorder { /** * Helper method to format a message and write to logger. */ public static void logMessage( final String context, final String msg, final MsgType msgType, final org.apache.log4j.Logger logger) { StringBuilder buf = new StringBuilder(64); buf.append(context); buf.append(": "); buf.append(msg); switch (msgType) { case INFO: logger.info(buf.toString()); break; case WARN: logger.warn(buf.toString()); break; case ERROR: logger.error(buf.toString()); break; default: logger.warn( "Unknown message type enum \"" + msgType + "\" for message: " + buf.toString()); } } enum MsgType { INFO, WARN, ERROR } public static final int DEFAULT_MSG_LIMIT = 10; private final int errorMsgLimit; private final List<String> contexts; private int errorMsgCount; private int warningMsgCount; private int infoMsgCount; private String contextMsgCache; private long startTime; protected AbstractRecorder() { this(DEFAULT_MSG_LIMIT); } protected AbstractRecorder(final int errorMsgLimit) { this.errorMsgLimit = errorMsgLimit; this.contexts = new ArrayList<String>(); this.startTime = System.currentTimeMillis(); } /** * Resets this MessageRecorder. */ public void clear() { errorMsgCount = 0; warningMsgCount = 0; infoMsgCount = 0; contextMsgCache = null; contexts.clear(); this.startTime = System.currentTimeMillis(); } public long getStartTimeMillis() { return this.startTime; } public long getRunTimeMillis() { return (System.currentTimeMillis() - this.startTime); } public boolean hasInformation() { return (infoMsgCount > 0); } public boolean hasWarnings() { return (warningMsgCount > 0); } public boolean hasErrors() { return (errorMsgCount > 0); } public int getInfoCount() { return infoMsgCount; } public int getWarningCount() { return warningMsgCount; } public int getErrorCount() { return errorMsgCount; } public String getContext() { // heavy weight if (contextMsgCache == null) { final StringBuilder buf = new StringBuilder(); int k = 0; for (String name : contexts) { if (k++ > 0) { buf.append(':'); } buf.append(name); } contextMsgCache = buf.toString(); } return contextMsgCache; } public void pushContextName(final String name) { // light weight contexts.add(name); contextMsgCache = null; } public void popContextName() { // light weight contexts.remove(contexts.size() - 1); contextMsgCache = null; } public void throwRTException() throws RecorderException { if (hasErrors()) { final String errorMsg = MondrianResource.instance().ForceMessageRecorderError.str( getContext(), errorMsgCount); throw new RecorderException(errorMsg); } } public void reportError(final Exception ex) throws RecorderException { reportError(ex, null); } public void reportError(final Exception ex, final Object info) throws RecorderException { reportError(ex.toString(), info); } public void reportError(final String msg) throws RecorderException { reportError(msg, null); } public void reportError(final String msg, final Object info) throws RecorderException { errorMsgCount++; recordMessage(msg, info, MsgType.ERROR); if (errorMsgCount >= errorMsgLimit) { final String errorMsg = MondrianResource.instance().TooManyMessageRecorderErrors.str( getContext(), errorMsgCount); throw new RecorderException(errorMsg); } } public void reportWarning(final String msg) { reportWarning(msg, null); } public void reportWarning(final String msg, final Object info) { warningMsgCount++; recordMessage(msg, info, MsgType.WARN); } public void reportInfo(final String msg) { reportInfo(msg, null); } public void reportInfo(final String msg, final Object info) { infoMsgCount++; recordMessage(msg, info, MsgType.INFO); } /** * Handles a message. * Classes implementing this abstract class must provide an implemention * of this method; it receives all warning/error messages. * * @param msg the error or warning message. * @param info the information Object which might be null. * @param msgType one of the message type enum values */ protected abstract void recordMessage( String msg, Object info, MsgType msgType); } // End AbstractRecorder.java