You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cayenne.apache.org by Aristedes Maniatis <ar...@ish.com.au.INVALID> on 2021/10/10 06:01:36 UTC

Re: Cayenne Modeler support for JDK 17

I know I haven't been around much recently to help out. Hi everyone!!!

Perhaps it would be a good opportunity to release 4.2 once the few JDK17 
things are fixed. I think its pretty important to have a working 17 
release ASAP given that an increasing number of developers will be 
trying out this upgrade.

We'd need to wait for Gradle 7.3 first I think, since it will be 
important to test the fixes to the cgen plugin there once gradle itself 
becomes JDK17 compatible. The latest release (4.2M3) of cgen doesn't 
work with gradle 7+. Groovy 3.0.8 is also the first groovy version to 
support JDK17.

Anyhow, my thoughts are that the next release might be 4.2RC1, aiming 
for a final release this year with JDK17 compatibility as a key reason 
for users to upgrade.


I've asked Infra to take a look at the old buildbot builder still 
pointing at the svn version of Cayenne [1]


Ari



[1] https://issues.apache.org/jira/browse/INFRA-22396



On 27/9/21 5:53pm, Andrus Adamchik wrote:
> Ok, here is the Jira: https://issues.apache.org/jira/browse/CAY-2721 <https://issues.apache.org/jira/browse/CAY-2721>
>
> I also described a few workarounds until we fix it.
>
> Andrus
>
>
>> On Sep 27, 2021, at 8:38 AM, Andrus Adamchik <aa...@gmail.com> wrote:
>>
>> Yep, after installing java 17 (Temurin from https://adoptium.net/ <https://adoptium.net/> ), Modeler would no longer start. We'll need to investigate.
>>
>> Andrus
>>
>>> On Sep 24, 2021, at 6:01 PM, John Huss <johnthuss@gmail.com <ma...@gmail.com>> wrote:
>>>
>>> Cayenne Modeler crashes on launch with JDK 17 (from Oracle). Here is the
>>> output:
>>>
>>> /A/C/C/MacOS> *./CayenneModeler *
>>>
>>> 2021-09-24 09:50:12.418 defaults[76618:3072366]
>>>
>>> The domain/default pair of (kCFPreferencesAnyApplication, AppleLocale) does
>>> not exist
>>>
>>> ./CayenneModeler: line 310: [: ==: unary operator expected
>>>
>>> ./CayenneModeler: line 310: [: ==: unary operator expected
>>>
>>> Exception in thread "main" java.lang.IllegalAccessError: class
>>> org.apache.cayenne.modeler.osx.OSXPlatformInitializer (in unnamed module
>>> @0x755c9148) cannot access class com.apple.eawt.Application (in module
>>> java.desktop) because module java.desktop does not export com.apple.eawt to
>>> unnamed module @0x755c9148
>>>
>>> at
>>> org.apache.cayenne.modeler.osx.OSXPlatformInitializer.initLookAndFeel(OSXPlatformInitializer.java:58)
>>>
>>> at org.apache.cayenne.modeler.Main.launch(Main.java:74)
>>>
>>> at org.apache.cayenne.modeler.osx.OSXMain.main(OSXMain.java:37)
>>>
>>> The shell script problems on line 310 are due to the way the java version
>>> number is reported and are fixed by updating the newest version of the
>>> launcher here:
>>> https://raw.githubusercontent.com/tofi86/universalJavaApplicationStub/master/src/universalJavaApplicationStub <https://raw.githubusercontent.com/tofi86/universalJavaApplicationStub/master/src/universalJavaApplicationStub>
>>>
>>> But it still crashes due to the module access problem.
>>>
>>> -----------------------------------------------------------------------------------
>>>
>>> Besides that crash, I am seeing a build failure with the new JDK 17. It
>>> looks like groovy may need to be updated to support compiling with JDK 17.
>>>
>>>
>>> org.apache.cayenne.tools.DbGenerateTaskIT > defaultConfigTaskSuccess FAILED
>>>
>>>     org.gradle.testkit.runner.UnexpectedBuildFailure at
>>> DbGenerateTaskIT.java:65
>>>
>>>
>>> [*INFO*] cayenne-gradle-plugin: Cayenne Gradle Plugin ....... *FAILURE* [
>>> 20.426 s]
>>>
>>> java.lang.IllegalArgumentException: Unsupported class file major version 61
>>>   	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:189)
>>>   	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:170)
>>>   	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:156)
>>>   	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:277)
>>>   	at org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:81)
>>>   	at org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:251)
>>>   	at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:189)
>>>   	at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:169)
>>>   	at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:125)
>>>   	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClassNullable(AsmReferenceResolver.java:57)
>>>   	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:44)
>>>   	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveNonArrayType(AsmReferenceResolver.java:79)
>>>   	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveType(AsmReferenceResolver.java:70)
>>>   	at org.codehaus.groovy.ast.decompiled.MemberSignatureParser.createMethodNode(MemberSignatureParser.java:57)
>>>   	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lambda$createMethodNode$1(DecompiledClassNode.java:230)
>>>   	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.createMethodNode(DecompiledClassNode.java:236)
>>>   	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lazyInitMembers(DecompiledClassNode.java:203)
>>>   	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getDeclaredMethods(DecompiledClassNode.java:122)
>>>   	at org.codehaus.groovy.ast.ClassNode.tryFindPossibleMethod(ClassNode.java:1283)
>>>   	at org.codehaus.groovy.control.StaticImportVisitor.transformMethodCallExpression(StaticImportVisitor.java:251)
>>>   	at org.codehaus.groovy.control.StaticImportVisitor.transform(StaticImportVisitor.java:133)
>>>   	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:108)
>>>   	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
>>>   	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:138)
>>>   	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:111)
>>>   	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:66)
>>>   	at org.codehaus.groovy.control.StaticImportVisitor.visitConstructorOrMethod(StaticImportVisitor.java:108)
>>>   	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructor(ClassCodeVisitorSupport.java:101)
>>>   	at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1089)
>>>   	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:52)
>>>   	at org.codehaus.groovy.control.CompilationUnit.lambda$addPhaseOperations$3(CompilationUnit.java:209)
>>>   	at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:942)
>>>   	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:671)
>>>   	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:635)
>>>   	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:389)
>>>   	at groovy.lang.GroovyClassLoader.lambda$parseClass$3(GroovyClassLoader.java:332)
>>>   	at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
>>>   	at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
>>>   	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:330)
>>>   	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileScript(DefaultScriptCompilationHandler.java:139)
>>>   	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileToDir(DefaultScriptCompilationHandler.java:95)
>>>   	at org.gradle.groovy.scripts.internal.BuildOperationBackedScriptCompilationHandler$2.run(BuildOperationBackedScriptCompilationHandler.java:54)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.groovy.scripts.internal.BuildOperationBackedScriptCompilationHandler.compileToDir(BuildOperationBackedScriptCompilationHandler.java:51)
>>>   	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:190)
>>>   	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:170)
>>>   	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:211)
>>>   	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:194)
>>>   	at org.gradle.cache.internal.DefaultPersistentDirectoryCache$Initializer.initialize(DefaultPersistentDirectoryCache.java:100)
>>>   	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess$1.run(FixedSharedModeCrossProcessCacheAccess.java:86)
>>>   	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:216)
>>>   	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:206)
>>>   	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess.open(FixedSharedModeCrossProcessCacheAccess.java:83)
>>>   	at org.gradle.cache.internal.DefaultCacheAccess.open(DefaultCacheAccess.java:139)
>>>   	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:89)
>>>   	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:43)
>>>   	at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:103)
>>>   	at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:68)
>>>   	at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:126)
>>>   	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler.compile(FileCacheBackedScriptClassCompiler.java:116)
>>>   	at org.gradle.groovy.scripts.internal.CrossBuildInMemoryCachingScriptClassCache.getOrCompile(CrossBuildInMemoryCachingScriptClassCache.java:50)
>>>   	at org.gradle.groovy.scripts.internal.BuildScopeInMemoryCachingScriptClassCompiler.compile(BuildScopeInMemoryCachingScriptClassCompiler.java:50)
>>>   	at org.gradle.groovy.scripts.DefaultScriptCompilerFactory$ScriptCompilerImpl.compile(DefaultScriptCompilerFactory.java:49)
>>>   	at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:110)
>>>   	at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:65)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:62)
>>>   	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:43)
>>>   	at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:62)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:250)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:277)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:249)
>>>   	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:42)
>>>   	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
>>>   	at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35)
>>>   	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:100)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:250)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$withProjectLock$3(DefaultProjectStateRegistry.java:310)
>>>   	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:310)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:291)
>>>   	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:249)
>>>   	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:91)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:63)
>>>   	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:723)
>>>   	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:150)
>>>   	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:41)
>>>   	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:67)
>>>   	at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:46)
>>>   	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:64)
>>>   	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>   	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
>>>   	at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:226)
>>>   	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:164)
>>>   	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
>>>   	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:125)
>>>   	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:71)
>>>   	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
>>>   	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:67)
>>>   	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:56)
>>>   	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:56)
>>>   	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
>>>   	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
>>>   	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:66)
>>>   	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
>>>   	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:90)
>>>   	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
>>>   	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
>>>   	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
>>>   	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
>>>   	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
>>>   	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
>>>   	at org.gradle.launcher.exec.InProcessBuildActionExecuter.lambda$execute$0(InProcessBuildActionExecuter.java:59)
>>>   	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:86)
>>>   	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:58)
>>>   	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
>>>   	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.lambda$execute$0(BuildTreeScopeLifecycleBuildActionExecuter.java:34)
>>>   	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
>>>   	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:33)
>>>   	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:28)
>>>   	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:104)
>>>   	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:55)
>>>   	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:64)
>>>   	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:37)
>>>   	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.lambda$execute$0(SessionScopeLifecycleBuildActionExecuter.java:54)
>>>   	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:67)
>>>   	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:50)
>>>   	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:36)
>>>   	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
>>>   	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
>>>   	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
>>>   	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
>>>   	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)
>>>   	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
>>>   	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
>>>   	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
>>>   	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
>>>   	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
>>>   	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
>>>   	at org.gradle.util.Swapper.swap(Swapper.java:38)
>>>   	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
>>>   	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
>>>   	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
>>>   	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>   	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
>>>   	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
>>>   	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
>>>   	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
>>>   	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
>>>   	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
>>>   	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
>>>   	at java.base/java.lang.Thread.run(Thread.java:833)
>


