Francesco, I've now pushed this change. Can you please try it out? Looks good over here now. Now I started the full Syncope build and hope all comes green again.
txs and LieGrue, strub > Am 03.07.2023 um 17:55 schrieb Mark Struberg <strub...@yahoo.de>: > > 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/ >>>> >>> >>> >