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;

Reply via email to