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