ceki        01/04/17 10:14:33

  Modified:    src/java/org/apache/log4j/config PropertyGetter.java
                        PropertySetter.java
               src/java/org/apache/log4j/helpers OptionConverter.java
               src/java/org/apache/log4j/test Makefile shallow
               src/java/org/apache/log4j/xml DOMConfigurator.java
               src/java/org/apache/log4j/xml/examples XPriority.java
  Added:       src/java/org/apache/log4j/config package.html
               src/java/org/apache/log4j/test UnitTestOptionConverter.java
  Removed:     src/java/org/apache/log4j/test UnitTestVarSubst.java
  Log:
  Added custom Priority paramater parsing capability to config/PropertySetter.java.
  
  Revision  Changes    Path
  1.2       +3 -4      
jakarta-log4j/src/java/org/apache/log4j/config/PropertyGetter.java
  
  Index: PropertyGetter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/config/PropertyGetter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PropertyGetter.java       2001/03/19 12:31:41     1.1
  +++ PropertyGetter.java       2001/04/17 17:13:52     1.2
  @@ -32,10 +32,9 @@
     
     /**
       Create a new PropertySetter for the specified Object. This is done
  -    in prepartion for invoking {@link #setProperty} one or more times.
  +    in prepartion for invoking {@link #getProperties(PropertyCallback,String)} one 
or more times.
       
  -    @param obj  the object for which to set properties
  -   */
  +    @param obj the object for which to set properties */
     public
     PropertyGetter(Object obj) throws IntrospectionException {
       BeanInfo bi = Introspector.getBeanInfo(obj.getClass());
  @@ -83,4 +82,4 @@
              Boolean.TYPE.isAssignableFrom(type) ||
              Priority.class.isAssignableFrom(type);
     }
  -}
  \ No newline at end of file
  +}
  
  
  
  1.3       +43 -31    
