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]