/*
 * 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 
 */

public 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
     */
    public DOMErrorImpl(short severity, String message, String type) {
        fSeverity = severity;
        fMessage = message;
        fType = type;
    }
    
    /**
     * @param severity
     * @param message
     * @param type
     * @param exception
     */
    public 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
     */
    public 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