jakarta-log4j/src/java/org/apache/log4j/config/PropertySetter.java
  
  Index: PropertySetter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/config/PropertySetter.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PropertySetter.java       2001/03/21 21:33:55     1.2
  +++ PropertySetter.java       2001/04/17 17:13:54     1.3
  @@ -68,6 +68,16 @@
       }
     }
     
  +
  +  /**
  +     Set the properties of an object passed as a parameter in one
  +     go. The <code>properties</code> are parsed relative to a
  +     <code>prefix</code>.
  +
  +     @param obj The object to configure.
  +     @param properties A java.util.Properties containing keys and values.
  +     @param prefix Only keys having the specified prefix will be set.
  +  */
     public
     static
     void setProperties(Object obj, Properties properties, String prefix) {
  @@ -103,8 +113,7 @@
           key = key.substring(len);
           if ("layout".equals(key) && obj instanceof Appender) {
             continue;
  -        }
  -        
  +        }        
           setProperty(key, value);
         }
       }
  @@ -139,7 +148,8 @@
       PropertyDescriptor prop = getPropertyDescriptor(name);
       
       if (prop == null) {
  -      LogLog.warn("No such property: " + name);
  +      LogLog.warn("No such property [" + name + "] in "+
  +               obj.getClass().getName()+"." );
       } else {
         try {
           setProperty(prop, name, value);
  @@ -149,27 +159,18 @@
         }
       }
     }
  -  
  -  /*
  -  public
  -  void setProperty(String name, String value) throws PropertySetterException {
  -    if (props == null) introspect();
  -    name = Introspector.decapitalize(name);
  -    PropertyDescriptor prop = getPropertyDescriptor(name);
  -    
  -    if (prop != null) {
  -      setProperty(prop, name, value);
  -    } else {
  -      throw new PropertySetterException(
  -          "No such property", obj, name, value);
  -    }
  -  }
  -  */
     
  +  /** 
  +      Set the named property given a {@link PropertyDescriptor}.
  +
  +      @param prop A PropertyDescriptor describing the characteristics
  +      of the property to set.
  +      @param name The named of the property to set.
  +      @param value The value of the property.      
  +   */
     public
     void setProperty(PropertyDescriptor prop, String name, String value)
  -    throws PropertySetterException
  -  {
  +    throws PropertySetterException {
       Method setter = prop.getWriteMethod();
       if (setter == null) {
         throw new PropertySetterException("No setter for property");
  @@ -181,7 +182,7 @@
       
       Object arg;
       try {
  -      arg = getArg(value, paramTypes[0]);
  +      arg = convertArg(value, paramTypes[0]);
       } catch (Throwable t) {
         throw new PropertySetterException(t);
       }
  @@ -197,33 +198,44 @@
       }
     }
     
  +
  +  /**
  +     Convert <code>val</code> a String parameter to an object of a
  +     given type.
  +  */
     protected
  -  Object getArg(String val, Class type) {
  +  Object convertArg(String val, Class type) {
  +    if(val == null)
  +      return null;
  +
  +    String v = val.trim();
       if (String.class.isAssignableFrom(type)) {
         return val;
       } else if (Integer.TYPE.isAssignableFrom(type)) {
  -      return new Integer(val.trim());
  +      return new Integer(v);
       } else if (Long.TYPE.isAssignableFrom(type)) {
  -      return new Long(val.trim());
  +      return new Long(v);
       } else if (Boolean.TYPE.isAssignableFrom(type)) {
  -      val = val.trim();
  -      if ("true".equalsIgnoreCase(val)) {
  +      if ("true".equalsIgnoreCase(v)) {
           return Boolean.TRUE;
  -      } else if ("false".equalsIgnoreCase(val)) {
  +      } else if ("false".equalsIgnoreCase(v)) {
           return Boolean.FALSE;
         }
       } else if (Priority.class.isAssignableFrom(type)) {
  -      return Priority.toPriority(val.trim());
  +      return OptionConverter.toPriority(v, null);
       }
       return null;
     }
     
  +  
     protected
     PropertyDescriptor getPropertyDescriptor(String name) {
       if (props == null) introspect();
       
       for (int i = 0; i < props.length; i++) {
  -      if (name.equals(props[i].getName())) return props[i];
  +      if (name.equals(props[i].getName())) {
  +     return props[i];
  +      }
       }
       return null;
     }
  @@ -231,7 +243,7 @@
     public
     void activate() {
       if (obj instanceof OptionHandler) {
  -        ((OptionHandler) obj).activateOptions();
  +      ((OptionHandler) obj).activateOptions();
       }
     }
   }
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/log4j/config/package.html
  
  Index: package.html
  ===================================================================
  <html>
  
  <body>
  Package used in getting/setting component properties.
  </body>
  </html>
  
  
  1.14      +76 -0     
jakarta-log4j/src/java/org/apache/log4j/helpers/OptionConverter.java
  
  Index: OptionConverter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/OptionConverter.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- OptionConverter.java      2001/03/22 18:37:49     1.13
  +++ OptionConverter.java      2001/04/17 17:14:02     1.14
  @@ -12,6 +12,7 @@
   import java.net.URL;
   import org.apache.log4j.Category;
   import org.apache.log4j.Hierarchy;
  +import org.apache.log4j.Priority;
   import org.apache.log4j.spi.Configurator;
   import org.apache.log4j.xml.DOMConfigurator;
   import org.apache.log4j.PropertyConfigurator;
  @@ -25,6 +26,7 @@
      A convenience class to convert property values to specific types.
   
      @author Ceki G&uuml;lc&uuml;
  +   @author Simon Kitching;
   */   
   public class OptionConverter {
   
  @@ -151,6 +153,80 @@
       return dEfault;
     }
   
  +  /**
  +     Converts a standard or custom priority level to a Priority
  +     object.  <p> If <code>value</code> is of form
  +     "priority#classname", then the specified class' toPriority method
  +     is called to process the specified priority string; if no '#'
  +     character is present, then the default {@link org.log4j.Priority}
  +     class is used to process the priority value.  
  +
  +     <p> If any error occurs while converting the value to a priority,
  +     the dflt value (which may be null) is returned.  
  +
  +     <p> Case of
  +     value is unimportant for the priority level, but is significant
  +     for any class name part present.  
  +     
  +     @since 1.1
  +  */
  +  public
  +  static
  +  Priority toPriority(String value, Priority defaultValue) {
  +    if(value == null)
  +      return defaultValue;
  +
  +    int hashIndex = value.indexOf('#');
  +    if (hashIndex == -1) {
  +      // no class name specified : use standard Priority class
  +      return Priority.toPriority(value, defaultValue);
  +    }
  +
  +    Priority result = defaultValue;
  +
  +    String clazz = value.substring(hashIndex+1);
  +    String priorityName = value.substring(0, hashIndex);
  +
  +    LogLog.debug("toPriority" + ":class=[" + clazz + "]" 
  +              + ":pri=[" + priorityName + "]");
  +
  +    try {
  +      Class customPriority = Class.forName(clazz);
  +
  +      // get a ref to the specified class' static method
  +      // toPriority(String, org.apache.log4j.Priority)
  +      Class[] paramTypes = new Class[] { String.class,
  +                                      org.apache.log4j.Priority.class
  +                                       };
  +      java.lang.reflect.Method toPriorityMethod =
  +                      customPriority.getMethod("toPriority", paramTypes);
  +
  +      // now call the toPriority method, passing priority string + default
  +      Object[] params = new Object[] {priorityName, defaultValue};
  +      Object o = toPriorityMethod.invoke(null, params);
  +
  +      result = (Priority) o;
  +    } catch(ClassNotFoundException e) {
  +      LogLog.error("custom priority class [" + clazz + "] could not be added.");
  +    } catch(NoSuchMethodException e) {
  +      LogLog.error("custom priority class [" + clazz + "]"
  +        + " does not have a constructor which takes one string parameter", e);
  +    } catch(java.lang.reflect.InvocationTargetException e) {
  +      LogLog.error("custom priority class [" + clazz + "]"
  +                + " could not be instantiated", e);
  +    } catch(ClassCastException e) {
  +      LogLog.error("class [" + clazz
  +        + "] is not a subclass of org.apache.log4j.Priority", e);
  +    } catch(IllegalAccessException e) {
  +      LogLog.error("class ["+clazz+
  +                "] cannot be instantiated due to access restrictions", e);
  +    } catch(Exception e) {
  +      LogLog.error("class ["+clazz+"], priority ["+priorityName+
  +                "] conversion failed.", e);
  +    }
  +    return result;
  +   }
  + 
     public
     static
     long toFileSize(String value, long dEfault) {
  
  
  
  1.10      +1 -1      jakarta-log4j/src/java/org/apache/log4j/test/Makefile
  
  Index: Makefile
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/test/Makefile,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Makefile  2001/03/21 20:52:12     1.9
  +++ Makefile  2001/04/17 17:14:08     1.10
  @@ -22,7 +22,7 @@
    UnitTestCategory.java\
    UnitTestCyclicBuffer.java\
    UnitTestBoundedFIFO.java\
  - UnitTestVarSubst.java\
  + UnitTestOptionConverter.java\
    SocketAppenderTest.java\
    PrintProperties.java\
    UnitTestOR.java\
  
  
  
  1.6       +2 -0      jakarta-log4j/src/java/org/apache/log4j/test/shallow
  
  Index: shallow
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/test/shallow,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- shallow   2001/01/20 16:02:22     1.5
  +++ shallow   2001/04/17 17:14:12     1.6
  @@ -85,9 +85,11 @@
   
   TEST=1
   if [ $TEST -ge $start ]; then
  +
     makeShallowConfigFile $TEMP DEBUG " " $SIMPLE
     testShallow LINE_NUMBER
   fi
  +
   
   TEST=2
   if [ $TEST -ge $start ]; then
  
  
  
  1.1                  
jakarta-log4j/src/java/org/apache/log4j/test/UnitTestOptionConverter.java
  
  Index: UnitTestOptionConverter.java
  ===================================================================
  
  // Log4j uses the JUnit framework for internal unit testing. JUnit
  // is available from "http://www.junit.org".
  
  package org.apache.log4j.test;
  
  import org.apache.log4j.helpers.OptionConverter;
  import org.apache.log4j.Priority;
  import org.apache.log4j.xml.examples.XPriority;
  
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  import junit.framework.Test;
  import java.util.Properties;
  
  /**
     Test variable substitution code.   
     @author Ceki G&uuml;lc&uuml;
     
     @since 1.0
  */
  public class UnitTestOptionConverter extends TestCase {
  
    Properties props;
    
    public UnitTestOptionConverter(String name) {
      super(name);
    }
  
    public
    void setUp() {
      props = new Properties();
      props.put("TOTO", "wonderful");
      props.put("key1", "value1");
      props.put("key2", "value2");
      System.setProperties(props);
  
  
    }  
    
    public
    void tearDown() {
      props = null;
    }
  
    public
    void varSubstTest1() {
      String r;
  
      r = OptionConverter.substVars("hello world.", null);
      assertEquals("hello world.", r);
      
      r = OptionConverter.substVars("hello ${TOTO} world.", null);
      
      assertEquals("hello wonderful world.", r);
    }
  
  
    public
    void varSubstTest2() {
      String r;
  
      r = OptionConverter.substVars("Test2 ${key1} mid ${key2} end.", null);
      assertEquals("Test2 value1 mid value2 end.", r);
    }
  
    public
    void varSubstTest3() {
      String r;
  
      r = OptionConverter.substVars(
                                     "Test3 ${unset} mid ${key1} end.", null);
      assertEquals("Test3  mid value1 end.", r);
    }
  
    public
    void varSubstTest4() {
      String res;
      String val = "Test4 ${incomplete ";
      try {
        res = OptionConverter.substVars(val, null);
      }
      catch(IllegalArgumentException e) {
        String errorMsg = e.getMessage();
        //System.out.println('['+errorMsg+']');
        assertEquals('"'+val+ "\" has no closing brace. Opening brace at position 6.", 
errorMsg);
      }
    }
  
  
    public
    void toPriorityTest1() {
      String val = "INFO";
      Priority p = OptionConverter.toPriority(val, null);
      assertEquals(p, Priority.INFO);
    }
  
    public
    void toPriorityTest2() {
      String val = "INFO#org.apache.log4j.xml.examples.XPriority";
      Priority p = OptionConverter.toPriority(val, null);
      assertEquals(p, Priority.INFO);
    }
  
    public
    void toPriorityTest3() {
      String val = "TRACE#org.apache.log4j.xml.examples.XPriority";
      Priority p = OptionConverter.toPriority(val, null);    
      assertEquals(p, XPriority.TRACE);
    }
  
    public
    void toPriorityTest4() {
      String val = "TR#org.apache.log4j.xml.examples.XPriority";
      Priority p = OptionConverter.toPriority(val, null);    
      assertEquals(p, null);
    }
  
  
    public
    static
    Test suite() {
      TestSuite suite = new TestSuite();
      suite.addTest(new UnitTestOptionConverter("varSubstTest1"));
      suite.addTest(new UnitTestOptionConverter("varSubstTest2"));
      suite.addTest(new UnitTestOptionConverter("varSubstTest3"));
      suite.addTest(new UnitTestOptionConverter("varSubstTest4"));
  
      suite.addTest(new UnitTestOptionConverter("toPriorityTest1"));
      suite.addTest(new UnitTestOptionConverter("toPriorityTest2"));
      suite.addTest(new UnitTestOptionConverter("toPriorityTest3"));
      suite.addTest(new UnitTestOptionConverter("toPriorityTest4"));
      return suite;
    }
  
  }
  
  
  
  1.14      +2 -2      jakarta-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java
  
  Index: DOMConfigurator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- DOMConfigurator.java      2001/04/13 00:01:18     1.13
  +++ DOMConfigurator.java      2001/04/17 17:14:20     1.14
  @@ -50,7 +50,7 @@
   
      <p>There are sample XML files included in the package.
      
  -   @author <a href=mailto:[EMAIL PROTECTED]>Christopher Taylor</a>
  +   @author Christopher Taylor
      @author Ceki G&uuml;lc&uuml;
      @author Anders Kristensen
   
  @@ -112,7 +112,7 @@
       } else {
         Document doc = appenderRef.getOwnerDocument();
   
  -      // DOESN'T WORK!! :
  +      // Doesn't work on DOM Level 1 :
         // Element element = doc.getElementById(appenderName);
                           
         // Endre's hack:
  
  
  
  1.5       +6 -3      
jakarta-log4j/src/java/org/apache/log4j/xml/examples/XPriority.java
  
  Index: XPriority.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/xml/examples/XPriority.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XPriority.java    2001/02/15 16:22:16     1.4
  +++ XPriority.java    2001/04/17 17:14:28     1.5
  @@ -29,11 +29,13 @@
       super(level, strLevel, syslogEquiv);
     }
   
  +
     public
     static
  -  Priority toPriority(String sArg) {
  +  Priority toPriority(String sArg, Priority defaultValue) {
  +    
       if(sArg == null) {
  -      return XPriority.TRACE;
  +      return defaultValue;
       }
       String stringVal = sArg.toUpperCase();
       
  @@ -43,8 +45,9 @@
         return XPriority.LETHAL;
       }
         
  -    return Priority.toPriority(sArg);    
  +    return Priority.toPriority(sArg, defaultValue);    
     }
  +
   
     public
     static
  
  
  

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

Reply via email to