Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * XQuery.java
   *
   * Copyright 2008 Mark Logic Corporation.
   * Portions Copyright 2007 Sun Microsystems, Inc.
   * All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common
  * Development and Distribution License("CDDL") (collectively, the
  * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * https://xproc.dev.java.net/public/CDDL+GPL.html or
  * docs/CDDL+GPL.txt in the distribution. See the License for the
  * specific language governing permissions and limitations under the
  * License. When distributing the software, include this License Header
  * Notice in each file and include the License file at docs/CDDL+GPL.txt.
  */
 
 package com.xmlcalabash.library;
 
 

Author(s):
ndw
 
 public class XQuery extends DefaultStep {
     private static final QName _content_type = new QName("content-type");
 
     private ReadablePipe source = null;
     private Hashtable<QName,RuntimeValueparams = new Hashtable<QName,RuntimeValue> ();
     private ReadablePipe query = null;
     private WritablePipe result = null;
     
     public XQuery(XProcRuntime runtimeXAtomicStep step) {
         super(runtime,step);
     }
 
     public void setInput(String portReadablePipe pipe) {
         if ("source".equals(port)) {
              = pipe;
         } else if ("query".equals(port)) {
              = pipe;
         }
     }
 
     public void setOutput(String portWritablePipe pipe) {
          = pipe;
     }
 
     public void setParameter(QName nameRuntimeValue value) {
         .put(namevalue);
     }
 
     public void reset() {
         .resetReader();
         .resetWriter();
     }
 
     public void run() throws SaxonApiException {
         super.run();
 
         // FIXME: Deal with (doubly) escaped markup correctly...
 
         Vector<XdmNodedefaultCollection = new Vector<XdmNode> ();
         while (.moreDocuments()) {
             defaultCollection.add(.read());
         }
 
         XdmNode document = null;
         if (defaultCollection.size() > 0) {
             document = defaultCollection.firstElement();
         }
 
         XdmNode root = S9apiUtils.getDocumentElement(.read());
         String queryString = null;
 
         if ((..equals(root.getNodeName())
              && "application/octet-stream".equals(root.getAttributeValue()))
             || "base64".equals(root.getAttributeValue())) {
             byte[] decoded = Base64.decode(root.getStringValue());
            queryString = new String(decoded);
        } else {
            queryString = root.getStringValue();
        }
        CollectionURIResolver collectionResolver = config.getCollectionURIResolver();
        config.setCollectionURIResolver(new CollectionResolver(defaultCollectioncollectionResolver));
        Processor qtproc = .getProcessor();
        XQueryCompiler xqcomp = qtproc.newXQueryCompiler();
        xqcomp.setBaseURI(root.getBaseURI());
        XQueryExecutable xqexec = xqcomp.compile(queryString);
        XQueryEvaluator xqeval = xqexec.load();
        if (document != null) {
            xqeval.setContextItem(document);
        }
        for (QName name : .keySet()) {
            RuntimeValue v = .get(name);
            if (.getAllowGeneralExpressions()) {
                xqeval.setExternalVariable(namev.getValue());
            } else {
                xqeval.setExternalVariable(namenew XdmAtomicValue(v.getString()));
            }
        }
        Iterator<XdmItemiter = xqeval.iterator();
        while (iter.hasNext()) {
            XdmItem item = iter.next();
            if (item.isAtomicValue()) {
                throw new XProcException(.getNode(), "Not expecting atomic values back from XQuery!");
            }
            XdmNode node = (XdmNodeitem;
            if (node.getNodeKind() != .) {
                // Make a document for this node...is this the right thing to do?
                TreeWriter treeWriter = new TreeWriter();
                treeWriter.startDocument(.getNode().getBaseURI());
                treeWriter.addSubtree(node);
                treeWriter.endDocument();
                node = treeWriter.getResult();
            }
            
            .write(node);
        }
        config.setCollectionURIResolver(collectionResolver);
    }
New to GrepCode? Check out our FAQ X