Re: cgen into the future

Posted by Mike Kienenberger <mk...@gmail.com>.
On Sun, Oct 10, 2021 at 5:09 AM Andrus Adamchik <aa...@gmail.com> wrote:

> I expected tools removal to be a controversial proposal. Still decided to
> throw it out there. I am always looking for opportunities to minimize our
> support footprint (hi, ROP :)). Properly maintaining the tools across 3
> build systems is a non-trivial effort (especially Gradle, due to the rest
> of Cayenne being built with Maven). Now we've only increased the footprint,
> as we'd need to be merging map.xml config with build file config. But of
> course I realize that lots of people have designed their Cayenne workflow
> around the build tools (and we encouraged it), and will not appreciate them
> being taken away.
>

I use cgen for more than just generating entity superclasses and
subclasses.   I use it for generating DAO objects, presentation layer
components, validation files, and even entire presentation layer pages in
some cases.   There is at least one internal CRUD app which is 99%
generated from cgen with very little original code.

Re: cgen into the future

Posted by Andrus Adamchik <aa...@gmail.com>.
> I don't see the benefit in storing the output of generated code in version control.

There's no benefit, but there's no downside either. I barely give it a thought during my daily work. Entity removal is probably the only snag, but it is not completely addressed by not having superclasses in VC: you still have to remove you subclass manually.

