You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mi...@apache.org on 2003/05/15 22:13:17 UTC

cvs commit: xml-xalan/java/src/org/apache/xml/serializer Utils.java OutputPropertiesFactory.java Encodings.java SerializerFactory.java

minchau     2003/05/15 13:13:17

  Modified:    java/src/org/apache/xml/serializer
                        OutputPropertiesFactory.java Encodings.java
                        SerializerFactory.java
  Added:       java/src/org/apache/xml/serializer Utils.java
  Log:
  Performance enhancement. Cache the loading of classes via Class.forName(classname)
   in the serializer.  The same class is otherwise loaded over and over with each request
  to a server, e.g. in a servlet. 
  PR: bugzilla # 19960
  Submitted by:	Brian Minchau
  Reviewed by:	Morris Kwan
  
  Revision  Changes    Path
  1.2       +1 -1      xml-xalan/java/src/org/apache/xml/serializer/OutputPropertiesFactory.java
  
  Index: OutputPropertiesFactory.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/serializer/OutputPropertiesFactory.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- OutputPropertiesFactory.java	1 Apr 2003 19:24:54 -0000	1.1
  +++ OutputPropertiesFactory.java	15 May 2003 20:13:17 -0000	1.2
  @@ -303,7 +303,7 @@
                       // and trusted for having access to resources.
   
                       accessControllerClass =
  -                        Class.forName("java.security.AccessController");
  +                        Utils.ClassForName("java.security.AccessController");
   
                       // If we are here means user is using JDK >= 1.2.
                       // Using doPrivileged to be able to read property file without opening
  
  
  
  1.2       +2 -2      xml-xalan/java/src/org/apache/xml/serializer/Encodings.java
  
  Index: Encodings.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/serializer/Encodings.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Encodings.java	1 Apr 2003 19:24:54 -0000	1.1
  +++ Encodings.java	15 May 2003 20:13:17 -0000	1.2
  @@ -162,7 +162,7 @@
           try
           {
               charToByteConverterClass =
  -                Class.forName("sun.io.CharToByteConverter");
  +                Utils.ClassForName("sun.io.CharToByteConverter");
               Class argTypes[] = new Class[1];
               argTypes[0] = String.class;
               getConverterMethod =
  
  
  
  1.2       +2 -2      xml-xalan/java/src/org/apache/xml/serializer/SerializerFactory.java
  
  Index: SerializerFactory.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/serializer/SerializerFactory.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SerializerFactory.java	1 Apr 2003 19:24:54 -0000	1.1
  +++ SerializerFactory.java	15 May 2003 20:13:17 -0000	1.2
  @@ -124,7 +124,7 @@
                 + OutputPropertiesFactory.S_KEY_CONTENT_HANDLER + "' property!");
             }
   
  -          cls = Class.forName(className);
  +          cls = Utils.ClassForName(className);
   
             // _serializers.put(method, cls);
   
  @@ -153,7 +153,7 @@
                      * SAX ContentHandler events to the users handler.
                      */
                     className = SerializerConstants.DEFAULT_SAX_SERIALIZER;
  -                  cls = Class.forName(className);
  +                  cls = Utils.ClassForName(className);
                     SerializationHandler sh =
                         (SerializationHandler) cls.newInstance();
                     sh.setContentHandler( (ContentHandler) obj);
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xml/serializer/Utils.java
  
  Index: Utils.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2003, International Business
   * Machines, Inc., http://www.ibm.com.  For more information on the Apache
   * Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.xml.serializer;
  
  import java.util.Hashtable;
  
  /**
   * This class contains utilities used by the serializer
   */
  class Utils
  {
  
      /**
       * This nested class acts as a way to lazy load the hashtable
       * in a thread safe way.
       */
      static private class CacheHolder
      {
          static final Hashtable cache;
          static {
              cache = new Hashtable();
          }
      }
      /**
       * Load the class by name.
       * 
       * This implementation, for performance reasons,
       * caches all classes loaded by name and
       * returns the cached Class object if it can previously 
       * loaded classes that were load by name.  If not previously loaded
       * an attempt is made to load with Class.forName(classname)
       * @param classname the name of the class to be loaded
       * @return the loaded class, never null. If the class could not be
       * loaded a ClassNotFound exception is thrown.
       * @throws ClassNotFoundException if the class was not loaded
       */
      static Class ClassForName(String classname) throws ClassNotFoundException
      {
          Class c;
          // the first time the next line runs will reference
          // CacheHolder, causing the class to load and create the
          // Hashtable.
          Object o = CacheHolder.cache.get(classname);
          if (o == null)
          {
              try
              {
                  // class was not in the cache, so try to load it
                  c = Class.forName(classname);
                  CacheHolder.cache.put(classname, c);
              }
              catch (ClassNotFoundException e)
              {
                  // class could not be loaded, lets put it in the
                  // cache anyway to make subsequent attempts quicker.
                  c = null;
                  CacheHolder.cache.put(classname, null);
              }
          }
          else
          {
              c = (Class)o;
          }
          if (c == null)
              throw new ClassNotFoundException(); // never return null
          return c;
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org