Hi lords and ladies!

I'm right now in the process of moving openjpa to jakarta natively. 
While doing that I stumbled across a failing test 
(org.apache.openjpa.persistence.detach.TestDetachNoProxy#testClear10Compat) 
which is due to some proxy classes cannot be generated at build time.

I'm looking at the generated classes right now and I have to admit I'm a bit 
confused. 

It looks like they contain state? (via StateManager and delegating to super 
which is java.sql.Date)
public class java$sql$Date$proxy extends Date implements ProxyDate {
    private transient OpenJPAStateManager sm;
    private transient int field;

    public java$sql$Date$proxy(long var1) {
        super(var1);
    }

    public java$sql$Date$proxy(int var1, int var2, int var3) {
        super(var1, var2, var3);
    }

    public void setOwner(OpenJPAStateManager var1, int var2) {
        this.sm = var1;
        this.field = var2;
    }
    public void setDate(int var1) {
        Proxies.dirty(this, true);
        super.setDate(var1);
    }

    public void setMonth(int var1) {
        Proxies.dirty(this, true);
        super.setMonth(var1);
    }

But on the other hand we do cache those instances in ProxyManagerImpl

private ProxyDate getFactoryProxyDate(Class type) {
    // we don't lock here; ok if two proxies get generated for same type
    ProxyDate proxy = (ProxyDate) _proxies.get(type);
    if (proxy == null) {
        ClassLoader l = GeneratedClasses.getMostDerivedLoader(type,
            ProxyDate.class);
        Class pcls = loadBuildTimeProxy(type, l);
        if (pcls == null)
            pcls = GeneratedClasses.loadBCClass(
                generateProxyDateBytecode(type, true), l);
        proxy = (ProxyDate) instantiateProxy(pcls, null, null);
        _proxies.put(type, proxy);
    }
    return proxy;
}
and others.
It looks really weird, because this caches instances apparently? Reason why I 
do look at it is that with moving to Jakarta and Java11 the Serp stuff totally 
falls apart. And the ProxyManagerImpl#main which is called via Ant during the 
build to create a few proxies named java$sql$... in o.a.openjpa.util fails due 
to that.

And the build time proxies are serializable, while the dynamically built are 
NOT, because they are loaded via a separate synthetical BCClassLoader from 
Serp. Which is not available or gets ignored during deserialisation. Now we 
have org.apache.openjpa.persistence.detach.TestDetachNoProxy#testClear10Compat 
fail due to that if those proxy classes cannot be generated at build time. But 
likely this problem also appears in other cases where this mechanism is used. 
Which is _not_ really often the case afaict. Usually when enhancing the class 
the whole getter and setters are changed during enhancement to call 
StateManager#dirty.
Still it's imo important to fix the whole proxy generation.

Is anywhere around which has a spare hour (or a few) to help me look at this 
via a shared screen session? I fear this is not as easy as it looks like.

I'd first like to understand what this really is used for nowadays and only 
then replace it with an ASM based approach. Writing the ASM stuff is actually 
not the real problem here.

Anyone up for a hacking session?

txs and LieGrue,
strub


Reply via email to