Home » geronimo-2.2-source-release » org.apache.geronimo.kernel.log » [javadoc | source]

    1   /**
    2    *
    3    * Copyright 2003-2004 The Apache Software Foundation
    4    *
    5    *  Licensed under the Apache License, Version 2.0 (the "License");
    6    *  you may not use this file except in compliance with the License.
    7    *  You may obtain a copy of the License at
    8    *
    9    *     http://www.apache.org/licenses/LICENSE-2.0
   10    *
   11    *  Unless required by applicable law or agreed to in writing, software
   12    *  distributed under the License is distributed on an "AS IS" BASIS,
   13    *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   14    *  See the License for the specific language governing permissions and
   15    *  limitations under the License.
   16    */
   17   
   18   package org.apache.geronimo.kernel.log;
   19   
   20   import java.util.HashMap;
   21   import java.util.HashSet;
   22   import java.util.Iterator;
   23   import java.util.Map;
   24   import java.util.Set;
   25   
   26   import org.apache.commons.logging.Log;
   27   import org.apache.commons.logging.LogConfigurationException;
   28   import org.apache.commons.logging.LogFactory;
   29   
   30   /**
   31    * @version $Rev: 168245 $ $Date: 2005-05-04 19:48:50 -0700 (Wed, 04 May 2005) $
   32    */
   33   public class GeronimoLogFactory extends LogFactory {
   34       private final static Object factoryLock = new Object();
   35       // todo this should use weak references
   36       private static final HashMap instancesByClassLoader = new HashMap();
   37   
   38       private static LogFactory logFactory = new BootstrapLogFactory();
   39   
   40       public GeronimoLogFactory() {
   41       }
   42   
   43       public LogFactory getLogFactory() {
   44           synchronized (factoryLock) {
   45               return logFactory;
   46           }
   47       }
   48   
   49       public void setLogFactory(LogFactory logFactory) {
   50           // change the log factory
   51           GeronimoLogFactory.logFactory = logFactory;
   52   
   53           // update all known logs to use instances of the new factory
   54           Set logs = getInstances();
   55           for (Iterator iterator = logs.iterator(); iterator.hasNext();) {
   56               GeronimoLog log = (GeronimoLog) iterator.next();
   57               log.setLog(logFactory.getInstance(log.getName()));
   58           }
   59       }
   60   
   61       public Set getInstances() {
   62           synchronized (factoryLock) {
   63               Set logs = new HashSet();
   64               for (Iterator iterator = instancesByClassLoader.values().iterator(); iterator.hasNext();) {
   65                   Map instanceMap = ((Map) iterator.next());
   66                   logs.addAll(instanceMap.values());
   67   
   68               }
   69               return logs;
   70           }
   71       }
   72   
   73       public Log getInstance(Class clazz) throws LogConfigurationException {
   74           synchronized (factoryLock) {
   75               return getInstance(clazz.getName());
   76           }
   77       }
   78   
   79       public Log getInstance(String name) throws LogConfigurationException {
   80           synchronized (factoryLock) {
   81               // get the instances for the context classloader
   82               ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
   83               Map instances = (Map) instancesByClassLoader.get(contextClassLoader);
   84               if (instances == null) {
   85                   instances = new HashMap();
   86                   instancesByClassLoader.put(contextClassLoader, instances);
   87               }
   88   
   89               // get the log
   90               Log log = (Log) instances.get(name);
   91               if (log == null) {
   92                   log = new GeronimoLog(name, logFactory.getInstance(name));
   93                   instances.put(name, log);
   94               }
   95               return log;
   96           }
   97       }
   98   
   99       public void release() {
  100           synchronized (factoryLock) {
  101   // TODO rethink this - it works for now
  102   //            for (Iterator maps = instancesByClassLoader.values().iterator(); maps.hasNext();) {
  103   //                Map instances = (Map) maps.next();
  104   //                for (Iterator logs = instances.values().iterator(); logs.hasNext();) {
  105   //                    GeronimoLog log = (GeronimoLog) logs.next();
  106   //                    log.setLog(null);
  107   //
  108   //                }
  109   //            }
  110               instancesByClassLoader.clear();
  111           }
  112       }
  113   
  114       public Object getAttribute(String name) {
  115           synchronized (factoryLock) {
  116               return logFactory.getAttribute(name);
  117           }
  118       }
  119   
  120       public String[] getAttributeNames() {
  121           synchronized (factoryLock) {
  122               return logFactory.getAttributeNames();
  123           }
  124       }
  125   
  126       public void removeAttribute(String name) {
  127           synchronized (factoryLock) {
  128               logFactory.removeAttribute(name);
  129           }
  130       }
  131   
  132       public void setAttribute(String name, Object value) {
  133           synchronized (factoryLock) {
  134               logFactory.setAttribute(name, value);
  135           }
  136       }
  137   }
  138   

Home » geronimo-2.2-source-release » org.apache.geronimo.kernel.log » [javadoc | source]