At 18:33 18.04.2001 +0200, Anders Kristensen wrote:
>Hey Ceki,
>
>I have a similar test program which shows the String setter being
>preferred over the long setter. Turns out that the JavaBeans
>introspector (at least the JDK 1.3 one) reports properties of different
>types (and with different setter/getter method) depending on which
>setter (maybe getter also) is defined first in the .java source file!
>Relying on the order of methods doesn't seem like a good recipe for
>maintainable software.

This is truly quite amazing. Saying "our code broke because the order of method 
definitions changed" will not earn us any brownie points to say the least.

>I wonder if ideally we should have a custom introspector rather than
>adding custom BeanInfo classes per log4j component as the latter adds
>per-component overhead and people writing their own components may
>easily get it wrong. For getting v1.1 out the door quickly we might
>still just add the custom BeanInfo to RollingFileAppender.

A custom introspector? How would a custom introspector solve the problem at hand? What 
do you have in mind? 

A custom bean info is only needed for the RollingFileAppender. I am not aware of any 
other appender or layout defining differently typed setters or getters for a given 
JavaBeans property.

BTW, this was cute little exercise... Cheers, Ceki

ps: I am about to release 1.1b3 that adds RollingFileAppenderBeanInfo thus correcting 
the backward compatibility issue as outlined in my previous mail. 

