src/share/jaxws_classes/com/sun/xml/internal/fastinfoset/stax/events/StAXEventAllocatorBase.java

Thu, 12 Oct 2017 19:44:07 +0800

author
aoqi
date
Thu, 12 Oct 2017 19:44:07 +0800
changeset 760
e530533619ec
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 *
aoqi@0 25 * THIS FILE WAS MODIFIED BY SUN MICROSYSTEMS, INC.
aoqi@0 26 */
aoqi@0 27
aoqi@0 28 package com.sun.xml.internal.fastinfoset.stax.events;
aoqi@0 29
aoqi@0 30 import javax.xml.stream.XMLEventFactory;
aoqi@0 31 import javax.xml.stream.XMLStreamException;
aoqi@0 32 import javax.xml.stream.XMLStreamReader;
aoqi@0 33 import javax.xml.stream.events.Namespace;
aoqi@0 34 import javax.xml.stream.events.XMLEvent;
aoqi@0 35 import javax.xml.stream.util.XMLEventAllocator;
aoqi@0 36 import javax.xml.stream.util.XMLEventConsumer;
aoqi@0 37
aoqi@0 38 import com.sun.xml.internal.fastinfoset.CommonResourceBundle;
aoqi@0 39
aoqi@0 40 /**
aoqi@0 41 * allows a user to register a way to allocate events given an XMLStreamReader.
aoqi@0 42 * The XMLEventAllocator can be set on an XMLInputFactory
aoqi@0 43 * using the property "javax.xml.stream.allocator"
aoqi@0 44 *
aoqi@0 45 * This base class uses EventFactory to create events as recommended in the JavaDoc of XMLEventAllocator.
aoqi@0 46 * However, creating new object per each event reduces performance. The implementation of
aoqi@0 47 * EventReader therefore will set the Allocator to StAXEventAllocator which implements the
aoqi@0 48 * Allocate methods without creating new objects.
aoqi@0 49 *
aoqi@0 50 * The spec for the first Allocate method states that it must NOT modify the state of the Reader
aoqi@0 51 * while the second MAY. For consistency, both Allocate methods in this implementation will
aoqi@0 52 * NOT modify the state.
aoqi@0 53 *
aoqi@0 54 */
aoqi@0 55 public class StAXEventAllocatorBase implements XMLEventAllocator {
aoqi@0 56 XMLEventFactory factory;
aoqi@0 57
aoqi@0 58 /** Creates a new instance of XMLEventAllocator */
aoqi@0 59 public StAXEventAllocatorBase() {
aoqi@0 60 if (System.getProperty("javax.xml.stream.XMLEventFactory")==null) {
aoqi@0 61 System.setProperty("javax.xml.stream.XMLEventFactory",
aoqi@0 62 "com.sun.xml.internal.fastinfoset.stax.factory.StAXEventFactory");
aoqi@0 63 }
aoqi@0 64 factory = XMLEventFactory.newInstance();
aoqi@0 65 }
aoqi@0 66
aoqi@0 67 // ---------------------methods defined by XMLEventAllocator-----------------//
aoqi@0 68
aoqi@0 69 /**
aoqi@0 70 * This method creates an instance of the XMLEventAllocator. This
aoqi@0 71 * allows the XMLInputFactory to allocate a new instance per reader.
aoqi@0 72 */
aoqi@0 73 public XMLEventAllocator newInstance() {
aoqi@0 74 return new StAXEventAllocatorBase();
aoqi@0 75 }
aoqi@0 76
aoqi@0 77 /**
aoqi@0 78 * This method allocates an event given the current state of the XMLStreamReader.
aoqi@0 79 * If this XMLEventAllocator does not have a one-to-one mapping between reader state
aoqi@0 80 * and events this method will return null.
aoqi@0 81 * @param streamReader The XMLStreamReader to allocate from
aoqi@0 82 * @return the event corresponding to the current reader state
aoqi@0 83 */
aoqi@0 84 public XMLEvent allocate(XMLStreamReader streamReader) throws XMLStreamException {
aoqi@0 85 if(streamReader == null )
aoqi@0 86 throw new XMLStreamException(CommonResourceBundle.getInstance().getString("message.nullReader"));
aoqi@0 87 return getXMLEvent(streamReader);
aoqi@0 88 }
aoqi@0 89
aoqi@0 90 /**
aoqi@0 91 * This method allocates an event or set of events given the current state of
aoqi@0 92 * the XMLStreamReader and adds the event or set of events to the consumer that
aoqi@0 93 * was passed in.
aoqi@0 94 * @param streamReader The XMLStreamReader to allocate from
aoqi@0 95 * @param consumer The XMLEventConsumer to add to.
aoqi@0 96 */
aoqi@0 97 public void allocate(XMLStreamReader streamReader, XMLEventConsumer consumer) throws XMLStreamException {
aoqi@0 98 consumer.add(getXMLEvent(streamReader));
aoqi@0 99
aoqi@0 100 }
aoqi@0 101 // ---------------------end of methods defined by XMLEventAllocator-----------------//
aoqi@0 102
aoqi@0 103
aoqi@0 104 XMLEvent getXMLEvent(XMLStreamReader reader){
aoqi@0 105 XMLEvent event = null;
aoqi@0 106 //returns the current event
aoqi@0 107 int eventType = reader.getEventType();
aoqi@0 108 //this needs to be set before creating events
aoqi@0 109 factory.setLocation(reader.getLocation());
aoqi@0 110 switch(eventType){
aoqi@0 111
aoqi@0 112 case XMLEvent.START_ELEMENT:
aoqi@0 113 {
aoqi@0 114 StartElementEvent startElement = (StartElementEvent)factory.createStartElement(reader.getPrefix(),
aoqi@0 115 reader.getNamespaceURI(), reader.getLocalName());
aoqi@0 116
aoqi@0 117 addAttributes(startElement,reader);
aoqi@0 118 addNamespaces(startElement, reader);
aoqi@0 119 //need to fix it along with the Reader
aoqi@0 120 //setNamespaceContext(startElement,reader);
aoqi@0 121 event = startElement;
aoqi@0 122 break;
aoqi@0 123 }
aoqi@0 124 case XMLEvent.END_ELEMENT:
aoqi@0 125 {
aoqi@0 126 EndElementEvent endElement = (EndElementEvent)factory.createEndElement(
aoqi@0 127 reader.getPrefix(), reader.getNamespaceURI(), reader.getLocalName());
aoqi@0 128 addNamespaces(endElement,reader);
aoqi@0 129 event = endElement ;
aoqi@0 130 break;
aoqi@0 131 }
aoqi@0 132 case XMLEvent.PROCESSING_INSTRUCTION:
aoqi@0 133 {
aoqi@0 134 event = factory.createProcessingInstruction(reader.getPITarget(),reader.getPIData());
aoqi@0 135 break;
aoqi@0 136 }
aoqi@0 137 case XMLEvent.CHARACTERS:
aoqi@0 138 {
aoqi@0 139 if (reader.isWhiteSpace())
aoqi@0 140 event = factory.createSpace(reader.getText());
aoqi@0 141 else
aoqi@0 142 event = factory.createCharacters(reader.getText());
aoqi@0 143
aoqi@0 144 break;
aoqi@0 145 }
aoqi@0 146 case XMLEvent.COMMENT:
aoqi@0 147 {
aoqi@0 148 event = factory.createComment(reader.getText());
aoqi@0 149 break;
aoqi@0 150 }
aoqi@0 151 case XMLEvent.START_DOCUMENT:
aoqi@0 152 {
aoqi@0 153 StartDocumentEvent docEvent = (StartDocumentEvent)factory.createStartDocument(
aoqi@0 154 reader.getVersion(), reader.getEncoding(), reader.isStandalone());
aoqi@0 155 if(reader.getCharacterEncodingScheme() != null){
aoqi@0 156 docEvent.setDeclaredEncoding(true);
aoqi@0 157 }else{
aoqi@0 158 docEvent.setDeclaredEncoding(false);
aoqi@0 159 }
aoqi@0 160 event = docEvent ;
aoqi@0 161 break;
aoqi@0 162 }
aoqi@0 163 case XMLEvent.END_DOCUMENT:{
aoqi@0 164 EndDocumentEvent endDocumentEvent = new EndDocumentEvent() ;
aoqi@0 165 event = endDocumentEvent ;
aoqi@0 166 break;
aoqi@0 167 }
aoqi@0 168 case XMLEvent.ENTITY_REFERENCE:{
aoqi@0 169 event = factory.createEntityReference(reader.getLocalName(),
aoqi@0 170 new EntityDeclarationImpl(reader.getLocalName(),reader.getText()));
aoqi@0 171 break;
aoqi@0 172
aoqi@0 173 }
aoqi@0 174 case XMLEvent.ATTRIBUTE:{
aoqi@0 175 event = null ;
aoqi@0 176 break;
aoqi@0 177 }
aoqi@0 178 case XMLEvent.DTD:{
aoqi@0 179 event = factory.createDTD(reader.getText());
aoqi@0 180 break;
aoqi@0 181 }
aoqi@0 182 case XMLEvent.CDATA:{
aoqi@0 183 event = factory.createCData(reader.getText());
aoqi@0 184 break;
aoqi@0 185 }
aoqi@0 186 case XMLEvent.SPACE:{
aoqi@0 187 event = factory.createSpace(reader.getText());
aoqi@0 188 break;
aoqi@0 189 }
aoqi@0 190 }
aoqi@0 191 return event ;
aoqi@0 192 }
aoqi@0 193
aoqi@0 194 //use event.addAttribute instead of addAttributes to avoid creating another list
aoqi@0 195 protected void addAttributes(StartElementEvent event,XMLStreamReader streamReader){
aoqi@0 196 AttributeBase attr = null;
aoqi@0 197 for(int i=0; i<streamReader.getAttributeCount() ;i++){
aoqi@0 198 attr = (AttributeBase)factory.createAttribute(streamReader.getAttributeName(i),
aoqi@0 199 streamReader.getAttributeValue(i));
aoqi@0 200 attr.setAttributeType(streamReader.getAttributeType(i));
aoqi@0 201 attr.setSpecified(streamReader.isAttributeSpecified(i));
aoqi@0 202 event.addAttribute(attr);
aoqi@0 203 }
aoqi@0 204 }
aoqi@0 205
aoqi@0 206 //add namespaces to StartElement/EndElement
aoqi@0 207 protected void addNamespaces(StartElementEvent event,XMLStreamReader streamReader){
aoqi@0 208 Namespace namespace = null;
aoqi@0 209 for(int i=0; i<streamReader.getNamespaceCount(); i++){
aoqi@0 210 namespace = factory.createNamespace(streamReader.getNamespacePrefix(i),
aoqi@0 211 streamReader.getNamespaceURI(i));
aoqi@0 212 event.addNamespace(namespace);
aoqi@0 213 }
aoqi@0 214 }
aoqi@0 215 protected void addNamespaces(EndElementEvent event,XMLStreamReader streamReader){
aoqi@0 216 Namespace namespace = null;
aoqi@0 217 for(int i=0; i<streamReader.getNamespaceCount(); i++){
aoqi@0 218 namespace = factory.createNamespace(streamReader.getNamespacePrefix(i),
aoqi@0 219 streamReader.getNamespaceURI(i));
aoqi@0 220 event.addNamespace(namespace);
aoqi@0 221 }
aoqi@0 222 }
aoqi@0 223
aoqi@0 224
aoqi@0 225 }

mercurial