| /* |
| * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. |
| */ |
| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package com.sun.org.apache.xpath.internal.functions; |
| |
| import javax.xml.transform.TransformerException; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Node; |
| import com.sun.org.apache.xml.internal.dtm.DTM; |
| import com.sun.org.apache.xpath.internal.NodeSetDTM; |
| import com.sun.org.apache.xpath.internal.XPathContext; |
| import com.sun.org.apache.xpath.internal.objects.XNodeSet; |
| import com.sun.org.apache.xpath.internal.objects.XObject; |
| import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; |
| |
| /** |
| * Execute the XML Signature here() function. |
| */ |
| public final class FuncHere extends Function { |
| |
| private static final long serialVersionUID = 4328660760070034592L; |
| |
| @Override |
| public XObject execute(XPathContext xctxt) throws TransformerException { |
| Node xpathOwnerNode = (Node)xctxt.getOwnerObject(); |
| if (xpathOwnerNode == null) { |
| return null; |
| } |
| |
| int xpathOwnerNodeDTM = xctxt.getDTMHandleFromNode(xpathOwnerNode); |
| int currentNode = xctxt.getCurrentNode(); |
| DTM dtm = xctxt.getDTM(currentNode); |
| int docContext = dtm.getDocument(); |
| |
| if (docContext == DTM.NULL) { |
| error(xctxt, XPATHErrorResources.ER_CONTEXT_HAS_NO_OWNERDOC, null); |
| } |
| |
| // check whether currentNode and the node containing the XPath |
| // expression are in the same document |
| Document currentDoc = getOwnerDocument(dtm.getNode(currentNode)); |
| Document xpathOwnerDoc = getOwnerDocument(xpathOwnerNode); |
| |
| if (currentDoc != xpathOwnerDoc) { |
| throw new TransformerException("Owner documents differ"); |
| } |
| |
| XNodeSet nodes = new XNodeSet(xctxt.getDTMManager()); |
| NodeSetDTM nodeSet = nodes.mutableNodeset(); |
| |
| int hereNode = DTM.NULL; |
| |
| switch (dtm.getNodeType(xpathOwnerNodeDTM)) { |
| |
| case Node.ATTRIBUTE_NODE: |
| case Node.PROCESSING_INSTRUCTION_NODE: { |
| // returns a node-set containing the attribute / processing |
| // instruction node |
| hereNode = xpathOwnerNodeDTM; |
| nodeSet.addNode(hereNode); |
| break; |
| } |
| case Node.TEXT_NODE : { |
| // returns a node-set containing the parent element of the |
| // text node that directly bears the XPath expression |
| hereNode = dtm.getParent(xpathOwnerNodeDTM); |
| nodeSet.addNode(hereNode); |
| break; |
| } |
| default : |
| break; |
| } |
| |
| /** $todo$ Do I have to do this detach() call? */ |
| nodeSet.detach(); |
| |
| return nodes; |
| } |
| |
| private static Document getOwnerDocument(Node node) { |
| if (node.getNodeType() == Node.DOCUMENT_NODE) { |
| return (Document)node; |
| } |
| return node.getOwnerDocument(); |
| } |
| |
| @Override |
| public void fixupVariables(java.util.Vector vars, int globalsSize) { } |
| } |