Think I found the solution, but first want to run all tests in OpenJPA. I did use the standard ClassWriter in ASMHelper. This does use Class.forName. Changed ASMHelper to use the BCClassWriter you wrote some time ago. That should do the trick I hope.
Gimme 10 minutes plz. LieGrue, strub > Am 03.07.2023 um 17:34 schrieb Romain Manni-Bucau <rmannibu...@gmail.com>: > > @Francesco: can you *javap -v -cp $yourclasspath the.class.which.Fail* when > it works vs when it fails please? > > Romain Manni-Bucau > @rmannibucau <https://twitter.com/rmannibucau> | Blog > <https://rmannibucau.metawerx.net/> | Old Blog > <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> | > LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book > <https://www.packtpub.com/application-development/java-ee-8-high-performance> > > > Le lun. 3 juil. 2023 à 17:23, Mark Struberg <strub...@yahoo.de.invalid> a > écrit : > >> Does not yet ring any bells, sorry :( >> >> Right now trying to fire up the enhancer manually in the debugger. >> Difference really is that we now do the ASM part way earlier, but still >> class per class. >> Before that it was done as part of the ASMAdapter. >> >> Still digging. >> >> LieGrue, >> strub >> >> >>> Am 03.07.2023 um 17:00 schrieb Francesco Chicchiriccò < >> ilgro...@apache.org>: >>> >>> Adding some info. >>> >>> First of all, the class to which the error message is referring is not >> always the same. >>> >>> Secondly, at least about AccountPolicy as reported below, the original >> error message is stating >>> >>> Execution enhancer of goal >> org.apache.openjpa:openjpa-maven-plugin:4.0.0-SNAPSHOT:enhance failed: An >> error occurred while enhancing >> org.apache.syncope.core.persistence.jpa.entity.JPARealm. Exception message: >> Type org/apache/syncope/core/persistence/api/entity/policy/AccountPolicy >> not present: >> org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy >>> >>> If you look at JPARealm: >>> >>> >> https://github.com/apache/syncope/blob/master/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java#L82 >>> >>> it declares >>> >>> @ManyToOne(fetch = FetchType.EAGER) >>> private JPAAccountPolicy accountPolicy; >>> >>> e.g. a reference to the JPA entity JPAAccountPolicy, not to the >> interface that this class implements, e.g. AccountPolicy >>> >>> It looks to me that somewhere the OpenJPA enhancement process is trying >> to resolve more than it should do. >>> >>> Does this make ringing any bell? >>> >>> Regards. >>> >>> On 03/07/23 16:32, Francesco Chicchiriccò wrote: >>>> On 03/07/23 16:27, Mark Struberg wrote: >>>>> Went forward and compiled the Syncope main branch. >>>>> >>>>> Getting this error when running with mvn -X >>>>> >>>>> Caused by: java.lang.ClassNotFoundException: >> org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy >>>>> at >> org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass >> (SelfFirstStrategy.java:50) >>>>> at >> org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass >> (ClassRealm.java:271) >>>>> at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass >> (ClassRealm.java:247) >>>>> at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass >> (ClassRealm.java:239) >>>>> at java.lang.Class.forName0 (Native Method) >>>>> at java.lang.Class.forName (Class.java:467) >>>>> at org.apache.xbean.asm9.ClassWriter.getCommonSuperClass >> (ClassWriter.java:1043) >>>>> at org.apache.xbean.asm9.SymbolTable.addMergedType >> (SymbolTable.java:1202) >>>>> at org.apache.xbean.asm9.Frame.merge (Frame.java:1299) >>>>> at org.apache.xbean.asm9.Frame.merge (Frame.java:1244) >>>>> at org.apache.xbean.asm9.MethodWriter.computeAllFrames >> (MethodWriter.java:1611) >>>>> at org.apache.xbean.asm9.MethodWriter.visitMaxs >> (MethodWriter.java:1547) >>>>> at org.apache.xbean.asm9.tree.MethodNode.accept >> (MethodNode.java:767) >>>>> at org.apache.xbean.asm9.tree.MethodNode.accept >> (MethodNode.java:647) >>>>> at org.apache.xbean.asm9.tree.ClassNode.accept >> (ClassNode.java:468) >>>>> at org.apache.openjpa.util.asm.AsmHelper.readIntoBCClass >> (AsmHelper.java:146) >>>>> at org.apache.openjpa.enhance.PCEnhancer.run (PCEnhancer.java:606) >>>>> at org.apache.openjpa.enhance.PCEnhancer.run >> (PCEnhancer.java:5889) >>>>> at org.apache.openjpa.enhance.PCEnhancer.run >> (PCEnhancer.java:5829) >>>>> at org.apache.openjpa.enhance.PCEnhancer$1.run >> (PCEnhancer.java:5799) >>>>> at org.apache.openjpa.lib.conf.Configurations.launchRunnable >> (Configurations.java:760) >>>>> at >> org.apache.openjpa.lib.conf.Configurations.runAgainstAllAnchors >> (Configurations.java:745) >>>>> >>>>> >>>>> Is this the one you experience too? >>>> >>>> Yes, exactly. >>>> >>>> As you might have found out, AccountPolicy is an interface implemented >> by JPAAccountPolicy, which is the corresponding JPA entity. >>>> We take this approach for all JPA entities, actually. >>>> >>>> I thought the reason why AccountPolicy or JPAAccountPolicy are not >> found is that enhancement does not actually finds them. >>>> >>>>> Will take a look at it now. >>>> >>>> Thank you very much! >>>> >>>> Regards. >>>>>> Am 03.07.2023 um 15:49 schrieb Mark Struberg >> <strub...@yahoo.de.INVALID>: >>>>>> >>>>>> Hi Francesco! >>>>>> >>>>>> Can you see which one of the classes fail to enhance? >>>>>> >>>>>> In which case you might try to run the enhancement of that very class >> manually in your IDE. >>>>>> >>>>>> Main class: org.apache.openjpa.enhance.PCEnhancer >>>>>> VMOptions:: -ea >> -Dopenjpa.ConnectionURL=jdbc:derby:target/database/openjpa-derby-database;create=true >> -Dopenjpa.ConnectionDriverName=org.apache.derby.jdbc.EmbeddedDriver >>>>>> or something similar for your connection >>>>>> >>>>>> Then you also need the parameter pointing to the class file which you >> want to enhance, e.g. >>>>>> >> target/test-classes/org/apache/openjpa/persistence/proxy/entities/Annuity.class >>>>>> >>>>>> Please keep me updated! >>>>>> >>>>>> >>>>>> LieGrue, >>>>>> strub >>>>>> >>>>>> PS: does it add value if we'd write all this up? You will likely know >> most of that stuff, but others who dig into OpenJPA do not. >>>>>> >>>>>> >>>>>> >>>>>>> Am 03.07.2023 um 15:28 schrieb Francesco Chicchiriccò < >> ilgro...@apache.org>: >>>>>>> >>>>>>> Hi Mark, >>>>>>> thanks for your reply. >>>>>>> >>>>>>> So I am proceeding as follows. >>>>>>> >>>>>>> Took the executions at >>>>>>> >>>>>>> https://ci-builds.apache.org/job/OpenJPA/job/OpenJPA-master-deploy/ >>>>>>> >>>>>>> (the Jenkins job which is publishing SNAPSHOT artifacts from master >> to ASF Maven repo) and saw that the artifacts with which the Syncope build >> succeeded last Friday are the one from May 16th, so the corresponding >> commit id is >>>>>>> >>>>>>> b238417dabeac935846fe1ce2fef28aafaeef205 >>>>>>> >>>>>>> I confirm that building locally from that commit id everything is >> working. >>>>>>> >>>>>>> As soon as I move to next commit (dated May 22nd, pushed and >> deployed today) with id >>>>>>> >>>>>>> b51d003ed98aa7663465aad7c9a1b554b006cc7d >>>>>>> >>>>>>> I see the same behavior as with HEAD, e.g. >>>>>>> >>>>>>> 2b9b024f273d63e479a02cad751c28b8ef974ace >>>>>>> >>>>>>> I will try to take a closer look at the code. >>>>>>> Regards. >>>>>>> >>>>>>> On 03/07/23 14:44, Mark Struberg wrote: >>>>>>>> Hi Francesco! >>>>>>>> >>>>>>>> That's very valuable information! >>>>>>>> Could you please do a git-bisect to find out which change did break >> it? >>>>>>>> >>>>>>>> Actually the algorithm to select which classes are to be enhanced >> should not have changed. Thus I'm really curious what I did break. >>>>>>>> >>>>>>>> Most times the amount of enhanced classes are the same but slightly >> differ in the generated code. That might be due to now we really generate >> Java11++ code whereas before we only generated Java 1.1 code (yes, not even >> 1.5!) >>>>>>>> >>>>>>>> What I usually do is to have 2 checkouts. You might want to change >> the pom GAV version of the working checkout to something something >> different so you might have both in your ~/.m2/repository in parallel. >>>>>>>> >>>>>>>> The first thing I do is to compare the class files in >> target/classes of both versions with 'compare with clipboard'. >>>>>>>> I just open the class file in target/classes and let >> Intellij/Netbeans do the decompilation for me. >>>>>>>> >>>>>>>> You might find some differences here in which case this needs >> further investigation. Note that the order of the methods might have >> changed. >>>>>>>> Sometimes you will also see some 'cannot decompile' in the code >> block. This happens when something in the bytecode is messed up. You can >> also watch out for ClassNotFound or VerifyError, etc. >>>>>>>> >>>>>>>> If this is the case I then use >>>>>>>> $> javap -c -p -constants >> target/classes/com/foo/mycorp/MyBlaEntity.class > MyBlaEntity.decompile >>>>>>>> on both versions and check whether something is different. >>>>>>>> Often it's a wrong offset in the stack calculation (e.g. ALOAD 1 vs >> ALOAD 2) >>>>>>>> >>>>>>>> Note that the 'old' Java 1.1 bytecode doesn't understand LDC of >> Class constants (LoaD Constant). This was only introduced in Java 1.4 or >> 1.5 bytecode afair. Before that a dynamic Class.forName was called and >> stored in a static variable. Ugly stuff, and happy to finally get rid of >> all those hacks... >>>>>>>> >>>>>>>> Hope that helps to get you started. Feel free to ping me again over >> here or at the #apachee ASF slack channel. >>>>>>>> >>>>>>>> txs and LieGrue, >>>>>>>> strub >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> Am 03.07.2023 um 14:13 schrieb Francesco Chicchiriccò < >> ilgro...@apache.org>: >>>>>>>>> >>>>>>>>> From a very preliminary analysis it seems that just a subset of >> the persistence-capable classes are effectively found and enhanced: now >> [2], it used to be [3]. >>>>>>>>> >>>>>>>>> I'll continue investigating. >>>>>>>>> >>>>>>>>> Regards. >>>>>>>>> >>>>>>>>> On 03/07/23 13:56, Francesco Chicchiriccò wrote: >>>>>>>>>> Hi Mark, >>>>>>>>>> the build on Syncope master branch, using OpenJPA 4.0.0-SNAPSHOT >> is now failing - it used to work at least until last June 30th. >>>>>>>>>> >>>>>>>>>> The issues seem to be related to entity enhancement, which we >> perform via openjpa-maven-plugin - see [1]. >>>>>>>>>> >>>>>>>>>> Is there anything obvious we should be changing? >>>>>>>>>> Meanwhile I'll try to dig to see if I am able to understand >> something more. >>>>>>>>>> >>>>>>>>>> Regards. >>>>>>>>>> >>>>>>>>>> [1] >> https://github.com/apache/syncope/blob/master/core/persistence-jpa/pom.xml#L143-L174 >>>>>>>>> [2] https://paste.apache.org/gxcm6 >>>>>>>>> [3] https://paste.apache.org/1g9k5 >>>>>>>>> >>>>>>>>>> On 03/07/23 12:15, Mark Struberg wrote: >>>>>>>>>>> Update: I've now merged the wip to our master and pushed it to >> the ASF gitox repo. >>>>>>>>>>> >>>>>>>>>>> I think we already came pretty far and it looks really >> promising. So there is a high chance that we succeed, although there is >> still plenty of work in front of us. >>>>>>>>>>> >>>>>>>>>>> How it works: >>>>>>>>>>> >>>>>>>>>>> Basically there are 2 sets of information in the PCEnhancer >> right now: >>>>>>>>>>> >>>>>>>>>>> _managed: the BCClass version of the original class >>>>>>>>>>> _pc: the BCClass of the generated/modified class. Might be the >> same as _managed but in case of subclassing or interface case it is >> different. In those cases _managed represents the original class and _pc >> the subclass/concrete implementation. >>>>>>>>>>> >>>>>>>>>>> managed and pc are the ASM variants of _managed and _pc. >>>>>>>>>>> >>>>>>>>>>> The main entry point for debugging into it is PCEnhancer#run() >>>>>>>>>>> >>>>>>>>>>> There are a few methods in ASMHelper to update from BCClass -> >> ASM and vice versa: >>>>>>>>>>> >>>>>>>>>>> AsmHelper.readIntoBCClass(pc, _pc); >>>>>>>>>>> takes all the information from the ASM pc, creates a class >> byte[] and reads that back into the existing _pc instance. >>>>>>>>>>> >>>>>>>>>>> pc = AsmHelper.toClassNode(_pc); >>>>>>>>>>> is the corresponding method in the other direction. from BCClass >> to ASM. >>>>>>>>>>> >>>>>>>>>>> Right now we have the following methods left to migrate in >> PCEnhancer >>>>>>>>>>> addAttachDetachCode(); >>>>>>>>>>> addSerializationCode(); >>>>>>>>>>> addCloningCode(); >>>>>>>>>>> runAuxiliaryEnhancers(); >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> I'll be off for a week on holidays in Venice. >>>>>>>>>>> If someone want's to join in with the effort then please go on! >> You might want to compare the current PCEnhancer code with an older version >> to get an idea how it can be done and to see some patterns I've used. >>>>>>>>>>> >>>>>>>>>>> As a quick hint: Java is basically a stack based virtual CPU. >> The 'this' pointer is on position 0 of the stack, so ALOAD 0. After that >> comes the parameters. The size of the param on the stack depends on the >> type. Mostly 1, but for long eg 2 positions. So ALOAD 1 is the 1st method >> parameter, ALOAD 2 the 2nd (except 1st param was a 2-pos type). >>>>>>>>>>> In case of a static method there is ofc no 'this' on the stack, >> so the parameters start with zero offset. >>>>>>>>>>> After all the parameters there are the unnamed 'local' >> variables. I tried to consistently name them xxxVarPos. >>>>>>>>>>> See also the various helper methods in ASMHelper. For example >> for the various LOAD, RETURN, STORE operations which depends based on the >> type (ALOAD vs ILOAD vs IALOAD etc) >>>>>>>>>>> Also read the guide to ASM PDF from objectweb. >>>>>>>>>>> >>>>>>>>>>> I'll be mostly offline till Sunday, but will try to answer mails >> if there are some questions. >>>>>>>>>>> >>>>>>>>>>> txs and LieGrue, >>>>>>>>>>> strub >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> Am 19.06.2023 um 17:11 schrieb Matt Pavlovich < >> mattr...@gmail.com>: >>>>>>>>>>>> >>>>>>>>>>>> +1 thanks for tackling this, Mark! >>>>>>>>>>>> >>>>>>>>>>>> ASM definitely more widely used going forward. >>>>>>>>>>>> >>>>>>>>>>>> -Matt >>>>>>>>>>>> >>>>>>>>>>>>> On Jun 17, 2023, at 3:01 PM, Mark Struberg >> <strub...@yahoo.de.INVALID> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Small update: >>>>>>>>>>>>> >>>>>>>>>>>>> I've worked on it over the last few weeks, and I'm getting >> closer >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> https://github.com/struberg/openjpa/tree/fb_asmEnhance >>>>>>>>>>>>> >>>>>>>>>>>>> contains the latest work on the PCEnhancer. Right in the >> middle of replacing Serp with native ASM code. >>>>>>>>>>>>> >>>>>>>>>>>>> Note that I also had to modify a few interfaces with a few >> more to follow from BCClass to ASM ClassNode. >>>>>>>>>>>>> >>>>>>>>>>>>> Happy to get some feedback! >>>>>>>>>>>>> >>>>>>>>>>>>> If anybody wants to help with this effort I'm happy to also >> push this feature branch to our ASF repo. It looks reasonably promising >> already. >>>>>>>>>>>>> >>>>>>>>>>>>> LieGrue, >>>>>>>>>>>>> strub >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>> Am 25.05.2023 um 18:36 schrieb Mark Struberg >> <strub...@yahoo.de.INVALID>: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Hi! >>>>>>>>>>>>>> >>>>>>>>>>>>>> Right now I'm trying to get rid of serp step by step. >>>>>>>>>>>>>> The code is right now at my own github repo in the >> fb_asmEnhance branch: >>>>>>>>>>>>>> https://github.com/struberg/openjpa/tree/fb_asmEnhance >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> The approach I took for now is to create a few methods in >> AsmHelper to be able to move from BCClass -> ASM ClassWriter and the other >> way around. That way we should be able to replace functionality part by >> part but still keep all things afloat. >>>>>>>>>>>>>> >>>>>>>>>>>>>> For now I've started with the PCSubclassValidator. >>>>>>>>>>>>>> Right now this evaluates the attributs using Serp plus ASM >> and then compare the results. >>>>>>>>>>>>>> If something is fishy, you'll see the following >>>>>>>>>>>>>> throw new IllegalStateException("MSX ASMTODO " + bcField + " >> " + field); >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> It would be extremely helpful, if you could go through your >> projects and let it run and report how it's going. >>>>>>>>>>>>>> If you see that "MSX ASMTODO" somewhere then we know I messed >> something up. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'll gonna finally remove the BCClass handling from those >> parts in a few days. Current commit is >>>>>>>>>>>>>> >> https://github.com/struberg/openjpa/commit/3ea2412003028d37f2a69971a47bb20abf589f8b >>>>>>>>>>>>>> >>>>>>>>>>>>>> txs and LieGrue, >>>>>>>>>>>>>> strub >>>> >>> >>> -- >>> Francesco Chicchiriccò >>> >>> Tirasa - Open Source Excellence >>> http://www.tirasa.net/ >>> >>> Member at The Apache Software Foundation >>> Syncope, Cocoon, Olingo, CXF, OpenJPA, PonyMail >>> http://home.apache.org/~ilgrosso/ >>> >> >>