src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/XPathFilterCHGPContainer.java
changeset 47216 71c04702a3d5
parent 25859 3317bb8137f4
child 50614 3810c9a2efa1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/XPathFilterCHGPContainer.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,316 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/**
+ * 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.xml.internal.security.transforms.params;
+
+
+import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
+import com.sun.org.apache.xml.internal.security.transforms.TransformParam;
+import com.sun.org.apache.xml.internal.security.utils.ElementProxy;
+import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Implements the parameters for a custom Transform which has a better performance
+ * than the xfilter2.
+ *
+ * @author $Author: coheigea $
+ */
+public class XPathFilterCHGPContainer extends ElementProxy implements TransformParam {
+
+    public static final String TRANSFORM_XPATHFILTERCHGP =
+        "http://www.nue.et-inf.uni-siegen.de/~geuer-pollmann/#xpathFilter";
+
+    /** Field _ATT_FILTER_VALUE_INTERSECT */
+    private static final String _TAG_INCLUDE_BUT_SEARCH = "IncludeButSearch";
+
+    /** Field _ATT_FILTER_VALUE_SUBTRACT */
+    private static final String _TAG_EXCLUDE_BUT_SEARCH = "ExcludeButSearch";
+
+    /** Field _ATT_FILTER_VALUE_UNION */
+    private static final String _TAG_EXCLUDE = "Exclude";
+
+    /** Field _TAG_XPATHCHGP */
+    public static final String _TAG_XPATHCHGP = "XPathAlternative";
+
+    /** Field _ATT_INCLUDESLASH */
+    public static final String _ATT_INCLUDESLASH = "IncludeSlashPolicy";
+
+    /** Field IncludeSlash           */
+    public static final boolean IncludeSlash = true;
+
+    /** Field ExcludeSlash           */
+    public static final boolean ExcludeSlash = false;
+
+    /**
+     * Constructor XPathFilterCHGPContainer
+     *
+     */
+    private XPathFilterCHGPContainer() {
+        // no instantiation
+    }
+
+    /**
+     * Constructor XPathFilterCHGPContainer
+     *
+     * @param doc
+     * @param includeSlashPolicy
+     * @param includeButSearch
+     * @param excludeButSearch
+     * @param exclude
+     */
+    private XPathFilterCHGPContainer(
+        Document doc, boolean includeSlashPolicy, String includeButSearch,
+        String excludeButSearch, String exclude
+    ) {
+        super(doc);
+
+        if (includeSlashPolicy) {
+            this.constructionElement.setAttributeNS(
+                null, XPathFilterCHGPContainer._ATT_INCLUDESLASH, "true"
+            );
+        } else {
+            this.constructionElement.setAttributeNS(
+                null, XPathFilterCHGPContainer._ATT_INCLUDESLASH, "false"
+            );
+        }
+
+        if ((includeButSearch != null) && (includeButSearch.trim().length() > 0)) {
+            Element includeButSearchElem =
+                ElementProxy.createElementForFamily(
+                    doc, this.getBaseNamespace(), XPathFilterCHGPContainer._TAG_INCLUDE_BUT_SEARCH
+                );
+
+            includeButSearchElem.appendChild(
+                this.doc.createTextNode(indentXPathText(includeButSearch))
+            );
+            XMLUtils.addReturnToElement(this.constructionElement);
+            this.constructionElement.appendChild(includeButSearchElem);
+        }
+
+        if ((excludeButSearch != null) && (excludeButSearch.trim().length() > 0)) {
+            Element excludeButSearchElem =
+                ElementProxy.createElementForFamily(
+                    doc, this.getBaseNamespace(), XPathFilterCHGPContainer._TAG_EXCLUDE_BUT_SEARCH
+                );
+
+            excludeButSearchElem.appendChild(
+                this.doc.createTextNode(indentXPathText(excludeButSearch)));
+
+            XMLUtils.addReturnToElement(this.constructionElement);
+            this.constructionElement.appendChild(excludeButSearchElem);
+        }
+
+        if ((exclude != null) && (exclude.trim().length() > 0)) {
+            Element excludeElem =
+                ElementProxy.createElementForFamily(
+                   doc, this.getBaseNamespace(), XPathFilterCHGPContainer._TAG_EXCLUDE);
+
+            excludeElem.appendChild(this.doc.createTextNode(indentXPathText(exclude)));
+            XMLUtils.addReturnToElement(this.constructionElement);
+            this.constructionElement.appendChild(excludeElem);
+        }
+
+        XMLUtils.addReturnToElement(this.constructionElement);
+    }
+
+    /**
+     * Method indentXPathText
+     *
+     * @param xp
+     * @return the string with enters
+     */
+    static String indentXPathText(String xp) {
+        if ((xp.length() > 2) && (!Character.isWhitespace(xp.charAt(0)))) {
+            return "\n" + xp + "\n";
+        }
+        return xp;
+    }
+
+    /**
+     * Constructor XPathFilterCHGPContainer
+     *
+     * @param element
+     * @param BaseURI
+     * @throws XMLSecurityException
+     */
+    private XPathFilterCHGPContainer(Element element, String BaseURI)
+        throws XMLSecurityException {
+        super(element, BaseURI);
+    }
+
+    /**
+     * Creates a new XPathFilterCHGPContainer; needed for generation.
+     *
+     * @param doc
+     * @param includeSlashPolicy
+     * @param includeButSearch
+     * @param excludeButSearch
+     * @param exclude
+     * @return the created object
+     */
+    public static XPathFilterCHGPContainer getInstance(
+        Document doc, boolean includeSlashPolicy, String includeButSearch,
+        String excludeButSearch, String exclude
+    ) {
+        return new XPathFilterCHGPContainer(
+            doc, includeSlashPolicy, includeButSearch, excludeButSearch, exclude);
+    }
+
+    /**
+     * Creates a XPathFilterCHGPContainer from an existing Element; needed for verification.
+     *
+     * @param element
+     * @param BaseURI
+     *
+     * @throws XMLSecurityException
+     * @return the created object.
+     */
+    public static XPathFilterCHGPContainer getInstance(
+        Element element, String BaseURI
+    ) throws XMLSecurityException {
+        return new XPathFilterCHGPContainer(element, BaseURI);
+    }
+
+    /**
+     * Method getXStr
+     *
+     * @param type
+     * @return The Xstr
+     */
+    private String getXStr(String type) {
+        if (this.length(this.getBaseNamespace(), type) != 1) {
+            return "";
+        }
+
+        Element xElem =
+            XMLUtils.selectNode(
+                this.constructionElement.getFirstChild(), this.getBaseNamespace(), type, 0
+            );
+
+        return XMLUtils.getFullTextChildrenFromElement(xElem);
+    }
+
+    /**
+     * Method getIncludeButSearch
+     *
+     * @return the string
+     */
+    public String getIncludeButSearch() {
+        return this.getXStr(XPathFilterCHGPContainer._TAG_INCLUDE_BUT_SEARCH);
+    }
+
+    /**
+     * Method getExcludeButSearch
+     *
+     * @return the string
+     */
+    public String getExcludeButSearch() {
+        return this.getXStr(XPathFilterCHGPContainer._TAG_EXCLUDE_BUT_SEARCH);
+    }
+
+    /**
+     * Method getExclude
+     *
+     * @return the string
+     */
+    public String getExclude() {
+        return this.getXStr(XPathFilterCHGPContainer._TAG_EXCLUDE);
+    }
+
+    /**
+     * Method getIncludeSlashPolicy
+     *
+     * @return the string
+     */
+    public boolean getIncludeSlashPolicy() {
+        return this.constructionElement.getAttributeNS(
+            null, XPathFilterCHGPContainer._ATT_INCLUDESLASH).equals("true");
+    }
+
+    /**
+     * Returns the first Text node which contains information from the XPath
+     * Filter String. We must use this stupid hook to enable the here() function
+     * to work.
+     *
+     * $todo$ I dunno whether this crashes: <XPath> he<!-- comment -->re()/ds:Signature[1]</XPath>
+     * @param type
+     * @return the first Text node which contains information from the XPath 2 Filter String
+     */
+    private Node getHereContextNode(String type) {
+
+        if (this.length(this.getBaseNamespace(), type) != 1) {
+            return null;
+        }
+
+        return XMLUtils.selectNodeText(
+            this.constructionElement.getFirstChild(), this.getBaseNamespace(), type, 0
+        );
+    }
+
+    /**
+     * Method getHereContextNodeIncludeButSearch
+     *
+     * @return the string
+     */
+    public Node getHereContextNodeIncludeButSearch() {
+        return this.getHereContextNode(XPathFilterCHGPContainer._TAG_INCLUDE_BUT_SEARCH);
+    }
+
+    /**
+     * Method getHereContextNodeExcludeButSearch
+     *
+     * @return the string
+     */
+    public Node getHereContextNodeExcludeButSearch() {
+        return this.getHereContextNode(XPathFilterCHGPContainer._TAG_EXCLUDE_BUT_SEARCH);
+    }
+
+    /**
+     * Method getHereContextNodeExclude
+     *
+     * @return the string
+     */
+    public Node getHereContextNodeExclude() {
+        return this.getHereContextNode(XPathFilterCHGPContainer._TAG_EXCLUDE);
+    }
+
+    /**
+     * Method getBaseLocalName
+     *
+     * @inheritDoc
+     */
+    public final String getBaseLocalName() {
+        return XPathFilterCHGPContainer._TAG_XPATHCHGP;
+    }
+
+    /**
+     * Method getBaseNamespace
+     *
+     * @inheritDoc
+     */
+    public final String getBaseNamespace() {
+        return TRANSFORM_XPATHFILTERCHGP;
+    }
+}