001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements. See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership. The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the  "License");
007     * you may not use this file except in compliance with the License.
008     * You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    /*
019     * $Id: SAXSourceLocator.java 468655 2006-10-28 07:12:06Z minchau $
020     */
021    package org.apache.xml.utils;
022    
023    import java.io.Serializable;
024    
025    import javax.xml.transform.SourceLocator;
026    
027    import org.xml.sax.Locator;
028    import org.xml.sax.SAXParseException;
029    import org.xml.sax.helpers.LocatorImpl;
030    
031    /**
032     * Class SAXSourceLocator extends org.xml.sax.helpers.LocatorImpl
033     * for the purpose of implementing the SourceLocator interface, 
034     * and thus can be both a SourceLocator and a SAX Locator.
035     */
036    public class SAXSourceLocator extends LocatorImpl
037            implements SourceLocator, Serializable
038    {
039        static final long serialVersionUID = 3181680946321164112L;
040      /** The SAX Locator object.
041       *  @serial
042       */
043      Locator m_locator;
044    
045      /**
046       * Constructor SAXSourceLocator
047       *
048       */
049      public SAXSourceLocator(){}
050    
051      /**
052       * Constructor SAXSourceLocator
053       *
054       *
055       * @param locator Source locator
056       */
057      public SAXSourceLocator(Locator locator)
058      {
059        m_locator = locator;
060        this.setColumnNumber(locator.getColumnNumber());
061        this.setLineNumber(locator.getLineNumber());
062        this.setPublicId(locator.getPublicId());
063        this.setSystemId(locator.getSystemId());
064      }
065      
066      /**
067       * Constructor SAXSourceLocator
068       *
069       *
070       * @param locator Source locator
071       */
072      public SAXSourceLocator(javax.xml.transform.SourceLocator locator)
073      {
074        m_locator = null;
075        this.setColumnNumber(locator.getColumnNumber());
076        this.setLineNumber(locator.getLineNumber());
077        this.setPublicId(locator.getPublicId());
078        this.setSystemId(locator.getSystemId());
079      }
080    
081      
082      /**
083       * Constructor SAXSourceLocator
084       *
085       *
086       * @param spe SAXParseException exception.
087       */
088      public SAXSourceLocator(SAXParseException spe)
089      {
090        this.setLineNumber( spe.getLineNumber() );
091        this.setColumnNumber( spe.getColumnNumber() );
092        this.setPublicId( spe.getPublicId() );
093        this.setSystemId( spe.getSystemId() );
094      }
095      
096      /**
097       * Return the public identifier for the current document event.
098       *
099       * <p>The return value is the public identifier of the document
100       * entity or of the external parsed entity in which the markup
101       * triggering the event appears.</p>
102       *
103       * @return A string containing the public identifier, or
104       *         null if none is available.
105       * @see #getSystemId
106       */
107      public String getPublicId()
108      {
109        return (null == m_locator) ? super.getPublicId() : m_locator.getPublicId();
110      }
111    
112      /**
113       * Return the system identifier for the current document event.
114       *
115       * <p>The return value is the system identifier of the document
116       * entity or of the external parsed entity in which the markup
117       * triggering the event appears.</p>
118       *
119       * <p>If the system identifier is a URL, the parser must resolve it
120       * fully before passing it to the application.</p>
121       *
122       * @return A string containing the system identifier, or null
123       *         if none is available.
124       * @see #getPublicId
125       */
126      public String getSystemId()
127      {
128        return (null == m_locator) ? super.getSystemId() : m_locator.getSystemId();
129      }
130      
131      /**
132       * Return the line number where the current document event ends.
133       *
134       * <p><strong>Warning:</strong> The return value from the method
135       * is intended only as an approximation for the sake of error
136       * reporting; it is not intended to provide sufficient information
137       * to edit the character content of the original XML document.</p>
138       *
139       * <p>The return value is an approximation of the line number
140       * in the document entity or external parsed entity where the
141       * markup triggering the event appears.</p>
142       *
143       * @return The line number, or -1 if none is available.
144       * @see #getColumnNumber
145       */
146      public int getLineNumber()
147      {
148        return (null == m_locator) ? super.getLineNumber() : m_locator.getLineNumber();
149      }
150    
151      /**
152       * Return the column number where the current document event ends.
153       *
154       * <p><strong>Warning:</strong> The return value from the method
155       * is intended only as an approximation for the sake of error
156       * reporting; it is not intended to provide sufficient information
157       * to edit the character content of the original XML document.</p>
158       *
159       * <p>The return value is an approximation of the column number
160       * in the document entity or external parsed entity where the
161       * markup triggering the event appears.</p>
162       *
163       * @return The column number, or -1 if none is available.
164       * @see #getLineNumber
165       */
166      public int getColumnNumber()
167      {
168        return (null == m_locator) ? super.getColumnNumber() : m_locator.getColumnNumber();
169      }
170    }