/*
 * 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.
 */
 
package org.apache.xerces.impl.io;

import java.io.CharConversionException;
import java.util.Locale;

import org.apache.xerces.util.MessageFormatter;

/**
 * <p>Signals that a malformed byte sequence was detected
 * by a <code>java.io.Reader</code> that decodes bytes 
 * of a given encoding into characters.</p>
 * 
 * @xerces.internal
 *
 * @author Michael Glavassevich, IBM
 *
 * @version $Id: MalformedByteSequenceException.java 718096 2008-11-16 20:00:58Z mrglavas $
 */
public final class MalformedByteSequenceException extends CharConversionException {

    /** Serialization version. */
    static final long serialVersionUID = 8436382245048328739L;
    
    //
    // Data
    //
    
    /** message formatter **/
    private MessageFormatter fFormatter;
    
    /** locale for error message **/
    private Locale fLocale;
    
    /** error domain **/
    private String fDomain;
    
    /** key for the error message **/
    private String fKey;
    
    /** replacement arguements for the error message **/
    private Object[] fArguments;
    
    /** message text for this message, initially null **/
    private String fMessage;
    
    //
    // Constructors
    //

    /**
     * Constructs a MalformedByteSequenceException with the given
     * parameters which may be passed to an error reporter to 
     * generate a localized string for this exception.
     * 
     * @param formatter The MessageFormatter used for building the 
     *                  message text for this exception.
     * @param locale    The Locale for which messages are to be reported.
     * @param domain    The error domain.
     * @param key       The key of the error message.
     * @param arguments The replacement arguments for the error message,
     *                  if needed.
     */
    public MalformedByteSequenceException(MessageFormatter formatter,
        Locale locale, String domain, String key, Object[] arguments) {
        fFormatter = formatter;
        fLocale = locale;
        fDomain = domain;
        fKey = key;
        fArguments = arguments;
    } // <init>(MessageFormatter, Locale, String, String, Object[])
    
    //
    // Public methods
    //
    
    /**
     * <p>Returns the error domain of the error message.</p>
     * 
     * @return the error domain
     */
    public String getDomain () {
    	return fDomain;
    } // getDomain
    
    /**
     * <p>Returns the key of the error message.</p>
     * 
     * @return the error key of the error message
     */
    public String getKey () {
    	return fKey;
    } // getKey()
    
    /**
     * <p>Returns the replacement arguments for the error
     * message or <code>null</code> if none exist.</p>
     * 
     * @return the replacement arguments for the error message
     * or <code>null</code> if none exist
     */
    public Object[] getArguments () {
    	return fArguments;
    } // getArguments();
    
    /**
     * <p>Returns the localized message for this exception.</p>
     * 
     * @return the localized message for this exception.
     */
    public synchronized String getMessage() {
        if (fMessage == null) {
            fMessage = fFormatter.formatMessage(fLocale, fKey, fArguments);
            // The references to the message formatter and locale
            // aren't needed anymore so null them.
            fFormatter = null;
            fLocale = null;
        }
        return fMessage;
     } // getMessage()
     
} // MalformedByteSequenceException