> With the configuration in our gradle build file there is absolutely nothing to ask new developers to do.

Yep. This is why it was recommended by us before it got moved to the Modeler. Now the "Modeler-only" flow is at the same (or arguably higher) level of convenience.

> But I'd be equally happy for Modeler and cgen to share the same configuration somewhere.

I don't remember if they can already share the config from the map.xml file. But they definitely should.



I expected tools removal to be a controversial proposal. Still decided to throw it out there. I am always looking for opportunities to minimize our support footprint (hi, ROP :)). Properly maintaining the tools across 3 build systems is a non-trivial effort (especially Gradle, due to the rest of Cayenne being built with Maven). Now we've only increased the footprint, as we'd need to be merging map.xml config with build file config. But of course I realize that lots of people have designed their Cayenne workflow around the build tools (and we encouraged it), and will not appreciate them being taken away. 

FWIW, the switch was very simple for me and my team, but that may be because "cdbimport" was also in use, and going from pom.xml to the Modeler for cdbimport removed so much pain, that it was a no-brainer. "cgen" was just icing on the cake. We are using standard templates and nobody cared about the latter one way or another (and we already had _Xyz.java under version control).

Andrus


> On Oct 10, 2021, at 11:41 AM, Aristedes Maniatis <ar...@ish.com.au.INVALID> wrote:
> 
> I don't see the benefit in storing the output of generated code in version control. It makes commit history more noisy and hard to read without any real benefit. For just this one project, that includes:
> 
> * Cayenne
> * Swagger
> * Antlr
> 
> So if someone makes a change to the data model of one of those things and forgets to commit additional files, or there is a lot of boilerplate output changes because (say) Swagger was updated, then things might get out of sync and cause oddness in builds.
> 
> Mostly importantly, its really easy to mess up when you remove an entity from Cayenne and there is no automated process which also removes the relevant superclass. You may not even notice for a while until something unexpected happens three months later.
> 
> With the configuration in our gradle build file there is absolutely nothing to ask new developers to do. But I'd be equally happy for Modeler and cgen to share the same configuration somewhere.
> 
> 
> Ari
> 
> 
> On 10/10/21 6:25pm, Andrus Adamchik wrote:
>>> We don't store generated superclasses in version control since that's confusing and redundant.
>> I commit generated superclasses to Git everywhere. Never caused any issues that I can remember. But yes, I think that would be a prerequisite to switching away from cgen in build scripts to the Modeler-based flow.
>> 
>> What I was alluding to is that the XML config below is now managed visually in the Modeler and is saved in the XYZ.map.xml, while previously it was only saved in the local modeler preferences. So keeping a similar configuration in a build script was a superior approach because it was the only way to keep the config portable across dev machines. Imagine asking all your team members to manually import a custom template and setup their Modeler to use it for a specific project. Now this problem is gone.
>> 
>> 
>> <dbImport xmlns="http://cayenne.apache.org/schema/10/dbimport">
>> 	<catalog>
>> 		<includeTable>
>> 			<name>ma_.*</name>
>> 		</includeTable>
>> 		<name>media</name>
>> 	</catalog>
>> 	<tableTypes>
>> 		<tableType>TABLE</tableType>
>> 		<tableType>VIEW</tableType>
>> 	</tableTypes>
>> 	<forceDataMapCatalog>false</forceDataMapCatalog>
>> 	<forceDataMapSchema>false</forceDataMapSchema>
>> 	<namingStrategy>org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator</namingStrategy>
>> 	<skipPrimaryKeyLoading>false</skipPrimaryKeyLoading>
>> 	<skipRelationshipsLoading>false</skipRelationshipsLoading>
>> 	<stripFromTableNames>^ma_</stripFromTableNames>
>> 	<useJava7Types>false</useJava7Types>
>> 	<usePrimitives>true</usePrimitives>
>> </dbImport>
>> <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
>> 	<destDir>../../../../../../java</destDir>
>> 	<mode>entity</mode>
>> 	<template>templates/v4_1/subclass.vm</template>
>> 	<superTemplate>templates/v4_1/superclass.vm</superTemplate>
>> 	<outputPattern>*.java</outputPattern>
>> 	<makePairs>true</makePairs>
>> 	<usePkgPath>true</usePkgPath>
>> 	<overwrite>false</overwrite>
>> 	<createPropertyNames>false</createPropertyNames>
>> 	<createPKProperties>false</createPKProperties>
>> 	<client>false</client>
>> </cgen>
>> 
>> Andrus
>> 
>> 
>>> On Oct 10, 2021, at 10:04 AM, Aristedes Maniatis <ar...@ish.com.au.INVALID> wrote:
>>> 
>>> 
>>> 
>>> On 10/10/21 5:42pm, Andrus Adamchik wrote:
>>>> A bit OT... Before 4.1 all my projects used cgen and most - cdbimport. Not anymore. Things went full circle and Modeler has become the only way to sync up project with the DB. DataMap XML file now stores all the settings of the c* tasks. So now I came to realization that putting those same settings in your build file (Ant/Maven/Gradle) was simply a hack that allowed to share and version-control task configs. It is not needed anymore.
>>>> 
>>>> While I'll expect pushback on this:)  , may I suggest to deprecate the tools in 5.0, and remove them in 5.1.
>>> Can you explain a bit more? We don't store generated superclasses in version control since that's confusing and redundant. [1]  This is similar to how we don't store swagger generated classes in version control for the server side API implementation.
>>> 
>>> 
>>> Ari
>>> 
>>> 
>>> [1] https://github.com/ishgroup/oncourse/blob/main/server/build.gradle#L335
>>> [2] https://github.com/ishgroup/oncourse/blob/main/server-api/build.gradle#L62
> 


