From 88c87eafc6f4f5ece29cb0d4e109af12e36ba613 Mon Sep 17 00:00:00 2001 From: Martin Ledvinka Date: Tue, 13 Aug 2024 18:24:38 +0200 Subject: [PATCH 1/6] [Bug #265] Ensure inherited callbacks and listeners are taken into account when determining whether entity class has callbacks/listeners. --- .../EntityLifecycleListenerManager.java | 17 +++++++++-------- .../EntityLifecycleCallbackResolverTest.java | 2 +- .../EntityLifecycleListenerManagerTest.java | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManager.java b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManager.java index a9d30de7b..b9644693c 100644 --- a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManager.java +++ b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManager.java @@ -42,7 +42,7 @@ public class EntityLifecycleListenerManager { private static final EntityLifecycleListenerManager EMPTY = new EntityLifecycleListenerManager(); - private Set parents = new HashSet<>(); + private final Set parents = new HashSet<>(); private final Map lifecycleCallbacks = new EnumMap<>(LifecycleEvent.class); @@ -225,11 +225,6 @@ public void invokePostRemoveCallbacks(Object instance) { invokeCallbacks(instance, LifecycleEvent.POST_REMOVE); } - void setParents(Set parents) { - assert parents != null; - this.parents = parents; - } - void addParent(EntityLifecycleListenerManager parent) { assert parent != null; this.parents.add(parent); @@ -264,11 +259,17 @@ Map getLifecycleCallbacks() { } boolean hasEntityLifecycleCallback(LifecycleEvent event) { - return lifecycleCallbacks.containsKey(event); + return lifecycleCallbacks.containsKey(event) || parents.stream() + .anyMatch(parent -> parent.hasEntityLifecycleCallback(event)); } List getEntityListeners() { - return entityListeners != null ? Collections.unmodifiableList(entityListeners) : Collections.emptyList(); + final List allListeners = new ArrayList<>(parents.stream().flatMap(parent -> parent.getEntityListeners() + .stream()).toList()); + if (entityListeners != null) { + allListeners.addAll(entityListeners); + } + return allListeners; } Map> getEntityListenerCallbacks() { diff --git a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleCallbackResolverTest.java b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleCallbackResolverTest.java index e3855c4a6..0faa8bd1a 100644 --- a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleCallbackResolverTest.java +++ b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleCallbackResolverTest.java @@ -173,7 +173,7 @@ public void resolveCreatesInstanceOfEntityListenerDeclaredBySpecifiedEntityType( final AbstractIdentifiableType et = typeFor(OWLClassS.class); final EntityLifecycleListenerManager result = resolve(et); assertEquals(1, result.getEntityListeners().size()); - assertTrue(result.getEntityListeners().get(0) instanceof ParentListener); + assertInstanceOf(ParentListener.class, result.getEntityListeners().get(0)); } @Test diff --git a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManagerTest.java b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManagerTest.java index 100c45319..7f71f9024 100644 --- a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManagerTest.java +++ b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/model/metamodel/EntityLifecycleListenerManagerTest.java @@ -109,6 +109,10 @@ void prePersist() { @PostLoad void postLoad() { } + + @PreUpdate + void preUpdate() { + } } @EntityListeners({ChildListener.class, AnotherChildListener.class}) @@ -219,7 +223,6 @@ void preUpdate() { @Test void hasLifecycleCallbackReturnsTrueWhenEntityHasMatchingLifecycleCallback() throws Exception { manager.addLifecycleCallback(LifecycleEvent.PRE_PERSIST, Child.class.getDeclaredMethod("prePersistChild")); - final Child instance = spy(new Child()); assertTrue(manager.hasLifecycleCallback(LifecycleEvent.PRE_PERSIST)); } @@ -229,7 +232,14 @@ void hasLifecycleCallbackReturnsTrueWhenEntityHasListenerWithMatchingLifecycleCa manager.addEntityListener(listener); manager.addEntityListenerCallback(listener, LifecycleEvent.POST_LOAD, ParentListener.class.getDeclaredMethod("postLoad", Parent.class)); - final Parent instance = new Parent(); assertTrue(manager.hasLifecycleCallback(LifecycleEvent.POST_LOAD)); } + + @Test + void hasLifecycleCallbackReturnsTrueForInheritedPreUpdateCallback() throws Exception { + final EntityLifecycleListenerManager parentManager = new EntityLifecycleListenerManager(); + parentManager.addLifecycleCallback(LifecycleEvent.PRE_UPDATE, Parent.class.getDeclaredMethod("preUpdate")); + manager.addParent(parentManager); + assertTrue(manager.hasLifecycleCallback(LifecycleEvent.PRE_UPDATE)); + } } From ccd665443b36b78505be3e24f3d72138f64bd4d5 Mon Sep 17 00:00:00 2001 From: Martin Ledvinka Date: Tue, 13 Aug 2024 18:47:50 +0200 Subject: [PATCH 2/6] [Bug #265] Add test reproducing the issue and fix. --- .../cvut/kbss/jopa/test/OWLClassSParent.java | 20 ++++++++ .../kbss/jopa/test/integration/BugTest.java | 51 ++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassSParent.java b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassSParent.java index 8e1511464..db787d364 100644 --- a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassSParent.java +++ b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassSParent.java @@ -19,8 +19,12 @@ import cz.cvut.kbss.jopa.model.annotations.Id; import cz.cvut.kbss.jopa.model.annotations.OWLClass; +import cz.cvut.kbss.jopa.model.annotations.OWLDataProperty; +import cz.cvut.kbss.jopa.model.annotations.PreUpdate; +import cz.cvut.kbss.jopa.vocabulary.DC; import java.net.URI; +import java.time.Instant; @OWLClass(iri = Vocabulary.C_OWL_CLASS_S_PARENT) public abstract class OWLClassSParent implements HasUri { @@ -28,6 +32,9 @@ public abstract class OWLClassSParent implements HasUri { @Id(generated = true) private URI uri; + @OWLDataProperty(iri = DC.Terms.MODIFIED) + private Instant modified; + @Override public URI getUri() { return uri; @@ -36,4 +43,17 @@ public URI getUri() { public void setUri(URI uri) { this.uri = uri; } + + public Instant getModified() { + return modified; + } + + public void setModified(Instant modified) { + this.modified = modified; + } + + @PreUpdate + void preUpdate() { + setModified(Instant.now()); + } } diff --git a/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java b/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java index 99a1dbd44..3c3000af3 100644 --- a/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java +++ b/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java @@ -33,10 +33,13 @@ import cz.cvut.kbss.jopa.test.OWLClassL; import cz.cvut.kbss.jopa.test.OWLClassO; import cz.cvut.kbss.jopa.test.OWLClassR; +import cz.cvut.kbss.jopa.test.OWLClassS; import cz.cvut.kbss.jopa.test.Vocabulary; import cz.cvut.kbss.jopa.test.environment.Generators; import cz.cvut.kbss.jopa.utils.JOPALazyUtils; +import cz.cvut.kbss.jopa.vocabulary.DC; import cz.cvut.kbss.jopa.vocabulary.RDFS; +import cz.cvut.kbss.ontodriver.Types; import cz.cvut.kbss.ontodriver.descriptor.AxiomDescriptor; import cz.cvut.kbss.ontodriver.descriptor.AxiomValueDescriptor; import cz.cvut.kbss.ontodriver.exception.OntoDriverException; @@ -59,6 +62,8 @@ import java.util.List; import java.util.Set; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -70,7 +75,9 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -313,12 +320,52 @@ void isInferredTriggersLazyLoadingForLazyLoadingProxy() throws Exception { em.getTransaction().begin(); final OWLClassL instance = em.find(OWLClassL.class, owner.getUri()); assertInstanceOf(LazyLoadingProxy.class, instance.getSingleA()); - assertFalse(em.isInferred(instance, em.getMetamodel().entity(OWLClassL.class).getAttribute("singleA"), instance.getSingleA())); + assertFalse(em.isInferred(instance, em.getMetamodel().entity(OWLClassL.class) + .getAttribute("singleA"), instance.getSingleA())); final ArgumentCaptor> axiomCaptor = ArgumentCaptor.forClass(Axiom.class); verify(connectionMock).isInferred(axiomCaptor.capture(), eq(Collections.emptySet())); assertEquals(new Value<>(NamedResource.create(ref.getUri())), axiomCaptor.getValue().getValue()); final ArgumentCaptor captor = ArgumentCaptor.forClass(AxiomDescriptor.class); verify(connectionMock, atLeastOnce()).find(captor.capture()); - assertTrue(captor.getAllValues().stream().anyMatch(ad -> ad.getSubject().equals(NamedResource.create(ref.getUri())))); + assertTrue(captor.getAllValues().stream() + .anyMatch(ad -> ad.getSubject().equals(NamedResource.create(ref.getUri())))); + } + + /** + * Bug #265 + */ + @Test + void updateRegistersChangesByInheritedPreUpdate() throws Exception { + final OWLClassS entity = new OWLClassS(); + entity.setUri(Generators.generateUri()); + final NamedResource subject = NamedResource.create(entity.getUri()); + final List> axioms = new ArrayList<>(); + final Axiom classAssertion = new AxiomImpl<>(subject, Assertion.createClassAssertion(false), + new Value<>(NamedResource.create(Vocabulary.C_OWL_CLASS_S))); + axioms.add(classAssertion); + final AxiomDescriptor desc = new AxiomDescriptor(subject); + desc.addAssertion(Assertion.createClassAssertion(false)); + desc.addAssertion(Assertion.createAnnotationPropertyAssertion(URI.create(RDFS.LABEL), false)); + desc.addAssertion(Assertion.createDataPropertyAssertion(URI.create(DC.Terms.DESCRIPTION), false)); + desc.addAssertion(Assertion.createDataPropertyAssertion(URI.create(DC.Terms.MODIFIED), false)); + doReturn(axioms).when(connectionMock).find(desc); + doReturn(true).when(connectionMock).contains(classAssertion, Collections.emptySet()); + final Types types = mock(Types.class); + when(connectionMock.types()).thenReturn(types); + when(types.getTypes(subject, Set.of(), false)).thenReturn(Set.of( + new AxiomImpl<>(subject, Assertion.createClassAssertion(false), new Value<>(URI.create(Vocabulary.C_OWL_CLASS_S))) + )); + + entity.setName("Updated name"); + em.getTransaction().begin(); + em.merge(entity); + em.getTransaction().commit(); + final ArgumentCaptor captor = ArgumentCaptor.forClass(AxiomValueDescriptor.class); + verify(connectionMock, times(2)).update(captor.capture()); + final List value = captor.getAllValues(); + assertTrue(value.stream().anyMatch(avd -> avd.getAssertions() + .contains(Assertion.createDataPropertyAssertion(URI.create(DC.Terms.MODIFIED), false)))); + assertTrue(value.stream().anyMatch(avd -> avd.getAssertions() + .contains(Assertion.createAnnotationPropertyAssertion(URI.create(RDFS.LABEL), false)))); } } From 70ef9ccf8e76e69f10e5b17e4e018f347c5ef3d9 Mon Sep 17 00:00:00 2001 From: Martin Ledvinka Date: Thu, 15 Aug 2024 08:35:40 +0200 Subject: [PATCH 3/6] [Upd] Update to RDF4J 5.0.2. --- ontodriver-rdf4j/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ontodriver-rdf4j/pom.xml b/ontodriver-rdf4j/pom.xml index 88dc44c49..6d6ee9800 100644 --- a/ontodriver-rdf4j/pom.xml +++ b/ontodriver-rdf4j/pom.xml @@ -14,7 +14,7 @@ - 5.0.1 + 5.0.2 From 35ec9e59279764ae7f5a708a4c5fbd0ebc6d4ef4 Mon Sep 17 00:00:00 2001 From: Martin Ledvinka Date: Wed, 14 Aug 2024 17:26:13 +0200 Subject: [PATCH 4/6] [Bug #264] Add test reproducing the issue. --- .../kbss/jopa/test/integration/BugTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java b/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java index 3c3000af3..aa051d0c3 100644 --- a/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java +++ b/jopa-integration-tests/src/test/java/cz/cvut/kbss/jopa/test/integration/BugTest.java @@ -26,6 +26,7 @@ import cz.cvut.kbss.jopa.oom.exception.UnpersistedChangeException; import cz.cvut.kbss.jopa.proxy.lazy.LazyLoadingProxy; import cz.cvut.kbss.jopa.test.OWLClassA; +import cz.cvut.kbss.jopa.test.OWLClassB; import cz.cvut.kbss.jopa.test.OWLClassD; import cz.cvut.kbss.jopa.test.OWLClassE; import cz.cvut.kbss.jopa.test.OWLClassF; @@ -39,6 +40,7 @@ import cz.cvut.kbss.jopa.utils.JOPALazyUtils; import cz.cvut.kbss.jopa.vocabulary.DC; import cz.cvut.kbss.jopa.vocabulary.RDFS; +import cz.cvut.kbss.ontodriver.Properties; import cz.cvut.kbss.ontodriver.Types; import cz.cvut.kbss.ontodriver.descriptor.AxiomDescriptor; import cz.cvut.kbss.ontodriver.descriptor.AxiomValueDescriptor; @@ -60,6 +62,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import static org.hamcrest.MatcherAssert.assertThat; @@ -368,4 +371,26 @@ void updateRegistersChangesByInheritedPreUpdate() throws Exception { assertTrue(value.stream().anyMatch(avd -> avd.getAssertions() .contains(Assertion.createAnnotationPropertyAssertion(URI.create(RDFS.LABEL), false)))); } + + /** + * Bug #264 + */ + @Test + void oomHandlesMapOfInstances() throws Exception { + final Properties properties = mock(Properties.class); + when(connectionMock.properties()).thenReturn(properties); + final OWLClassB entity = new OWLClassB(); + entity.setUri(Generators.generateUri()); + entity.setProperties(Map.of(Vocabulary.P_Q_STRING_ATTRIBUTE, Set.of("Test"))); + em.getTransaction().begin(); + em.persist(entity); + em.getTransaction().commit(); + + final ArgumentCaptor captor = ArgumentCaptor.forClass(AxiomValueDescriptor.class); + verify(connectionMock).persist(captor.capture()); + final AxiomValueDescriptor value = captor.getValue(); + assertThat(value.getAssertions(), hasItem(Assertion.createClassAssertion(false))); + verify(properties).addProperties(NamedResource.create(entity.getUri()), null, + Map.of(Assertion.createPropertyAssertion(URI.create(Vocabulary.P_Q_STRING_ATTRIBUTE), false), Set.of(new Value<>("Test")))); + } } From be92daceb361a2d0579316845f2ee87bc3450fcf Mon Sep 17 00:00:00 2001 From: Martin Ledvinka Date: Thu, 15 Aug 2024 08:31:13 +0200 Subject: [PATCH 5/6] [Bug #264] Handle ImmutableMaps in MapInstanceBuilder. Fall back to default Map (HashMap) if we are unable to find a suitable specific map implementation. --- .../jopa/sessions/MapInstanceBuilder.java | 7 +- .../jopa/sessions/MapInstanceBuilderTest.java | 66 +++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 jopa-impl/src/test/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilderTest.java diff --git a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilder.java b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilder.java index 67f2ad49b..741a099db 100644 --- a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilder.java +++ b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilder.java @@ -22,6 +22,7 @@ import cz.cvut.kbss.jopa.proxy.change.ChangeTrackingIndirectMap; import cz.cvut.kbss.jopa.sessions.util.CloneConfiguration; import cz.cvut.kbss.jopa.sessions.util.CloneRegistrationDescriptor; +import cz.cvut.kbss.jopa.utils.CollectionFactory; import cz.cvut.kbss.jopa.utils.EntityPropertiesUtils; import java.lang.reflect.Constructor; @@ -37,6 +38,7 @@ class MapInstanceBuilder extends AbstractInstanceBuilder { private static final Class singletonMapClass = Collections.singletonMap(null, null).getClass(); + private static final Class map1Class = Map.of(new Object(), new Object()).getClass(); MapInstanceBuilder(CloneBuilder builder, UnitOfWork uow) { super(builder, uow); @@ -55,12 +57,13 @@ Object buildClone(Object cloneOwner, Field field, Object original, CloneConfigur Map clone; clone = cloneUsingDefaultConstructor(cloneOwner, field, origCls, orig, configuration); if (clone == null) { - if (singletonMapClass.isInstance(orig)) { + if (singletonMapClass.isInstance(orig) || map1Class.isInstance(orig)) { clone = buildSingletonClone(cloneOwner, field, orig, configuration); } else if (Collections.emptyMap().equals(orig)) { clone = orig; } else { - throw new IllegalArgumentException("Unsupported map type " + origCls); + clone = CollectionFactory.createDefaultMap(); + cloneMapContent(cloneOwner, field, orig, clone, configuration); } } clone = new ChangeTrackingIndirectMap<>(cloneOwner, field, uow, clone); diff --git a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilderTest.java b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilderTest.java new file mode 100644 index 000000000..1857dcf11 --- /dev/null +++ b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/sessions/MapInstanceBuilderTest.java @@ -0,0 +1,66 @@ +package cz.cvut.kbss.jopa.sessions; + +import cz.cvut.kbss.jopa.environment.OWLClassB; +import cz.cvut.kbss.jopa.model.descriptors.Descriptor; +import cz.cvut.kbss.jopa.model.descriptors.EntityDescriptor; +import cz.cvut.kbss.jopa.sessions.util.CloneConfiguration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(MockitoExtension.class) +class MapInstanceBuilderTest { + + @Mock + private AbstractUnitOfWork uow; + + private Descriptor descriptor; + + private MapInstanceBuilder sut; + + @BeforeEach + public void setUp() { + CloneBuilder cloneBuilder = new CloneBuilder(uow); + this.sut = new MapInstanceBuilder(cloneBuilder, uow); + this.descriptor = new EntityDescriptor(); + } + + @Test + void buildCloneOfSingletonMapReturnsSingletonMap() throws Exception { + Map map = Collections.singletonMap("key", "value"); + Map clone = (Map) sut.buildClone(new OWLClassB(), OWLClassB.getPropertiesField(), map, new CloneConfiguration(descriptor, false)); + assertEquals(map, clone); + assertNotSame(map, clone); + } + + @Test + void buildCloneOfMapOfOneReturnsSingletonMap() throws Exception { + Map map = Map.of("key", "value"); + Map clone = (Map) sut.buildClone(new OWLClassB(), OWLClassB.getPropertiesField(), map, new CloneConfiguration(descriptor, false)); + assertEquals(map, clone); + assertNotSame(map, clone); + } + + @Test + void buildCloneOfEmptyMapReturnsEmptyMap() throws Exception { + Map map = Map.of(); + Map clone = (Map) sut.buildClone(new OWLClassB(), OWLClassB.getPropertiesField(), map, new CloneConfiguration(descriptor, false)); + assertEquals(map, clone); + assertNotSame(map, clone); + } + + @Test + void buildCloneOfMapOfNReturnsDefaultMap() throws Exception { + final Map map = Map.of("key1", "value1", "key2", "value2"); + final Map clone = (Map) sut.buildClone(new OWLClassB(), OWLClassB.getPropertiesField(), map, new CloneConfiguration(descriptor, false)); + assertEquals(map, clone); + assertNotSame(map, clone); + } +} From f65deb2bd7efbf0343398d84554b3e9a6b83ca54 Mon Sep 17 00:00:00 2001 From: Martin Ledvinka Date: Thu, 15 Aug 2024 08:48:09 +0200 Subject: [PATCH 6/6] [2.0.4] Bump version, update changelog. --- CHANGELOG.md | 5 +++++ datatype/pom.xml | 2 +- jopa-api/pom.xml | 2 +- jopa-distribution/pom.xml | 2 +- jopa-impl/pom.xml | 2 +- jopa-integration-tests-jena/pom.xml | 2 +- jopa-integration-tests-owlapi/pom.xml | 2 +- jopa-integration-tests-rdf4j/pom.xml | 2 +- jopa-integration-tests/pom.xml | 2 +- jopa-maven-plugin/pom.xml | 2 +- jopa-owl2java/pom.xml | 2 +- jopa-owlapi-utils/pom.xml | 2 +- modelgen/pom.xml | 2 +- ontodriver-api/pom.xml | 2 +- ontodriver-jena/pom.xml | 2 +- ontodriver-owlapi/pom.xml | 2 +- ontodriver-rdf4j/pom.xml | 2 +- pom.xml | 2 +- 18 files changed, 22 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f351320de..2909aa4db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # JOPA - Change Log +## 2.0.4 - 2024-08-15 +- Fix an issue with cloning instances of `AbstractImmutableMap` (produced by `Map.of`) (Bug #264). +- Ensure changes done by `@PreUpdate` callback inherited by entity are propagated to repository (Bug #265). +- Dependency updates: RDF4J 5.0.2. + ## 2.0.3 - 2024-07-22 - Fix an issue with generating static metamodel under JDK 21 (Bug #257). - Support using URI/URL as data property values (as RDF simple literal) (Enhancement #256). diff --git a/datatype/pom.xml b/datatype/pom.xml index e5589fcad..9fc448e64 100644 --- a/datatype/pom.xml +++ b/datatype/pom.xml @@ -6,7 +6,7 @@ jopa-all cz.cvut.kbss.jopa - 2.0.3 + 2.0.4 ../pom.xml diff --git a/jopa-api/pom.xml b/jopa-api/pom.xml index f6ff38b21..cc705668a 100644 --- a/jopa-api/pom.xml +++ b/jopa-api/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml diff --git a/jopa-distribution/pom.xml b/jopa-distribution/pom.xml index 87cea7439..c92af3f20 100644 --- a/jopa-distribution/pom.xml +++ b/jopa-distribution/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml diff --git a/jopa-impl/pom.xml b/jopa-impl/pom.xml index 6f846aa93..8072ecba5 100644 --- a/jopa-impl/pom.xml +++ b/jopa-impl/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml diff --git a/jopa-integration-tests-jena/pom.xml b/jopa-integration-tests-jena/pom.xml index 504c6526b..b9d0fb233 100644 --- a/jopa-integration-tests-jena/pom.xml +++ b/jopa-integration-tests-jena/pom.xml @@ -5,7 +5,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml 4.0.0 diff --git a/jopa-integration-tests-owlapi/pom.xml b/jopa-integration-tests-owlapi/pom.xml index ba5832eed..42f637215 100644 --- a/jopa-integration-tests-owlapi/pom.xml +++ b/jopa-integration-tests-owlapi/pom.xml @@ -5,7 +5,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml 4.0.0 diff --git a/jopa-integration-tests-rdf4j/pom.xml b/jopa-integration-tests-rdf4j/pom.xml index e4c65f548..6ba745617 100644 --- a/jopa-integration-tests-rdf4j/pom.xml +++ b/jopa-integration-tests-rdf4j/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml jopa-integration-tests-rdf4j diff --git a/jopa-integration-tests/pom.xml b/jopa-integration-tests/pom.xml index afda9733c..5a94de709 100644 --- a/jopa-integration-tests/pom.xml +++ b/jopa-integration-tests/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml 4.0.0 diff --git a/jopa-maven-plugin/pom.xml b/jopa-maven-plugin/pom.xml index eeb41395d..6c0cad3c9 100644 --- a/jopa-maven-plugin/pom.xml +++ b/jopa-maven-plugin/pom.xml @@ -5,7 +5,7 @@ jopa-all cz.cvut.kbss.jopa - 2.0.3 + 2.0.4 ../pom.xml 4.0.0 diff --git a/jopa-owl2java/pom.xml b/jopa-owl2java/pom.xml index d8d89d780..0230b27d6 100644 --- a/jopa-owl2java/pom.xml +++ b/jopa-owl2java/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml diff --git a/jopa-owlapi-utils/pom.xml b/jopa-owlapi-utils/pom.xml index 9a46e2110..d3d7bf422 100644 --- a/jopa-owlapi-utils/pom.xml +++ b/jopa-owlapi-utils/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml diff --git a/modelgen/pom.xml b/modelgen/pom.xml index b049620d7..60fd3981d 100644 --- a/modelgen/pom.xml +++ b/modelgen/pom.xml @@ -6,7 +6,7 @@ jopa-all cz.cvut.kbss.jopa - 2.0.3 + 2.0.4 ../pom.xml diff --git a/ontodriver-api/pom.xml b/ontodriver-api/pom.xml index e86744c74..21422b852 100644 --- a/ontodriver-api/pom.xml +++ b/ontodriver-api/pom.xml @@ -6,7 +6,7 @@ jopa-all cz.cvut.kbss.jopa - 2.0.3 + 2.0.4 ../pom.xml diff --git a/ontodriver-jena/pom.xml b/ontodriver-jena/pom.xml index 17abaaaac..bdf481580 100644 --- a/ontodriver-jena/pom.xml +++ b/ontodriver-jena/pom.xml @@ -8,7 +8,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml diff --git a/ontodriver-owlapi/pom.xml b/ontodriver-owlapi/pom.xml index 9c183fe83..5c04b547d 100644 --- a/ontodriver-owlapi/pom.xml +++ b/ontodriver-owlapi/pom.xml @@ -11,7 +11,7 @@ cz.cvut.kbss.jopa jopa-all - 2.0.3 + 2.0.4 ../pom.xml diff --git a/ontodriver-rdf4j/pom.xml b/ontodriver-rdf4j/pom.xml index 6d6ee9800..19a1ed314 100644 --- a/ontodriver-rdf4j/pom.xml +++ b/ontodriver-rdf4j/pom.xml @@ -10,7 +10,7 @@ jopa-all cz.cvut.kbss.jopa - 2.0.3 + 2.0.4 diff --git a/pom.xml b/pom.xml index 537d03f8a..cb5abb279 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 cz.cvut.kbss.jopa - 2.0.3 + 2.0.4 jopa-all pom JOPA