FWIW, we did this on 3.1.2 to use in J17.
https://github.com/veselov/openjpa/commits/3.1.2.xl4.j17

On Sun, Apr 30, 2023 at 5:44 PM Mark Struberg <strub...@yahoo.de.invalid> wrote:
>
> 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
> >
> >
>


-- 
With best of best regards
Pawel S. Veselov

Reply via email to