|Richard Sitze||Apr 4, 2002 2:15 pm|
|cost...@covalent.net||Apr 4, 2002 2:26 pm|
|Paulo Gaspar||Apr 4, 2002 3:25 pm|
|Geir Magnusson Jr.||Apr 5, 2002 2:45 am|
|Richard Sitze||Apr 5, 2002 6:07 am|
|Geir Magnusson Jr.||Apr 5, 2002 6:16 am|
|Nicola Ken Barozzi||Apr 5, 2002 6:26 am|
|Andrew C. Oliver||Apr 5, 2002 6:38 am|
|cost...@covalent.net||Apr 5, 2002 6:46 am|
|Geir Magnusson Jr.||Apr 5, 2002 7:03 am|
|cost...@covalent.net||Apr 5, 2002 7:17 am|
|Geir Magnusson Jr.||Apr 5, 2002 7:53 am|
|Christoph Reck||Apr 5, 2002 8:25 am|
|Geir Magnusson Jr.||Apr 5, 2002 8:37 am|
|Craig R. McClanahan||Apr 5, 2002 8:57 am|
|Geir Magnusson Jr.||Apr 5, 2002 9:10 am|
|Richard Sitze||Apr 5, 2002 9:18 am|
|Morgan Delagrange||Apr 5, 2002 9:24 am|
|Geir Magnusson Jr.||Apr 5, 2002 9:58 am|
|Craig R. McClanahan||Apr 5, 2002 10:06 am|
|Nicola Ken Barozzi||Apr 5, 2002 10:09 am|
|Michael A. Smith||Apr 5, 2002 10:14 am|
|Morgan Delagrange||Apr 5, 2002 10:18 am|
|cost...@covalent.net||Apr 5, 2002 10:24 am|
|Michael A. Smith||Apr 5, 2002 10:36 am|
|Geir Magnusson Jr.||Apr 5, 2002 10:44 am|
|cost...@covalent.net||Apr 5, 2002 10:45 am|
|Michael A. Smith||Apr 5, 2002 10:50 am|
|Morgan Delagrange||Apr 5, 2002 10:53 am|
|Andrew C. Oliver||Apr 5, 2002 10:56 am|
|Richard Sitze||Apr 5, 2002 11:10 am|
|Scott Sanders||Apr 5, 2002 11:11 am|
|Geir Magnusson Jr.||Apr 5, 2002 11:33 am|
|cost...@covalent.net||Apr 5, 2002 11:41 am|
|cost...@covalent.net||Apr 5, 2002 12:27 pm|
|Geir Magnusson Jr.||Apr 5, 2002 1:03 pm|
|Craig R. McClanahan||Apr 5, 2002 1:14 pm|
|Geir Magnusson Jr.||Apr 5, 2002 1:35 pm|
|cost...@covalent.net||Apr 5, 2002 1:45 pm|
|cost...@covalent.net||Apr 5, 2002 1:47 pm|
|Geir Magnusson Jr.||Apr 5, 2002 2:23 pm|
|Geir Magnusson Jr.||Apr 5, 2002 2:36 pm|
|cost...@covalent.net||Apr 5, 2002 2:58 pm|
|Craig R. McClanahan||Apr 5, 2002 3:08 pm|
|Geir Magnusson Jr.||Apr 5, 2002 3:37 pm|
|Geir Magnusson Jr.||Apr 5, 2002 3:45 pm|
|Geir Magnusson Jr.||Apr 5, 2002 3:50 pm|
|Geir Magnusson Jr.||Apr 5, 2002 3:51 pm|
|Craig R. McClanahan||Apr 5, 2002 4:00 pm|
|Geir Magnusson Jr.||Apr 5, 2002 6:07 pm|
|Craig R. McClanahan||Apr 5, 2002 7:30 pm|
|Geir Magnusson Jr.||Apr 6, 2002 4:11 am|
|Craig R. McClanahan||Apr 6, 2002 9:14 am|
|Subject:||Re: [logging] Need interface... VOTE|
|From:||Geir Magnusson Jr. (gei...@optonline.net)|
|Date:||Apr 5, 2002 11:33:36 am|
On Fri, 5 Apr 2002, Geir Magnusson Jr. wrote:
In o.a.c.l with some implicit assumptions (which I am trying to dodge...)
It's quite explicit, and your proposal seem to hava a LogFactory too.
The assumptions are *not* explicit - the assumption I am talking about is that you must get the log via a pull from a singleton in o.a.c.l. Again, nothing wrong with that, but wanted to be clear.
There is no "must". The static method and the discovery is a helper, nothing require you to use it.
But from what I've heard, everyone *expects* it to be there, as it's in the o.a.c.l jar.
You've seem to have coupled a generic logging interface o.a.c.l.Log to the expectation of a pull-able implementation, and all I am suggesting is that maybe the interface can be separate from the pull impl.
The name-based registration of components is pretty widespread in java - and most people know how to use it and how to not use it if they want to. Almost all APIs in use today are using it - JDBC, JNDI, JAXP - even servlets ( you get a servlet by name, and web.xml is full of crap to simplify the configuration of name-based resources).
I'm not complaining about it!
However nothing in the API prevent you to instantiate a DOM parser yourself and add setDOMParser in your code.
BTW, are you going to also propose a o.a.c.genericxmlparser, o.a.c.genericjdbc, etc ? After all, there are few dozen APIs using the same pattern with common-logging, do you feel confused when using them too ?
Nope. JDBC doesn't come with an impl, does it? Don't I go and use the mm.sql MySQL driver package throuh which getConnection() will return an object that implements Connection? That's what I am trying to get to here - an implementation free interface spec.
Ok, the 'implementation' you talk about is the println() fallback if log4j, logkit, jdk1.4 or any other impl is detected.
JAXP does come with a default implementation as well, same for JMX and JNDI. ( JDBC was not the best example, my mistake :-).
But one I was able to deftly capitalize on! :)
And the JNDI impl as great as long as you don't want to do anything with it.
Serious question : how do I implement a new LogFactory?
Do I have to rely on classpath order? (no thanks...)
BTW, JDBC does include the registration code ( also pull based - you don't have to call mm.sql.Driver directly except to make it register itslef in DriverManager ). And it also include a second pull and name based mechansim - JNDI.
Then the basic implementation is commons-logging for the pull crowd, (and maybe push) and anyone who has another idea can do what they want.
You can do what you want anyway - there are already a dozen interfaces for Log besides o.a.c.logging.Log.
The current Log interface is good enough and used in several packages, and I don't plan to use any other log interface in any code I write.
I thought you got it. There is no need to be defensive here - I am not trying to disrupt o.a.c.l, force any behavior on anyone, force implementation on anyone, etc...
I am not trying to do another Log interface because there is a problem with o.a.c.l. There isn't any problem with the *interface* o.a.c.l.Log. It's beautiful! Perfect! I salute the vision! and the code formatting is just immaculate. And the comments... Mere words don't do them justice...
The problem I have is that there is implementation support built into the package, and that leads to the expectation that if I am in o.a.c.l there is a working LogFactory I can reach via a singleton.
Or put another way, commons logging has pull discovery implicit in the model.
It's the *expectation* - I understand now that it's explicit because if you want to use the generic Log interface, that log factory impl is *always* going to be around somewhere, so just try...
I was proposing the same interfaces with no promises about the existence of factories. If you want to pull - be my guest and use o.a.c.l. And if
public interface Log implements o.a.c.gl.Log
then they are 100% compatible with each other. (not bidirectionally, but that could be fixed :)
You guys say you don't want this interface in the Logging package, and then make fun of me when I propose a generic interface package that fully supports the existing and includes it?
You can create 10 interfaces if you want - what matter is what we use in our code, and for now it seems most of us are using commons-logging as the interface for logging.
Right - because you wanted a COMMON interface for logging. I am not asking anyone to use anything different.
Why you seem to be saying that the generic logging interface can't be separate from the pull-compatible implementation is beyond me... Utterly.
See what I'm saying?
However, I would think you would want to separate the interfaces, to prevent a *component* from calling setFactory()
No need for that - there are already pretty good mechansims to prevent and define who is allowed to set factory. Either Permission or a 'set once' policy or a guard will do it. ( the permission is actually a guard, I put it separately since it's the standard way to do this kind of stuff ).
As usually, if sandbox is not used no interface will prevent anything.
What I am thinking about here is that you could write a component that does both the static factory pull (catching any exceptions) well as support container push at the same time. Maybe I'm wrong...
Pull is already done.
I know that. Just curious - what made you feel the necessity to point that out?
If you want to implement push - you can use a different package if you can't convince people to put it in common-logging.
Sigh. If I want to implement push - I do it privately in my app. There is no 'push implementation' I am proposing - just the marker interface that lets me know I *can* push.
And I like the idea of package separation from o.a.c.l because of the implicit assumption of LogFactory.
Can you give any arguments for that ( besides 'it seems' ) ?
Because if I use o.a.c.l, it's assumed that there exists a singleton somewhere such that
What do you mean 'it's assumed' ??? There is a helper method in LogFactory, and the semantic is pretty well defined. There is no MUST USE in it.
But it must always BE THERE if you are using o.a.c.l. Therefore, of using o.a.c.l, people *assume*. So why not make the simple Log interface outside of o.a.c.l so you can use that w/o dragging in the impl assumptions?
Lets step back :
1) This is not a push vs pull value debate. I don't care. I have used both and like both.
2) This is not a criticism of o.a.c.l per se. I like the interfaces and am excited about a single interface for *making calls* to a logger.
3) I think that the idea of a generic logging interface is great, and doesn't have to be tied to an discovery model, no matter how valid that model is.
Will work. That SEEMS like a huge assumption and requires an implementation to be part of o.a.c.l
If a Log implementation wants to be 'discovered' by the helper, it must follow the rules ( set in JDK1.3 spec BTW - the META-INF/services is there ).
The implementation of the discovery is part of o.a.c.l because many people prefer to use the discovery instead of hardcoding calls to a logger impl ( or to a DOM parser, etc ).
That¹s great! That's wonderful! You make many people happy and provide good software.
But discovery of an interface can be separate from the definition of the interface, or so I believe.
I want to just define the interfaces separately in o.a.c.gl that o.a.c.l builds upon with the current implementation strategy. People could still use o.a.c.l as is w/o even knowing about o.a.c.gl, o.a.c.gl could be used w/o knowing about o.a.c.l, and things that support o.a.c.gl could also be used in a o.a.c.l environment, as the Logs and Factorys are compatible.
I doubt o.a.c.gl will be used - I'm -1 on adding another layer, its confusing and doesn't actually gives any benefit. The user will still use a Log interface with the methods we have - so why add another package ? Who wants discovery will still use LogFactory directly - again no need for another package.
If you create a package with the push interfaces ( or some other management stuff ) - that would be usefull.
But I would never want to set push interfaces in stone - because the possibilities are so rich...
No - the problem as I see it, and I maybe hugely mistaken, is in the expectation - that if I am in an o.a.c.l environment, I can assume that I can do a pull to get the Log or factory. This makes me worry that if I have a system that claims that logging is done via o.a.c.l, then I have to provide the ability to pull.
You don't have to provide it - the discovery is already implemented ( and a user could use getResource( "META-INF/services/..." ) and Class.forName() himself.
How do I replace the implementation of LogFactory? I want to override the static accessor, for example.
I'm not familiar with services discovery.... I'll go read though...
If you don't support named-based loggers - fine, you just don't include any LogFactory impl. The user will still be able to use the fallback impl, which is System.println() ( nothing special here - he would be able to do that anyway ).
Like I have been trying to say - there are no implementation requirements on the part of the component.
Well, your original proposal ( to have a LogUser interface ) would put implementation requirement on a component that wants to use it, wouldn't it ?
What? Of course - if you want to implement the marker interface, you have to implement the marker interface. We've reached tautology land...
But not if you don¹t want to use it (more tautology...) - which is where I think Morgan was coming from - he didn't want to go back an change existing stuff...
If you want to pull all the time, use o.a.c.l. Don't even worry about o.a.c.gl
That's exactly what we are all saying - put LogUser in a separate package.
Ok - so that's halfway there.
But I am not sure what that buys us - why putting it in a different package does anything.
Again, you have at least my +1 on putting LogUser in o.a.c.l, it seems you have Craig's +0, and so far a single -1 which may be switched with a bit of effort.
Hm. I have some reservations now - :) I didn't realize the pull model was so critical to commons logging...
-- Geir Magnusson Jr. gei...@optonline.net System and Software Consulting The obvious solutions are challenging