# HG changeset patch # User mullan # Date 1434141391 14400 # Node ID c494d4d1c5a111a0048f1493290820b67899bd56 # Parent f424712eaedeb7ee019411edbe60f56070221b04 8087283: Add support for the XML Signature here() function to the JDK XPath implementation Reviewed-by: alanb, joehw diff -r f424712eaede -r c494d4d1c5a1 src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java --- a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java Mon Jun 08 22:08:47 2015 -0700 +++ b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java Fri Jun 12 16:36:31 2015 -0400 @@ -1,21 +1,23 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. */ -/* - * Copyright 1999-2005 The Apache Software Foundation. +/** + * 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 * - * Licensed 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 + * 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. + * 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. */ /* * $Id: FunctionTable.java,v 1.3 2005/09/28 13:49:34 pvedula Exp $ @@ -135,6 +137,9 @@ /** The 'unparsed-entity-uri()' id (XSLT). */ public static final int FUNC_UNPARSED_ENTITY_URI = 36; + /** The 'here()' id (XML Signature). */ + public static final int FUNC_HERE = 37; + // Proprietary /** The 'document-location()' id (Proprietary). */ @@ -162,7 +167,7 @@ * Number of built in functions. Be sure to update this as * built-in functions are added. */ - private static final int NUM_BUILT_IN_FUNCS = 37; + private static final int NUM_BUILT_IN_FUNCS = 38; /** * Number of built-in functions that may be added. @@ -229,6 +234,8 @@ com.sun.org.apache.xpath.internal.functions.FuncDoclocation.class; m_functions[FUNC_UNPARSED_ENTITY_URI] = com.sun.org.apache.xpath.internal.functions.FuncUnparsedEntityURI.class; + m_functions[FUNC_HERE] = + com.sun.org.apache.xpath.internal.functions.FuncHere.class; } static{ @@ -302,6 +309,8 @@ new Integer(FunctionTable.FUNC_UNPARSED_ENTITY_URI)); m_functionID.put(Keywords.FUNC_DOCLOCATION_STRING, new Integer(FunctionTable.FUNC_DOCLOCATION)); + m_functionID.put(Keywords.FUNC_HERE_STRING, + new Integer(FunctionTable.FUNC_HERE)); } public FunctionTable(){ diff -r f424712eaede -r c494d4d1c5a1 src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java --- a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java Mon Jun 08 22:08:47 2015 -0700 +++ b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java Fri Jun 12 16:36:31 2015 -0400 @@ -1,21 +1,23 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. */ -/* - * Copyright 1999-2005 The Apache Software Foundation. +/** + * 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 * - * Licensed 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 + * 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. + * 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. */ /* * $Id: Keywords.java,v 1.2.4.1 2005/09/14 19:46:01 jeffsuttor Exp $ @@ -210,6 +212,9 @@ public static final String FUNC_UNPARSED_ENTITY_URI_STRING = "unparsed-entity-uri"; + /** here function string (XML Signature). */ + public static final String FUNC_HERE_STRING = "here"; + // Proprietary, built in functions /** current function string (Proprietary). */ diff -r f424712eaede -r c494d4d1c5a1 src/java.xml/share/classes/com/sun/org/apache/xpath/internal/functions/FuncHere.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/functions/FuncHere.java Fri Jun 12 16:36:31 2015 -0400 @@ -0,0 +1,107 @@ +/* + * 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) { } +}