This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch v4 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit 752ffc0d3ce56abc23d21654400fca865aea0809 Merge: 2e656191d9c d589bafcdb3 Author: Andi Huber <[email protected]> AuthorDate: Fri Jun 13 14:50:07 2025 +0200 Merge remote-tracking branch 'origin/main' into v4 commons/src/main/java/module-info.java | 1 + .../commons/internal/debug/_MemoryUsage.java | 98 +++++++++++++ .../metamodel/context/HasMetaModelContext.java | 5 + .../context/MetaModelContext_usingSpring.java | 5 + .../metamodel/spec/impl/ObjectMemberAbstract.java | 5 - .../runtimeservices/src/main/java/module-info.java | 1 + .../pdfjs/wkt/ui/components/PdfJsViewerPanel.java | 20 +-- .../testdomain/jpa/JpaInventoryManager.java | 6 + .../interact/WrapperInteraction_1_IntegTest.java | 149 +++++++++++++++++++ .../interact/WrapperInteraction_2_IntegTest.java | 132 +++++++++++++++++ .../interact/WrapperInteraction_3_IntegTest.java | 158 +++++++++++++++++++++ .../interact/WrapperInteraction_4_IntegTest.java | 152 ++++++++++++++++++++ .../WrapperInteraction_Caching_IntegTest.java | 141 ++++++++++++++++++ .../jpa/wrapper/JpaWrapperSyncTest.java | 86 +++++++++++ .../WrapperFactoryMetaspaceMemoryLeakTest.java | 103 ++++++++++++++ 15 files changed, 1049 insertions(+), 13 deletions(-) diff --cc commons/src/main/java/module-info.java index dc27edec287,27b06a6870d..fd5cc6fdc27 --- a/commons/src/main/java/module-info.java +++ b/commons/src/main/java/module-info.java @@@ -66,6 -66,7 +66,7 @@@ module org.apache.causeway.commons requires transitive java.desktop; requires transitive java.sql; requires transitive java.xml; - requires transitive org.apache.logging.log4j; ++ requires transitive java.management; requires transitive org.jdom2; requires transitive org.jspecify; requires transitive org.jsoup; diff --cc regressiontests/persistence-jpa/src/test/java/org/apache/causeway/testdomain/persistence/jpa/wrapper/JpaWrapperSyncTest.java index 00000000000,a62821d1e69..e58358093f4 mode 000000,100644..100644 --- a/regressiontests/persistence-jpa/src/test/java/org/apache/causeway/testdomain/persistence/jpa/wrapper/JpaWrapperSyncTest.java +++ b/regressiontests/persistence-jpa/src/test/java/org/apache/causeway/testdomain/persistence/jpa/wrapper/JpaWrapperSyncTest.java @@@ -1,0 -1,90 +1,86 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.causeway.testdomain.persistence.jpa.wrapper; + + import jakarta.inject.Inject; + + import org.junit.jupiter.api.AfterEach; + import org.junit.jupiter.api.BeforeEach; + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.TestPropertySource; - + import org.apache.causeway.applib.services.repository.RepositoryService; + import org.apache.causeway.applib.services.wrapper.WrapperFactory; -import org.apache.causeway.core.config.presets.CausewayPresets; + import org.apache.causeway.testdomain.fixtures.EntityTestFixtures; + import org.apache.causeway.testdomain.jpa.JpaInventoryManager; + import org.apache.causeway.testdomain.jpa.JpaTestFixtures; + import org.apache.causeway.testdomain.jpa.conf.Configuration_usingJpa; + import org.apache.causeway.testdomain.jpa.entities.JpaBook; + import org.apache.causeway.testdomain.jpa.entities.JpaProduct; + import org.apache.causeway.testing.integtestsupport.applib.CausewayIntegrationTestAbstract; + + import lombok.val; + + @SpringBootTest( + classes = { + Configuration_usingJpa.class + }, + properties = { + "spring.datasource.url=jdbc:h2:mem:JpaWrapperSyncTest" + } + ) -@TestPropertySource(CausewayPresets.UseLog4j2Test) + class JpaWrapperSyncTest extends CausewayIntegrationTestAbstract { + + @Inject private RepositoryService repository; + @Inject private WrapperFactory wrapper; + @Inject private JpaTestFixtures testFixtures; + + protected EntityTestFixtures.Lock lock; + + @BeforeEach + void installFixture() { + this.lock = testFixtures.aquireLock(); + lock.install(); + } + + @AfterEach + void uninstallFixture() { + this.lock.release(); + } + + @Test + void testWrapper_waitingOnDomainEvent() { + + val inventoryManager = factoryService.viewModel(JpaInventoryManager.class); + val sumOfPrices = repository.allInstances(JpaProduct.class) + .stream() + .mapToDouble(JpaProduct::getPrice) + .sum(); + + assertEquals(167d, sumOfPrices, 1E-6); + + val products = wrapper.wrap(inventoryManager).getAllProducts(); + + assertEquals(3, products.size()); + assertEquals(JpaBook.class, products.get(0).getClass()); + } + + } diff --cc regressiontests/persistence-jpa/src/test/java/org/apache/causeway/testdomain/persistence/jpa/wrapper/WrapperFactoryMetaspaceMemoryLeakTest.java index 00000000000,18dd21de935..c579fbfe39f mode 000000,100644..100644 --- a/regressiontests/persistence-jpa/src/test/java/org/apache/causeway/testdomain/persistence/jpa/wrapper/WrapperFactoryMetaspaceMemoryLeakTest.java +++ b/regressiontests/persistence-jpa/src/test/java/org/apache/causeway/testdomain/persistence/jpa/wrapper/WrapperFactoryMetaspaceMemoryLeakTest.java @@@ -1,0 -1,107 +1,103 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.causeway.testdomain.persistence.jpa.wrapper; + + import jakarta.inject.Inject; + + import org.junit.jupiter.api.AfterEach; + import org.junit.jupiter.api.BeforeEach; + import org.junit.jupiter.api.Test; + + import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.TestPropertySource; - + import org.apache.causeway.applib.services.wrapper.WrapperFactory; + import org.apache.causeway.commons.internal.base._Blackhole; + import org.apache.causeway.commons.internal.debug._MemoryUsage; -import org.apache.causeway.core.config.presets.CausewayPresets; + import org.apache.causeway.testdomain.fixtures.EntityTestFixtures; + import org.apache.causeway.testdomain.jpa.JpaInventoryManager; + import org.apache.causeway.testdomain.jpa.JpaTestFixtures; + import org.apache.causeway.testdomain.jpa.conf.Configuration_usingJpa; + import org.apache.causeway.testdomain.jpa.entities.JpaProduct; + import org.apache.causeway.testing.integtestsupport.applib.CausewayIntegrationTestAbstract; + + @SpringBootTest( + classes = { + Configuration_usingJpa.class, + }, + properties = { + "spring.datasource.url=jdbc:h2:mem:JpaWrapperSyncTest" + } + ) -@TestPropertySource(CausewayPresets.UseLog4j2Test) + class WrapperFactoryMetaspaceMemoryLeakTest extends CausewayIntegrationTestAbstract { + + @Inject private WrapperFactory wrapper; + @Inject private JpaTestFixtures testFixtures; + + protected EntityTestFixtures.Lock lock; + + @BeforeEach + void installFixture() { + this.lock = testFixtures.aquireLock(); + lock.install(); + } + + @AfterEach + void uninstallFixture() { + this.lock.release(); + } + + @Test + void testWrapper_waitingOnDomainEvent() throws InterruptedException { + _MemoryUsage.measureMetaspace("exercise", ()->{ + // with caching + // exercise(1, 0); // 2,221 KB + // exercise(1, 2000); // 3,839 KB. // some leakage from collections + // exercise(20, 0); // 2,112 KB + // exercise(20, 2000); // 3,875 KB + // exercise(2000, 0); // 3,263 KB. // ? increased some, is it significant; a lot less than without caching + // exercise(2000, 200); // 4,294 KB. + // exercise(20000, 0); // 3,243 KB // no noticeable leakage compared to 2000; MUCH less than without caching + + // without caching + // exercise(1, 0); // 2,244 KB + // exercise(1, 2000); //. 3,669 KB // some leakage from collections + // exercise(20, 0); // 2,440 KB + // exercise(20, 2000); //. 4,286 KB + exercise(2000, 0); // 14,580 KB // significant leakage from 20 + // exercise(2000, 200); // 20,423 KB + // exercise(20000, 0); //.115,729 KB + }); + } + - private void exercise(int instances, int loops) { ++ private void exercise(final int instances, final int loops) { + for (int i = 0; i < instances; i++) { + var jpaInventoryManager = wrapper.wrap(factoryService.viewModel(JpaInventoryManager.class)); + jpaInventoryManager.foo(); + + for (var j = 0; j < loops; j++) { + jpaInventoryManager + .getAllProducts() + .stream() + .map(JpaProduct::getName) + .forEach(_Blackhole::consume); + } + } + } + } + +
