1 /* This file is part of the project "Hilbert II" - http://www.qedeq.org" target="alexandria_uri">http://www.qedeq.org
2 *
3 * Copyright 2000-2014, Michael Meyling <mime@qedeq.org>.
4 *
5 * "Hilbert II" is free software; you can redistribute
6 * it and/or modify it under the terms of the GNU General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15 package org.qedeq.kernel.xml.handler.common;
16
17 import java.lang.reflect.Method;
18
19 import org.qedeq.base.trace.Trace;
20 import org.xml.sax.Locator;
21 import org.xml.sax.helpers.DefaultHandler;
22
23
24 /**
25 * SAX handler that remembers {@link org.xml.sax.Locator} and possibly
26 * encoding of XML document.
27 *
28 * @author Michael Meyling
29 */
30 public class SimpleHandler extends DefaultHandler {
31
32 /** This class. */
33 private static final Class CLASS = SimpleHandler.class;
34
35 /** Locator for current row and column information. */
36 private Locator locator;
37
38 /** Which encoding was used to parse the document? */
39 private String encoding;
40
41 /** File that is parsed. */
42 private String url;
43
44 /**
45 * Constructor.
46 */
47 public SimpleHandler() {
48 super();
49 }
50
51 /**
52 * Receive a Locator object for document events.
53 * Store the locator for use with other document events.
54 *
55 * @param locator A locator for all SAX document events.
56 * @see org.xml.sax.ContentHandler#setDocumentLocator
57 * @see org.xml.sax.Locator
58 */
59 public void setDocumentLocator(final Locator locator) {
60 this.locator = locator;
61 this.encoding = getEncoding(locator);
62 Trace.paramInfo(CLASS, this, "setDocumentLocator(locator)", "encoding", encoding);
63 }
64
65 /**
66 * Which encoding was used to parse the document?
67 *
68 * @return Encoding for parsed document. Maybe <code>null</code>.
69 */
70 public String getEncoding() {
71 return this.encoding;
72 }
73
74 /**
75 * There is no way in SAX 2.0.0 or 2.0.1 to get information about the encoding; the SAX
76 * Locator2 interface from the 1.1 extensions does provide methods to accomplish this,
77 * Assuming <code>Locator</code> is an instance of the SAX Locator interface that supports
78 * <code>Locator2</code> call we can get the information.
79 *
80 * @param locator Locator.
81 * @return Encoding. Maybe <code>null</code>.
82 */
83 private static String getEncoding(final Locator locator) {
84 String encoding = null;
85 Method getEncoding = null;
86 try {
87 getEncoding = locator.getClass().getMethod("getEncoding", new Class[]{});
88 if (getEncoding != null) {
89 encoding = (String) getEncoding.invoke(locator, null);
90 }
91 } catch (Exception e) {
92 // either this locator object doesn't have this
93 // method, or we're on an old JDK
94 }
95 return encoding;
96 }
97
98 /**
99 * Get document locator. This value set is set during parsing.
100 *
101 * @return Locator. Maybe <code>null</code>.
102 */
103 protected Locator getLocator() {
104 return locator;
105 }
106
107 /**
108 * Set original file URL.
109 *
110 * @param url Data from this source is parsed. This URL is only for information. The
111 * actual parsed data might be a local copy.
112 */
113 public final void setUrl(final String url) {
114 this.url = url;
115 }
116
117 /**
118 * Get original file URL.
119 *
120 * @return Data from this source is parsed. This URL is only for information. The
121 * actual parsed data might be a local copy.
122 */
123 public final String getUrl() {
124 return url;
125 }
126
127 }