Source code: javax/ide/extension/spi/SAXManifestParser.java
1 package javax.ide.extension.spi;
2
3
4 import java.io.IOException;
5
6 import java.util.logging.Level;
7 import javax.ide.extension.ElementContext;
8 import javax.ide.extension.ElementEndContext;
9 import javax.ide.extension.ElementStartContext;
10 import javax.ide.extension.ElementVisitor;
11
12 import javax.xml.parsers.ParserConfigurationException;
13 import javax.xml.parsers.SAXParser;
14 import javax.xml.parsers.SAXParserFactory;
15
16 import org.xml.sax.Attributes;
17 import org.xml.sax.InputSource;
18 import org.xml.sax.Locator;
19 import org.xml.sax.SAXException;
20 import org.xml.sax.XMLReader;
21 import org.xml.sax.helpers.DefaultHandler;
22
23 /**
24 * An extensible SAX parser.
25 *
26 * @author Brian.Duff@oracle.com
27 */
28 public final class SAXManifestParser
29 {
30 private final DefaultElementContext _context;
31 private SAXParser _parser = null;
32 private Handler _handler = null;
33 private Locator _locator;
34
35 public SAXManifestParser( DefaultElementContext initialContext )
36 {
37 _context = initialContext;
38 }
39
40 /**
41 * Get the context
42 */
43 public ElementContext getContext()
44 {
45 return _context;
46 }
47
48 public void parse( InputSource inputSource )
49 throws ParserConfigurationException, SAXException, IOException
50 {
51 if ( _parser == null )
52 {
53 _handler = new Handler();
54 SAXParserFactory factory = SAXParserFactory.newInstance();
55
56 // make namespace aware, since the JAXP default is non-namespace aware
57 factory.setNamespaceAware(true);
58 _parser = factory.newSAXParser();
59 XMLReader reader = _parser.getXMLReader();
60 reader.setContentHandler( _handler );
61 reader.setErrorHandler( _handler );
62 }
63
64 _parser.getXMLReader().parse( inputSource );
65 }
66
67 private class Handler extends DefaultHandler
68 {
69
70 public void startElement( String uri, String name, String qName,
71 Attributes attributes ) throws SAXException
72 {
73 _context.beginElement( uri, name, attributes );
74
75 ElementVisitor visitor = _context.getScopedHandler();
76 if ( visitor != null )
77 {
78 recordPosition( _context );
79 try
80 {
81 visitor.start( (ElementStartContext)_context );
82 }
83 catch ( RuntimeException re )
84 {
85 _context.getLogger().log( Level.SEVERE,
86 "Runtime exception processing manifest: "+re.getClass().getName()+":"+re.getMessage(),
87 _locator );
88 re.printStackTrace();
89 }
90 }
91
92 _context.postBeginElement();
93 }
94
95 public void endElement( String uri, String name, String qName )
96 throws SAXException
97 {
98 _context.endElement( uri, name );
99 ElementVisitor visitor = _context.getScopedHandler();
100 if ( visitor != null )
101 {
102 recordPosition( _context );
103 try
104 {
105 visitor.end((ElementEndContext)_context);
106 }
107 catch ( RuntimeException re )
108 {
109 _context.getLogger().log( Level.SEVERE,
110 "Runtime exception processing manifest: "+re.getClass().getName()+": "+re.getMessage(),
111 _locator );
112 re.printStackTrace();
113 }
114 }
115 _context.postEndElement();
116 }
117
118 public void characters ( char ch[], int start, int length )
119 {
120 _context.appendCharacters( ch, start, length );
121 }
122
123 public void setDocumentLocator(Locator locator)
124 {
125 _locator = locator;
126 }
127
128 private void recordPosition( ElementContext context )
129 {
130 context.getScopeData().put( ElementVisitor.KEY_LOCATOR, _locator );
131 }
132 }
133 }