Hi All,

Here is a solution that hides the setMaxFileSize(long) method. It basically marks 
"maxFileSize" as a String property instead of a long property. This works in the sense 
that setMaxFileSize(long) need not be commented out (solving the backward 
compatibility problem with Velocity) and the different configurators use the right 
String-based setter method.

I do not like this solution because it just a hack. It presents an essentially long 
property as a string which is basically the wrong approach. As I understand it, the 
fundamental issue is that a given JavaBeans property can only have one and only one 
type. Consequently, the long term solution is to rename setMaxFileSize(long) and 
getMaxFileSize() to different names, e.g. setMaximumFileSize() and respectively 
getMaximumFileSize.  

Comments welcome, Ceki

/*
 * Copyright (C) The Apache Software Foundation. All rights reserved.
 *
 * This software is published under the terms of the Apache Software
 * License version 1.1, a copy of which has been included with this
 * distribution in the LICENSE.APL file.  */

 

package org.apache.log4j;

import java.beans.*;
import org.apache.log4j.helpers.LogLog;
import java.lang.reflect.Method;

public class RollingFileAppenderBeanInfo extends SimpleBeanInfo {

  private PropertyDescriptor[] props;

  public
  RollingFileAppenderBeanInfo() {
    Class clazz = RollingFileAppender.class;
    try {
      // the magic is here
      BeanInfo bi = Introspector.getBeanInfo(clazz,
                                             Introspector.IGNORE_ALL_BEANINFO);

      props = bi.getPropertyDescriptors();
      if(props != null) {
        for(int i = 0; i < props.length; i++) {
          if(props[i].getName().equals("maxFileSize")) {
            Method m = clazz.getMethod("setMaxFileSize", 
                                       new Class[] {String.class});
            props[i] = new PropertyDescriptor("maxFileSize", null, m);
          }
        }
      }
      // flush the bean info because getPropertyDescriptors() will now return
      // different properties
      Introspector.flushFromCaches(RollingFileAppender.class);
    } catch(IntrospectionException e) {
      LogLog.error("Could not inspect RollingFileAppender.", e);
    } catch(NoSuchMethodException e) {
      LogLog.error("Could find setter method for RollingFileAppender.", e);
    }
  }

  public
  PropertyDescriptor[] getPropertyDescriptors() {
    return props;
  }
}


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to