Hi Pawel!

A few of your commits do look interesting. Will surely come back to it after 
getting rid of Serp!
I fear the problem I have now got introduced by finally wanting to get rid of 
generating Java5 code as due latest ASM does not support all features of ASM5 
anymore.

LieGrue,
strub


> Am 30.04.2023 um 18:18 schrieb Pawel Veselov <pawel.vese...@gmail.com>:
> 
> 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