Class WSSNamespacePrefixMapper

java.lang.Object
org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper
com.sun.xml.wss.saml.util.WSSNamespacePrefixMapper

public class WSSNamespacePrefixMapper extends NamespacePrefixMapper
Author:
[email protected]
  • Constructor Details

    • WSSNamespacePrefixMapper

      public WSSNamespacePrefixMapper()
      Creates a new instance of NamespacePrefixMapper
    • WSSNamespacePrefixMapper

      public WSSNamespacePrefixMapper(boolean soap12)
  • Method Details

    • getPreferredPrefix

      public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix)
      Description copied from class: NamespacePrefixMapper
      Returns a preferred prefix for the given namespace URI. This method is intended to be overrided by a derived class.

      As noted in the return value portion of the javadoc, there are several cases where the preference cannot be honored. Specifically, as of JAXB RI 2.0 and onward:

      1. If the prefix returned is already in use as one of the in-scope namespace bindings. This is partly necessary for correctness (so that we don't unexpectedly change the meaning of QNames bound to String), partly to simplify the marshaller.
      2. If the prefix returned is "" yet the current JAXBContext includes classes that use the empty namespace URI. This allows the JAXB RI to reserve the "" prefix for the empty namespace URI, which is the only possible prefix for the URI. This restriction is also to simplify the marshaller.
      Specified by:
      getPreferredPrefix in class NamespacePrefixMapper
      Parameters:
      namespaceUri - The namespace URI for which the prefix needs to be found. Never be null. "" is used to denote the default namespace.
      suggestion - When the content tree has a suggestion for the prefix to the given namespaceUri, that suggestion is passed as a parameter. Typicall this value comes from the QName.getPrefix to show the preference of the content tree. This parameter may be null, and this parameter may represent an already occupied prefix.
      requirePrefix - If this method is expected to return non-empty prefix. When this flag is true, it means that the given namespace URI cannot be set as the default namespace.
      Returns:
      null if there's no prefered prefix for the namespace URI. In this case, the system will generate a prefix for you. Otherwise the system will try to use the returned prefix, but generally there's no guarantee if the prefix will be actually used or not. return "" to map this namespace URI to the default namespace. Again, there's no guarantee that this preference will be honored. If this method returns "" when requirePrefix=true, the return value will be ignored and the system will generate one.
    • getPreDeclaredNamespaceUris

      public String[] getPreDeclaredNamespaceUris()
      Description copied from class: NamespacePrefixMapper
      Returns a list of namespace URIs that should be declared at the root element.

      By default, the JAXB RI 1.0.x produces namespace declarations only when they are necessary, only at where they are used. Because of this lack of look-ahead, sometimes the marshaller produces a lot of namespace declarations that look redundant to human eyes. For example,

      
       <?xml version="1.0"?>
       <root>
         <ns1:child xmlns:ns1="urn:foo"> ... </ns1:child>
         <ns2:child xmlns:ns2="urn:foo"> ... </ns2:child>
         <ns3:child xmlns:ns3="urn:foo"> ... </ns3:child>
         ...
       </root>
       

      The JAXB RI 2.x mostly doesn't exhibit this behavior any more, as it declares all statically known namespace URIs (those URIs that are used as element/attribute names in JAXB annotations), but it may still declare additional namespaces in the middle of a document, for example when (i) a QName as an attribute/element value requires a new namespace URI, or (ii) DOM nodes as a portion of an object tree requires a new namespace URI.

      If you know in advance that you are going to use a certain set of namespace URIs, you can override this method and have the marshaller declare those namespace URIs at the root element.

      For example, by returning new String[]{"urn:foo"}, the marshaller will produce:

      
       <?xml version="1.0"?>
       <root xmlns:ns1="urn:foo">
         <ns1:child> ... </ns1:child>
         <ns1:child> ... </ns1:child>
         <ns1:child> ... </ns1:child>
         ...
       </root>
       

      To control prefixes assigned to those namespace URIs, use the NamespacePrefixMapper.getPreferredPrefix(String, String, boolean) method.

      Overrides:
      getPreDeclaredNamespaceUris in class NamespacePrefixMapper
      Returns:
      A list of namespace URIs as an array of Strings. This method can return a length-zero array but not null. None of the array component can be null. To represent the empty namespace, use the empty string "".