/****************************************************************************/ /* File: PkgReadableDocument.java */ /* Author: F. Georges */ /* Company: H2O Consulting */ /* Date: 2009-10-20 */ /* Tags: */ /* Copyright (c) 2009 Florent Georges (see end of file.) */ /* ------------------------------------------------------------------------ */ package org.expath.pkg.calabash; import com.xmlcalabash.core.XProcException; import com.xmlcalabash.core.XProcRuntime; import com.xmlcalabash.io.DocumentSequence; import com.xmlcalabash.io.ReadablePipe; import com.xmlcalabash.model.Step; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; import net.sf.saxon.s9api.DocumentBuilder; import net.sf.saxon.s9api.SaxonApiException; import net.sf.saxon.s9api.XdmNode; /** * ... * * Based on ReadableDocument (Calabash 0.9.15, SVN revision 456.) * * @author Florent Georges */ public class PkgReadableDocument implements ReadablePipe { public PkgReadableDocument(String href, URIResolver resolver, XProcRuntime runtime) { myHref = href; myResolver = resolver; myRuntime = runtime; myDocs = new DocumentSequence(myRuntime); } @Override public void canReadSequence(boolean sequence) { // nop; always false } @Override public void resetReader() { myPos = 0; } @Override public void setReader(Step step) { // nothing } @Override public boolean moreDocuments() { if ( ! myHasBeenRead ) { doRead(); } return myPos < myDocs.size(); } @Override public boolean closed() { return true; } @Override public int documentCount() { return myDocs.size(); } @Override public DocumentSequence documents() { return myDocs; } @Override public XdmNode read() throws SaxonApiException { if ( ! myHasBeenRead ) { doRead(); } return myDocs.get(myPos++); } @Override public boolean readSequence() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void setNames(String step, String port) { // nop } private void doRead() { Source src; try { src = myResolver.resolve(myHref, null); } catch ( TransformerException ex ) { throw new XProcException("Error resolving '" + myHref + "'", ex); } DocumentBuilder builder = myRuntime.getProcessor().newDocumentBuilder(); builder.setLineNumbering(true); try { myDocs.add(builder.build(src)); myHasBeenRead = true; } catch ( SaxonApiException ex ) { String msg = "Error building '" + myHref + "' (" + src.getSystemId() + ")"; throw new XProcException(msg, ex); } } private String myHref; private URIResolver myResolver; private XProcRuntime myRuntime; private int myPos = 0; private DocumentSequence myDocs = null; private boolean myHasBeenRead = false; } /* ------------------------------------------------------------------------ */ /* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS COMMENT. */ /* */ /* The contents of this file are subject to the Mozilla Public License */ /* Version 1.0 (the "License"); you may not use this file except in */ /* compliance with the License. You may obtain a copy of the License at */ /* http://www.mozilla.org/MPL/. */ /* */ /* Software distributed under the License is distributed on an "AS IS" */ /* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See */ /* the License for the specific language governing rights and limitations */ /* under the License. */ /* */ /* The Original Code is: all this file. */ /* */ /* The Initial Developer of the Original Code is Florent Georges. */ /* */ /* Contributor(s): none. */ /* ------------------------------------------------------------------------ */