Oh btw, some work can be seen over here. Not yet ready to be pushed, but is 
maybe a start:



https://github.com/struberg/openjpa/tree/jakartaee


LieGrue,
strub


> Am 30.04.2023 um 17:19 schrieb Mark Struberg <strub...@yahoo.de.INVALID>:
> 
> 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