You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by ra...@apache.org on 2004/09/25 17:09:32 UTC

cvs commit: xml-security/src/org/apache/xml/security Init.java

raul        2004/09/25 08:09:32

  Modified:    src/org/apache/xml/security/algorithms JCEMapper.java
               src/org/apache/xml/security Init.java
  Log:
  Use DOM lookup instead of XPath one.
  
  Revision  Changes    Path
  1.23      +179 -173  xml-security/src/org/apache/xml/security/algorithms/JCEMapper.java
  
  Index: JCEMapper.java
  ===================================================================
  RCS file: /home/cvs/xml-security/src/org/apache/xml/security/algorithms/JCEMapper.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- JCEMapper.java	3 Aug 2004 18:01:23 -0000	1.22
  +++ JCEMapper.java	25 Sep 2004 15:09:32 -0000	1.23
  @@ -21,17 +21,17 @@
   import java.security.Key;
   import java.security.Provider;
   import java.security.Security;
  +import java.util.ArrayList;
   import java.util.HashMap;
  +import java.util.Iterator;
  +import java.util.List;
   import java.util.Map;
   
  -import javax.xml.transform.TransformerException;
   
  +import org.apache.xml.security.Init;
   import org.apache.xml.security.utils.XMLUtils;
  -import org.apache.xpath.CachedXPathAPI;
  -import org.w3c.dom.Attr;
  -import org.w3c.dom.Document;
   import org.w3c.dom.Element;
  -import org.w3c.dom.NodeList;
  +
   
   
   /**
  @@ -45,36 +45,80 @@
       static org.apache.commons.logging.Log log = 
           org.apache.commons.logging.LogFactory.getLog(JCEMapper.class.getName());
   
  -   /** Field _providerList */
  -   private static Element _providerList = null;
   
  -   /** Field _nscontext */
  -   private static Element _nscontext = null;
  -   
  -   private static CachedXPathAPI cx=null;
      
      private static Map uriToProvider = new HashMap();
      private static Map cacheProviderIsInClassPath = new HashMap();
  +   
  +   private static Map providersMap = new HashMap();
  +   private static Map algorithmsMap = new HashMap();
   
      /**
       * Method init
       *
       * @param mappingElement
  -    * @param cx for using in the xpath searchs
       * @throws Exception
       */
  -   public static void init(Element mappingElement,CachedXPathAPI cx) throws Exception {
  -
  -      JCEMapper._providerList = mappingElement;
  +   public static void init(Element mappingElement) throws Exception {
   
  -      Document doc = mappingElement.getOwnerDocument();
  +      //JCEMapper._providerList = mappingElement;
   
  -      JCEMapper._nscontext =
  -         XMLUtils.createDSctx(doc, "x",
  -                              "http://www.xmlsecurity.org/NS/#configuration");
  -      JCEMapper.cx=cx;
  +      //Document doc = mappingElement.getOwnerDocument();
  +      loadProviders((Element)mappingElement.getElementsByTagName("Providers").item(0));
  +      loadAlgorithms((Element)mappingElement.getElementsByTagName("Algorithms").item(0));
  +   }
  +
  +   static void loadProviders( Element providers) {
  +   	    Element[] elements=XMLUtils.selectNodes(providers.getFirstChild(),Init.CONF_NS,"Provider");
  +        for (int i=0;i<elements.length;i++) {
  +            Element el=elements[i];
  +            String id=el.getAttribute("Id");
  +            List list=(List) providersMap.get(id);
  +            if (list==null) {
  +            	list=new ArrayList();
  +            }
  +            list.add(new ProviderJCE(el));
  +        	providersMap.put(id,list);
  +        }
  +   }
  +   static ProviderJCE getProvider(String id) {
  +    List list=(List) providersMap.get(id);
  +   	if (list==null) {
  +   		return null;
  +    }
  +    return (ProviderJCE) list.get(0);
  +    
  +   }
  +   static List getProviders(String id) {
  +    List list=(List) providersMap.get(id);
  +    if (list==null) {
  +        return null;
  +    }
  +    return list;    
  +   }
  +   static void loadAlgorithms( Element algorithmsEl) {
  +        Element[] algorithms=XMLUtils.selectNodes(algorithmsEl.getFirstChild(),Init.CONF_NS,"Algorithm");
  +    for (int i=0;i<algorithms.length;i++) {
  +        Element el=algorithms[i];
  +        String id=el.getAttribute("URI");
  +        Algorithm providerAlgoMap=new Algorithm(el);
  +        Element []providerAlgos=XMLUtils.selectNodes(el.getFirstChild(),Init.CONF_NS,"ProviderAlgo");
  +        for (int j=0;j<providerAlgos.length;j++) {
  +            Element elp=providerAlgos[j];
  +            AlgorithmMapping idA=new AlgorithmMapping(providerAlgoMap,elp);            
  +        	providerAlgoMap.put(idA.ProviderId,idA);
  +        }
  +        algorithmsMap.put(id,providerAlgoMap);
  +    }
  +    
  +   }
  +   static AlgorithmMapping getAlgorithmMapping(String algoURI,String providerId) {
  +   	    Map algo=(Map) algorithmsMap.get(algoURI);
  +        return (AlgorithmMapping) algo.get(providerId);
  +   }
  +   static Algorithm getAlgorithmMapping(String algoURI) {
  +   	   return ((Algorithm)algorithmsMap.get(algoURI));
      }
  -
      /**
       * This method takes a Provider ID and tries to register this provider in the JCE.
       *
  @@ -85,12 +129,8 @@
      public static boolean addProvider(String Id) {
   
         try {
  -         if (Security.getProvider(Id) == null) {
  -            Element providerElem = (Element) cx.selectSingleNode(
  -               JCEMapper._providerList,
  -               "./x:Providers/x:Provider[@Id='" + Id + "']",
  -               JCEMapper._nscontext);
  -            String providerClass = providerElem.getAttributeNS(null, "Class");
  +         if (Security.getProvider(Id) == null) {            
  +            String providerClass =  getProvider(Id).providerClass;
               java.security.Provider prov =
                  (java.security.Provider) Class.forName(providerClass)
                     .newInstance();
  @@ -108,7 +148,7 @@
                  }
               }
            }
  -      } catch (TransformerException ex) {}
  +      } 
         catch (ClassNotFoundException ex) {}
         catch (IllegalAccessException ex) {}
         catch (InstantiationException ex) {}
  @@ -134,18 +174,12 @@
         	return true;
         }
   
  -
  -      try {
  +       
   		  /* Allow for mulitple provider entries with same Id */
  -		  NodeList providers = cx.selectNodeList(JCEMapper._providerList,
  -													   "./x:Providers/x:Provider[@Id='"
  -													   + providerId + "']",
  -													   JCEMapper._nscontext);
  -
  -         for (int i = 0; available == false && i < providers.getLength(); i++) {
  -            Element pro = (Element) providers.item(i);
  +		  List providers = getProviders(providerId);
   
  -			String providerClass = pro.getAttributeNS(null, "Class");
  +         for (int i = 0; available == false && i < providers.size(); i++) {            
  +			String providerClass = ((ProviderJCE)providers.get(i)).providerClass;
   			try {
   				java.security.Provider prov =
   					(java.security.Provider) Class.forName(providerClass).newInstance();
  @@ -160,10 +194,7 @@
   			} catch (InstantiationException ex) {
   				//do nothing
   			}
  -		 }
  -      } catch (TransformerException ex) {
  -		//do nothing
  -      }
  +		 }      
         
         cacheProviderIsInClassPath.put(providerId,new Boolean(available));
         return available;
  @@ -205,23 +236,21 @@
         }
   
   
  -      try {
  +      
    
  -         NodeList providers = cx.selectNodeList(JCEMapper._providerList,
  -                                 "./x:Algorithms/x:Algorithm[@URI='"
  -                                 + AlgorithmURI + "']/x:ProviderAlgo",
  -                                 JCEMapper._nscontext);
  -
  -         for (int i = 0; i < providers.getLength(); i++) {
  -            Element pro = (Element) providers.item(i);
  -            String jceName = pro.getAttributeNS(null, "JCEName");
  -            String providerId = pro.getAttributeNS(null, "ProviderId");
  +         Iterator providers=getAlgorithmMapping(AlgorithmURI)
  +         .values()
  +         .iterator();
  +         
  +         while (providers.hasNext()) {
  +            
  +            AlgorithmMapping map= (AlgorithmMapping)providers.next();                        
   
  -            if (JCEMapper.getProviderIsInClassPath(providerId)) {
  -               JCEMapper.addProvider(providerId);
  +            if (JCEMapper.getProviderIsInClassPath(map.ProviderId)) {
  +               JCEMapper.addProvider(map.ProviderId);
   
  -               ProviderIdClass result = new ProviderIdClass(jceName,
  -                                           providerId);
  +               ProviderIdClass result = new ProviderIdClass(map.JCEName,
  +                                           map.ProviderId);
   
                  log.debug("Found " + result.getAlgorithmID() + " from provider "
                            + result.getProviderId());
  @@ -230,11 +259,7 @@
                  return result;
               }
            }
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -      }
  -
  -      return null;
  +         return null;
      }
   
      /**
  @@ -255,13 +280,9 @@
            return null;
         }
   
  -      try {
  -         Element pro = (Element) cx.selectSingleNode(
  -            JCEMapper._providerList,
  -            "./x:Algorithms/x:Algorithm[@URI='" + AlgorithmURI
  -            + "']/x:ProviderAlgo[@ProviderId='" + requestedProviderId + "']",
  -            JCEMapper._nscontext);
  -         String jceName = pro.getAttributeNS(null, "JCEName");
  +
  +         
  +         String jceName = getAlgorithmMapping(AlgorithmURI,requestedProviderId).JCEName;
   
            JCEMapper.addProvider(requestedProviderId);
   
  @@ -272,11 +293,6 @@
                      + result.getProviderId());
   
            return result;
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -      }
  -
  -      return null;
      }
   
      /**
  @@ -291,25 +307,18 @@
   
         log.debug("Request for URI " + AlgorithmURI);
   
  -      try {
  -         NodeList providers = cx.selectNodeList(JCEMapper._providerList,
  -                                 "./x:Algorithms/x:Algorithm[@URI='"
  -                                 + AlgorithmURI + "']/x:ProviderAlgo",
  -                                 JCEMapper._nscontext);
  -
  -         for (int i = 0; i < providers.getLength(); i++) {
  -            Element pro = (Element) providers.item(i);
  -            Attr jceName = pro.getAttributeNodeNS(null, "JCEName");
  -
  -            log.debug("Found " + jceName.getNodeValue());
  +         Iterator alth=getAlgorithmMapping(AlgorithmURI).entrySet().iterator();
  +         String uri=null;
  +         
  +         while (alth.hasNext()) {
  +            String cur=((AlgorithmMapping)alth.next()).JCEName;
  +            if (uri==null)
  +                uri=cur;
  +            log.debug("Found " + cur);
            }
   
  -         return ((Element) providers.item(0)).getAttributeNS(null, "JCEName");
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -
  -         return "";
  -      }
  +         return uri;
  +      
      }
   
      /**
  @@ -320,16 +329,8 @@
       */
      public static int getKeyTypeFromURI(String AlgorithmURI) {
   
  -      try {
  -         Attr algoclassAttr =
  -            (Attr) cx.selectSingleNode(JCEMapper._providerList,
  -                                             "./x:Algorithms/x:Algorithm[@URI='"
  -                                             + AlgorithmURI
  -                                             + "']/@AlgorithmClass", JCEMapper
  -                                                ._nscontext);
  +         String algoclass = getAlgorithmMapping(AlgorithmURI).algorithmClass;
   
  -         if (algoclassAttr != null) {            
  -            String algoclass = algoclassAttr.getNodeValue();
   
               if (algoclass.equals(JCEMapper.KEYTYPE_BLOCK_ENCRYPTION)) {
                  return javax.crypto.Cipher.SECRET_KEY;
  @@ -340,10 +341,6 @@
               } else if (algoclass.equals(JCEMapper.KEYTYPE_KEY_TRANSPORT)) {
                  return javax.crypto.Cipher.SECRET_KEY;
               }
  -         }
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -      }
   
         return -1;
      }
  @@ -356,22 +353,11 @@
       */
      public static int getKeyLengthFromURI(String AlgorithmURI) {
   
  -      try {
  -         Attr algoclassAttr =
  -            (Attr) cx.selectSingleNode(JCEMapper._providerList,
  -                                             "./x:Algorithms/x:Algorithm[@URI='"
  -                                             + AlgorithmURI + "']/@KeyLength",
  -                                             JCEMapper._nscontext);
  -
  -         if (algoclassAttr != null) {
  -            return Integer.parseInt(algoclassAttr.getNodeValue());
  -         }
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -      }
  -
  -      return 0;
  -   }
  +      
  +         
  +            return Integer.parseInt(getAlgorithmMapping(AlgorithmURI).keyLength);
  +         
  +    }
   
      /**
       * Method getJCEKeyAlgorithmFromURI
  @@ -384,23 +370,9 @@
      public static String getJCEKeyAlgorithmFromURI(String AlgorithmURI,
              String ProviderId) {
   
  -      try {
  -         Attr algoclassAttr =
  -            (Attr) cx.selectSingleNode(JCEMapper._providerList,
  -                                             "./x:Algorithms/x:Algorithm[@URI='"
  -                                             + AlgorithmURI
  -                                             + "']/x:ProviderAlgo[@ProviderId='"
  -                                             + ProviderId + "']/@RequiredKey",
  -                                             JCEMapper._nscontext);
  -
  -         if (algoclassAttr != null) {
  -            return algoclassAttr.getNodeValue();
  -         }
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -      }
  -
  -      return null;
  +   
  +   	return  getAlgorithmMapping(AlgorithmURI,ProviderId).RequiredKey;
  +    
      }
   
   
  @@ -411,24 +383,8 @@
       */
       public static String getJCEIVAlgorithmFromURI(String AlgorithmURI,
              String ProviderId) {
  -
  -      try {
  -         Attr algoclassAttr =
  -            (Attr) cx.selectSingleNode(JCEMapper._providerList,
  -                                             "./x:Algorithms/x:Algorithm[@URI='"
  -                                             + AlgorithmURI
  -                                             + "']/x:ProviderAlgo[@ProviderId='"
  -                                             + ProviderId + "']/@IVJCEName",
  -                                             JCEMapper._nscontext);
  -
  -         if (algoclassAttr != null) {
  -            return algoclassAttr.getNodeValue();
  -         }
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -      }
  -
  -      return null;
  +    	return  getAlgorithmMapping(AlgorithmURI,ProviderId).IVJCEName;
  +      
      }
   
      /** Field KEYTYPE_SYMMETRIC_KEY_WRAP           */
  @@ -455,26 +411,26 @@
       *
       */
      public static String getURIfromKey(Key key, String type) {
  -
  +      
         String JCEalgo = key.getAlgorithm();
         String keyLength = new Integer(key.getEncoded().length * 8).toString();
  -
  -      try {
  -         Attr URI = (Attr) cx.selectSingleNode(
  -            JCEMapper._providerList,
  -            "./x:Algorithms/x:Algorithm[@KeyLength='" + keyLength
  +      
  +      //try {
  +         //Attr URI = (Attr) cx.selectSingleNode(
  +            //JCEMapper._providerList,
  +          String xpath=  "./x:Algorithms/x:Algorithm[@KeyLength='" + keyLength
               + "' and @AlgorithmClass='" + type
  -            + "']/x:ProviderAlgo[@RequiredKey='" + JCEalgo + "']/../@URI",
  -            JCEMapper._nscontext);
  +            + "']/x:ProviderAlgo[@RequiredKey='" + JCEalgo + "']/../@URI";          
  +            //,JCEMapper._nscontext);
   
  -         if (URI != null) {
  +         /*if (URI != null) {
               return URI.getNodeValue();
  -         }
  -      } catch (TransformerException ex) {
  -         log.debug("Found nothing: " + ex.getMessage());
  -      }
  -
  -      return null;
  +         }*/
  +      //} catch (TransformerException ex) {
  +       //  log.debug("Found nothing: " + ex.getMessage());
  +      //}
  +      
  +      return xpath;
      }
   
      /*
  @@ -486,7 +442,57 @@
         return JCEMapper.getURIfromKey(key, JCEMapper.KEYTYPE_BLOCK_ENCRYPTION);
      }
      */
  -
  +   /**
  +    * Represents the ProviderJCE xml element
  +    */
  +   public  static class ProviderJCE {
  +     String providerClass;
  +     /**
  +      * Gets the data from element.
  +      * @param el
  +      */
  +     public ProviderJCE(Element el) {
  +        providerClass = el.getAttributeNS(null, "Class");        
  +     }	
  +   }
  +   /**
  +    * Represents the Algorithm xml element
  +    */   
  +   public static class Algorithm extends HashMap {
  +   	    String algorithmClass;
  +   	    String keyLength;
  +        /**
  +         * Gets data from element
  +         * @param el
  +         */
  +        public Algorithm(Element el) {
  +        	algorithmClass=el.getAttribute("AlgorithmClass");
  +            keyLength=el.getAttribute("KeyLength");
  +        }
  +   }
  +   /**
  +    * Represents the AlgorithmMapping xml element
  +    */
  +   public static class AlgorithmMapping {
  +   	   String RequiredKey;
  +       String ProviderId;
  +       String JCEName;
  +       String IVJCEName;
  +       Algorithm algo;
  +       /**
  +        * Gets data from element
  +        * @param algo
  +        * @param el
  +        */
  +       public AlgorithmMapping(Algorithm algo,Element el) {
  +        this.algo=algo;
  +        RequiredKey=el.getAttribute("RequiredKey");
  +        ProviderId=el.getAttribute("ProviderId");
  +        JCEName=el.getAttribute("JCEName");
  +        IVJCEName=el.getAttribute("IVJCEName");
  +    }
  +   }
  +   
      /**
       * Class ProviderIdClass
       *
  
  
  
  1.27      +215 -206  xml-security/src/org/apache/xml/security/Init.java
  
  Index: Init.java
  ===================================================================
  RCS file: /home/cvs/xml-security/src/org/apache/xml/security/Init.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- Init.java	24 Sep 2004 20:54:28 -0000	1.26
  +++ Init.java	25 Sep 2004 15:09:32 -0000	1.27
  @@ -18,9 +18,11 @@
   
   
   
  -import java.io.*;
  -import java.lang.reflect.Method;
  -import javax.xml.parsers.*;
  +import java.io.InputStream;
  +
  +import javax.xml.parsers.DocumentBuilder;
  +import javax.xml.parsers.DocumentBuilderFactory;
  +
   import org.apache.xml.security.algorithms.JCEMapper;
   import org.apache.xml.security.algorithms.SignatureAlgorithm;
   import org.apache.xml.security.c14n.Canonicalizer;
  @@ -28,13 +30,17 @@
   import org.apache.xml.security.keys.keyresolver.KeyResolver;
   import org.apache.xml.security.transforms.Transform;
   import org.apache.xml.security.transforms.implementations.FuncHere;
  -import org.apache.xml.security.utils.*;
  +import org.apache.xml.security.utils.I18n;
  +import org.apache.xml.security.utils.PRNG;
  +import org.apache.xml.security.utils.XMLUtils;
   import org.apache.xml.security.utils.resolver.ResourceResolver;
  -import org.apache.xpath.CachedXPathAPI;
   import org.apache.xpath.compiler.FuncLoader;
   import org.apache.xpath.compiler.FunctionTable;
   import org.apache.xpath.functions.Function;
  -import org.w3c.dom.*;
  +import org.w3c.dom.Attr;
  +import org.w3c.dom.Document;
  +import org.w3c.dom.Element;
  +import org.w3c.dom.Node;
   
   
   /**
  @@ -53,6 +59,9 @@
   
      /** Field _initialized */
      private static boolean _alreadyInitialized = false;
  +   
  +   /** The namespace for CONF file **/
  +   public static final String CONF_NS="http://www.xmlsecurity.org/NS/#configuration";
   
      /**
       * Method isInitialized
  @@ -69,7 +78,22 @@
       */
      public synchronized static void init() {
   
  -      if (!_alreadyInitialized) {
  +      if (_alreadyInitialized) {
  +        return;
  +      }
  +      long XX_configure_i18n_end=0;
  +      long XX_configure_reg_c14n_start=0;
  +      long XX_configure_reg_c14n_end=0;
  +      long XX_configure_reg_here_start=0;
  +      long XX_configure_reg_jcemapper_end=0;
  +      long XX_configure_reg_keyInfo_start=0;
  +      long XX_configure_reg_keyResolver_end=0;
  +      long XX_configure_reg_prefixes_start=0;
  +      long XX_configure_reg_resourceresolver_start=0;
  +      long XX_configure_reg_sigalgos_end=0;
  +      long XX_configure_reg_transforms_end=0;
  +      long XX_configure_reg_keyInfo_end=0;
  +      long XX_configure_reg_keyResolver_start=0;
            _alreadyInitialized = true;
   
            try {
  @@ -95,26 +119,47 @@
                     .getResourceAsStream(cfile != null ? cfile : "resource/config.xml");
   
               Document doc = db.parse(is);
  -            long XX_parsing_end = System.currentTimeMillis();
  -            Element context = doc.createElementNS(null, "nscontext");
  -
  -            context.setAttributeNS(
  -               Constants.NamespaceSpecNS, "xmlns:x",
  -                    "http://www.xmlsecurity.org/NS/#configuration");
  -            CachedXPathAPI cx=new CachedXPathAPI();
  -            long XX_configure_i18n_start = System.currentTimeMillis();
  -
  +            long XX_parsing_end = System.currentTimeMillis();            
  +            XX_configure_reg_here_start = System.currentTimeMillis();
  +            registerHereFunction();
  +            long XX_configure_reg_here_end = System.currentTimeMillis();
  +            //CachedXPathAPI cx=new CachedXPathAPI();
  +            long XX_configure_i18n_start = 0;            
  +            
               {
  +                XX_configure_reg_keyInfo_start = System.currentTimeMillis();
  +               try {
  +                  KeyInfo.init();
  +               } catch (Exception e) {
  +                  e.printStackTrace();
   
  +                  throw e;
  +               }
  +               XX_configure_reg_keyInfo_end = System.currentTimeMillis();
  +            }
  +            
  +			long XX_configure_reg_transforms_start=0;
  +			long XX_configure_reg_jcemapper_start=0;
  +			long XX_configure_reg_sigalgos_start=0;
  +			long XX_configure_reg_resourceresolver_end=0;
  +			long XX_configure_reg_prefixes_end=0;
  +            Node config=doc.getFirstChild();
  +            for (;config!=null;config=config.getNextSibling()) {
  +            	if ("Configuration".equals(config.getLocalName())) {
  +            		break;
  +                }
  +            }
  +			for (Node el=config.getFirstChild();el!=null;el=el.getNextSibling()) {
  +                if (!(el instanceof Element)) {
  +                	continue;
  +                }
  +                String tag=el.getLocalName();
  +            if (tag.equals("ResourceBundles")){
  +                XX_configure_i18n_start = System.currentTimeMillis();
  +            	Element resource=(Element)el;
                  /* configure internationalization */
  -               Attr langAttr = (Attr) cx.selectSingleNode(
  -                  doc,
  -                  "/x:Configuration/x:ResourceBundles/@defaultLanguageCode",
  -                  context);
  -               Attr countryAttr = (Attr) cx.selectSingleNode(
  -                  doc,
  -                  "/x:Configuration/x:ResourceBundles/@defaultCountryCode",
  -                  context);
  +               Attr langAttr = resource.getAttributeNode("defaultLanguageCode");
  +               Attr countryAttr = resource.getAttributeNode("defaultCountryCode");
                  String languageCode = (langAttr == null)
                                        ? null
                                        : langAttr.getNodeValue();
  @@ -123,68 +168,23 @@
                                       : countryAttr.getNodeValue();
   
                  I18n.init(languageCode, countryCode);
  +               XX_configure_i18n_end = System.currentTimeMillis();
               }
  -
  -            long XX_configure_i18n_end = System.currentTimeMillis();
  -
  -            /**
  -             * Try to register our here() implementation as internal function.
  -             */
  -            long XX_configure_reg_here_start = System.currentTimeMillis();
  -
  -            {
  -                FunctionTable.installFunction("here", new FuncHere());
  -                log.debug("Registered class " + FuncHere.class.getName()
  -                        + " for XPath function 'here()' function in internal table");
  -
  -                /* The following tweak by "Eric Olson" <eg...@alum.mit.edu>
  -                 * is to enable xml-security to play with JDK 1.4 which
  -                 * unfortunately bundles an old version of Xalan
  -                 */
  -                FuncLoader funcHereLoader = new FuncHereLoader();
  -
  -                try {
  -                    java.lang.reflect.Field mFunctions = FunctionTable.class.getField("m_functions");
  -                    FuncLoader[] m_functions = (FuncLoader[]) mFunctions.get(null);
  -
  -                    for (int i = 0; i < m_functions.length; i++) {
  -                        FuncLoader loader = m_functions[i];
  -
  -                        if (loader != null) {
  -                            log.debug("Func " + i + " " + loader.getName());
  -
  -                            if (loader.getName().equals(funcHereLoader.getName())) {
  -                                m_functions[i] = funcHereLoader;
  -                            }
  -                        }
  -                    }
  -                } catch (Exception e) {
  -                    log.info("Unable to patch xalan function table.", e);
  -                }
  -            }
  -             
  -            long XX_configure_reg_here_end = System.currentTimeMillis();
  -            long XX_configure_reg_c14n_start = System.currentTimeMillis();
  -
  -            {
  +           
  +            if (tag.equals("CanonicalizationMethods")){
  +                XX_configure_reg_c14n_start = System.currentTimeMillis();
                  Canonicalizer.init();
  +               Element[] list=XMLUtils.selectNodes(el.getFirstChild(),CONF_NS,"CanonicalizationMethod");               
   
  -               NodeList c14nElem = cx.selectNodeList(
  -                  doc,
  -                  "/x:Configuration/x:CanonicalizationMethods/x:CanonicalizationMethod",
  -                  context);
  -
  -               for (int i = 0; i < c14nElem.getLength(); i++) {
  -                  String URI = ((Element) c14nElem.item(i)).getAttributeNS(null,
  +               for (int i = 0; i < list.length; i++) {
  +                  String URI = list[i].getAttributeNS(null,
                                     "URI");
                     String JAVACLASS =
  -                     ((Element) c14nElem.item(i)).getAttributeNS(null,
  +                     list[i].getAttributeNS(null,
                           "JAVACLASS");
  -                  boolean registerClass = true;
  -
                     try {
  -                     Class c = Class.forName(JAVACLASS);
  -                     Method methods[] = c.getMethods();
  +                      Class.forName(JAVACLASS);
  +/*                     Method methods[] = c.getMethods();
   
                        for (int j = 0; j < methods.length; j++) {
                           Method currMeth = methods[j];
  @@ -193,139 +193,114 @@
                                   .equals(JAVACLASS)) {
                              log.debug(currMeth.getDeclaringClass());
                           }
  -                     }
  +                     }*/
  +                     log.debug("Canonicalizer.register(" + URI + ", "
  +                            + JAVACLASS + ")");
  +                     Canonicalizer.register(URI, JAVACLASS);
                     } catch (ClassNotFoundException e) {
                        Object exArgs[] = { URI, JAVACLASS };
   
                        log.fatal(I18n.translate("algorithm.classDoesNotExist",
                                                 exArgs));
  -
  -                     registerClass = false;
  -                  }
  -
  -                  if (registerClass) {
  -                     log.debug("Canonicalizer.register(" + URI + ", "
  -                               + JAVACLASS + ")");
  -                     Canonicalizer.register(URI, JAVACLASS);
                     }
                  }
  +               XX_configure_reg_c14n_end = System.currentTimeMillis();
               }
  -
  -            long XX_configure_reg_c14n_end = System.currentTimeMillis();
  -            long XX_configure_reg_transforms_start = System.currentTimeMillis();
  -
  -            {
  +                        
  +            if (tag.equals("TransformAlgorithms")){
  +               XX_configure_reg_transforms_start = System.currentTimeMillis();
                  Transform.init();
   
  -               NodeList tranElem = cx.selectNodeList(
  -                  doc,
  -                  "/x:Configuration/x:TransformAlgorithms/x:TransformAlgorithm",
  -                  context);
  +               Element[] tranElem = XMLUtils.selectNodes(el.getFirstChild(),CONF_NS,"TransformAlgorithm");
   
  -               for (int i = 0; i < tranElem.getLength(); i++) {
  -                  String URI = ((Element) tranElem.item(i)).getAttributeNS(null,
  +               for (int i = 0; i < tranElem.length; i++) {
  +                  String URI = tranElem[i].getAttributeNS(null,
                                     "URI");
                     String JAVACLASS =
  -                     ((Element) tranElem.item(i)).getAttributeNS(null,
  +                     tranElem[i].getAttributeNS(null,
                           "JAVACLASS");
  -                  boolean registerClass = true;
  -
                     try {
                        Class.forName(JAVACLASS);
  +                     log.debug("Transform.register(" + URI + ", " + JAVACLASS
  +                            + ")");
  +                     Transform.register(URI, JAVACLASS);
                     } catch (ClassNotFoundException e) {
                        Object exArgs[] = { URI, JAVACLASS };
   
                        log.fatal(I18n.translate("algorithm.classDoesNotExist",
                                                 exArgs));
   
  -                     registerClass = false;
  -                  }
  -
  -                  if (registerClass) {
  -                     log.debug("Transform.register(" + URI + ", " + JAVACLASS
  -                               + ")");
  -                     Transform.register(URI, JAVACLASS);
                     }
                  }
  +               XX_configure_reg_transforms_end = System.currentTimeMillis();
               }
  +                        
   
  -            long XX_configure_reg_transforms_end = System.currentTimeMillis();
  -            long XX_configure_reg_jcemapper_start = System.currentTimeMillis();
  -
  -            {
  -               Element jcemapperElem = (Element) cx.selectSingleNode(
  -                  doc, "/x:Configuration/x:JCEAlgorithmMappings", context);
  -
  -               JCEMapper.init(jcemapperElem,cx);
  +            if ("JCEAlgorithmMappings".equals(tag)){
  +               XX_configure_reg_jcemapper_start = System.currentTimeMillis();
  +               JCEMapper.init((Element)el);
  +               XX_configure_reg_jcemapper_end = System.currentTimeMillis();
               }
   
  -            long XX_configure_reg_jcemapper_end = System.currentTimeMillis();
  -            long XX_configure_reg_sigalgos_start = System.currentTimeMillis();
  +                        
   
  -            {
  +            if (tag.equals("SignatureAlgorithms")){
  +               XX_configure_reg_sigalgos_start = System.currentTimeMillis();
                  SignatureAlgorithm.providerInit();
   
  -               NodeList sigElems = cx.selectNodeList(
  -                  doc,
  -                  "/x:Configuration/x:SignatureAlgorithms/x:SignatureAlgorithm",
  -                  context);
  +               Element[] sigElems = XMLUtils.selectNodes(el.getFirstChild(), CONF_NS,                  
  +                  "SignatureAlgorithm");
   
  -               for (int i = 0; i < sigElems.getLength(); i++) {
  -                  String URI = ((Element) sigElems.item(i)).getAttributeNS(null,
  +               for (int i = 0; i < sigElems.length; i++) {
  +                  String URI = sigElems[i].getAttributeNS(null,
                                     "URI");
                     String JAVACLASS =
  -                     ((Element) sigElems.item(i)).getAttributeNS(null,
  +                    sigElems[i].getAttributeNS(null,
                           "JAVACLASS");
   
                     /** $todo$ handle registering */
  -                  boolean registerClass = true;
   
                     try {
  -                     Class c = Class.forName(JAVACLASS);
  -                     Method methods[] = c.getMethods();
  +                      Class.forName(JAVACLASS);
  + //                    Method methods[] = c.getMethods();
   
  -                     for (int j = 0; j < methods.length; j++) {
  -                        Method currMeth = methods[j];
  -
  -                        if (currMeth.getDeclaringClass().getName()
  -                                .equals(JAVACLASS)) {
  -                           log.debug(currMeth.getDeclaringClass());
  -                        }
  -                     }
  +//                     for (int j = 0; j < methods.length; j++) {
  +//                        Method currMeth = methods[j];
  +//
  +//                        if (currMeth.getDeclaringClass().getName()
  +//                                .equals(JAVACLASS)) {
  +//                           log.debug(currMeth.getDeclaringClass());
  +//                        }
  +//                     }
  +                     log.debug("SignatureAlgorithm.register(" + URI + ", "
  +                            + JAVACLASS + ")");
  +                     SignatureAlgorithm.register(URI, JAVACLASS);
                     } catch (ClassNotFoundException e) {
                        Object exArgs[] = { URI, JAVACLASS };
   
                        log.fatal(I18n.translate("algorithm.classDoesNotExist",
                                                 exArgs));
   
  -                     registerClass = false;
  -                  }
  -
  -                  if (registerClass) {
  -                     log.debug("SignatureAlgorithm.register(" + URI + ", "
  -                               + JAVACLASS + ")");
  -                     SignatureAlgorithm.register(URI, JAVACLASS);
                     }
                  }
  +               XX_configure_reg_sigalgos_end = System.currentTimeMillis();
               }
   
  -            long XX_configure_reg_sigalgos_end = System.currentTimeMillis();
  -            long XX_configure_reg_resourceresolver_start =
  -               System.currentTimeMillis();
  -
  -            {
  +            
  +            
  +            if (tag.equals("ResourceResolvers")){
  +               XX_configure_reg_resourceresolver_start = System.currentTimeMillis();
                  ResourceResolver.init();
   
  -               NodeList resolverElem = cx.selectNodeList(
  -                  doc, "/x:Configuration/x:ResourceResolvers/x:Resolver",
  -                  context);
  +               Element[]resolverElem = XMLUtils.selectNodes(el.getFirstChild(),CONF_NS,
  +                  "Resolver");
   
  -               for (int i = 0; i < resolverElem.getLength(); i++) {
  +               for (int i = 0; i < resolverElem.length; i++) {
                     String JAVACLASS =
  -                     ((Element) resolverElem.item(i)).getAttributeNS(null,
  +                      resolverElem[i].getAttributeNS(null,
                           "JAVACLASS");
                     String Description =
  -                     ((Element) resolverElem.item(i)).getAttributeNS(null,
  +                     resolverElem[i].getAttributeNS(null,
                           "DESCRIPTION");
   
                     if ((Description != null) && (Description.length() > 0)) {
  @@ -337,39 +312,29 @@
                     }
   
                     ResourceResolver.register(JAVACLASS);
  -               }
  -            }
  +                  XX_configure_reg_resourceresolver_end =
  +                    System.currentTimeMillis();
  +               }               
   
  -            long XX_configure_reg_resourceresolver_end =
  -               System.currentTimeMillis();
  -            long XX_configure_reg_keyInfo_start = System.currentTimeMillis();
  -
  -            {
  -               try {
  -                  KeyInfo.init();
  -               } catch (Exception e) {
  -                  e.printStackTrace();
  -
  -                  throw e;
  -               }
               }
   
  -            long XX_configure_reg_keyInfo_end = System.currentTimeMillis();
  -            long XX_configure_reg_keyResolver_start =
  -               System.currentTimeMillis();
  +            
   
  -            {
  +            
  +
  +                        
  +            if (tag.equals("KeyResolver")){
  +               XX_configure_reg_keyResolver_start =System.currentTimeMillis();
                  KeyResolver.init();
   
  -               NodeList resolverElem = cx.selectNodeList(
  -                  doc, "/x:Configuration/x:KeyResolver/x:Resolver", context);
  +               Element[] resolverElem = XMLUtils.selectNodes(el.getFirstChild(), CONF_NS,"Resolver");
   
  -               for (int i = 0; i < resolverElem.getLength(); i++) {
  +               for (int i = 0; i < resolverElem.length; i++) {
                     String JAVACLASS =
  -                     ((Element) resolverElem.item(i)).getAttributeNS(null,
  +                     resolverElem[i].getAttributeNS(null,
                           "JAVACLASS");
                     String Description =
  -                     ((Element) resolverElem.item(i)).getAttributeNS(null,
  +                     resolverElem[i].getAttributeNS(null,
                           "DESCRIPTION");
   
                     if ((Description != null) && (Description.length() > 0)) {
  @@ -382,58 +347,102 @@
   
                     KeyResolver.register(JAVACLASS);
                  }
  +               XX_configure_reg_keyResolver_end = System.currentTimeMillis();
               }
   
  -            long XX_configure_reg_keyResolver_end = System.currentTimeMillis();
  -            long XX_configure_reg_prefixes_start = System.currentTimeMillis();
  -
  -            {
  +                        
  +            if (tag.equals("PrefixMappings")){
  +                XX_configure_reg_prefixes_start = System.currentTimeMillis();
                  log.debug("Now I try to bind prefixes:");
   
  -               NodeList nl = cx.selectNodeList(
  -                  doc, "/x:Configuration/x:PrefixMappings/x:PrefixMapping",
  -                  context);
  +               Element[] nl = XMLUtils.selectNodes(el.getFirstChild(), CONF_NS,"PrefixMapping");
   
  -               for (int i = 0; i < nl.getLength(); i++) {
  -                  String namespace = ((Element) nl.item(i)).getAttributeNS(null,
  +               for (int i = 0; i < nl.length; i++) {
  +                  String namespace = nl[i].getAttributeNS(null,
                                           "namespace");
  -                  String prefix = ((Element) nl.item(i)).getAttributeNS(null,
  +                  String prefix = nl[i].getAttributeNS(null,
                                        "prefix");
   
                     log.debug("Now I try to bind " + prefix + " to " + namespace);
                     org.apache.xml.security.utils.ElementProxy
                        .setDefaultPrefix(namespace, prefix);
                  }
  +               XX_configure_reg_prefixes_end = System.currentTimeMillis();
               }
  -
  -            long XX_configure_reg_prefixes_end = System.currentTimeMillis();
  +            }
  +            
               long XX_init_end = System.currentTimeMillis();
   
               //J-
  -            log.debug("XX_init                             " + ((int)(XX_init_end - XX_init_start)) + " ms");
  -            log.debug("  XX_prng                           " + ((int)(XX_prng_end - XX_prng_start)) + " ms");
  -            log.debug("  XX_parsing                        " + ((int)(XX_parsing_end - XX_parsing_start)) + " ms");
  -            log.debug("  XX_configure_i18n                 " + ((int)(XX_configure_i18n_end- XX_configure_i18n_start)) + " ms");
  -            log.debug("  XX_configure_reg_c14n             " + ((int)(XX_configure_reg_c14n_end- XX_configure_reg_c14n_start)) + " ms");
  -            log.debug("  XX_configure_reg_here             " + ((int)(XX_configure_reg_here_end- XX_configure_reg_here_start)) + " ms");
  -            log.debug("  XX_configure_reg_jcemapper        " + ((int)(XX_configure_reg_jcemapper_end- XX_configure_reg_jcemapper_start)) + " ms");
  -            log.debug("  XX_configure_reg_keyInfo          " + ((int)(XX_configure_reg_keyInfo_end- XX_configure_reg_keyInfo_start)) + " ms");
  -            log.debug("  XX_configure_reg_keyResolver      " + ((int)(XX_configure_reg_keyResolver_end- XX_configure_reg_keyResolver_start)) + " ms");
  -            log.debug("  XX_configure_reg_prefixes         " + ((int)(XX_configure_reg_prefixes_end- XX_configure_reg_prefixes_start)) + " ms");
  -            log.debug("  XX_configure_reg_resourceresolver " + ((int)(XX_configure_reg_resourceresolver_end- XX_configure_reg_resourceresolver_start)) + " ms");
  -            log.debug("  XX_configure_reg_sigalgos         " + ((int)(XX_configure_reg_sigalgos_end- XX_configure_reg_sigalgos_start)) + " ms");
  -            log.debug("  XX_configure_reg_transforms       " + ((int)(XX_configure_reg_transforms_end- XX_configure_reg_transforms_start)) + " ms");
  +            log.error("XX_init                             " + ((int)(XX_init_end - XX_init_start)) + " ms");
  +            log.error("  XX_prng                           " + ((int)(XX_prng_end - XX_prng_start)) + " ms");
  +            log.error("  XX_parsing                        " + ((int)(XX_parsing_end - XX_parsing_start)) + " ms");
  +            
  +            log.error("  XX_configure_i18n                 " + ((int)(XX_configure_i18n_end- XX_configure_i18n_start)) + " ms");
  +			log.error("  XX_configure_reg_c14n             " + ((int)(XX_configure_reg_c14n_end- XX_configure_reg_c14n_start)) + " ms");            
  +			log.error("  XX_configure_reg_here             " + ((int)(XX_configure_reg_here_end- XX_configure_reg_here_start)) + " ms");            
  +			log.error("  XX_configure_reg_jcemapper        " + ((int)(XX_configure_reg_jcemapper_end- XX_configure_reg_jcemapper_start)) + " ms");
  +            
  +			
  +			log.error("  XX_configure_reg_keyInfo          " + ((int)(XX_configure_reg_keyInfo_end- XX_configure_reg_keyInfo_start)) + " ms");            
  +			
  +			log.error("  XX_configure_reg_keyResolver      " + ((int)(XX_configure_reg_keyResolver_end- XX_configure_reg_keyResolver_start)) + " ms");            
  +			log.error("  XX_configure_reg_prefixes         " + ((int)(XX_configure_reg_prefixes_end- XX_configure_reg_prefixes_start)) + " ms");            
  +			log.error("  XX_configure_reg_resourceresolver " + ((int)(XX_configure_reg_resourceresolver_end- XX_configure_reg_resourceresolver_start)) + " ms");            
  +			log.error("  XX_configure_reg_sigalgos         " + ((int)(XX_configure_reg_sigalgos_end- XX_configure_reg_sigalgos_start)) + " ms");            
  +			log.error("  XX_configure_reg_transforms       " + ((int)(XX_configure_reg_transforms_end- XX_configure_reg_transforms_start)) + " ms");
               //J+
            } catch (Exception e) {
               log.fatal("Bad: ", e);
               e.printStackTrace();
            }
  -      }
  +      
      }
   
   
   
      /**
  + * 
  + */
  +private static void registerHereFunction() {
  +	/**
  +	 * Try to register our here() implementation as internal function.
  +	 */            
  +	{	    
  +	    FunctionTable.installFunction("here", new FuncHere());
  +	    log.debug("Registered class " + FuncHere.class.getName()
  +	            + " for XPath function 'here()' function in internal table");
  +
  +	    /* The following tweak by "Eric Olson" <eg...@alum.mit.edu>
  +	     * is to enable xml-security to play with JDK 1.4 which
  +	     * unfortunately bundles an old version of Xalan
  +	     */
  +	    FuncLoader funcHereLoader = new FuncHereLoader();
  +
  +	    try {
  +	        java.lang.reflect.Field mFunctions = FunctionTable.class.getField("m_functions");
  +	        FuncLoader[] m_functions = (FuncLoader[]) mFunctions.get(null);
  +
  +	        for (int i = 0; i < m_functions.length; i++) {
  +	            FuncLoader loader = m_functions[i];
  +
  +	            if (loader != null) {
  +	                log.debug("Func " + i + " " + loader.getName());
  +
  +	                if (loader.getName().equals(funcHereLoader.getName())) {
  +	                    m_functions[i] = funcHereLoader;
  +	                }
  +	            }
  +	        }
  +	    } catch (Exception e) {
  +	        log.info("Unable to patch xalan function table.", e);
  +	    }
  +	}
  +}
  +
  +
  +
  +/**
       * Class FuncHereLoader
       *
       * @author $Author$