/*
* eXist EXPath
* Copyright (C) 2011 Adam Retter <adam@existsolutions.com>
* www.existsolutions.com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
*/
package org.expath.httpclient.model.exist;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Properties;
import javax.xml.transform.OutputKeys;
import org.exist.storage.serializers.Serializer;
import org.exist.util.serializer.SAXSerializer;
import org.exist.util.serializer.SerializerPool;
import org.exist.xquery.XPathException;
import org.exist.xquery.XQueryContext;
import org.exist.xquery.value.NodeValue;
import org.exist.xquery.value.SequenceIterator;
import org.expath.httpclient.HttpClientException;
import org.expath.httpclient.model.Sequence;
import org.xml.sax.SAXException;
/**
* @author Adam Retter <adam@existsolutions.com>
*/
public class EXistSequence implements Sequence {
private final org.exist.xquery.value.Sequence sequence;
private SequenceIterator sequenceIterator = SequenceIterator.EMPTY_ITERATOR;
private final XQueryContext context;
public EXistSequence(org.exist.xquery.value.Sequence sequence, XQueryContext context) throws XPathException {
this.sequence = sequence;
if(sequence != null) {
this.sequenceIterator = sequence.iterate();
}
this.context = context;
}
//@Override
public boolean isEmpty() throws HttpClientException {
return sequence.isEmpty();
}
//@Override
public Sequence next() throws HttpClientException {
try {
return new EXistSequence((NodeValue)sequenceIterator.nextItem(), context);
} catch (XPathException xpe) {
throw new HttpClientException(xpe.getMessage(), xpe);
}
}
//@Override
public void serialize(OutputStream out, Properties params) throws HttpClientException {
SAXSerializer sax = (SAXSerializer) SerializerPool.getInstance().borrowObject(SAXSerializer.class);
params.setProperty(Serializer.GENERATE_DOC_EVENTS, "false");
try {
SequenceIterator itSequence = SequenceIterator.EMPTY_ITERATOR;
if(sequence != null) {
itSequence = sequence.iterate();
}
String encoding = params.getProperty(OutputKeys.ENCODING, "UTF-8");
Writer writer = new OutputStreamWriter(out, encoding);
sax.setOutput(writer, params);
Serializer serializer = context.getBroker().getSerializer();
serializer.reset();
serializer.setProperties(params);
serializer.setSAXHandlers(sax, sax);
sax.startDocument();
while(itSequence.hasNext()) {
NodeValue next = (NodeValue)itSequence.nextItem();
serializer.toSAX(next);
}
sax.endDocument();
writer.close();
} catch(SAXException saxe) {
throw new HttpClientException("A problem occurred while serializing the node set: " + saxe.getMessage(), saxe);
} catch(IOException ioe) {
throw new HttpClientException("A problem occurred while serializing the node set: " + ioe.getMessage(), ioe);
} catch(XPathException xpe) {
throw new HttpClientException("A problem occurred while serializing the node set: " + xpe.getMessage(), xpe);
} finally {
SerializerPool.getInstance().returnObject(sax);
}
}
}