Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.xmlcalabash.extensions;
  
 
 import java.util.Set;
Created by IntelliJ IDEA. User: ndw Date: Mar 15, 2009 Time: 5:22:42 PM To change this template use File | Settings | File Templates.
 
 public class Eval extends DefaultStep {
     protected final static QName cx_document = new QName("cx"."document");
     protected final static QName cx_options = new QName("cx"."options");
     protected final static QName cx_option = new QName("cx"."option");
     private static final QName _port = new QName("port");
     private static final QName _detailed = new QName("detailed");
     private static final QName _step = new QName("step");
     private static final QName _name = new QName("name");
     private static final QName _value = new QName("value");
 
     private Vector<ReadablePipesources = new Vector<ReadablePipe> ();
     private ReadablePipe pipeline = null;
     private Hashtable<QName,RuntimeValueparams = new Hashtable<QName,RuntimeValue> ();
     private Vector<ReadablePipeoptions = new Vector<ReadablePipe> ();
     private WritablePipe result = null;

    
Creates a new instance of Eval
 
     public Eval(XProcRuntime runtimeXAtomicStep step) {
         super(runtime,step);
     }
 
     public void setInput(String portReadablePipe pipe) {
         if ("source".equals(port)) {
             .add(pipe);
         } else if ("pipeline".equals(port)) {
             if ( != null) {
                 throw new XProcException(.getNode(), "You can't specify more than one pipeline.");
             } else {
                  = pipe;
             }
         } else if ("options".equals(port)) {
             .add(pipe);
         } else {
             throw new XProcException(.getNode(), "Unexpected port: " + port);
         }
     }
 
     public void setOutput(String portWritablePipe pipe) {
          = pipe;
     }
 
     public void reset() {
         for (ReadablePipe pipe : ) {
             pipe.resetReader();
         }
         for (ReadablePipe pipe : ) {
             pipe.resetReader();
         }
         .resetReader();
         // What about parameters?
         .resetWriter();
     }
 
     public void setParameter(QName nameRuntimeValue value) {
         .put(namevalue);
     }
 
     public void run() throws SaxonApiException {
        super.run();
        XdmNode pipedoc = .read();
        XdmNode piperoot = S9apiUtils.getDocumentElement(pipedoc);
        XProcRuntime innerRuntime = new XProcRuntime();
        innerRuntime.resetExtensionFunctions();
        QName stepName = getOption(, (QNamenull);
        XPipeline pipeline = null;
        if (..equals(piperoot.getNodeName())
                || ..equals(piperoot.getNodeName())) {
            if (stepName != null) {
                throw new XProcException(.getNode(), "Step option can only be used when loading a p:library");
            }
            pipeline = innerRuntime.use(pipedoc);
        } else if (..equals(piperoot.getNodeName())) {
            XLibrary library = innerRuntime.useLibrary(piperoot);
            if (stepName == null) {
                pipeline = library.getFirstPipeline();
            } else {
                pipeline = library.getPipeline(stepName);
            }
        }
        Set<Stringinputports = pipeline.getInputs();
        Set<Stringoutputports = pipeline.getOutputs();
        int inputCount = 0;
        for (String port : inputports) {
            XInput input = pipeline.getInput(port);
            if (input.getParameters()) {
                // nop; it's ok for these to be unbound
            } else {
                inputCount++;
            }
        }
        boolean detailed = getOption(false);
        if (!detailed && (inputCount > 1 || outputports.size() > 1)) {
            throw new XProcException(.getNode(), "You must specify detailed='true' to eval pipelines with multiple inputs or outputs");
        }
        DeclareStep decl = pipeline.getDeclareStep();
        String primaryin = null;
        Iterator<Stringportiter = inputports.iterator();
        while (portiter.hasNext()) {
            String port = portiter.next();
            Input input = decl.getInput(port);
            if (!input.getParameterInput() && ((inputports.size() == 1 && !input.getPrimarySet()) || input.getPrimary())) {
                primaryin = port;
            }
        }
        Hashtable<String,Vector<XdmNode>> inputs = new Hashtable<String,Vector<XdmNode>> ();
        for (ReadablePipe pipe : ) {
            while (pipe.moreDocuments()) {
                String port = primaryin;
                XdmNode doc = pipe.read();
                XdmNode root = S9apiUtils.getDocumentElement(doc);
                if (detailed && .equals(root.getNodeName())) {
                    port = root.getAttributeValue();
                    // FIXME: support exclude-inline-prefixes
                    boolean seenelem = false;
                    XdmDestination dest = new XdmDestination();
                    Vector<XdmValuenodes = new Vector<XdmValue> ();
                    XdmSequenceIterator iter = root.axisIterator(.);
                    while (iter.hasNext()) {
                        XdmNode child = (XdmNodeiter.next();
                        if (child.getNodeKind() == .) {
                            if (seenelem) {
                                throw new IllegalArgumentException("Not a well-formed inline document");
                            }
                            seenelem = true;
                        }
                        nodes.add(child);
                    }
                    S9apiUtils.writeXdmValue(nodesdestroot.getBaseURI());
                    doc = dest.getXdmNode();
                }
                if (port == null) {
                    throw new XProcException(.getNode(), "You must use cx:document for pipelines with no primary input port");
                }
                if (!inputs.containsKey(port)) {
                    inputs.put(portnew Vector<XdmNode> ());
                }
                inputs.get(port).add(doc);
            }
        }
        for (String port : inputs.keySet()) {
            if (inputports.contains(port)) {
                pipeline.clearInputs(port);
                for (XdmNode node : inputs.get(port)) {
                    pipeline.writeTo(portnode);
                }
            } else {
                throw new XProcException(.getNode(), "Eval pipeline has no input port named '" + port + "'");
            }
        }
        if ( != null) {
            for (QName name : .keySet()) {
                pipeline.setParameter(name.get(name));
            }
        }
        for (ReadablePipe pipe : ) {
            while (pipe.moreDocuments()) {
                XdmNode doc = pipe.read();
                XdmNode root = S9apiUtils.getDocumentElement(doc);
                if (!.equals(root.getNodeName())) {
                    throw new XProcException(.getNode(), "Options port must be a cx:options document.");
                }
                
                for (XdmNode opt : new RelevantNodes(root.)) {
                    if (opt.getNodeKind() != . || !.equals(opt.getNodeName())) {
                        throw new XProcException(.getNode(), "A cx:options document must only contain cx:option elements");
                    }
                    String name = opt.getAttributeValue();
                    QName qname = new QName(nameopt);
                    String value = opt.getAttributeValue();
                    if (name == null || value == null) {
                        throw new XProcException(.getNode(), "A cx:option element must have name and value attributes");
                    }
                    RuntimeValue runtimeValue = new RuntimeValue(value);
                    pipeline.passOption(qnameruntimeValue);
                }
            }
        }
        pipeline.run();
        portiter = outputports.iterator();
        while (portiter.hasNext()) {
            String port = portiter.next();
            ReadablePipe rpipe = pipeline.readFrom(port);
            rpipe.canReadSequence(true);
            while (rpipe.moreDocuments()) {
                XdmNode doc = rpipe.read();
                TreeWriter tree = new TreeWriter();
                tree.startDocument(doc.getBaseURI());
                if (detailed) {
                    tree.addStartElement();
                    tree.addAttribute(port);
                    tree.startContent();
                    tree.addSubtree(doc);
                    tree.addEndElement();
                } else {
                    tree.addSubtree(doc);
                }
                tree.endDocument();
                .write(tree.getResult());
            }
        }
    }
New to GrepCode? Check out our FAQ X