View Javadoc
1   /*
2    * reserved comment block
3    * DO NOT REMOVE OR ALTER!
4    */
5   /**
6    * Licensed to the Apache Software Foundation (ASF) under one
7    * or more contributor license agreements. See the NOTICE file
8    * distributed with this work for additional information
9    * regarding copyright ownership. The ASF licenses this file
10   * to you under the Apache License, Version 2.0 (the
11   * "License"); you may not use this file except in compliance
12   * with the License. You may obtain a copy of the License at
13   *
14   * http://www.apache.org/licenses/LICENSE-2.0
15   *
16   * Unless required by applicable law or agreed to in writing,
17   * software distributed under the License is distributed on an
18   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19   * KIND, either express or implied. See the License for the
20   * specific language governing permissions and limitations
21   * under the License.
22   */
23  package com.sun.org.apache.xml.internal.security.transforms.params;
24  
25  import java.util.Set;
26  import java.util.SortedSet;
27  import java.util.TreeSet;
28  
29  import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
30  import com.sun.org.apache.xml.internal.security.transforms.TransformParam;
31  import com.sun.org.apache.xml.internal.security.utils.ElementProxy;
32  import org.w3c.dom.Document;
33  import org.w3c.dom.Element;
34  
35  /**
36   * This Object serves as Content for the ds:Transforms for exclusive
37   * Canonicalization.
38   * <BR />
39   * It implements the {@link Element} interface
40   * and can be used directly in a DOM tree.
41   *
42   * @author Christian Geuer-Pollmann
43   */
44  public class InclusiveNamespaces extends ElementProxy implements TransformParam {
45  
46      /** Field _TAG_EC_INCLUSIVENAMESPACES */
47      public static final String _TAG_EC_INCLUSIVENAMESPACES =
48          "InclusiveNamespaces";
49  
50      /** Field _ATT_EC_PREFIXLIST */
51      public static final String _ATT_EC_PREFIXLIST = "PrefixList";
52  
53      /** Field ExclusiveCanonicalizationNamespace */
54      public static final String ExclusiveCanonicalizationNamespace =
55          "http://www.w3.org/2001/10/xml-exc-c14n#";
56  
57      /**
58       * Constructor XPathContainer
59       *
60       * @param doc
61       * @param prefixList
62       */
63      public InclusiveNamespaces(Document doc, String prefixList) {
64          this(doc, InclusiveNamespaces.prefixStr2Set(prefixList));
65      }
66  
67      /**
68       * Constructor InclusiveNamespaces
69       *
70       * @param doc
71       * @param prefixes
72       */
73      public InclusiveNamespaces(Document doc, Set<String> prefixes) {
74          super(doc);
75  
76          SortedSet<String> prefixList = null;
77          if (prefixes instanceof SortedSet<?>) {
78              prefixList = (SortedSet<String>)prefixes;
79          } else {
80              prefixList = new TreeSet<String>(prefixes);
81          }
82  
83          StringBuilder sb = new StringBuilder();
84          for (String prefix : prefixList) {
85              if (prefix.equals("xmlns")) {
86                  sb.append("#default ");
87              } else {
88                  sb.append(prefix + " ");
89              }
90          }
91  
92          this.constructionElement.setAttributeNS(
93              null, InclusiveNamespaces._ATT_EC_PREFIXLIST, sb.toString().trim());
94      }
95  
96      /**
97       * Constructor InclusiveNamespaces
98       *
99       * @param element
100      * @param BaseURI
101      * @throws XMLSecurityException
102      */
103     public InclusiveNamespaces(Element element, String BaseURI)
104         throws XMLSecurityException {
105         super(element, BaseURI);
106     }
107 
108     /**
109      * Method getInclusiveNamespaces
110      *
111      * @return The Inclusive Namespace string
112      */
113     public String getInclusiveNamespaces() {
114         return this.constructionElement.getAttributeNS(null, InclusiveNamespaces._ATT_EC_PREFIXLIST);
115     }
116 
117     /**
118      * Decodes the <code>inclusiveNamespaces</code> String and returns all
119      * selected namespace prefixes as a Set. The <code>#default</code>
120      * namespace token is represented as an empty namespace prefix
121      * (<code>"xmlns"</code>).
122      * <BR/>
123      * The String <code>inclusiveNamespaces=" xenc    ds #default"</code>
124      * is returned as a Set containing the following Strings:
125      * <UL>
126      * <LI><code>xmlns</code></LI>
127      * <LI><code>xenc</code></LI>
128      * <LI><code>ds</code></LI>
129      * </UL>
130      *
131      * @param inclusiveNamespaces
132      * @return A set to string
133      */
134     public static SortedSet<String> prefixStr2Set(String inclusiveNamespaces) {
135         SortedSet<String> prefixes = new TreeSet<String>();
136 
137         if ((inclusiveNamespaces == null) || (inclusiveNamespaces.length() == 0)) {
138             return prefixes;
139         }
140 
141         String[] tokens = inclusiveNamespaces.split("\\s");
142         for (String prefix : tokens) {
143             if (prefix.equals("#default")) {
144                 prefixes.add("xmlns");
145             } else {
146                 prefixes.add(prefix);
147             }
148         }
149 
150         return prefixes;
151     }
152 
153     /**
154      * Method getBaseNamespace
155      *
156      * @inheritDoc
157      */
158     public String getBaseNamespace() {
159         return InclusiveNamespaces.ExclusiveCanonicalizationNamespace;
160     }
161 
162     /**
163      * Method getBaseLocalName
164      *
165      * @inheritDoc
166      */
167     public String getBaseLocalName() {
168         return InclusiveNamespaces._TAG_EC_INCLUSIVENAMESPACES;
169     }
170 }