View Javadoc
1   /*
2    * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  package javax.xml.bind.helpers;
27  
28  import java.net.URL;
29  import java.net.MalformedURLException;
30  import java.text.MessageFormat;
31  
32  import javax.xml.bind.ValidationEventLocator;
33  import org.w3c.dom.Node;
34  import org.xml.sax.Locator;
35  import org.xml.sax.SAXParseException;
36  
37  /**
38   * Default implementation of the ValidationEventLocator interface.
39   *
40   * <p>
41   * JAXB providers are allowed to use whatever class that implements
42   * the ValidationEventLocator interface. This class is just provided for a
43   * convenience.
44   *
45   * @author <ul><li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li></ul>
46   * @see javax.xml.bind.Validator
47   * @see javax.xml.bind.ValidationEventHandler
48   * @see javax.xml.bind.ValidationEvent
49   * @see javax.xml.bind.ValidationEventLocator
50   * @since JAXB1.0
51   */
52  public class ValidationEventLocatorImpl implements ValidationEventLocator
53  {
54      /**
55       * Creates an object with all fields unavailable.
56       */
57      public ValidationEventLocatorImpl() {
58      }
59  
60      /**
61       * Constructs an object from an org.xml.sax.Locator.
62       *
63       * The object's ColumnNumber, LineNumber, and URL become available from the
64       * values returned by the locator's getColumnNumber(), getLineNumber(), and
65       * getSystemId() methods respectively. Node, Object, and Offset are not
66       * available.
67       *
68       * @param loc the SAX Locator object that will be used to populate this
69       * event locator.
70       * @throws IllegalArgumentException if the Locator is null
71       */
72      public ValidationEventLocatorImpl( Locator loc ) {
73          if( loc == null ) {
74              throw new IllegalArgumentException(
75                  Messages.format( Messages.MUST_NOT_BE_NULL, "loc" ) );
76          }
77  
78          this.url = toURL(loc.getSystemId());
79          this.columnNumber = loc.getColumnNumber();
80          this.lineNumber = loc.getLineNumber();
81      }
82  
83      /**
84       * Constructs an object from the location information of a SAXParseException.
85       *
86       * The object's ColumnNumber, LineNumber, and URL become available from the
87       * values returned by the locator's getColumnNumber(), getLineNumber(), and
88       * getSystemId() methods respectively. Node, Object, and Offset are not
89       * available.
90       *
91       * @param e the SAXParseException object that will be used to populate this
92       * event locator.
93       * @throws IllegalArgumentException if the SAXParseException is null
94       */
95      public ValidationEventLocatorImpl( SAXParseException e ) {
96          if( e == null ) {
97              throw new IllegalArgumentException(
98                  Messages.format( Messages.MUST_NOT_BE_NULL, "e" ) );
99          }
100 
101         this.url = toURL(e.getSystemId());
102         this.columnNumber = e.getColumnNumber();
103         this.lineNumber = e.getLineNumber();
104     }
105 
106     /**
107      * Constructs an object that points to a DOM Node.
108      *
109      * The object's Node becomes available.  ColumnNumber, LineNumber, Object,
110      * Offset, and URL are not available.
111      *
112      * @param _node the DOM Node object that will be used to populate this
113      * event locator.
114      * @throws IllegalArgumentException if the Node is null
115      */
116     public ValidationEventLocatorImpl(Node _node) {
117         if( _node == null ) {
118             throw new IllegalArgumentException(
119                 Messages.format( Messages.MUST_NOT_BE_NULL, "_node" ) );
120         }
121 
122         this.node = _node;
123     }
124 
125     /**
126      * Constructs an object that points to a JAXB content object.
127      *
128      * The object's Object becomes available. ColumnNumber, LineNumber, Node,
129      * Offset, and URL are not available.
130      *
131      * @param _object the Object that will be used to populate this
132      * event locator.
133      * @throws IllegalArgumentException if the Object is null
134      */
135     public ValidationEventLocatorImpl(Object _object) {
136         if( _object == null ) {
137             throw new IllegalArgumentException(
138                 Messages.format( Messages.MUST_NOT_BE_NULL, "_object" ) );
139         }
140 
141         this.object = _object;
142     }
143 
144     /** Converts a system ID to an URL object. */
145     private static URL toURL( String systemId ) {
146         try {
147             return new URL(systemId);
148         } catch( MalformedURLException e ) {
149             // TODO: how should we handle system id here?
150             return null;    // for now
151         }
152     }
153 
154     private URL url = null;
155     private int offset = -1;
156     private int lineNumber = -1;
157     private int columnNumber = -1;
158     private Object object = null;
159     private Node node = null;
160 
161 
162     /**
163      * @see javax.xml.bind.ValidationEventLocator#getURL()
164      */
165     public URL getURL() {
166         return url;
167     }
168 
169     /**
170      * Set the URL field on this event locator.  Null values are allowed.
171      *
172      * @param _url the url
173      */
174     public void setURL( URL _url ) {
175         this.url = _url;
176     }
177 
178     /**
179      * @see javax.xml.bind.ValidationEventLocator#getOffset()
180      */
181     public int getOffset() {
182         return offset;
183     }
184 
185     /**
186      * Set the offset field on this event locator.
187      *
188      * @param _offset the offset
189      */
190     public void setOffset( int _offset ) {
191         this.offset = _offset;
192     }
193 
194     /**
195      * @see javax.xml.bind.ValidationEventLocator#getLineNumber()
196      */
197     public int getLineNumber() {
198         return lineNumber;
199     }
200 
201     /**
202      * Set the lineNumber field on this event locator.
203      *
204      * @param _lineNumber the line number
205      */
206     public void setLineNumber( int _lineNumber ) {
207         this.lineNumber = _lineNumber;
208     }
209 
210     /**
211      * @see javax.xml.bind.ValidationEventLocator#getColumnNumber()
212      */
213     public int getColumnNumber() {
214         return columnNumber;
215     }
216 
217     /**
218      * Set the columnNumber field on this event locator.
219      *
220      * @param _columnNumber the column number
221      */
222     public void setColumnNumber( int _columnNumber ) {
223         this.columnNumber = _columnNumber;
224     }
225 
226     /**
227      * @see javax.xml.bind.ValidationEventLocator#getObject()
228      */
229     public Object getObject() {
230         return object;
231     }
232 
233     /**
234      * Set the Object field on this event locator.  Null values are allowed.
235      *
236      * @param _object the java content object
237      */
238     public void setObject( Object _object ) {
239         this.object = _object;
240     }
241 
242     /**
243      * @see javax.xml.bind.ValidationEventLocator#getNode()
244      */
245     public Node getNode() {
246         return node;
247     }
248 
249     /**
250      * Set the Node field on this event locator.  Null values are allowed.
251      *
252      * @param _node the Node
253      */
254     public void setNode( Node _node ) {
255         this.node = _node;
256     }
257 
258     /**
259      * Returns a string representation of this object in a format
260      * helpful to debugging.
261      *
262      * @see Object#equals(Object)
263      */
264     public String toString() {
265         return MessageFormat.format("[node={0},object={1},url={2},line={3},col={4},offset={5}]",
266             getNode(),
267             getObject(),
268             getURL(),
269             String.valueOf(getLineNumber()),
270             String.valueOf(getColumnNumber()),
271             String.valueOf(getOffset()));
272     }
273 }