/*
 * 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.DOMLocator;
import org.w3c.dom.Node;


/**
 * <code>DOMLocatorImpl</code> is an implementaion that describes a location (e.g. 
 * where an error occured).
 * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407'>Document Object Model (DOM) Level 3 Core Specification</a>.
 * This class is a copy of the Xerces-2J class org.apache.xerces.dom.DOMLocatorImpl.java v 1.10 
 *
 * @author Gopal Sharma, SUN Microsystems Inc.
 * @version $Id: 
 * 
 * @xsl.usage internal
 */
final class DOMLocatorImpl implements DOMLocator {
    
    //
    // Data
    //
    
    /**
     * The column number where the error occured, 
     * or -1 if there is no column number available.
     */
    private final int fColumnNumber;
    
    /**
     * The line number where the error occured, 
     * or -1 if there is no line number available.
     */
    private final int fLineNumber;
    
    /** related data node*/
    private final Node fRelatedNode;
    
    /**
     * The URI where the error occured, 
     * or null if there is no URI available.
     */
    private final String fUri;
    
    /**
     * The byte offset into the input source this locator is pointing to or -1 
     * if there is no byte offset available
     */
    private final int fByteOffset;
    
    /**
     * The UTF-16, as defined in [Unicode] and Amendment 1 of [ISO/IEC 10646], 
     * offset into the input source this locator is pointing to or -1 if there 
     * is no UTF-16 offset available.
     */
    private final int fUtf16Offset;
    
    //
    // Constructors
    //
    
    DOMLocatorImpl(){
        fColumnNumber = -1;
        fLineNumber = -1;
        fRelatedNode = null;
        fUri = null;
        fByteOffset = -1;
        fUtf16Offset = -1;
    }
    
    DOMLocatorImpl (int lineNumber, int columnNumber, String uri ){
        fLineNumber = lineNumber ;
        fColumnNumber = columnNumber ;
        fUri = uri;
        
        fRelatedNode = null;
        fByteOffset = -1;
        fUtf16Offset = -1;
    } // DOMLocatorImpl (int lineNumber, int columnNumber, String uri )
    
    DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri ){
        fLineNumber = lineNumber ;
        fColumnNumber = columnNumber ;
        fUri = uri;
        fUtf16Offset = utf16Offset;
        

        fRelatedNode = null;
        fByteOffset = -1;
    } // DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri )
    
    DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri ){
        fLineNumber = lineNumber ;
        fColumnNumber = columnNumber ;
        fByteOffset = byteoffset ;
        fRelatedNode = relatedData ;
        fUri = uri;
        
        fUtf16Offset = -1;
    } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri )
    
    DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri, int utf16Offset ){
        fLineNumber = lineNumber ;
        fColumnNumber = columnNumber ;
        fByteOffset = byteoffset ;
        fRelatedNode = relatedData ;
        fUri = uri;
        fUtf16Offset = utf16Offset;
    } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri )
    
    
    /**
     * The line number where the error occured, or -1 if there is no line 
     * number available.
     */
    public int getLineNumber(){
        return fLineNumber;
    }
    
    /**
     * The column number where the error occured, or -1 if there is no column 
     * number available.
     */
    public int getColumnNumber(){
        return fColumnNumber;
    }
    
    
    /**
     * The URI where the error occured, or null if there is no URI available.
     */
    public String getUri(){
        return fUri;
    }
    
    
    public Node getRelatedNode(){
        return fRelatedNode;
    }
    
    
    /**
     * The byte offset into the input source this locator is pointing to or -1 
     * if there is no byte offset available
     */
    public int getByteOffset(){
        return fByteOffset;
    }
    
    /**
     * The UTF-16, as defined in [Unicode] and Amendment 1 of [ISO/IEC 10646], 
     * offset into the input source this locator is pointing to or -1 if there 
     * is no UTF-16 offset available.
     */
    public int getUtf16Offset(){
        return fUtf16Offset;
    }
    
}// class DOMLocatorImpl
