There is actually another problem with your version of the code. It is fine
with a url like

zip:a/path/to/an/archive.war#WEB-INF/log4j.properties

This is pretty typical of what you would actually get back from the WebLogic
classloader when telling it to find log4j.properties from the classpath, for
a .WAR file deployed into it.

On the other hand, it would get confused with a URL with a period in the
filename, but not path. In this case it would think that was a classname.

zip:a/path/to/an/archive.zip#log4j.properties

My original code least handled this case when getting back a URL from the
classloader, since in that case it would never even look at the ref as
something special. Obviously there would still be an issue when the url came
from somewhere else, like an environment variable.

I am of mixed feelings about this whole scheme of piggybacking a
configurator classname as a ref portion of a URL. Obviously there are cases
when you can't in fact tell if it is a classname or a valid part of a custom
url... I would have just used a separate system variable myself to indicate
a special configurator class...


----- Original Message -----
From: "Colin Sampaleanu" <[EMAIL PROTECTED]>
To: "LOG4J Developers Mailing List" <[EMAIL PROTECTED]>
Sent: Tuesday, July 10, 2001 5:38 PM
Subject: Re: PATCH: modify config file loading to allow custom URL types


> 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