Re: cgen into the future

Posted by Aristedes Maniatis <ar...@ish.com.au.INVALID>.
I don't see the benefit in storing the output of generated code in 
version control. It makes commit history more noisy and hard to read 
without any real benefit. For just this one project, that includes:

* Cayenne
* Swagger
* Antlr

So if someone makes a change to the data model of one of those things 
and forgets to commit additional files, or there is a lot of boilerplate 
output changes because (say) Swagger was updated, then things might get 
out of sync and cause oddness in builds.

Mostly importantly, its really easy to mess up when you remove an entity 
from Cayenne and there is no automated process which also removes the 
relevant superclass. You may not even notice for a while until something 
unexpected happens three months later.

With the configuration in our gradle build file there is absolutely 
nothing to ask new developers to do. But I'd be equally happy for 
Modeler and cgen to share the same configuration somewhere.


Ari


On 10/10/21 6:25pm, Andrus Adamchik wrote:
>> We don't store generated superclasses in version control since that's confusing and redundant.
> I commit generated superclasses to Git everywhere. Never caused any issues that I can remember. But yes, I think that would be a prerequisite to switching away from cgen in build scripts to the Modeler-based flow.
>
> What I was alluding to is that the XML config below is now managed visually in the Modeler and is saved in the XYZ.map.xml, while previously it was only saved in the local modeler preferences. So keeping a similar configuration in a build script was a superior approach because it was the only way to keep the config portable across dev machines. Imagine asking all your team members to manually import a custom template and setup their Modeler to use it for a specific project. Now this problem is gone.
>
>
> <dbImport xmlns="http://cayenne.apache.org/schema/10/dbimport">
> 	<catalog>
> 		<includeTable>
> 			<name>ma_.*</name>
> 		</includeTable>
> 		<name>media</name>
> 	</catalog>
> 	<tableTypes>
> 		<tableType>TABLE</tableType>
> 		<tableType>VIEW</tableType>
> 	</tableTypes>
> 	<forceDataMapCatalog>false</forceDataMapCatalog>
> 	<forceDataMapSchema>false</forceDataMapSchema>
> 	<namingStrategy>org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator</namingStrategy>
> 	<skipPrimaryKeyLoading>false</skipPrimaryKeyLoading>
> 	<skipRelationshipsLoading>false</skipRelationshipsLoading>
> 	<stripFromTableNames>^ma_</stripFromTableNames>
> 	<useJava7Types>false</useJava7Types>
> 	<usePrimitives>true</usePrimitives>
> </dbImport>
> <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
> 	<destDir>../../../../../../java</destDir>
> 	<mode>entity</mode>
> 	<template>templates/v4_1/subclass.vm</template>
> 	<superTemplate>templates/v4_1/superclass.vm</superTemplate>
> 	<outputPattern>*.java</outputPattern>
> 	<makePairs>true</makePairs>
> 	<usePkgPath>true</usePkgPath>
> 	<overwrite>false</overwrite>
> 	<createPropertyNames>false</createPropertyNames>
> 	<createPKProperties>false</createPKProperties>
> 	<client>false</client>
> </cgen>
>
> Andrus
>
>
>> On Oct 10, 2021, at 10:04 AM, Aristedes Maniatis <ar...@ish.com.au.INVALID> wrote:
>>
>>
>>
>> On 10/10/21 5:42pm, Andrus Adamchik wrote:
>>> A bit OT... Before 4.1 all my projects used cgen and most - cdbimport. Not anymore. Things went full circle and Modeler has become the only way to sync up project with the DB. DataMap XML file now stores all the settings of the c* tasks. So now I came to realization that putting those same settings in your build file (Ant/Maven/Gradle) was simply a hack that allowed to share and version-control task configs. It is not needed anymore.
>>>
>>> While I'll expect pushback on this:)  , may I suggest to deprecate the tools in 5.0, and remove them in 5.1.
>> Can you explain a bit more? We don't store generated superclasses in version control since that's confusing and redundant. [1]  This is similar to how we don't store swagger generated classes in version control for the server side API implementation.
>>
>>
>> Ari
>>
>>
>> [1] https://github.com/ishgroup/oncourse/blob/main/server/build.gradle#L335
>> [2] https://github.com/ishgroup/oncourse/blob/main/server-api/build.gradle#L62


Re: cgen into the future

Posted by John Huss <jo...@gmail.com>.
Besides generating the java classes, we use cgen to generate source code
for other languages and other artifacts, using different configuration. So
while I would be in favor of removing the duplication of the configuration
for java class generation, I would still like to have the cgen task remain
available to use for other purposes.

On Sun, Oct 10, 2021 at 2:26 AM Andrus Adamchik <aa...@gmail.com> wrote:

