This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch CAUSEWAY-3676 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit a6b8b18c7436ad66964849c16a67c530753114c9 Author: danhaywood <[email protected]> AuthorDate: Thu Jan 18 10:51:10 2024 +0000 CAUSEWAY-3676: CAUSEWAY-3678 : extends EntityFacet to obtain the version of the entity --- .../facets/object/entity/EntityFacet.java | 2 + persistence/commons/src/main/java/module-info.java | 1 + .../commons/CausewayModulePersistenceCommons.java | 23 +++++++++ .../version/EntityVersionAccessor.java} | 21 ++------ .../version/EntityVersionAccessorDefault.java | 50 +++++++++++++++++++ .../metamodel/facets/entity/JdoEntityFacet.java | 9 ++++ .../jpa/applib/integration/HasVersion.java | 57 ++++++++++++++++++++++ .../jpa/integration/entity/JpaEntityFacet.java | 14 ++++++ 8 files changed, 159 insertions(+), 18 deletions(-) diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/entity/EntityFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/entity/EntityFacet.java index 0d910321d7..4cc0dbe3bf 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/entity/EntityFacet.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/entity/EntityFacet.java @@ -152,6 +152,8 @@ public interface EntityFacet extends Facet { EntityState getEntityState(Object pojo); + Object versionOf(Object pojo); + /** * Whether given method originates from byte code mangling. * @param method diff --git a/persistence/commons/src/main/java/module-info.java b/persistence/commons/src/main/java/module-info.java index 58a535970c..b4186b98a2 100644 --- a/persistence/commons/src/main/java/module-info.java +++ b/persistence/commons/src/main/java/module-info.java @@ -20,6 +20,7 @@ module org.apache.causeway.persistence.commons { exports org.apache.causeway.persistence.commons; exports org.apache.causeway.persistence.commons.metamodel.facets.prop.column; exports org.apache.causeway.persistence.commons.integration.changetracking; + exports org.apache.causeway.persistence.commons.integration.version; requires java.annotation; requires java.desktop; diff --git a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/CausewayModulePersistenceCommons.java b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/CausewayModulePersistenceCommons.java index ac62cade36..47a35c6d50 100644 --- a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/CausewayModulePersistenceCommons.java +++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/CausewayModulePersistenceCommons.java @@ -18,6 +18,15 @@ */ package org.apache.causeway.persistence.commons; +<<<<<<< Updated upstream +======= +import org.apache.causeway.persistence.commons.integration.repository.RepositoryServiceDefault; + +import org.apache.causeway.persistence.commons.integration.version.EntityVersionAccessor; +import org.apache.causeway.persistence.commons.integration.version.EntityVersionAccessorDefault; + +import org.springframework.context.annotation.Bean; +>>>>>>> Stashed changes import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -33,7 +42,21 @@ import org.apache.causeway.persistence.commons.integration.changetracking.PreAnd // @Service's EntityChangeTrackerDefault.class, PreAndPostValueEvaluatorServiceDefault.class, +<<<<<<< Updated upstream }) public class CausewayModulePersistenceCommons { +======= + EntityVersionAccessorDefault.class, + + // @Repository's + RepositoryServiceDefault.class, + +}) +public class CausewayModulePersistenceCommons { + + public static final String NAMESPACE = "causeway.persistence.commons"; + + +>>>>>>> Stashed changes } diff --git a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/CausewayModulePersistenceCommons.java b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/version/EntityVersionAccessor.java similarity index 54% copy from persistence/commons/src/main/java/org/apache/causeway/persistence/commons/CausewayModulePersistenceCommons.java copy to persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/version/EntityVersionAccessor.java index ac62cade36..a33b13815d 100644 --- a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/CausewayModulePersistenceCommons.java +++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/version/EntityVersionAccessor.java @@ -16,24 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.causeway.persistence.commons; +package org.apache.causeway.persistence.commons.integration.version; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import org.apache.causeway.core.runtime.CausewayModuleCoreRuntime; -import org.apache.causeway.persistence.commons.integration.changetracking.EntityChangeTrackerDefault; -import org.apache.causeway.persistence.commons.integration.changetracking.PreAndPostValueEvaluatorServiceDefault; - -@Configuration -@Import({ - // modules - CausewayModuleCoreRuntime.class, - - // @Service's - EntityChangeTrackerDefault.class, - PreAndPostValueEvaluatorServiceDefault.class, -}) -public class CausewayModulePersistenceCommons { +public interface EntityVersionAccessor { + Object versionOf(final Object domainObject); } diff --git a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/version/EntityVersionAccessorDefault.java b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/version/EntityVersionAccessorDefault.java new file mode 100644 index 0000000000..6df2581214 --- /dev/null +++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/version/EntityVersionAccessorDefault.java @@ -0,0 +1,50 @@ +/* + * 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.persistence.commons.integration.version; + +import lombok.RequiredArgsConstructor; + +import javax.annotation.Priority; +import javax.inject.Inject; + +import org.apache.causeway.applib.annotation.PriorityPrecedence; + +import org.apache.causeway.core.metamodel.facets.object.entity.EntityFacet; +import org.apache.causeway.core.metamodel.object.ManagedObject; +import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; + +import org.springframework.stereotype.Service; + +@Service +@Priority(PriorityPrecedence.LAST) +@RequiredArgsConstructor(onConstructor_ = {@Inject}) +public class EntityVersionAccessorDefault implements EntityVersionAccessor { + + private final ObjectManager objectManager; + + @Override + public Object versionOf(Object domainObject) { + ManagedObject managedObject = objectManager.adapt(domainObject); + EntityFacet facet = managedObject.getSpecification().getFacet(EntityFacet.class); + if (facet != null) { + return facet.versionOf(domainObject); + } + return null; + } +} diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java index 97f53f6eee..e43cb82834 100644 --- a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java +++ b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java @@ -27,6 +27,7 @@ import java.util.function.Supplier; import javax.inject.Inject; import javax.jdo.FetchGroup; +import javax.jdo.JDOHelper; import javax.jdo.PersistenceManager; import org.datanucleus.api.jdo.JDOQuery; @@ -368,6 +369,14 @@ implements EntityFacet { return DnEntityStateProvider.entityState(pojo); } + @Override + public Object versionOf(Object pojo) { + if (getEntityState(pojo).isAttached()) { + return JDOHelper.getVersion(pojo); + } + return null; + } + @Override public <T> T detach(final T pojo) { return getPersistenceManager().detachCopy(pojo); diff --git a/persistence/jpa/applib/src/main/java/org/apache/causeway/persistence/jpa/applib/integration/HasVersion.java b/persistence/jpa/applib/src/main/java/org/apache/causeway/persistence/jpa/applib/integration/HasVersion.java new file mode 100644 index 0000000000..39a8f49de7 --- /dev/null +++ b/persistence/jpa/applib/src/main/java/org/apache/causeway/persistence/jpa/applib/integration/HasVersion.java @@ -0,0 +1,57 @@ +/* + * 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.persistence.jpa.applib.integration; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.persistence.PostLoad; +import javax.persistence.PostPersist; +import javax.persistence.PostRemove; +import javax.persistence.PostUpdate; +import javax.persistence.PrePersist; +import javax.persistence.PreRemove; +import javax.persistence.PreUpdate; + +import org.eclipse.persistence.sessions.UnitOfWork; +import org.eclipse.persistence.sessions.changesets.DirectToFieldChangeRecord; +import org.eclipse.persistence.sessions.changesets.ObjectChangeSet; + +import org.springframework.lang.Nullable; + +import org.apache.causeway.commons.collections.Can; +import org.apache.causeway.commons.functional.Either; +import org.apache.causeway.core.metamodel.object.ManagedObject; +import org.apache.causeway.core.metamodel.object.ManagedObjects; +import org.apache.causeway.core.metamodel.object.MmEntityUtils; +import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; +import org.apache.causeway.core.metamodel.services.objectlifecycle.ObjectLifecyclePublisher; +import org.apache.causeway.core.metamodel.services.objectlifecycle.PropertyChangeRecord; +import org.apache.causeway.persistence.jpa.applib.services.JpaSupportService; + +import lombok.val; +import lombok.extern.log4j.Log4j2; + +/** + * For domain entities to implement, in order to surface their version programmatically. + */ +public interface HasVersion<T> { + + T getVersion(); + +} diff --git a/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/JpaEntityFacet.java b/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/JpaEntityFacet.java index 994e164e3c..44faa0ad1d 100644 --- a/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/JpaEntityFacet.java +++ b/persistence/jpa/integration/src/main/java/org/apache/causeway/persistence/jpa/integration/entity/JpaEntityFacet.java @@ -23,8 +23,11 @@ import java.util.Optional; import javax.inject.Inject; import javax.persistence.EntityManager; +import javax.persistence.LockModeType; import javax.persistence.PersistenceUnitUtil; +import org.apache.causeway.persistence.jpa.applib.integration.HasVersion; + import org.springframework.data.jpa.repository.JpaContext; import org.springframework.lang.Nullable; @@ -242,6 +245,17 @@ public class JpaEntityFacet return _JpaEntityStateUtil.getEntityState(entityManager, persistenceUnitUtil, entityClass, primaryKeyType, pojo); } + @Override + public Object versionOf(Object pojo) { + if (getEntityState(pojo).isAttached()) { + if (pojo instanceof HasVersion) { + return ((HasVersion<?>)pojo).getVersion(); + } + } + return null; + } + + @Override public boolean isProxyEnhancement(final Method method) { return false;
