1 /**
2  *  ServingXML
3  *
4  *  Copyright (C) 2006  Daniel Parker
5  *    daniel.parker@servingxml.com
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  **/
20 
21 package com.servingxml.components.saxsource;
22 
23 import org.xml.sax.XMLReader;
24 import org.xml.sax.ContentHandler;
25 import org.xml.sax.helpers.AttributesImpl;
26 import org.xml.sax.SAXException;
27 
28 import com.servingxml.util.Name;
29 
30 public class SaxEventBufferImpl implements SaxEventBuffer {
31   private final int[] symbols;
32   private final char[] values;
33   private final Name[] names;
34 
SaxEventBufferImpl(Name[] names,int[] symbols,char[] values)35   public SaxEventBufferImpl(Name[] names,int[] symbols,char[] values) {
36     this.names = names;
37     this.symbols = symbols;
38     this.values = values;
39   }
40 
createXmlReader()41   public XMLReader createXmlReader() {
42     return new SaxEventBufferReader(this);
43   }
44 
replayEvents(ContentHandler handler)45   public void replayEvents(ContentHandler handler) throws SAXException {
46     for (int i = 0; i < symbols.length; ++i) {
47       int symbol = symbols[i];
48       if (symbol == SaxEventBuffer.START_DOCUMENT) {
49         handler.startDocument();
50       } else if (symbol == SaxEventBuffer.START_PREFIX_MAPPING) {
51         int prefixMapId = symbols[++i];
52         Name prefixMap = names[prefixMapId];
53         //System.out.println("out:  startPrefixMapping" + prefixMap.getLocalName()+":" + prefixMap.getNamespaceUri());
54         handler.startPrefixMapping(prefixMap.getLocalName(), prefixMap.getNamespaceUri());
55       } else if (symbol == SaxEventBuffer.END_PREFIX_MAPPING) {
56         int start = symbols[++i];
57         int length = symbols[++i];
58         String prefix = new String(values,start,length);
59         //System.out.println("out:  endPrefixMapping " + prefix);
60         handler.endPrefixMapping(prefix);
61       } else if (symbol == SaxEventBuffer.START_ELEMENT) {
62         int elementNameId = symbols[++i];
63         Name elementName = names[elementNameId];
64         int start = symbols[++i];
65         int length = symbols[++i];
66         String qname = new String(values,start,length);
67         //System.out.println("out:  startElement " + qname);
68         int attributeCount = symbols[++i];
69 
70         AttributesImpl atts = new AttributesImpl();
71         for (int j = 0; j < attributeCount; ++j) {
72           int attNameId = symbols[++i];
73           Name attName = names[attNameId];
74           int attQnameStart = symbols[++i];
75           int attQnameLength = symbols[++i];
76           String attQname = new String(values,attQnameStart,attQnameLength);
77           int attTypeStart = symbols[++i];
78           int attTypeLength = symbols[++i];
79           String type = new String(values,attTypeStart,attTypeLength);
80           int attValueStart = symbols[++i];
81           int attValueLength = symbols[++i];
82           String attValue = new String(values,attValueStart,attValueLength);
83           atts.addAttribute(attName.getNamespaceUri(),attName.getLocalName(),
84             attQname,type,attValue);
85         }
86         String ns = elementName.getNamespaceUri();
87         //System.out.println(getClass().getName()+".parse " + qname + ", ns=" +ns);
88         handler.startElement(ns, elementName.getLocalName(),qname,atts);
89       } else if (symbol == SaxEventBuffer.CHARACTERS) {
90         int chStart = symbols[++i];
91         int chLength = symbols[++i];
92         handler.characters(values,chStart,chLength);
93         String chValue = new String(values,chStart,chLength);
94       } else if (symbol == SaxEventBuffer.IGNORABLE_WHITESPACE) {
95         int chStart = symbols[++i];
96         int chLength = symbols[++i];
97         handler.ignorableWhitespace(values,chStart,chLength);
98         String chValue = new String(values,chStart,chLength);
99       } else if (symbol == SaxEventBuffer.END_ELEMENT) {
100         int elementNameId = symbols[++i];
101         Name elementName = names[elementNameId];
102         int start = symbols[++i];
103         int length = symbols[++i];
104         String qname = new String(values,start,length);
105         handler.endElement(elementName.getNamespaceUri(),elementName.getLocalName(),
106           qname);
107       } else if (symbol == SaxEventBuffer.END_DOCUMENT) {
108         handler.endDocument();
109       }
110     }
111   }
112 
closeEvents(ContentHandler handler)113   public void closeEvents(ContentHandler handler) throws SAXException {
114     //System.out.println(getClass()+".closeEvents");
115 
116     int[] stack = new int[symbols.length];
117     int count = 0;
118     for (int i = 0; i < symbols.length; ++i) {
119       int symbol = symbols[i];
120       if (symbol == SaxEventBuffer.START_DOCUMENT) {
121       } else if (symbol == SaxEventBuffer.START_PREFIX_MAPPING) {
122         int prefixMapId = symbols[++i];
123         Name prefixMap = names[prefixMapId];
124         //System.out.println("out:  startPrefixMapping" + prefixMap.getLocalName()+":" + prefixMap.getNamespaceUri());
125       } else if (symbol == SaxEventBuffer.END_PREFIX_MAPPING) {
126         int start = symbols[++i];
127         int length = symbols[++i];
128         String prefix = new String(values,start,length);
129         //System.out.println("out:  endPrefixMapping " + prefix);
130       } else if (symbol == SaxEventBuffer.START_ELEMENT) {
131         stack[count++] = i;
132         int elementNameId = symbols[++i];
133         Name elementName = names[elementNameId];
134         int start = symbols[++i];
135         int length = symbols[++i];
136         String qname = new String(values,start,length);
137         //System.out.println("out:  startElement " + qname);
138         int attributeCount = symbols[++i];
139 
140         AttributesImpl atts = new AttributesImpl();
141         for (int j = 0; j < attributeCount; ++j) {
142           int attNameId = symbols[++i];
143           Name attName = names[attNameId];
144           int attQnameStart = symbols[++i];
145           int attQnameLength = symbols[++i];
146           String attQname = new String(values,attQnameStart,attQnameLength);
147           int attTypeStart = symbols[++i];
148           int attTypeLength = symbols[++i];
149           String type = new String(values,attTypeStart,attTypeLength);
150           int attValueStart = symbols[++i];
151           int attValueLength = symbols[++i];
152           String attValue = new String(values,attValueStart,attValueLength);
153           atts.addAttribute(attName.getNamespaceUri(),attName.getLocalName(),
154             attQname,type,attValue);
155         }
156         String ns = elementName.getNamespaceUri();
157         //System.out.println("startElement " + qname);
158         //System.out.println(getClass().getName()+".parse " + qname + ", ns=" +ns);
159       } else if (symbol == SaxEventBuffer.CHARACTERS) {
160         int chStart = symbols[++i];
161         int chLength = symbols[++i];
162         String chValue = new String(values,chStart,chLength);
163       } else if (symbol == SaxEventBuffer.IGNORABLE_WHITESPACE) {
164         int chStart = symbols[++i];
165         int chLength = symbols[++i];
166         String chValue = new String(values,chStart,chLength);
167       } else if (symbol == SaxEventBuffer.END_ELEMENT) {
168         --count;
169         int elementNameId = symbols[++i];
170         Name elementName = names[elementNameId];
171         int start = symbols[++i];
172         int length = symbols[++i];
173         String qname = new String(values,start,length);
174         //System.out.println("endElement " + qname);
175       } else if (symbol == SaxEventBuffer.END_DOCUMENT) {
176       }
177     }
178 
179     //System.out.println(getClass()+".closeEvents count=" + count);
180     if (count > 0) {
181       for (int i = count-1; i >= 0; --i) {
182         int j = stack[i];
183         int symbol = symbols[j];
184         int elementNameId = symbols[++j];
185         Name elementName = names[elementNameId];
186         int start = symbols[++j];
187         int length = symbols[++j];
188         String qname = new String(values,start,length);
189         //System.out.println(getClass()+".closeEvents end element " + qname);
190         handler.endElement(elementName.getNamespaceUri(),elementName.getLocalName(),qname);
191       }
192       handler.endDocument();
193     }
194   }
195 }
196 
197