Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }