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.
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.
Cheers,
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]