> > We don't store generated superclasses in version control since that's
> confusing and redundant.
>
> I commit generated superclasses to Git everywhere. Never caused any issues
> that I can remember. But yes, I think that would be a prerequisite to
> switching away from cgen in build scripts to the Modeler-based flow.
>
> What I was alluding to is that the XML config below is now managed
> visually in the Modeler and is saved in the XYZ.map.xml, while previously
> it was only saved in the local modeler preferences. So keeping a similar
> configuration in a build script was a superior approach because it was the
> only way to keep the config portable across dev machines. Imagine asking
> all your team members to manually import a custom template and setup their
> Modeler to use it for a specific project. Now this problem is gone.
>
>
> <dbImport xmlns="http://cayenne.apache.org/schema/10/dbimport">
>         <catalog>
>                 <includeTable>
>                         <name>ma_.*</name>
>                 </includeTable>
>                 <name>media</name>
>         </catalog>
>         <tableTypes>
>                 <tableType>TABLE</tableType>
>                 <tableType>VIEW</tableType>
>         </tableTypes>
>         <forceDataMapCatalog>false</forceDataMapCatalog>
>         <forceDataMapSchema>false</forceDataMapSchema>
>
> <namingStrategy>org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator</namingStrategy>
>         <skipPrimaryKeyLoading>false</skipPrimaryKeyLoading>
>         <skipRelationshipsLoading>false</skipRelationshipsLoading>
>         <stripFromTableNames>^ma_</stripFromTableNames>
>         <useJava7Types>false</useJava7Types>
>         <usePrimitives>true</usePrimitives>
> </dbImport>
> <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
>         <destDir>../../../../../../java</destDir>
>         <mode>entity</mode>
>         <template>templates/v4_1/subclass.vm</template>
>         <superTemplate>templates/v4_1/superclass.vm</superTemplate>
>         <outputPattern>*.java</outputPattern>
>         <makePairs>true</makePairs>
>         <usePkgPath>true</usePkgPath>
>         <overwrite>false</overwrite>
>         <createPropertyNames>false</createPropertyNames>
>         <createPKProperties>false</createPKProperties>
>         <client>false</client>
> </cgen>
>
> Andrus
>
>
> > On Oct 10, 2021, at 10:04 AM, Aristedes Maniatis <ar...@ish.com.au.INVALID>
> wrote:
> >
> >
> >
> > On 10/10/21 5:42pm, Andrus Adamchik wrote:
> >> A bit OT... Before 4.1 all my projects used cgen and most - cdbimport.
> Not anymore. Things went full circle and Modeler has become the only way to
> sync up project with the DB. DataMap XML file now stores all the settings
> of the c* tasks. So now I came to realization that putting those same
> settings in your build file (Ant/Maven/Gradle) was simply a hack that
> allowed to share and version-control task configs. It is not needed anymore.
> >>
> >> While I'll expect pushback on this:)  , may I suggest to deprecate the
> tools in 5.0, and remove them in 5.1.
> >
> > Can you explain a bit more? We don't store generated superclasses in
> version control since that's confusing and redundant. [1]  This is similar
> to how we don't store swagger generated classes in version control for the
> server side API implementation.
> >
> >
> > Ari
> >
> >
> > [1]
> https://github.com/ishgroup/oncourse/blob/main/server/build.gradle#L335
> > [2]
> https://github.com/ishgroup/oncourse/blob/main/server-api/build.gradle#L62
>
>

Re: cgen into the future

Posted by Andrus Adamchik <aa...@gmail.com>.
> We don't store generated superclasses in version control since that's confusing and redundant.

I commit generated superclasses to Git everywhere. Never caused any issues that I can remember. But yes, I think that would be a prerequisite to switching away from cgen in build scripts to the Modeler-based flow.

What I was alluding to is that the XML config below is now managed visually in the Modeler and is saved in the XYZ.map.xml, while previously it was only saved in the local modeler preferences. So keeping a similar configuration in a build script was a superior approach because it was the only way to keep the config portable across dev machines. Imagine asking all your team members to manually import a custom template and setup their Modeler to use it for a specific project. Now this problem is gone.


<dbImport xmlns="http://cayenne.apache.org/schema/10/dbimport">
	<catalog>
		<includeTable>
			<name>ma_.*</name>
		</includeTable>
		<name>media</name>
	</catalog>
	<tableTypes>
		<tableType>TABLE</tableType>
		<tableType>VIEW</tableType>
	</tableTypes>
	<forceDataMapCatalog>false</forceDataMapCatalog>
	<forceDataMapSchema>false</forceDataMapSchema>
	<namingStrategy>org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator</namingStrategy>
	<skipPrimaryKeyLoading>false</skipPrimaryKeyLoading>
	<skipRelationshipsLoading>false</skipRelationshipsLoading>
	<stripFromTableNames>^ma_</stripFromTableNames>
	<useJava7Types>false</useJava7Types>
	<usePrimitives>true</usePrimitives>
</dbImport>
<cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
	<destDir>../../../../../../java</destDir>
	<mode>entity</mode>
	<template>templates/v4_1/subclass.vm</template>
	<superTemplate>templates/v4_1/superclass.vm</superTemplate>
	<outputPattern>*.java</outputPattern>
	<makePairs>true</makePairs>
	<usePkgPath>true</usePkgPath>
	<overwrite>false</overwrite>
	<createPropertyNames>false</createPropertyNames>
	<createPKProperties>false</createPKProperties>
	<client>false</client>
</cgen>

Andrus


> On Oct 10, 2021, at 10:04 AM, Aristedes Maniatis <ar...@ish.com.au.INVALID> wrote:
> 
> 
> 
> On 10/10/21 5:42pm, Andrus Adamchik wrote:
>> A bit OT... Before 4.1 all my projects used cgen and most - cdbimport. Not anymore. Things went full circle and Modeler has become the only way to sync up project with the DB. DataMap XML file now stores all the settings of the c* tasks. So now I came to realization that putting those same settings in your build file (Ant/Maven/Gradle) was simply a hack that allowed to share and version-control task configs. It is not needed anymore.
>> 
>> While I'll expect pushback on this:)  , may I suggest to deprecate the tools in 5.0, and remove them in 5.1.
> 
> Can you explain a bit more? We don't store generated superclasses in version control since that's confusing and redundant. [1]  This is similar to how we don't store swagger generated classes in version control for the server side API implementation.
> 
> 
> Ari
> 
> 
> [1] https://github.com/ishgroup/oncourse/blob/main/server/build.gradle#L335
> [2] https://github.com/ishgroup/oncourse/blob/main/server-api/build.gradle#L62


