On Sep 8, 2009, at 1:18 PM, Adam Heath wrote:

David E Jones wrote:

On Sep 8, 2009, at 11:58 AM, Adam Heath wrote:

Adrian Crum wrote:
Adam Heath wrote:
Adrian Crum wrote:
Adam Heath wrote:
adri...@apache.org wrote:
Author: adrianc
Date: Sun Aug  9 18:04:26 2009
New Revision: 802567

URL: http://svn.apache.org/viewvc?rev=802567&view=rev
Log:
Refactored GenericDelegator:

1. Converted GenericDelegator to an interface. We already have
DelegatorInterface, but it isn't being used anywhere. Removed
DelegatorInterface.java.

2. Extracted the static, cached data from the GenericDelegator
implementation and put it in its own class - DelegatorData. The
GenericDelegator implementation holds a reference to the
DelegatorData instance. This makes it possible to have per- thread
instances of GenericDelegator.

3. Replaced the ThreadLocal variables with regular variables.
ThreadLocal variables are no longer needed. Client code doesn't need to be concerned with pushing and popping the GenericDelegator state.

This commit paves the way for the forthcoming ExecutionContext.

User modifications will have to replace
GenericDelegator.getGenericDelegator(...) with
DelegatorFactory.getGenericDelegator(...). Also, replace the push
code with the new setXxx methods, and remove the pop code. If
modifications used DelegatorInterface, replace that with
GenericDelegator.

Aside from those changes, this commit is backwards compatible.
No, it is not backwards compatible.

When a java class is compiled, the bytecode requests an interface named 'foo', or a class named 'foo'. If 'foo' changes from class to
interface, then pre-compiled classes will *not* load.

Please, change GenericDelegator back to a class.

If DelegatorInterface wasn't used, and was just not uptodate with the method signatures, wouldn't the simpler thing have been to improve DelegatorInterface, then to change the class itself? It seems more
work to change the class to an interface.

I have external code(webslinger) that needs to support multiple
versions of ofbiz(one all the way back to 512946). This change makes
that impossible.  I have to have multiple versions of ofbiz
installed(pre/post this change), and compile the class once for each
ofbiz version.
Which is easier: rewrite all your Webslinger code to reference
DelegatorInterface instead of GenericDelegator, or just recompile your
existing code without making any changes?

That's just it, I wouldn't have to recompile *at all*, if
GenericDelegator stayed a class.  Nor would anyone else.

I don't have a problem with reverting it, but GenericDelegator will
become an interface eventually. If you take a look at David's
ExecutionContext branch, that is what he has planned.

Why?  We already had DelegatorInterface, that has existed for years;
it was just never fleshed out.

There was a lot of discussion about this in the context of the
reasons/goals behind the executioncontext branch(es). The basic idea is to move the framework to be accessible through a set of interfaces that
are in a single place, a low-level component that other framework
components will depend on, and then all code will use the framework
through the interfaces instead of going directly to classes (which will
just be internal implementations of the framework interfaces and not
generally used directly).

For the rationale behind this, please see the write up I sent to this
mailing list a few weeks ago about the ExecutionContext and related stuff.

Sure, understand all that.  But this broke ABI.  And I understand that
such a set of changes will *have* to break ABI.

If this change is to support the ExecutionContext branch, then it
should stay in that branch, 'til it is ready.

That is one thing I DO agree with, which is why I was doing all of the work I did in a branch and refactoring dependent code there.

I'm seeing this done in the reverse order.  Introduce a *new*
interface, that existing implementations will use.  Alter all users to
use the interface.  When all users are so modified, rename the
implementation to whatever.

What has happened, is that the last step was done first.

Profound.

-David


Reply via email to