Hi,

Unfortunately I have to take back my comment about this code being ok. My
original patch worked both in and outside of WebLogic. I only tried your
patch inside WL (with a prop file in a .WAR archive, which forces the custom
URL to be used), where it worked fine. Unfortunately your code will get a
null pointer exception outside. You need to check the return value from
getRef() for a null, as my original code did...

Regards,

Colin

----- Original Message -----
From: "Ceki Gülcü" <[EMAIL PROTECTED]>
To: "LOG4J Developers Mailing List" <[EMAIL PROTECTED]>
Sent: Thursday, July 05, 2001 12:54 PM
Subject: Re: PATCH: modify config file loading to allow custom URL types



Colin,

I modified OptionConverter.java as follows:

  static
  public
  void selectAndConfigure(URL url, Hierarchy hierarchy) {
    String clazz = url.getRef();

    if (clazz.indexOf('.') == -1 || clazz.indexOf('/') != -1 ||
clazz.indexOf('\\') != -1) {
      LogLog.warn("Suspicious reference part in URL ["+url+
                  "] will ignore refence part assuming BEA Weblogic
environment.");
      clazz = null;
    }


    Configurator configurator = null;

    if(clazz != null) {
      LogLog.debug("Preferred configurator class: " + clazz);
    ....

  }

Category.java remains unchanged. Can you please double check that my
simplified patch works.
You can get the latest code from our CVS repository. Best regards, Ceki

At 14:20 29.06.2001 +0000, you wrote:
>(same patch as before, but diffed using -u option...)
>
>>As per my previous email with Ceki, this patch modifies the configuration
file loading code so that while still allowing a 'ref' or anchor portion of
a URL to specify a class name for a custom configurator, it can also work
with custom URL schemes such as used in WebLogic to specify a file within an
archive, e.g.
>>zip:/part1/part2/whatever.war#WEB-INF/classes/log4j.properties
>>With the new code, for the ref portion of a URL to be considered a
classname, it must consist of at least one package element and one classname
element (e.g. mypackage.Myclass), and must not have the file separator
character in it. Also, when the URL comes from a classloader as opposed to a
system properly, the code will never consider the ref to be a classname,
since that wouldn't make sense (e.g. in this case the ref will always be
part of a custom URL).
>
>Index: Category.java
>===================================================================
>RCS file:
/home/cvspublic/jakarta-log4j/src/java/org/apache/log4j/Category.java,v
>retrieving revision 1.35
>diff -w -u -r1.35 Category.java
>--- Category.java       2001/06/26 19:40:05     1.35
>+++ Category.java       2001/06/29 14:12:44
>@@ -131,12 +131,16 @@
>
>DEFAULT_CONFIGURATION_KEY,
>
DEFAULT_CONFIGURATION_FILE);
>     URL url = null;
>+      boolean urlRefMayBeConfigurator = true;
>     try {
>-       // so, resource is not a URL:
>-       // attempt to get the resource from the class path
>        url = new URL(resource);
>     } catch (MalformedURLException ex) {
>+       // if resource is not a URL then
>+       // attempt to get the resource from the class path
>        url = Loader.getResource(resource, Category.class);
>+        // any ref portion in URL returned by classload is specific to
that URL,
>+        // not a Configurator class name
>+        urlRefMayBeConfigurator = false;
>     }
>
>     // If we have a non-null url, then delegate the rest of the
>@@ -144,7 +148,7 @@
>     // method.
>     if(url != null) {
>        LogLog.debug("Using URL ["+url+"] for automatic log4j
configuration.");
>-       OptionConverter.selectAndConfigure(url, defaultHierarchy);
>+       OptionConverter.selectAndConfigure(url, urlRefMayBeConfigurator,
defaultHierarchy);
>     } else {
>        LogLog.debug("Could not find resource: ["+resource+"].");
>     }
>Index: helpers/OptionConverter.java
>===================================================================
>RCS file:
/home/cvspublic/jakarta-log4j/src/java/org/apache/log4j/helpers/OptionConver
ter.java,v
>retrieving revision 1.17
>diff -w -u -r1.17 OptionConverter.java
>--- helpers/OptionConverter.java        2001/06/20 07:59:46     1.17
>+++ helpers/OptionConverter.java        2001/06/29 14:12:45
>@@ -399,9 +399,16 @@
> /**
>    Configure log4j given a URL.
>-     <p>The URL format is important. Its <em>reference</em> part is
>-     taken as the class name of the configurator. For example, if you
>-     invoke your application using the command line
>+     <p>The URL format is important. If the
<em>urlRefMayBeConfigurator</em>
>+     param is true, then its <em>reference</em> part (if any) is
potentially
>+     considered to be the class name of the configurator. Since the ref
part
>+     may also be used by some custom URL types (e.g. to qualify a specific
file
>+     within another archive file), for the ref string to be considered a
class
>+     name, it must be a fully qualified class name including at least one
>+     package, and must not contain any file separator characters such as
'/' or
>+     '\' since those would never be part of a valid class name, and are a
strong
>+     indication of a custom URL type. For example, if you invoke your
>+     application using the command line
>    <pre>
java -Dlog4j.configuration=file:/temp/myconfig.xyz#com.myCompany.myConfigura
tor
>    </pre>
>@@ -412,8 +419,8 @@
>    configurator you specify <em>must</em> implement the {@link
>    Configurator} interface.
>-     <p>If the URL has no reference part, then the {@link
>-     PropertyConfigurator} will parse the URL. However, if the URL
>+     <p>If no configurator is specified via a URL reference part, then the
>+     {@link PropertyConfigurator} will parse the URL. However, if the URL
>    ends with a ".xml" extension, then the {@link DOMConfigurator}
>    will be used to parse the URL.
>@@ -425,12 +432,29 @@
>    @since 1.0 */
> static
> public
>-  void selectAndConfigure(URL url, Hierarchy hierarchy) {
>-    String clazz = url.getRef();
>+  void selectAndConfigure(URL url, boolean urlRefMayBeConfigurator,
>+                          Hierarchy hierarchy) {
>+
>+    // assume a 'ref' portion of a URL may be Configurator class
>+    String clazz = null;
>+    if (urlRefMayBeConfigurator) {
>+      clazz = url.getRef();
>+      if (clazz != null) {
>+        String fileSep = "/";
>+        try { fileSep = System.getProperty("file.separator"); }
catch(Exception e) {}
>+        // it's only a class name if it has a period somewhere in it, and
it's
>+        // not a class name if it has a file separator (explicitly check
both
>+        // unix and windows versions since Java itself will always allow
them
>+        // regardless of actual platform)
>+        if (clazz.indexOf('.') == -1 || clazz.indexOf(fileSep) != -1 ||
>+            clazz.indexOf('/') != -1 || clazz.indexOf('\\') != -1)
>+          clazz = null;
>+      }
>+    }
>   Configurator configurator = null;
>-    if(clazz != null) {
>+    if (clazz != null && clazz.length() > 0) {
>     LogLog.debug("Preferred configurator class: " + clazz);
>     configurator = (Configurator) instantiateByClassName(clazz,
>
Configurator.class,
>@@ -440,6 +464,11 @@
>        return;
>     }
>   } else {
>+      // hmm, this test is actually no longer valid if we have a custom
URL type
>+      // such as:
>+      // 'zip:/a/b/c/d.war#e/f/log4j.properties'
>+      // which is what a custom classloader like WebLogic's may return as
a URL
>+      // reference to a file inside of an archive
>     String filename = url.getFile();
>     if(filename != null && filename.endsWith(".xml")) {
>        try {
>@@ -455,4 +484,16 @@
>   configurator.doConfigure(url, hierarchy);
> }
>+
>+
>+  /**
>+     Configure log4j given a URL.
>+     This method signature maintained for compatibility
>+   */
>+  static
>+  public
>+  void selectAndConfigure(URL url, Hierarchy hierarchy) {
>+    selectAndConfigure(url, true, hierarchy);
>+  }
>+
>}
>---------------------------------------------------------------------
>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]

Reply via email to