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 <ahu...@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); }