Re: cgen into the future

Posted by Aristedes Maniatis <ar...@ish.com.au.INVALID>.
On 11/10/21 2:56am, Michael Gentry wrote:
> If someone generated the "incorrect" classes
> from the default templates, cgen would fix that mistake for them when they
> built the project (happened frequently enough that I made it part of the
> build process).

This isn't true when deleting or renaming an entity in the model. It is 
really important to me that this kind of mistake causes a compilation 
error. Multiply this problem out by antlr, swagger and cayenne entities 
and I'm very happy with our design choice to keep generated code out of VCS.

This isn't hypothetical. Years ago we had a real problem that took days 
to solve; additional entities in our classpath caused a subtle problem 
in places you'd not expect. Almost lost a customer over it, so I've 
little interest in going back there.


> if you
> have to checkout a previous version and build it with a newer (or perhaps
> even older) version of Cayenne to see the superclasses, you may not be
> seeing the same superclasses as originally intended.

I'm pretty happy with our use of gradle to lock dependencies to a 
reproducible version. We even use gradle to lock in the version of node 
which compiles our typescript. And our DSL documentation is generated 
live [1], parsing the code without having to remember to commit the 
generated docs.


Anyhow, each to their own. Some people might like to commit js files 
compiled from typescript so they can search on what is running in 
production without compiling. For us, the opposite approach has worked well.


Cheers

Ari


[1] 
https://github.com/ishgroup/oncourse/blob/main/buildSrc/apidoc/src/main/groovy/au/com/ish/docs/DslGroovyRootDocBuilder.groovy

Re: cgen into the future

Posted by Michael Gentry <bl...@gmail.com>.
On Sun, Oct 10, 2021 at 3:04 AM Aristedes Maniatis <ar...@ish.com.au.invalid>
wrote:

> Can you explain a bit more? We don't store generated superclasses in
> version control since that's confusing and redundant. [1]  This is
> similar to how we don't store swagger generated classes in version
> control for the server side API implementation.
>

Hi Ari and Andrus,

While I'm generally a proponent of "don't commit generated artifacts," I'm
also a proponent of "write code to be read, not written."

I often browse code through GitHub or BitBucket and if I were browsing a
Cayenne project WITHOUT the superclasses checked in, I'd probably be
grumbling "WTF is the code?!?!?!" [1] There are also many times I've sent
people a GH or BB link to code to look at, including the superclasses. I
wouldn't want to have to checkout and build before I could browse the
code, which could involve a lot of steps for some of the projects I've seen
or worked on. Likewise, I wouldn't want to tell someone else they have
to checkout and build the code to see the superclasses.

Also, with the superclass checked in, you have a point-in-time view of the
actual code which was used to build the project. With changes to Cayenne
Modeler and code generation possible from one version to another, if you
have to checkout a previous version and build it with a newer (or perhaps
even older) version of Cayenne to see the superclasses, you may not be
seeing the same superclasses as originally intended.

I guess I feel it is important to check in the generated classes for
readability and historical purposes. Also used cgen quite a bit to generate
the classes instead of using Cayenne Modeler to do so since it made dealing
with custom templates easier. If someone generated the "incorrect" classes
from the default templates, cgen would fix that mistake for them when they
built the project (happened frequently enough that I made it part of the
build process).

[1] This might be even more important if you use custom templates for a
project.

Thanks,

mrg

cgen into the future

Posted by Aristedes Maniatis <ar...@ish.com.au.INVALID>.

On 10/10/21 5:42pm, Andrus Adamchik wrote:
> A bit OT... Before 4.1 all my projects used cgen and most - cdbimport. Not anymore. Things went full circle and Modeler has become the only way to sync up project with the DB. DataMap XML file now stores all the settings of the c* tasks. So now I came to realization that putting those same settings in your build file (Ant/Maven/Gradle) was simply a hack that allowed to share and version-control task configs. It is not needed anymore.
>
> While I'll expect pushback on this:)  , may I suggest to deprecate the tools in 5.0, and remove them in 5.1.

Can you explain a bit more? We don't store generated superclasses in 
version control since that's confusing and redundant. [1]  This is 
similar to how we don't store swagger generated classes in version 
control for the server side API implementation.


Ari


[1] https://github.com/ishgroup/oncourse/blob/main/server/build.gradle#L335
[2] 
https://github.com/ishgroup/oncourse/blob/main/server-api/build.gradle#L62

Re: Cayenne Modeler support for JDK 17

Posted by Andrus Adamchik <aa...@gmail.com>.
> Perhaps it would be a good opportunity to release 4.2 once the few JDK17 things are fixed. I think its pretty important to have a working 17 release ASAP given that an increasing number of developers will be trying out this upgrade.

Absolutely! Once Java 17 compatibility is addressed we should do the next 4.2 release (as well as 4.0.x and 4.1.x).

> Anyhow, my thoughts are that the next release might be 4.2RC1, aiming for a final release this year with JDK17 compatibility as a key reason for users to upgrade.

I was thinking the next release should be 4.2.B1 just to follow the tradition. But if we don't have any stability issues during the beta, we can go final skipping RC phase. WDYT?

> We'd need to wait for Gradle 7.3 first I think, since it will be important to test the fixes to the cgen plugin there once gradle itself becomes JDK17 compatible. The latest release (4.2M3) of cgen doesn't work with gradle 7+. Groovy 3.0.8 is also the first groovy version to support JDK17.

A bit OT... Before 4.1 all my projects used cgen and most - cdbimport. Not anymore. Things went full circle and Modeler has become the only way to sync up project with the DB. DataMap XML file now stores all the settings of the c* tasks. So now I came to realization that putting those same settings in your build file (Ant/Maven/Gradle) was simply a hack that allowed to share and version-control task configs. It is not needed anymore.

