net.sf.saxon.pull.PullPushTee Maven / Gradle / Ivy
package net.sf.saxon.pull;
import net.sf.saxon.event.Receiver;
import net.sf.saxon.event.SequenceReceiver;
import net.sf.saxon.om.AttributeCollection;
import net.sf.saxon.om.NamespaceDeclarations;
import net.sf.saxon.om.Orphan;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.type.Type;
import java.util.List;
/**
* PullPushTee is a pass-through filter class that links one PullProvider to another PullProvider
* in a pipeline, copying all events that are read into a push pipeline, supplied in the form
* of a Receiver.
*
* This class can be used to insert a schema validator into a pull pipeline, since Saxon's schema
* validation is push-based. It could also be used to insert a serializer into the pipeline, allowing
* the XML document being "pulled" to be displayed for diagnostic purposes.
*/
public class PullPushTee extends PullFilter {
private Receiver branch;
boolean previousAtomic = false;
/**
* Create a PullPushTee
* @param base the PullProvider to which requests are to be passed
* @param branch the Receiver to which all events are to be copied, as "push" events
*/
public PullPushTee(PullProvider base, Receiver branch) throws XPathException {
super(base);
this.branch = branch;
//branch.open();
}
/**
* Get the Receiver to which events are being tee'd.
* @return the Receiver
*/
public Receiver getReceiver() {
return branch;
}
/**
* Get the next event. This implementation gets the next event from the underlying PullProvider,
* copies it to the branch Receiver, and then returns the event to the caller.
*
* @return an integer code indicating the type of event. The code
* {@link #END_OF_INPUT} is returned at the end of the sequence.
*/
public int next() throws XPathException {
currentEvent = super.next();
copyEvent(currentEvent);
return currentEvent;
}
/**
* Copy a pull event to a Receiver
* @param event the pull event to be copied
*/
private void copyEvent(int event) throws XPathException {
PullProvider in = getUnderlyingProvider();
Receiver out = branch;
switch (event) {
case START_DOCUMENT:
out.startDocument(0);
break;
case START_ELEMENT:
out.startElement(in.getNameCode(), in.getTypeAnnotation(), 0, 0);
NamespaceDeclarations decl = in.getNamespaceDeclarations();
for (int i=0; i
© 2015 - 2025 Weber Informatics LLC | Privacy Policy