1:
37:
38: package ;
39:
40: import ;
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55:
56: import ;
57: import ;
58: import ;
59: import ;
60: import ;
61: import ;
62: import ;
63: import ;
64: import ;
65: import ;
66: import ;
67: import ;
68: import ;
69: import ;
70: import ;
71:
72:
92: public class SAXParser
93: extends javax.xml.parsers.SAXParser
94: implements XMLReader, Attributes2, Locator2, XMLReporter, XMLResolver
95: {
96:
97: ContentHandler contentHandler;
98: DeclHandler declHandler;
99: DTDHandler dtdHandler;
100: EntityResolver entityResolver;
101: ErrorHandler errorHandler;
102: LexicalHandler lexicalHandler;
103:
104: boolean validating = false;
105: boolean namespaceAware = true;
106: boolean xIncludeAware = false;
107: boolean stringInterning = true;
108: boolean coalescing = true;
109: boolean replaceERefs = true;
110: boolean externalEntities = true;
111: boolean supportDTD = true;
112: boolean baseAware = true;
113:
114: XMLParser parser;
115: XMLStreamReader reader;
116: String encoding;
117: String xmlVersion;
118: boolean xmlStandalone;
119: String xmlEncoding;
120: String baseURI;
121:
122: public SAXParser()
123: {
124: }
125:
126: SAXParser(boolean validating, boolean namespaceAware, boolean xIncludeAware)
127: {
128: this.validating = validating;
129: this.namespaceAware = namespaceAware;
130: this.xIncludeAware = xIncludeAware;
131: }
132:
133:
134:
135: public Parser getParser()
136: throws SAXException
137: {
138: return null;
139: }
140:
141: public XMLReader getXMLReader()
142: throws SAXException
143: {
144: return this;
145: }
146:
147: public boolean isNamespaceAware()
148: {
149: return namespaceAware;
150: }
151:
152: public boolean isValidating()
153: {
154: return validating;
155: }
156:
157: public void setProperty(String name, Object value)
158: throws SAXNotRecognizedException, SAXNotSupportedException
159: {
160: if (parser != null)
161: throw new IllegalStateException("parsing in progress");
162: final String FEATURES = "http://xml.org/sax/features/";
163: final String PROPERTIES = "http://xml.org/sax/properties/";
164: final String GNU_FEATURES = "http://gnu.org/sax/features/";
165: if ((FEATURES + "namespaces").equals(name))
166: namespaceAware = Boolean.TRUE.equals(value);
167: else if ((FEATURES + "namespace-prefixes").equals(name))
168: {
169:
170: }
171: else if ((FEATURES + "string-interning").equals(name))
172: stringInterning = Boolean.TRUE.equals(value);
173: else if ((FEATURES + "use-attributes2").equals(name))
174: {
175:
176: }
177: else if ((FEATURES + "validation").equals(name))
178: validating = Boolean.TRUE.equals(value);
179: else if ((FEATURES + "external-general-entities").equals(name))
180: externalEntities = Boolean.TRUE.equals(value);
181: else if ((FEATURES + "external-parameter-entities").equals(name))
182: externalEntities = Boolean.TRUE.equals(value);
183: else if ((PROPERTIES + "declaration-handler").equals(name))
184: declHandler = (DeclHandler) value;
185: else if ((PROPERTIES + "lexical-handler").equals(name))
186: lexicalHandler = (LexicalHandler) value;
187: else if ((GNU_FEATURES + "xml-base").equals(name))
188: baseAware = Boolean.TRUE.equals(value);
189: else if ((GNU_FEATURES + "coalescing").equals(name))
190: coalescing = Boolean.TRUE.equals(value);
191: else
192: throw new SAXNotSupportedException(name);
193: }
194:
195: public Object getProperty(String name)
196: throws SAXNotRecognizedException, SAXNotSupportedException
197: {
198: final String FEATURES = "http://xml.org/sax/features/";
199: final String PROPERTIES = "http://xml.org/sax/properties/";
200: final String GNU_FEATURES = "http://gnu.org/sax/features/";
201: final String GNU_PROPERTIES = "http://gnu.org/sax/properties/";
202: if ((GNU_FEATURES + "base-uri").equals(name))
203: return baseURI;
204: if ((FEATURES + "is-standalone").equals(name))
205: return xmlStandalone ? Boolean.TRUE : Boolean.FALSE;
206: if ((FEATURES + "namespaces").equals(name))
207: return namespaceAware ? Boolean.TRUE : Boolean.FALSE;
208: if ((FEATURES + "namespace-prefixes").equals(name))
209: return Boolean.TRUE;
210: if ((FEATURES + "string-interning").equals(name))
211: return stringInterning ? Boolean.TRUE : Boolean.FALSE;
212: if ((FEATURES + "use-attributes2").equals(name))
213: return Boolean.TRUE;
214: if ((FEATURES + "use-locator2").equals(name))
215: return Boolean.TRUE;
216: if ((FEATURES + "use-entity-resolver2").equals(name))
217: return Boolean.FALSE;
218: if ((FEATURES + "validation").equals(name))
219: return validating ? Boolean.TRUE : Boolean.FALSE;
220: if ((FEATURES + "external-general-entities").equals(name))
221: return externalEntities ? Boolean.TRUE : Boolean.FALSE;
222: if ((FEATURES + "external-parameter-entities").equals(name))
223: return externalEntities ? Boolean.TRUE : Boolean.FALSE;
224: if ((FEATURES + "xml-1.1").equals(name))
225: return Boolean.TRUE;
226: if ((PROPERTIES + "declaration-handler").equals(name))
227: return declHandler;
228: if ((PROPERTIES + "document-xml-version").equals(name))
229: return xmlVersion;
230: if ((PROPERTIES + "lexical-handler").equals(name))
231: return lexicalHandler;
232: if ((GNU_FEATURES + "xml-base").equals(name))
233: return baseAware ? Boolean.TRUE : Boolean.FALSE;
234: if ((GNU_PROPERTIES + "document-xml-encoding").equals(name))
235: return xmlEncoding;
236: throw new SAXNotRecognizedException(name);
237: }
238:
239: public boolean isXIncludeAware()
240: {
241: return xIncludeAware;
242: }
243:
244: public void reset()
245: {
246: parser = null;
247: encoding = null;
248: xmlVersion = null;
249: xmlStandalone = false;
250: }
251:
252:
253:
254: public boolean getFeature(String name)
255: throws SAXNotRecognizedException, SAXNotSupportedException
256: {
257: Object ret = getProperty(name);
258: if (ret instanceof Boolean)
259: return ((Boolean) ret).booleanValue();
260: throw new SAXNotSupportedException(name);
261: }
262:
263: public void setFeature(String name, boolean value)
264: throws SAXNotRecognizedException, SAXNotSupportedException
265: {
266: setProperty(name, value ? Boolean.TRUE : Boolean.FALSE);
267: }
268:
269: public void setEntityResolver(EntityResolver resolver)
270: {
271: entityResolver = resolver;
272: }
273:
274: public EntityResolver getEntityResolver()
275: {
276: return entityResolver;
277: }
278:
279: public void setDTDHandler(DTDHandler handler)
280: {
281: dtdHandler = handler;
282: }
283:
284: public DTDHandler getDTDHandler()
285: {
286: return dtdHandler;
287: }
288:
289: public void setContentHandler(ContentHandler handler)
290: {
291: contentHandler = handler;
292: }
293:
294: public ContentHandler getContentHandler()
295: {
296: return contentHandler;
297: }
298:
299: public void setErrorHandler(ErrorHandler handler)
300: {
301: errorHandler = handler;
302: }
303:
304: public ErrorHandler getErrorHandler()
305: {
306: return errorHandler;
307: }
308:
309: public synchronized void parse(InputSource input)
310: throws IOException, SAXException
311: {
312: reset();
313: String systemId = input.getSystemId();
314: InputStream in = input.getByteStream();
315: boolean opened = false;
316: if (in != null)
317: parser = new XMLParser(in, systemId,
318: validating,
319: namespaceAware,
320: coalescing,
321: replaceERefs,
322: externalEntities,
323: supportDTD,
324: baseAware,
325: stringInterning,
326: true,
327: this,
328: this);
329: else
330: {
331: Reader r = input.getCharacterStream();
332: if (r != null)
333: parser = new XMLParser(r, systemId,
334: validating,
335: namespaceAware,
336: coalescing,
337: replaceERefs,
338: externalEntities,
339: supportDTD,
340: baseAware,
341: stringInterning,
342: true,
343: this,
344: this);
345: }
346: if (parser == null)
347: {
348: if (systemId == null)
349: throw new SAXException("No stream or system ID specified");
350: systemId = XMLParser.absolutize(null, systemId);
351: in = new URL(systemId).openStream();
352: opened = true;
353: parser = new XMLParser(in, systemId,
354: validating,
355: namespaceAware,
356: coalescing,
357: replaceERefs,
358: externalEntities,
359: supportDTD,
360: baseAware,
361: stringInterning,
362: true,
363: this,
364: this);
365: }
366: reader = parser;
367: baseURI = systemId;
368:
369: if (xIncludeAware)
370: reader = new XIncludeFilter(parser, systemId, namespaceAware,
371: validating, true);
372:
373: if (contentHandler != null)
374: contentHandler.setDocumentLocator(this);
375: boolean startDocumentDone = false;
376: try
377: {
378: while (parser.hasNext())
379: {
380: int event = parser.next();
381: if (baseAware)
382: baseURI = parser.getXMLBase();
383: switch (event)
384: {
385: case XMLStreamConstants.CHARACTERS:
386: if (contentHandler != null)
387: {
388: char[] b = reader.getTextCharacters();
389: contentHandler.characters(b, 0, b.length);
390: }
391: break;
392: case XMLStreamConstants.SPACE:
393: if (contentHandler != null)
394: {
395: char[] b = reader.getTextCharacters();
396: if (isIgnorableWhitespace(parser, b, false))
397: contentHandler.ignorableWhitespace(b, 0, b.length);
398: else
399: contentHandler.characters(b, 0, b.length);
400: }
401: break;
402: case XMLStreamConstants.CDATA:
403: if (lexicalHandler != null)
404: lexicalHandler.startCDATA();
405: if (contentHandler != null)
406: {
407: char[] b = reader.getTextCharacters();
408: if (isIgnorableWhitespace(parser, b, true))
409: contentHandler.ignorableWhitespace(b, 0, b.length);
410: else
411: contentHandler.characters(b, 0, b.length);
412: }
413: if (lexicalHandler != null)
414: lexicalHandler.endCDATA();
415: break;
416: case XMLStreamConstants.START_ELEMENT:
417: if (contentHandler != null)
418: {
419: QName name = reader.getName();
420: String uri = name.getNamespaceURI();
421: String localName = name.getLocalPart();
422: String prefix = name.getPrefix();
423: String qName = localName;
424: if (!"".equals(prefix))
425: qName = prefix + ":" + localName;
426: if (!namespaceAware)
427: {
428: uri = "";
429: localName = "";
430: }
431: else
432: {
433: int nc = reader.getNamespaceCount();
434: for (int i = 0; i < nc; i++)
435: {
436: String nsuri = reader.getNamespaceURI(i);
437: String nsprefix = reader.getNamespacePrefix(i);
438: if ("xml".equals(nsprefix))
439: continue;
440: contentHandler.startPrefixMapping(nsprefix, nsuri);
441: }
442: }
443: contentHandler.startElement(uri, localName, qName, this);
444: }
445: break;
446: case XMLStreamConstants.END_ELEMENT:
447: if (contentHandler != null)
448: {
449: QName name = reader.getName();
450: String uri = name.getNamespaceURI();
451: String localName = name.getLocalPart();
452: String prefix = name.getPrefix();
453: String qName = localName;
454: if (!"".equals(prefix))
455: qName = prefix + ":" + localName;
456: if (!namespaceAware)
457: {
458: uri = "";
459: localName = "";
460: }
461: contentHandler.endElement(uri, localName, qName);
462: if (namespaceAware)
463: {
464: int nc = reader.getNamespaceCount();
465: for (int i = 0; i < nc; i++)
466: {
467: String nsprefix = reader.getNamespacePrefix(i);
468: if ("xml".equals(nsprefix))
469: continue;
470: contentHandler.endPrefixMapping(nsprefix);
471: }
472: }
473: }
474: break;
475: case XMLStreamConstants.COMMENT:
476: if (lexicalHandler != null)
477: {
478: char[] b = reader.getTextCharacters();
479: lexicalHandler.comment(b, 0, b.length);
480: }
481: break;
482: case XMLStreamConstants.PROCESSING_INSTRUCTION:
483: if (contentHandler != null)
484: {
485: String target = reader.getPITarget();
486: String data = reader.getPIData();
487: if (data == null)
488: data = "";
489: contentHandler.processingInstruction(target, data);
490: }
491: break;
492: case XMLParser.START_ENTITY:
493: if (lexicalHandler != null)
494: {
495: String name = reader.getText();
496: lexicalHandler.startEntity(name);
497: }
498: break;
499: case XMLParser.END_ENTITY:
500: if (lexicalHandler != null)
501: {
502: String name = reader.getText();
503: lexicalHandler.endEntity(name);
504: }
505: break;
506: case XMLStreamConstants.START_DOCUMENT:
507: encoding = reader.getEncoding();
508: xmlVersion = reader.getVersion();
509: xmlStandalone = reader.isStandalone();
510: xmlEncoding = reader.getCharacterEncodingScheme();
511: if (contentHandler != null)
512: contentHandler.startDocument();
513: startDocumentDone = true;
514: break;
515: case XMLStreamConstants.END_DOCUMENT:
516: if (contentHandler != null)
517: contentHandler.endDocument();
518: break;
519: case XMLStreamConstants.DTD:
520: XMLParser.Doctype doctype = parser.doctype;
521: if (lexicalHandler != null)
522: {
523: String rootName = doctype.rootName;
524: String publicId = doctype.publicId;
525: String systemId2 = doctype.systemId;
526: lexicalHandler.startDTD(rootName, publicId, systemId2);
527: }
528: for (Iterator i = doctype.entryIterator(); i.hasNext(); )
529: {
530: String entry = (String) i.next();
531: char c = entry.charAt(0);
532: String name = entry.substring(1);
533: if ('E' == c)
534: {
535:
536: if (declHandler != null)
537: {
538: XMLParser.ContentModel model =
539: doctype.getElementModel(name);
540: declHandler.elementDecl(name, model.text);
541: }
542: }
543: else if ('A' == c)
544: {
545:
546: if (declHandler != null)
547: {
548: for (Iterator j = doctype.attlistIterator(name);
549: j.hasNext(); )
550: {
551: Map.Entry att = (Map.Entry) j.next();
552: String aname = (String) att.getKey();
553: XMLParser.AttributeDecl decl =
554: (XMLParser.AttributeDecl) att.getValue();
555: String type = decl.type;
556: String value = decl.value;
557: String mode = null;
558: switch (decl.valueType)
559: {
560: case XMLParser.ATTRIBUTE_DEFAULT_FIXED:
561: mode = "#FIXED";
562: break;
563: case XMLParser.ATTRIBUTE_DEFAULT_REQUIRED:
564: mode = "#REQUIRED";
565: break;
566: case XMLParser.ATTRIBUTE_DEFAULT_IMPLIED:
567: mode = "#IMPLIED";
568: break;
569: }
570: declHandler.attributeDecl(name, aname,
571: type, mode, value);
572: }
573: }
574: }
575: else if ('e' == c)
576: {
577:
578: Object entity = doctype.getEntity(name);
579: if (entity instanceof String)
580: {
581: if (declHandler != null)
582: declHandler.internalEntityDecl(name,
583: (String) entity);
584: }
585: else
586: {
587: XMLParser.ExternalIds ids =
588: (XMLParser.ExternalIds) entity;
589: if (ids.notationName != null)
590: {
591: if (dtdHandler != null)
592: {
593: String pub = ids.publicId;
594: String url = ids.systemId;
595: String not = ids.notationName;
596: dtdHandler.unparsedEntityDecl(name,
597: pub,
598: url,
599: not);
600: }
601: }
602: else
603: {
604: if (declHandler != null)
605: {
606: String pub = ids.publicId;
607: String url = ids.systemId;
608: declHandler.externalEntityDecl(name,
609: pub,
610: url);
611: }
612: }
613: }
614: }
615: else if ('n' == c)
616: {
617:
618: if (dtdHandler != null)
619: {
620: XMLParser.ExternalIds ids =
621: doctype.getNotation(name);
622: String pub = ids.publicId;
623: String url = ids.systemId;
624: dtdHandler.notationDecl(name, pub, url);
625: }
626: }
627: else if ('c' == c)
628: {
629:
630: if (lexicalHandler != null)
631: {
632: String comment = doctype.getComment(name);
633: char[] b = comment.toCharArray();
634: lexicalHandler.comment(b, 0, b.length);
635: }
636: }
637: else if ('p' == c)
638: {
639:
640: if (contentHandler != null)
641: {
642: String[] pi = doctype.getPI(name);
643: String target = pi[0];
644: String data = pi[1];
645: if (data == null)
646: data = "";
647: contentHandler.processingInstruction(target, data);
648: }
649: }
650: }
651: if (lexicalHandler != null)
652: lexicalHandler.endDTD();
653: }
654: }
655: reset();
656: if (opened)
657: in.close();
658: }
659: catch (Exception e)
660: {
661: SAXParseException e2 = new SAXParseException(e.getMessage(), this);
662: e2.initCause(e);
663: try
664: {
665: if (!startDocumentDone && contentHandler != null)
666: contentHandler.startDocument();
667: if (errorHandler != null)
668: errorHandler.fatalError(e2);
669: if (contentHandler != null)
670: contentHandler.endDocument();
671: }
672: catch (SAXException sex)
673: {
674:
675: }
676: reset();
677: if (opened)
678: in.close();
679: if (e instanceof SAXException)
680: throw (SAXException) e;
681: if (e instanceof IOException)
682: throw (IOException) e;
683: else
684: throw e2;
685: }
686: }
687:
688:
691: private boolean isIgnorableWhitespace(XMLParser reader, char[] b,
692: boolean testCharacters)
693: throws XMLStreamException
694: {
695: XMLParser.Doctype doctype = reader.doctype;
696: if (doctype == null)
697: return false;
698: String currentElement = reader.getCurrentElement();
699:
700: int ac = reader.getAttributeCount();
701: for (int i = 0; i < ac; i++)
702: {
703: QName aname = reader.getAttributeName(i);
704: if ("space".equals(aname.getLocalPart()) &&
705: XMLConstants.XML_NS_URI.equals(aname.getNamespaceURI()))
706: {
707: if ("preserve".equals(reader.getAttributeValue(i)))
708: return false;
709: }
710: }
711: XMLParser.ContentModel model = doctype.getElementModel(currentElement);
712: if (model == null || model.type != XMLParser.ContentModel.ELEMENT)
713: return false;
714: if (model.external && xmlStandalone)
715: return false;
716: boolean white = true;
717: if (testCharacters)
718: {
719: for (int i = 0; i < b.length; i++)
720: {
721: if (b[i] != ' ' && b[i] != '\t' && b[i] != '\n' && b[i] != '\r')
722: {
723: white = false;
724: break;
725: }
726: }
727: }
728: return white;
729: }
730:
731: public void parse(String systemId)
732: throws IOException, SAXException
733: {
734: parse(new InputSource(systemId));
735: }
736:
737:
738:
739: public int getIndex(String qName)
740: {
741: int len = reader.getAttributeCount();
742: for (int i = 0; i < len; i++)
743: {
744: QName q = reader.getAttributeName(i);
745: String localName = q.getLocalPart();
746: String prefix = q.getPrefix();
747: String qn = ("".equals(prefix)) ? localName : prefix + ":" + localName;
748: if (qName.equals(qn))
749: return i;
750: }
751: return -1;
752: }
753:
754: public int getIndex(String uri, String localName)
755: {
756: int len = reader.getAttributeCount();
757: for (int i = 0; i < len; i++)
758: {
759: QName q = reader.getAttributeName(i);
760: String ln = q.getLocalPart();
761: String u = q.getNamespaceURI();
762: if (u == null && uri != null)
763: continue;
764: if (u != null && !u.equals(uri))
765: continue;
766: if (ln.equals(localName))
767: return i;
768: }
769: return -1;
770: }
771:
772: public int getLength()
773: {
774: return reader.getAttributeCount();
775: }
776:
777: public String getLocalName(int index)
778: {
779: return reader.getAttributeLocalName(index);
780: }
781:
782: public String getQName(int index)
783: {
784: QName q = reader.getAttributeName(index);
785: String localName = q.getLocalPart();
786: String prefix = q.getPrefix();
787: return ("".equals(prefix)) ? localName : prefix + ":" + localName;
788: }
789:
790: public String getType(int index)
791: {
792: String ret = reader.getAttributeType(index);
793:
794: return ("ENUMERATION".equals(ret)) ? "NMTOKEN" : ret;
795: }
796:
797: public String getType(String qName)
798: {
799: int index = getIndex(qName);
800: return (index == -1) ? null : getType(index);
801: }
802:
803: public String getType(String uri, String localName)
804: {
805: int index = getIndex(uri, localName);
806: return (index == -1) ? null : getType(index);
807: }
808:
809: public String getURI(int index)
810: {
811: String ret = reader.getAttributeNamespace(index);
812: return (ret == null) ? "" : ret;
813: }
814:
815: public String getValue(int index)
816: {
817: return reader.getAttributeValue(index);
818: }
819:
820: public String getValue(String qName)
821: {
822: int index = getIndex(qName);
823: return (index == -1) ? null : getValue(index);
824: }
825:
826: public String getValue(String uri, String localName)
827: {
828: int index = getIndex(uri, localName);
829: return (index == -1) ? null : getValue(index);
830: }
831:
832: public boolean isDeclared(int index)
833: {
834: return parser.isAttributeDeclared(index);
835: }
836:
837: public boolean isDeclared(String qName)
838: {
839: int index = getIndex(qName);
840: return (index == -1) ? false : isDeclared(index);
841: }
842:
843: public boolean isDeclared(String uri, String localName)
844: {
845: int index = getIndex(uri, localName);
846: return (index == -1) ? false : isDeclared(index);
847: }
848:
849: public boolean isSpecified(int index)
850: {
851: return reader.isAttributeSpecified(index);
852: }
853:
854: public boolean isSpecified(String qName)
855: {
856: int index = getIndex(qName);
857: return (index == -1) ? false : isSpecified(index);
858: }
859:
860: public boolean isSpecified(String uri, String localName)
861: {
862: int index = getIndex(uri, localName);
863: return (index == -1) ? false : isSpecified(index);
864: }
865:
866:
867:
868: public int getColumnNumber()
869: {
870: Location l = reader.getLocation();
871: return l.getColumnNumber();
872: }
873:
874: public int getLineNumber()
875: {
876: Location l = reader.getLocation();
877: return l.getLineNumber();
878: }
879:
880: public String getPublicId()
881: {
882: Location l = reader.getLocation();
883: return l.getPublicId();
884: }
885:
886: public String getSystemId()
887: {
888: Location l = reader.getLocation();
889: return l.getSystemId();
890: }
891:
892: public String getEncoding()
893: {
894: return encoding;
895: }
896:
897: public String getXMLVersion()
898: {
899: return xmlVersion;
900: }
901:
902:
903:
904: public Object resolveEntity(String publicId, String systemId,
905: String baseURI, String namespace)
906: throws XMLStreamException
907: {
908: if (entityResolver != null)
909: {
910: try
911: {
912: InputSource input =
913: entityResolver.resolveEntity(publicId, systemId);
914: if (input != null)
915: {
916: InputStream in = input.getByteStream();
917: if (in == null)
918: {
919: String newSystemId = input.getSystemId();
920: if (newSystemId != null && !newSystemId.equals(systemId))
921: in = XMLParser.resolve(newSystemId);
922: }
923: return in;
924: }
925: }
926: catch (SAXException e)
927: {
928: XMLStreamException e2 = new XMLStreamException(e.getMessage());
929: e2.initCause(e);
930: throw e2;
931: }
932: catch (IOException e)
933: {
934: XMLStreamException e2 = new XMLStreamException(e.getMessage());
935: e2.initCause(e);
936: throw e2;
937: }
938: }
939: return null;
940: }
941:
942: public XMLEventReader resolveAsXMLEventReader(String uri)
943: throws XMLStreamException
944: {
945:
946: return null;
947: }
948:
949: public XMLStreamReader resolveAsXMLStreamReader(String uri)
950: throws XMLStreamException
951: {
952:
953: return null;
954: }
955:
956:
957:
958: public void report(String message, String errorType,
959: Object relatedInformation, Location location)
960: throws XMLStreamException
961: {
962: if (errorHandler != null)
963: {
964: try
965: {
966: errorHandler.warning(new SAXParseException(message, this));
967: }
968: catch (SAXException e)
969: {
970: XMLStreamException e2 = new XMLStreamException(e.getMessage());
971: e2.initCause(e);
972: throw e2;
973: }
974: }
975: }
976:
977: public static void main(String[] args)
978: throws Exception
979: {
980: boolean validating = false;
981: boolean namespaceAware = false;
982: boolean xIncludeAware = false;
983: boolean expectCallbackClass = false;
984: String callbackClass = null;
985: int pos = 0;
986: while (pos < args.length && (args[pos].startsWith("-") || expectCallbackClass))
987: {
988: if ("-x".equals(args[pos]))
989: xIncludeAware = true;
990: else if ("-v".equals(args[pos]))
991: validating = true;
992: else if ("-n".equals(args[pos]))
993: namespaceAware = true;
994: else if ("-c".equals(args[pos]))
995: expectCallbackClass = true;
996: else if (expectCallbackClass)
997: {
998: callbackClass = args[pos];
999: expectCallbackClass = false;
1000: }
1001: pos++;
1002: }
1003: if (pos >= args.length || expectCallbackClass)
1004: {
1005: System.out.println("Syntax: SAXParser [-n] [-v] [-x] [-c <class>] <file> [<file2> [...]]");
1006: System.out.println("\t-n: use namespace aware mode");
1007: System.out.println("\t-v: use validating parser");
1008: System.out.println("\t-x: use XInclude aware mode");
1009: System.out.println("\t-c <class>: use specified class as callback handler (must have a no-arg public constructor)");
1010: System.exit(2);
1011: }
1012: while (pos < args.length)
1013: {
1014: ContentHandler handler = null;
1015: if (callbackClass != null)
1016: {
1017: Class t = Class.forName(callbackClass);
1018: handler = (ContentHandler) t.newInstance();
1019: }
1020: else
1021: handler = new org.xml.sax.helpers.DefaultHandler();
1022: SAXParser parser = new SAXParser(validating, namespaceAware,
1023: xIncludeAware);
1024: InputSource input = new InputSource(args[pos]);
1025: java.io.FileReader fr = new java.io.FileReader(args[pos]);
1026: input.setCharacterStream(fr);
1027: try
1028: {
1029: XMLReader reader = parser.getXMLReader();
1030: reader.setContentHandler(handler);
1031: reader.parse(input);
1032: }
1033: finally
1034: {
1035: fr.close();
1036: }
1037: pos++;
1038: }
1039: }
1040:
1041: }