While I'll expect pushback on this :) , may I suggest to deprecate the tools in 5.0, and remove them in 5.1.


> I've asked Infra to take a look at the old buildbot builder still pointing at the svn version of Cayenne [1]

I wonder if we still need buildbot. While Travis has recently fallen off a cliff, GitHub Actions are very capable and well-understood.

Andrus


> On Oct 10, 2021, at 9:01 AM, Aristedes Maniatis <ar...@ish.com.au.INVALID> wrote:
> 
> I know I haven't been around much recently to help out. Hi everyone!!!
> 
> Perhaps it would be a good opportunity to release 4.2 once the few JDK17 things are fixed. I think its pretty important to have a working 17 release ASAP given that an increasing number of developers will be trying out this upgrade.
> 
> We'd need to wait for Gradle 7.3 first I think, since it will be important to test the fixes to the cgen plugin there once gradle itself becomes JDK17 compatible. The latest release (4.2M3) of cgen doesn't work with gradle 7+. Groovy 3.0.8 is also the first groovy version to support JDK17.
> 
> Anyhow, my thoughts are that the next release might be 4.2RC1, aiming for a final release this year with JDK17 compatibility as a key reason for users to upgrade.
> 
> 
> I've asked Infra to take a look at the old buildbot builder still pointing at the svn version of Cayenne [1]
> 
> 
> Ari
> 
> 
> 
> [1] https://issues.apache.org/jira/browse/INFRA-22396
> 
> 
> 
> On 27/9/21 5:53pm, Andrus Adamchik wrote:
>> Ok, here is the Jira: https://issues.apache.org/jira/browse/CAY-2721 <https://issues.apache.org/jira/browse/CAY-2721>
>> 
>> I also described a few workarounds until we fix it.
>> 
>> Andrus
>> 
>> 
>>> On Sep 27, 2021, at 8:38 AM, Andrus Adamchik <aa...@gmail.com> wrote:
>>> 
>>> Yep, after installing java 17 (Temurin from https://adoptium.net/ <https://adoptium.net/> ), Modeler would no longer start. We'll need to investigate.
>>> 
>>> Andrus
>>> 
>>>> On Sep 24, 2021, at 6:01 PM, John Huss <johnthuss@gmail.com <ma...@gmail.com>> wrote:
>>>> 
>>>> Cayenne Modeler crashes on launch with JDK 17 (from Oracle). Here is the
>>>> output:
>>>> 
>>>> /A/C/C/MacOS> *./CayenneModeler *
>>>> 
>>>> 2021-09-24 09:50:12.418 defaults[76618:3072366]
>>>> 
>>>> The domain/default pair of (kCFPreferencesAnyApplication, AppleLocale) does
>>>> not exist
>>>> 
>>>> ./CayenneModeler: line 310: [: ==: unary operator expected
>>>> 
>>>> ./CayenneModeler: line 310: [: ==: unary operator expected
>>>> 
>>>> Exception in thread "main" java.lang.IllegalAccessError: class
>>>> org.apache.cayenne.modeler.osx.OSXPlatformInitializer (in unnamed module
>>>> @0x755c9148) cannot access class com.apple.eawt.Application (in module
>>>> java.desktop) because module java.desktop does not export com.apple.eawt to
>>>> unnamed module @0x755c9148
>>>> 
>>>> at
>>>> org.apache.cayenne.modeler.osx.OSXPlatformInitializer.initLookAndFeel(OSXPlatformInitializer.java:58)
>>>> 
>>>> at org.apache.cayenne.modeler.Main.launch(Main.java:74)
>>>> 
>>>> at org.apache.cayenne.modeler.osx.OSXMain.main(OSXMain.java:37)
>>>> 
>>>> The shell script problems on line 310 are due to the way the java version
>>>> number is reported and are fixed by updating the newest version of the
>>>> launcher here:
>>>> https://raw.githubusercontent.com/tofi86/universalJavaApplicationStub/master/src/universalJavaApplicationStub <https://raw.githubusercontent.com/tofi86/universalJavaApplicationStub/master/src/universalJavaApplicationStub>
>>>> 
>>>> But it still crashes due to the module access problem.
>>>> 
>>>> -----------------------------------------------------------------------------------
>>>> 
>>>> Besides that crash, I am seeing a build failure with the new JDK 17. It
>>>> looks like groovy may need to be updated to support compiling with JDK 17.
>>>> 
>>>> 
>>>> org.apache.cayenne.tools.DbGenerateTaskIT > defaultConfigTaskSuccess FAILED
>>>> 
>>>>    org.gradle.testkit.runner.UnexpectedBuildFailure at
>>>> DbGenerateTaskIT.java:65
>>>> 
>>>> 
>>>> [*INFO*] cayenne-gradle-plugin: Cayenne Gradle Plugin ....... *FAILURE* [
>>>> 20.426 s]
>>>> 
>>>> java.lang.IllegalArgumentException: Unsupported class file major version 61
>>>>  	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:189)
>>>>  	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:170)
>>>>  	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:156)
>>>>  	at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:277)
>>>>  	at org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:81)
>>>>  	at org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:251)
>>>>  	at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:189)
>>>>  	at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:169)
>>>>  	at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:125)
>>>>  	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClassNullable(AsmReferenceResolver.java:57)
>>>>  	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:44)
>>>>  	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveNonArrayType(AsmReferenceResolver.java:79)
>>>>  	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveType(AsmReferenceResolver.java:70)
>>>>  	at org.codehaus.groovy.ast.decompiled.MemberSignatureParser.createMethodNode(MemberSignatureParser.java:57)
>>>>  	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lambda$createMethodNode$1(DecompiledClassNode.java:230)
>>>>  	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.createMethodNode(DecompiledClassNode.java:236)
>>>>  	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lazyInitMembers(DecompiledClassNode.java:203)
>>>>  	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getDeclaredMethods(DecompiledClassNode.java:122)
>>>>  	at org.codehaus.groovy.ast.ClassNode.tryFindPossibleMethod(ClassNode.java:1283)
>>>>  	at org.codehaus.groovy.control.StaticImportVisitor.transformMethodCallExpression(StaticImportVisitor.java:251)
>>>>  	at org.codehaus.groovy.control.StaticImportVisitor.transform(StaticImportVisitor.java:133)
>>>>  	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:108)
>>>>  	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
>>>>  	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:138)
>>>>  	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:111)
>>>>  	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:66)
>>>>  	at org.codehaus.groovy.control.StaticImportVisitor.visitConstructorOrMethod(StaticImportVisitor.java:108)
>>>>  	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructor(ClassCodeVisitorSupport.java:101)
>>>>  	at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1089)
>>>>  	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:52)
>>>>  	at org.codehaus.groovy.control.CompilationUnit.lambda$addPhaseOperations$3(CompilationUnit.java:209)
>>>>  	at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:942)
>>>>  	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:671)
>>>>  	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:635)
>>>>  	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:389)
>>>>  	at groovy.lang.GroovyClassLoader.lambda$parseClass$3(GroovyClassLoader.java:332)
>>>>  	at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
>>>>  	at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
>>>>  	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:330)
>>>>  	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileScript(DefaultScriptCompilationHandler.java:139)
>>>>  	at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileToDir(DefaultScriptCompilationHandler.java:95)
>>>>  	at org.gradle.groovy.scripts.internal.BuildOperationBackedScriptCompilationHandler$2.run(BuildOperationBackedScriptCompilationHandler.java:54)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.groovy.scripts.internal.BuildOperationBackedScriptCompilationHandler.compileToDir(BuildOperationBackedScriptCompilationHandler.java:51)
>>>>  	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:190)
>>>>  	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:170)
>>>>  	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:211)
>>>>  	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:194)
>>>>  	at org.gradle.cache.internal.DefaultPersistentDirectoryCache$Initializer.initialize(DefaultPersistentDirectoryCache.java:100)
>>>>  	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess$1.run(FixedSharedModeCrossProcessCacheAccess.java:86)
>>>>  	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:216)
>>>>  	at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:206)
>>>>  	at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess.open(FixedSharedModeCrossProcessCacheAccess.java:83)
>>>>  	at org.gradle.cache.internal.DefaultCacheAccess.open(DefaultCacheAccess.java:139)
>>>>  	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:89)
>>>>  	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:43)
>>>>  	at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:103)
>>>>  	at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:68)
>>>>  	at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:126)
>>>>  	at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler.compile(FileCacheBackedScriptClassCompiler.java:116)
>>>>  	at org.gradle.groovy.scripts.internal.CrossBuildInMemoryCachingScriptClassCache.getOrCompile(CrossBuildInMemoryCachingScriptClassCache.java:50)
>>>>  	at org.gradle.groovy.scripts.internal.BuildScopeInMemoryCachingScriptClassCompiler.compile(BuildScopeInMemoryCachingScriptClassCompiler.java:50)
>>>>  	at org.gradle.groovy.scripts.DefaultScriptCompilerFactory$ScriptCompilerImpl.compile(DefaultScriptCompilerFactory.java:49)
>>>>  	at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:110)
>>>>  	at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:65)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:62)
>>>>  	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:43)
>>>>  	at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:62)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:250)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:277)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:249)
>>>>  	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:42)
>>>>  	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
>>>>  	at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35)
>>>>  	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:100)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:250)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$withProjectLock$3(DefaultProjectStateRegistry.java:310)
>>>>  	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:310)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:291)
>>>>  	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:249)
>>>>  	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:91)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:63)
>>>>  	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:723)
>>>>  	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:150)
>>>>  	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:41)
>>>>  	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:67)
>>>>  	at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:46)
>>>>  	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:64)
>>>>  	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
>>>>  	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
>>>>  	at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:226)
>>>>  	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:164)
>>>>  	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
>>>>  	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:125)
>>>>  	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:71)
>>>>  	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
>>>>  	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:67)
>>>>  	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:56)
>>>>  	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:56)
>>>>  	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
>>>>  	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
>>>>  	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:66)
>>>>  	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
>>>>  	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:90)
>>>>  	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
>>>>  	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
>>>>  	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
>>>>  	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
>>>>  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
>>>>  	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
>>>>  	at org.gradle.launcher.exec.InProcessBuildActionExecuter.lambda$execute$0(InProcessBuildActionExecuter.java:59)
>>>>  	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:86)
>>>>  	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:58)
>>>>  	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
>>>>  	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.lambda$execute$0(BuildTreeScopeLifecycleBuildActionExecuter.java:34)
>>>>  	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
>>>>  	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:33)
>>>>  	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:28)
>>>>  	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:104)
>>>>  	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:55)
>>>>  	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:64)
>>>>  	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:37)
>>>>  	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.lambda$execute$0(SessionScopeLifecycleBuildActionExecuter.java:54)
>>>>  	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:67)
>>>>  	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:50)
>>>>  	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:36)
>>>>  	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
>>>>  	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
>>>>  	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
>>>>  	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
>>>>  	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)
>>>>  	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
>>>>  	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
>>>>  	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
>>>>  	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
>>>>  	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
>>>>  	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
>>>>  	at org.gradle.util.Swapper.swap(Swapper.java:38)
>>>>  	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
>>>>  	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
>>>>  	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
>>>>  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
>>>>  	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
>>>>  	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
>>>>  	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
>>>>  	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
>>>>  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
>>>>  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
>>>>  	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
>>>>  	at java.base/java.lang.Thread.run(Thread.java:833)
>> 
>