/* Aalto XML processor
 *
 * Copyright (c) 2006- Tatu Saloranta, tatu.saloranta@iki.fi
 *
 * Licensed under the License specified in the file LICENSE which is
 * included with the source code.
 * You may not use this file except in compliance with the License.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.fasterxml.aalto.evt;

import javax.xml.stream.*;
import javax.xml.stream.events.XMLEvent;
import javax.xml.stream.util.XMLEventAllocator;

import org.codehaus.stax2.ri.evt.Stax2EventAllocatorImpl;

import com.fasterxml.aalto.AsyncXMLStreamReader;

Specialized event allocator implementation. Beyond additions needed to support DTD entities, implements non-location-preserving optimization.
Author:Tatu Saloranta
/** * Specialized event allocator implementation. Beyond additions needed * to support DTD entities, implements non-location-preserving optimization. * * @author Tatu Saloranta */
public final class EventAllocatorImpl extends Stax2EventAllocatorImpl { final static EventAllocatorImpl sStdInstance = new EventAllocatorImpl(true); /* /********************************************************************** /* Configuration /********************************************************************** */ protected final boolean _cfgPreserveLocation; /* /********************************************************************** /* Recycled objects /********************************************************************** */
Last used location info; only relevant to non-accurate-location allocators.
/** * Last used location info; only relevant to non-accurate-location * allocators. */
protected Location _lastLocation = null;
Params:
  • preserveLocation – If true, allocator will construct instances that have accurate location information; if false, instances will only have some generic shared Location info. Latter option will reduce memory usage/thrashing a bit, and may improve speed.
/** * @param preserveLocation If true, allocator will construct instances * that have accurate location information; if false, instances * will only have some generic shared Location info. Latter option * will reduce memory usage/thrashing a bit, and may improve speed. */
protected EventAllocatorImpl(boolean preserveLocation) { _cfgPreserveLocation = preserveLocation; } public static EventAllocatorImpl getDefaultInstance() { /* Standard allocator instance can be shared as it * has no state. */ return sStdInstance; } public static EventAllocatorImpl getFastInstance() { /* Can not share instances, due to QName caching, as well as because * of Location object related state */ return new EventAllocatorImpl(false); }
Default implementation assumes that the caller knows how to share instances, and so need not create new copies.

Note: if this class is sub-classes, this method should be redefined if assumptions about shareability do not hold.

/** * Default implementation assumes that the caller knows how to * share instances, and so need not create new copies. *<p> * Note: if this class is sub-classes, this method should be * redefined if assumptions about shareability do not hold. */
@Override public XMLEventAllocator newInstance() { return new EventAllocatorImpl(_cfgPreserveLocation); } /* /********************************************************************** /* Overriden methods /********************************************************************** */ @Override public XMLEvent allocate(XMLStreamReader r) throws XMLStreamException { if (r.getEventType() == AsyncXMLStreamReader.EVENT_INCOMPLETE) { return IncompleteEvent.instance(); } return super.allocate(r); }
Method used to get the Location object to use for an event to create. Base implementation just calls stream reader's accessors, but sub-classes may choose to use other methods (esp. when not in "preserve location" mode).
/** * Method used to get the {@link Location} object to use for * an event to create. Base implementation just calls stream * reader's accessors, but sub-classes may choose to use other * methods (esp. when not in "preserve location" mode). */
@Override protected Location getLocation(XMLStreamReader r) { if (_cfgPreserveLocation) { return r.getLocation(); } Location loc = _lastLocation; /* And even if we can just share one instance, we need that * first instance... */ if (loc == null) { loc = _lastLocation = r.getLocation(); } return loc; } // Should redefine this one: /* protected EntityReference createEntityReference(XMLStreamReader r, Location loc) throws XMLStreamException */ // As well as this: /* protected DTD createDTD(XMLStreamReader r, Location loc) throws XMLStreamException */ // And probably this one too? /* protected StartElement createStartElement(XMLStreamReader r, Location loc) throws XMLStreamException { return super.createStartElement(r, loc); } */ }