FileDocCategorySizeDatePackage
ElementProxy.javaAPI DocJava SE 6 API15457Tue Jun 10 00:23:04 BST 2008com.sun.org.apache.xml.internal.security.utils

ElementProxy

public abstract class ElementProxy extends Object
This is the base class to all Objects which have a direct 1:1 mapping to an Element in a particular namespace.
author
$Author: mullan $

Fields Summary
static Logger
log
{@link java.util.logging} logging facility
public static final int
MODE_CREATE
The element has been created by the code
public static final int
MODE_PROCESS
The element has been readed from a DOM tree by the code
public static final int
MODE_UNKNOWN
The element isn't known if it is readen or created
public static final int
MODE_SIGN
The element is going to be signed
public static final int
MODE_VERIFY
The element is going to be verified
public static final int
MODE_ENCRYPT
The element is going to be encrypted
public static final int
MODE_DECRYPT
The element is going to be decrypted
protected int
_state
protected Element
_constructionElement
Field _constructionElement
protected String
_baseURI
Field _baseURI
protected Document
_doc
Field _doc
static HashMap
_prefixMappings
Field _prefixMappings
Constructors Summary
public ElementProxy()
Constructor ElementProxy


         
     

      this._doc = null;
      this._state = ElementProxy.MODE_UNKNOWN;
      this._baseURI = null;
      this._constructionElement = null;
   
public ElementProxy(Document doc)
Constructor ElementProxy

param
doc


      this();

      if (doc == null) {
         throw new RuntimeException("Document is null");
      }

      this._doc = doc;
      this._state = ElementProxy.MODE_CREATE;
      this._constructionElement = ElementProxy.createElementForFamily(this._doc,
              this.getBaseNamespace(), this.getBaseLocalName());      
   
public ElementProxy(Element element, String BaseURI)
Constructor ElementProxy

param
element
param
BaseURI
throws
XMLSecurityException


      this();

      if (element == null) {
         throw new XMLSecurityException("ElementProxy.nullElement");
      }
      
      if (true) {
      	if (log.isLoggable(java.util.logging.Level.FINE))                                     log.log(java.util.logging.Level.FINE, "setElement(\"" + element.getTagName() + "\", \"" + BaseURI
                + "\")");
      }

      this._doc = element.getOwnerDocument();
      this._state = ElementProxy.MODE_PROCESS;
      this._constructionElement = element;
      this._baseURI = BaseURI;

      this.guaranteeThatElementInCorrectSpace();
   
Methods Summary
public voidaddBase64Element(byte[] bytes, java.lang.String localname)
Method addBase64Element

param
bytes
param
localname


      if (bytes != null) {

         Element e = Base64.encodeToElement(this._doc, localname, bytes);

         this._constructionElement.appendChild(e);
         this._constructionElement.appendChild(this._doc.createTextNode("\n"));
      }
   
public voidaddBase64Text(byte[] bytes)
Method addBase64Text

param
bytes


      if (bytes != null) {
         Text t = this._doc.createTextNode("\n" + Base64.encode(bytes) + "\n");

         this._constructionElement.appendChild(t);
      }
   
public voidaddBigIntegerElement(java.math.BigInteger bi, java.lang.String localname)
Method setVal

param
bi
param
localname


      if (bi != null) {
         Element e = XMLUtils.createElementInSignatureSpace(this._doc,
                        localname);

         Base64.fillElementWithBigInteger(e, bi);
         this._constructionElement.appendChild(e);
         XMLUtils.addReturnToElement(this._constructionElement);
      }
   
public voidaddText(java.lang.String text)
Method addText

param
text


      if (text != null) {
         Text t = this._doc.createTextNode(text);

         this._constructionElement.appendChild(t);
      }
   
public voidaddTextElement(java.lang.String text, java.lang.String localname)
Method addTextElement

param
text
param
localname


      Element e = XMLUtils.createElementInSignatureSpace(this._doc, localname);
      Text t = this._doc.createTextNode(text);

      e.appendChild(t);
      this._constructionElement.appendChild(e);
      XMLUtils.addReturnToElement(this._constructionElement);
   
