/*
 * 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.
 */
/*
 * $Id:  $
 */

package org.apache.xml.serializer.dom3;

import org.w3c.dom.DOMError;
import org.w3c.dom.DOMLocator;

/**
 * Implementation of the DOM Level 3 DOMError interface.
 *
 * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ERROR-Interfaces-DOMError'>DOMError Interface definition from Document Object Model (DOM) Level 3 Core Specification</a>.
 * 
 * @xsl.usage internal 
 */

final class DOMErrorImpl implements DOMError {
    
    /** private data members */
    
    // The DOMError Severity
    private short fSeverity = DOMError.SEVERITY_WARNING;
    
    // The Error message
    private String fMessage = null;
    
    //  A String indicating which related data is expected in relatedData. 
    private String fType;
    
    // The platform related exception
    private Exception fException = null;
    
    //  
    private Object fRelatedData;
    
    // The location of the exception
    private DOMLocatorImpl fLocation = new DOMLocatorImpl();
    
    
    //
    // Constructors
    //
    
    /** 
     * Default constructor. 
     */    
    DOMErrorImpl () {
    }
    
    /**
     * @param severity
     * @param message
     * @param type
     */
    DOMErrorImpl(short severity, String message, String type) {
        fSeverity = severity;
        fMessage = message;
        fType = type;
    }
    
    /**
     * @param severity
     * @param message
     * @param type
     * @param exception
     */
    DOMErrorImpl(short severity, String message, String type,
            Exception exception) {
        fSeverity = severity;
        fMessage = message;
        fType = type;
        fException = exception;
    }
    
    /**
     * @param severity
     * @param message
     * @param type
     * @param exception
     * @param relatedData
     * @param location
     */
    DOMErrorImpl(short severity, String message, String type,
            Exception exception, Object relatedData, DOMLocatorImpl location) {
        fSeverity = severity;
        fMessage = message;
        fType = type;
        fException = exception;
        fRelatedData = relatedData;
        fLocation = location;
    }
    
    
    /**
     * The severity of the error, either <code>SEVERITY_WARNING</code>, 
     * <code>SEVERITY_ERROR</code>, or <code>SEVERITY_FATAL_ERROR</code>.
     * 
     * @return A short containing the DOMError severity
     */
    public short getSeverity() {
        return fSeverity;
    }
    
    /**
     * The DOMError message string.
     * 
     * @return String
     */
    public String getMessage() {
        return fMessage;
    }
    
    /**
     * The location of the DOMError.
     * 
     * @return A DOMLocator object containing the DOMError location.
     */
    public DOMLocator getLocation() {
        return fLocation;
    }
    
    /**
     * The related platform dependent exception if any.
     * 
     * @return A java.lang.Exception 
     */
    public Object getRelatedException(){
        return fException;
    }
    
    /**
     * Returns a String indicating which related data is expected in relatedData.
     * 
     * @return A String
     */
    public String getType(){
        return fType;
    }
    
    /**
     * The related DOMError.type dependent data if any.
     * 
     * @return java.lang.Object 
     */
    public Object getRelatedData(){
        return fRelatedData;
    }
    
    public void reset(){
        fSeverity = DOMError.SEVERITY_WARNING; 
        fException = null;
        fMessage = null;
        fType = null;
        fRelatedData = null;
        fLocation = null;        
    }
    
}// class DOMErrorImpl
