Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Wrap.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;
 
 import java.util.Map;
 

Author(s):
ndw
 
 public class Wrap extends DefaultStep implements ProcessMatchingNodes {
     private static final QName _match = new QName("match");
     private static final QName _wrapper = new QName("wrapper");
     private static final QName _wrapper_prefix = new QName("wrapper-prefix");
     private static final QName _wrapper_namespace = new QName("wrapper-namespace");
     private static final QName _group_adjacent = new QName("group-adjacent");
     private ReadablePipe source = null;
     private WritablePipe result = null;
     private ProcessMatch matcher = null;
     private Map<QNameRuntimeValueinScopeOptions = null;
     private QName wrapper = null;
     private NodeName wrapperCode = null;
     private RuntimeValue groupAdjacent = null;
     private Stack<BooleaninGroup = new Stack<Boolean> ();

    
Creates a new instance of Wrap
 
     public Wrap(XProcRuntime runtimeXAtomicStep step) {
         super(runtime,step);
     }
 
     public void setInput(String portReadablePipe pipe) {
          = pipe;
     }
 
     public void setOutput(String portWritablePipe pipe) {
          = pipe;
     }
 
     public void reset() {
         .resetReader();
         .resetWriter();
     }
 
     public void run() throws SaxonApiException {
         super.run();
 
         RuntimeValue wrapperNameValue = getOption();
         String wrapperNameStr = wrapperNameValue.getString();
         String wpfx = getOption(, (Stringnull);
         String wns = getOption(, (Stringnull);
 
         if (wpfx != null && wns == null) {
             throw XProcException.dynamicError(34, .getNode(), "You can't specify a prefix without a namespace");
         }
 
         if (wns != null && wrapperNameStr.contains(":")) {
             throw XProcException.dynamicError(34, .getNode(), "You can't specify a namespace if the wrapper name contains a colon");
        }
        if (wrapperNameStr.contains(":")) {
             = new QName(wrapperNameStrwrapperNameValue.getNode());
        } else {
             = new QName(wpfx == null ? "" : wpfxwnswrapperNameStr);
        }
        .push(false);
        XdmNode doc = .read();
         = new ProcessMatch(this);
        .match(doc,getOption());
        if (.moreDocuments()) {
            throw XProcException.dynamicError(6);
        }
        .write(.getResult());
    }
    public boolean processStartDocument(XdmNode nodethrows SaxonApiException {
        .startDocument(node.getBaseURI());
        .addStartElement(, Untyped.getInstance(), null);
        .startContent();
        .addSubtree(node);
        .addEndElement();
        .endDocument();
        return false;
    }
    public void processEndDocument(XdmNode nodethrows SaxonApiException {
        // nop
    }
    public boolean processStartElement(XdmNode nodethrows SaxonApiException {
        if (!.peek()) {
            .addStartElement(, Untyped.getInstance(), null);
        }
        if ( != null && nextMatches(node)) {
            .pop();
            .push(true);
        } else {
            .pop();
            .push(false);
        }
        .addStartElement(node);
        .addAttributes(node);
        .push(false); // processEndElement will pop it! Value doesn't matter!
        return true;
    }
    public void processAttribute(XdmNode nodethrows SaxonApiException {
        throw XProcException.stepError(23);
    }
    public void processEndElement(XdmNode nodethrows SaxonApiException {
        .addEndElement();
        .pop();
        if (!.peek()) {
            .addEndElement();
        }
    }
    public void processText(XdmNode nodethrows SaxonApiException {
        if (!.peek()) {
            .addStartElement(, Untyped.getInstance(), null);
        }
        .addText(node.getStringValue());
        if ( != null && nextMatches(node)) {
            .pop();
            .push(true);
        } else {
            .addEndElement();
            .pop();
            .push(false);
        }
    }
    public void processComment(XdmNode nodethrows SaxonApiException {
        if (!.peek()) {
            .addStartElement(, Untyped.getInstance(), null);
        }
        .addComment(node.getStringValue());
        if ( != null && nextMatches(node)) {
            .pop();
            .push(true);
        } else {
            .addEndElement();
            .pop();
            .push(false);
        }
    }
    public void processPI(XdmNode nodethrows SaxonApiException {
        if (!.peek()) {
            .addStartElement(, Untyped.getInstance(), null);
        }
        .addPI(node.getNodeName().getLocalName(),node.getStringValue());
        if ( != null && nextMatches(node)) {
            .pop();
            .push(true);
        } else {
            .addEndElement();
            .pop();
            .push(false);
        }
    }
    private boolean nextMatches(XdmNode node) {
        XdmItem nodeValue = computeGroup(node);
        if (nodeValue == null) {
            return false;
        }
        while (iter.hasNext()) {
            XdmNode chk = (XdmNodeiter.next();
            boolean skippable
                    = (chk.getNodeKind() == .
                       || chk.getNodeKind() == .);
            if (chk.getNodeKind() == .) {
                if ("".equals(chk.toString().trim())) {
                    skippable = true;
                }
            }
            if (.matches(chk)) {
                XdmItem nextValue = computeGroup(chk);
                boolean same = S9apiUtils.xpathEqual(.getProcessor(), nodeValuenextValue);
                return same;
            }
            if (!skippable) {
                return false;
            }
        }
        return false;
    }
    private XdmItem computeGroup(XdmNode node) {
        try {
            XPathCompiler xcomp = .getProcessor().newXPathCompiler();
            xcomp.setBaseURI(.getNode().getBaseURI());
            for (String prefix : .getNamespaceBindings().keySet()) {
                xcomp.declareNamespace(prefix.getNamespaceBindings().get(prefix));
            }
            XPathExecutable xexec = xcomp.compile(.getString());
            XPathSelector selector = xexec.load();
            selector.setContextItem(node);
            Iterator<XdmItemvalues = selector.iterator();
            if (values.hasNext()) {
                return values.next();
            } else {
                return null;
            }
        } catch (SaxonApiException sae) {
            throw new XProcException(sae);
        }
    }
New to GrepCode? Check out our FAQ X