You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/09/10 04:43:59 UTC
[isis] 02/02: ISIS-1976: fixing NPE when represents-persistent is
not recognized by the PM yet
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 289890b96c1e13b9e1a5e691f54ed87f1c031795
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Sep 10 06:24:08 2018 +0200
ISIS-1976: fixing NPE when represents-persistent is not recognized by
the PM yet
Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
.../system/persistence/PersistenceSession4.java | 6 ++----
.../system/persistence/PersistenceSession5.java | 18 ++++++++++++----
.../system/persistence/PersistenceSession.java | 24 ++++++++--------------
.../system/persistence/PersistenceSessionBase.java | 2 ++
.../ObjectAdapterContext_NewIdentifier.java | 13 +++---------
...ObjectAdapterContext_ObjectAdapterProvider.java | 2 +-
.../persistence/adaptermanager/OidProviders.java | 23 +++++++++++++--------
7 files changed, 45 insertions(+), 43 deletions(-)
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index e5e0b8c..7ba1caa 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -1201,10 +1201,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
@Override
- public String identifierFor(final Object pojo, final Oid.State type) {
- return type == Oid.State.TRANSIENT
- ? UUID.randomUUID().toString()
- : JdoObjectIdSerializer.toOidIdentifier(getPersistenceManager().getObjectId(pojo));
+ public String identifierFor(final Object pojo) {
+ return JdoObjectIdSerializer.toOidIdentifier(getPersistenceManager().getObjectId(pojo));
}
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index e77e5fb..2a9ec77 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -18,6 +18,7 @@
*/
package org.apache.isis.core.runtime.system.persistence;
+import static java.util.Objects.requireNonNull;
import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
import java.lang.reflect.Array;
@@ -33,6 +34,7 @@ import java.util.UUID;
import javax.jdo.FetchGroup;
import javax.jdo.FetchPlan;
+import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.identity.SingleFieldIdentity;
@@ -42,6 +44,8 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.datanucleus.enhancement.Persistable;
+import org.datanucleus.enhancer.methods.IsDeleted;
+import org.datanucleus.enhancer.methods.IsPersistent;
import org.datanucleus.exceptions.NucleusObjectNotFoundException;
import org.datanucleus.identity.DatastoreIdImpl;
import org.slf4j.Logger;
@@ -1193,10 +1197,16 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
@Override
- public String identifierFor(final Object pojo, final Oid.State type) {
- return type == Oid.State.TRANSIENT
- ? UUID.randomUUID().toString()
- : JdoObjectIdSerializer.toOidIdentifier(getPersistenceManager().getObjectId(pojo));
+ public String identifierFor(final Object pojo) {
+ final Object jdoOid = getPersistenceManager().getObjectId(pojo);
+ if(jdoOid==null) {
+ return UUID.randomUUID().toString(); //FIXME[ISIS-1976] should be guarded against somewhere else
+ }
+
+ requireNonNull(jdoOid,
+ ()->String.format("Pojo of type '%s' is not recognized by JDO.",
+ pojo.getClass().getName()));
+ return JdoObjectIdSerializer.toOidIdentifier(jdoOid);
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index f0850e5..eec2996 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -29,7 +29,6 @@ import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.adapter.oid.Oid.State;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -52,14 +51,6 @@ public interface PersistenceSession extends ObjectAdapterProvider.Delegating, Tr
public static final String INSTALL_FIXTURES_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_INSTALL_FIXTURES_KEY;
public static final boolean INSTALL_FIXTURES_DEFAULT = false;
- // [ahuber] could as well be 'protected', not referenced from other then implementing classes
- public static final String ROOT_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_ROOT_KEY;
-
- /**
- * Append regular <a href="http://www.datanucleus.org/products/accessplatform/persistence_properties.html">datanucleus properties</a> to this key
- */
- public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
-
//---
MementoRecreateObjectSupport mementoSupport();
@@ -108,12 +99,18 @@ public interface PersistenceSession extends ObjectAdapterProvider.Delegating, Tr
PersistenceManager getPersistenceManager();
/**
- * @param pojo
- * @param type
+ * @param pojo a persistable object
* @return String representing an object's id.
* @since 2.0.0-M2
*/
- String identifierFor(Object pojo, State type);
+ String identifierFor(Object pojo);
+
+ /**@since 2.0.0-M2*/
+ boolean isTransient(Object pojo);
+ /**@since 2.0.0-M2*/
+ boolean isRepresentingPersistent(Object pojo);
+ /**@since 2.0.0-M2*/
+ boolean isDestroyed(Object pojo);
/**
* Convenient equivalent to {@code getPersistenceManager()}.
@@ -170,9 +167,6 @@ public interface PersistenceSession extends ObjectAdapterProvider.Delegating, Tr
void resolve(Object parent);
- boolean isTransient(Object pojo);
- boolean isRepresentingPersistent(Object pojo);
- boolean isDestroyed(Object pojo);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
index 6fc8284..f597cc5 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
@@ -40,6 +40,7 @@ import org.apache.isis.core.commons.util.ToString;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
+import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureAbstract;
import org.apache.isis.core.runtime.services.changes.ChangedObjectsServiceInternal;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
@@ -49,6 +50,7 @@ abstract class PersistenceSessionBase implements PersistenceSession {
// -- CONSTANTS
protected static final Logger LOG = LoggerFactory.getLogger(PersistenceSession.class);
+ protected static final String ROOT_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_ROOT_KEY;
// -- FIELDS
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
index 5aad3c1..4ac5b3b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
@@ -69,20 +69,13 @@ class ObjectAdapterContext_NewIdentifier {
* @param pojo - being persisted
*/
final RootOid createPersistentOid(Object pojo) {
- final Oid.State type = Oid.State.PERSISTENT;
-
+
final ObjectSpecification spec = specificationLoader.loadSpecification(pojo.getClass());
- //FIXME[ISIS-1976] remove guard
- final ViewModelFacet recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
- if(spec.isService() || recreatableObjectFacet!=null || spec.containsDoOpFacet(ViewModelFacet.class)) {
- _Exceptions.throwUnexpectedCodeReach();
- }
-
- final String identifier = persistenceSession.identifierFor(pojo, type);
+ final String identifier = persistenceSession.identifierFor(pojo);
final ObjectSpecId objectSpecId = spec.getSpecId();
- return new RootOid(objectSpecId, identifier, type);
+ return new RootOid(objectSpecId, identifier, Oid.State.PERSISTENT);
}
}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index e3c4cd9..ab92f47 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -68,7 +68,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
.add(new OidProviders.OidForServices())
.add(new OidProviders.OidForValues())
.add(new OidProviders.OidForViewModels())
- .add(new OidProviders.OidForPersistables())
+ .add(new OidProviders.OidForPersistent())
.add(new OidProviders.OidForOthers())
.build();
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
index 63cce83..833bf1d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
@@ -18,6 +18,8 @@
*/
package org.apache.isis.core.runtime.system.persistence.adaptermanager;
+import java.util.UUID;
+
import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -45,13 +47,13 @@ public class OidProviders {
}
- public static class OidForPersistables implements OidProvider {
+ public static class OidForPersistent implements OidProvider {
private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
@Override
public boolean isHandling(Object pojo, ObjectSpecification spec) {
- // equivalent to isInstanceOfPersistable = pojo instanceof Persistable;
+ // equivalent to 'isInstanceOfPersistable = pojo instanceof Persistable'
final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin.isPersistenceEnhanced(pojo.getClass());
return isInstanceOfPersistable;
}
@@ -59,14 +61,18 @@ public class OidProviders {
@Override
public RootOid oidFor(Object pojo, ObjectSpecification spec) {
final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
- final Oid.State state = persistenceSession.isTransient(pojo) ? Oid.State.TRANSIENT : Oid.State.PERSISTENT;
- final String identifier = persistenceSession.identifierFor(pojo, state);
- return new RootOid(spec.getSpecId(), identifier, state);
+ final boolean isPersistent = !persistenceSession.isTransient(pojo);
+ if(isPersistent) {
+ final String identifier = persistenceSession.identifierFor(pojo);
+ return new RootOid(spec.getSpecId(), identifier, Oid.State.PERSISTENT);
+ } else {
+ final String identifier = UUID.randomUUID().toString();
+ return new RootOid(spec.getSpecId(), identifier, Oid.State.TRANSIENT);
+ }
}
-
+
}
-
public static class OidForValues implements OidProvider {
@Override
@@ -106,8 +112,7 @@ public class OidProviders {
@Override
public RootOid oidFor(Object pojo, ObjectSpecification spec) {
- final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
- final String identifier = persistenceSession.identifierFor(pojo, Oid.State.TRANSIENT);
+ final String identifier = UUID.randomUUID().toString();
return new RootOid(spec.getSpecId(), identifier, Oid.State.TRANSIENT);
}