public static org.w3c.dom.ElementcreateElementForFamily(org.w3c.dom.Document doc, java.lang.String namespace, java.lang.String localName)
This method creates an Element in a given namespace with a given localname. It uses the {@link ElementProxy#getDefaultPrefix} method to decide whether a particular prefix is bound to that namespace.
This method was refactored out of the constructor.

param
doc
param
namespace
param
localName
return
The element created.

       //Element nscontext = XMLUtils.createDSctx(doc, "x", namespace);
      Element result = null;
      String prefix = ElementProxy.getDefaultPrefix(namespace);

      if (namespace == null) {
         result = doc.createElementNS(null, localName);
      } else {
         if ((prefix == null) || (prefix.length() == 0)) {
            result = doc.createElementNS(namespace, localName);

            result.setAttributeNS(Constants.NamespaceSpecNS, "xmlns",
                                  namespace);
         } else {
            result = doc.createElementNS(namespace, prefix + ":" + localName);

            result.setAttributeNS(Constants.NamespaceSpecNS, "xmlns:" + prefix,
                                  namespace);
         }
      }

      return result;
   
public abstract java.lang.StringgetBaseLocalName()
Returns the localname of the Elements of the sub-class.

return
the localname of the Elements of the sub-class.

public abstract java.lang.StringgetBaseNamespace()
Returns the namespace of the Elements of the sub-class.

return
the namespace of the Elements of the sub-class.

public java.lang.StringgetBaseURI()
Method getBaseURI

return
the base uri of the namespace of this element

      return this._baseURI;
   
public java.math.BigIntegergetBigIntegerFromChildElement(java.lang.String localname, java.lang.String namespace)
Method getVal

param
localname
param
namespace
return
The biginter contained in the given element
throws
Base64DecodingException

   	    
   		return Base64.decodeBigIntegerFromText(
   				XMLUtils.selectNodeText(this._constructionElement.getFirstChild(),
   						namespace,localname,0));

   
public byte[]getBytesFromChildElement(java.lang.String localname, java.lang.String namespace)
Method getBytesFromChildElement

param
localname
param
namespace
return
the bytes
throws
XMLSecurityException

               
         Element e =
             XMLUtils.selectNode(
                 this._constructionElement.getFirstChild(),
                 namespace,
                 localname,
                 0);
            
         return Base64.decode(e);
   
public byte[]getBytesFromTextChild()
Method getBytesFromTextChild

return
The base64 bytes from the first text child of this element
throws
XMLSecurityException

      
         Text t = (Text)this._constructionElement.getFirstChild();
                                                   

         return Base64.decode(t.getData());
   
public static java.lang.StringgetDefaultPrefix(java.lang.String namespace)
Method getDefaultPrefix

param
namespace
return
the default prefix bind to this element.


      String prefix = (String) ElementProxy._prefixMappings.get(namespace);

      return prefix;
   
public org.w3c.dom.DocumentgetDocument()
Method getDocument

return
the Document where this element is contained.

      return this._doc;
   
public final org.w3c.dom.ElementgetElement()
Returns the Element which was constructed by the Object.

return
the Element which was constructed by the Object.

      return this._constructionElement;
   
public final org.w3c.dom.NodeListgetElementPlusReturns()
Returns the Element plus a leading and a trailing CarriageReturn Text node.

return
the Element which was constructed by the Object.


      HelperNodeList nl = new HelperNodeList();

      nl.appendChild(this._doc.createTextNode("\n"));
      nl.appendChild(this.getElement());
      nl.appendChild(this._doc.createTextNode("\n"));

      return nl;
   
public java.lang.StringgetTextFromChildElement(java.lang.String localname, java.lang.String namespace)
Method getTextFromChildElement

param
localname
param
namespace
return
the Text of the textNode

              
         Text t =
             (Text) XMLUtils.selectNode(
                        this._constructionElement.getFirstChild(),
                        namespace,
                        localname,
                        0).getFirstChild();

         return t.getData();      
   
public java.lang.StringgetTextFromTextChild()
Method getTextFromTextChild

return
the Text obtained concatening all the the text nodes of this element

      return XMLUtils.getFullTextChildrenFromElement(this._constructionElement);
   
public voidguaranteeThatElementInCorrectSpace()
Method guaranteeThatElementInCorrectSpace

throws
XMLSecurityException


      String localnameSHOULDBE = this.getBaseLocalName();
      String namespaceSHOULDBE = this.getBaseNamespace();
      
      String localnameIS = this._constructionElement.getLocalName();
      String namespaceIS = this._constructionElement.getNamespaceURI();
      if ( !localnameSHOULDBE.equals(localnameIS) ||
        !namespaceSHOULDBE.equals(namespaceIS)) {      
         Object exArgs[] = { namespaceIS +":"+ localnameIS, 
           namespaceSHOULDBE +":"+ localnameSHOULDBE};
         throw new XMLSecurityException("xml.WrongElement", exArgs);
      }
   
public intlength(java.lang.String namespace, java.lang.String localname)
Method length

param
namespace
param
localname
return
the number of elements {namespace}:localname under this element

   	    int number=0;
   	    Node sibling=this._constructionElement.getFirstChild();
   	    while (sibling!=null) {        
   	    	if (localname.equals(sibling.getLocalName())
   	    			&&  
					namespace.equals(sibling.getNamespaceURI())) {            
   	    		number++;
   	    	}
   	    	sibling=sibling.getNextSibling();
   	    }
   	    return number;
     
public static voidsetDefaultPrefix(java.lang.String namespace, java.lang.String prefix)
Method setDefaultPrefix

param
namespace
param
prefix
throws
XMLSecurityException


               
         
             
    
   	if (ElementProxy._prefixMappings.containsValue(prefix)) {
        
   		Object storedNamespace=ElementProxy._prefixMappings.get(namespace);
         if (!storedNamespace.equals(prefix)) {
         	Object exArgs[] = { prefix, namespace, storedNamespace };

         	throw new XMLSecurityException("prefix.AlreadyAssigned", exArgs);
         }
    }
      ElementProxy._prefixMappings.put(namespace, prefix);
   
public voidsetElement(org.w3c.dom.Element element, java.lang.String BaseURI)
Method setElement

param
element
param
BaseURI
throws
XMLSecurityException


      if (element == null) {
         throw new XMLSecurityException("ElementProxy.nullElement");
      }
      if (true) {
      }
      
      if (true) {
      	if (log.isLoggable(java.util.logging.Level.FINE))                                     log.log(java.util.logging.Level.FINE, "setElement(" + element.getTagName() + ", \"" + BaseURI + "\"");
      }
        
      this._doc = element.getOwnerDocument();
      this._state = ElementProxy.MODE_PROCESS;
      this._constructionElement = element;
      this._baseURI = BaseURI;
   
public voidsetXPathNamespaceContext(java.lang.String prefix, java.lang.String uri)
Adds an xmlns: definition to the Element. This can be called as follows:
// set namespace with ds prefix
xpathContainer.setXPathNamespaceContext("ds", "http://www.w3.org/2000/09/xmldsig#");
xpathContainer.setXPathNamespaceContext("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#");

param
prefix
param
uri
throws
XMLSecurityException


      String ns;

      if ((prefix == null) || (prefix.length() == 0)) {
       throw new XMLSecurityException("defaultNamespaceCannotBeSetHere");
      } else if (prefix.equals("xmlns")) {
        throw new XMLSecurityException("defaultNamespaceCannotBeSetHere");
      } else if (prefix.startsWith("xmlns:")) {
         ns = prefix;//"xmlns:" + prefix.substring("xmlns:".length());
      } else {
         ns = "xmlns:" + prefix;
      }

      

      Attr a = this._constructionElement.getAttributeNodeNS(Constants.NamespaceSpecNS, ns);

      if (a != null) { 
       if (!a.getNodeValue().equals(uri)) {
         Object exArgs[] = { ns,
                             this._constructionElement.getAttributeNS(null,
                                                                      ns) };

         throw new XMLSecurityException("namespacePrefixAlreadyUsedByOtherURI",
                                        exArgs);
       }
       return;
      }

      this._constructionElement.setAttributeNS(Constants.NamespaceSpecNS, ns,
                                               uri);