package org.codehaus.mojo.exception; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import java.text.MessageFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.apache.maven.plugin.MojoExecutionException; /** * @author <a href="mailto:m2@corridor-software.us">Kris Bravo</a> * @version $Id$ */ public abstract class CodedException extends MojoExecutionException { /** * The error message used when a key is missing from the resource bundles. */ protected static final Error MISSING_ERROR_KEY = new Error( "missing.error.key" ); /** * The error code for the specific error. */ protected Error error; /** * Any fields which would need to be filled in within the error message. */ protected String[] errorFields; /** * The shadow handle to the resource bundle. Since statics can only * be shadowed and not overridden, this provides the mechanism needed * to access a subclasses resource bundle from a super-class non-static * method. */ protected ResourceBundle errors = null; /** * Empty Constructor. Required for subclasses. */ public CodedException() { super( "" ); init( null, null ); } /** * An exception with a specific error code. * * @param code The code key used to look up the error text. */ public CodedException( final Error code ) { super( "" ); init( code, null ); } /** * An exception with an error code and fields in the * message. * * @param code The code key used to look up the error text. * @param fields An array of field values to replace fields in the error message. */ public CodedException( final Error code, final String[] fields ) { super( "" ); init( code, fields ); } /** * An exception with an error code and fields in the * message. * * @param code The code key used to look up the error text. * @param field A single value with which to replace the error message field. */ public CodedException( final Error code, final String field ) { super( "" ); String[] fields = new String[1]; fields[0] = field; init( code, fields ); } /** * Creates a new Coded Exception, given an error code and root cause. * * @param code The {@link Error} of this particular exception. * @param exception The root cause of the problem. */ public CodedException( final Error code, final Throwable exception ) { super( "", ( Exception ) exception ); init( code, null ); } /** * Creates a coded exception with fields and a root cause. * * @param code The code key used to look up the error text. * @param field A single value with which to replace the error message field. * @param exception The source of the error. */ public CodedException( final Error code, final String field, final Throwable exception ) { super( "", ( Exception ) exception ); String[] fields = new String[1]; fields[0] = field; init( code, fields ); } /** * Creates a coded exception with fields and a root cause. * * @param code The code key used to look up the error text. * @param fields An array of field values to replace fields in the error message. * @param exception The source of the error. */ public CodedException( final Error code, final String[] fields, final Throwable exception ) { super( "", ( Exception ) exception ); init( code, fields ); } /** * Initialize the instance. * * @param code The code key used to look up the error text. * @param fields An array of field values to replace fields in the error message. */ protected final void init( final Error code, final String[] fields ) { if ( code != null ) { error = code; } errorFields = fields; } /** * <code>getMessage</code> - Check the error code to see if * it's an <code>ExtendedError</code>. * Based on the result, pull the error string from the appropriate * resource bundle (business logic errors or general CAM errors). * * @return a <code>String</code> value */ public final String getMessage() { String message; // determine if it's a valid extended error. if ( ( errors != null ) && ( error != null ) ) { try { message = errors.getString( error.toString() ); // use the subclass resource bundle // if there are error fields, fill them in. if ( errorFields != null ) { message = MessageFormat.format( message, errorFields ); } } catch ( MissingResourceException e ) { message = errors.getString( MISSING_ERROR_KEY.getErrorKey() + ":" + e.getKey() ); } } else { message = "An unknown error occurred."; } return message; } }