>Anders
>
>
>Ceki Gülcü wrote:
>> 
>> Hi Anders,
>> 
>> Here is a small test program:
>> 
>> import org.apache.log4j.*;
>> import org.apache.log4j.config.*;
>> import java.beans.*;
>> 
>> public class R {
>> 
>>   static public void main(String[] args) {
>>     try {
>>       BeanInfo bi = Introspector.getBeanInfo(RollingFileAppender.class);
>>       PropertyDescriptor[] props = bi.getPropertyDescriptors();
>>       for(int i = 0; i < props.length; i++) {
>>         System.out.println("Property name: "+ props[i].getName()+
>>                            ", type: "+props[i].getPropertyType());
>> 
>>         System.out.println("Setter method: "+ props[i].getWriteMethod()+"\n")
>>       }
>>     } catch(Exception e) {
>>       e.printStackTrace();
>>     }
>>   }
>> }
>> 
>> It spits out:
>> 
>> Property name: name, type: class java.lang.String
>> Setter method: public void 
>org.apache.log4j.AppenderSkeleton.setName(java.lang.String)
>> 
>> Property name: maxBackupIndex, type: int
>> Setter method: public void 
>org.apache.log4j.RollingFileAppender.setMaxBackupIndex(int)
>> 
>> Property name: filter, type: class org.apache.log4j.spi.Filter
>> Setter method: null
>> 
>> Property name: append, type: boolean
>> Setter method: public void org.apache.log4j.FileAppender.setAppend(boolean)
>> 
>> Property name: file, type: class java.lang.String
>> Setter method: public void org.apache.log4j.FileAppender.setFile(java.lang.String)
>> 
>> Property name: maxFileSize, type: long  <---- Note this
>> Setter method: public void 
>org.apache.log4j.RollingFileAppender.setMaxFileSize(long) <--- and this
>> 
>> Property name: writer, type: class java.io.Writer
>> Setter method: public synchronized void 
>org.apache.log4j.WriterAppender.setWriter(java.io.Writer)
>> 
>> Property name: class, type: class java.lang.Class
>> Setter method: null
>> 
>> Property name: firstFilter, type: class org.apache.log4j.spi.Filter
>> Setter method: null
>> 
>> Property name: threshold, type: class org.apache.log4j.Priority
>> Setter method: public void 
>org.apache.log4j.AppenderSkeleton.setThreshold(org.apache.log4j.Priority)
>> 
>> Property name: errorHandler, type: interface org.apache.log4j.spi.ErrorHandler
>> Setter method: public synchronized void 
>org.apache.log4j.WriterAppender.setErrorHandler(org.apache.log4j.spi.ErrorHandler)
>> 
>> Property name: layout, type: class org.apache.log4j.Layout
>> Setter method: public void 
>org.apache.log4j.AppenderSkeleton.setLayout(org.apache.log4j.Layout)
>> 
>> Property name: immediateFlush, type: boolean
>> Setter method: public void 
>org.apache.log4j.WriterAppender.setImmediateFlush(boolean)
>> 
>> Property name: optionStrings, type: class [Ljava.lang.String;
>> 
>> (This, when the setMaxFileSize(long) in RollingFileAppender is put back in.)
>> 
>> I am using
>> 
>>   java version "1.3.0"
>>   Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-C)
>>   Java HotSpot(TM) Client VM (build 1.3.0-C, mixed mode)
>> 
>> on Windows 2000.
>> 
>> In any case, the setMaxFileSize(String) setter is invisible. I suppose the rest of 
>the problem is clear. The wrong settter method is used for the maxFileSize property 
>which causes a NumberFormatException, etc, etc.
>> 
>> The only solution I can think of apart from removing setMaxFileSize(long), is to 
>write a custom RollingFileAppenderBeanInfo class to circumvent the problem... Cheers, 
>Ceki
>> 
>> At 04:57 19.04.2001 +0200, Anders Kristensen wrote:
>> >Actually it seems that the JavaBeans introspector returns the String
>> >setter when a class has something like
>> >
>> >  setMaxFileSize(long)
>> >  setMaxFileSize(String)
>> >
>> >so I don't know why setMaxFileSize(long) had to be commented out?
>> >
>> >Cheers,
>> >Anders
>> >
>> >
>> >Ceki Gülcü wrote:
>> >>
>> >> Aaaaaaaaaaaaah!
>> >>
>> >> There are two versions of setMaxFileSize in RollingFileAppender:
>> >>
>> >> setMaxFileSize(long)
>> >>
>> >> and
>> >>
>> >> setMaxFileSize(String)
>> >>
>> >> The problem is that the JabaBeans Introspector returns the former when asked for 
>setter methods in RollingFileAppender. However, this causes problems when log4j is 
>configured using scripts because the
>> >> max file size is specified using units as in 1048576, 1024KB, or 1MB but 1MB is 
>not a valid number calling setMaxFileSize(long) fails.
>> >>
>> >> The only solution I can think of is to add a custom BeanInfo class for 
>RollingFileAppender where the setMaxFileSize(long) setter is removed. This is a bit 
>cumbersome but can be done.
>> >>
>> >> Well, I never imagined that someone was using the removed method. I guess I was 
>wrong. I'll see what I can do.
>> >>
>> >> Anders, do you have a better idea?  Cheers, Ceki
>> >>
>> >> ps: Sam, thanks for the info.
>> >>
>> >> At 05:32 18.04.2001 -0400, Sam Ruby wrote:
>> >> >Why was setMaxFileSize(long) in org.apache.log4j.RollingFileAppender removed?
>> >> >
>> >> 
>>http://jakarta.apache.org/cvsweb/index.cgi/jakarta-log4j/src/java/org/apache/log4j/RollingFileAppender.java.diff?r1=1.8&r2=1.9&diff_format=h
>> >> >
>> >> >In a few hours, you should be able to see the failure that this produces at:
>> >> >
>> >> >http://jakarta.apache.org/builds/gump/2001-04-18/jakarta-velocity.html
>> >> >
>> >> >- Sam Ruby
>> >> >
>> >> >
>> >> >---------------------------------------------------------------------
>> >> >To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> >For additional commands, e-mail: [EMAIL PROTECTED]
>> >>
>> >> --
>> >> Ceki Gülcü
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> For additional commands, e-mail: [EMAIL PROTECTED]
>> >
>> >---------------------------------------------------------------------
>> >To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >For additional commands, e-mail: [EMAIL PROTECTED]
>> 
>> --
>> Ceki Gülcü
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]

--
Ceki Gülcü


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

Reply via email to