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 14:56:11 UTC
[isis] 05/08: ISIS-1976: decouple viewmodel re-creation from
PersistenceSession
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 d3c46e8680309bec805efefb324fde304a3c6690
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Sep 10 12:47:03 2018 +0200
ISIS-1976: decouple viewmodel re-creation from PersistenceSession
Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
.../system/persistence/PersistenceSession4.java | 49 +-----------
.../system/persistence/PersistenceSession5.java | 46 +----------
.../system/persistence/PersistenceSession.java | 2 -
.../adaptermanager/ObjectAdapterContext.java | 29 +++++--
.../ObjectAdapterContext_DependencyInjection.java | 88 ++++++++++++++++++++++
.../ObjectAdapterContext_MementoSupport.java | 2 +-
...ctAdapterContext_ObjectAdapterByIdProvider.java | 6 +-
.../ObjectAdapterContext_ObjectReCreation.java | 72 ++++++++++++++++++
8 files changed, 191 insertions(+), 103 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 8af6150..1acd10d 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
@@ -459,58 +459,15 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
final Object pojo;
if(variant == Variant.VIEW_MODEL) {
- pojo = recreateViewModel(spec, memento);
+ pojo = objectAdapterContext.recreateViewModel(spec, memento);
} else {
- pojo = instantiateAndInjectServices(spec);
-
+ pojo = objectAdapterContext.instantiateAndInjectServices(spec);
}
final ObjectAdapter adapter = adapterFor(pojo);
return initializePropertiesAndDoCallback(adapter);
}
- //FIXME[ISIS-1976] remove
- private Object recreateViewModel(final ObjectSpecification spec, final String memento) {
- final ViewModelFacet facet = spec.getFacet(ViewModelFacet.class);
- if(facet == null) {
- throw new IllegalArgumentException("spec does not have ViewModelFacet; spec is " + spec.getFullIdentifier());
- }
-
- final Object viewModelPojo;
- if(facet.getRecreationMechanism().isInitializes()) {
- viewModelPojo = instantiateAndInjectServices(spec);
- facet.initialize(viewModelPojo, memento);
- } else {
- viewModelPojo = facet.instantiate(spec.getCorrespondingClass(), memento);
- }
- return viewModelPojo;
- }
-
- @Override
- public Object instantiateAndInjectServices(final ObjectSpecification objectSpec) {
-
- final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
- if (correspondingClass.isArray()) {
- return Array.newInstance(correspondingClass.getComponentType(), 0);
- }
-
- final Class<?> cls = correspondingClass;
- if (Modifier.isAbstract(cls.getModifiers())) {
- throw new IsisException("Cannot create an instance of an abstract class: " + cls);
- }
-
- final Object newInstance;
- try {
- newInstance = cls.newInstance();
- } catch (final IllegalAccessException | InstantiationException e) {
- throw new IsisException("Failed to create instance of type " + objectSpec.getFullIdentifier(), e);
- }
-
- servicesInjector.injectServicesInto(newInstance);
- return newInstance;
-
- }
-
private ObjectAdapter initializePropertiesAndDoCallback(final ObjectAdapter adapter) {
// initialize new object
@@ -877,6 +834,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
getTransactionManager().executeWithinTransaction(()->{
makePersistentTransactionAssumed(adapter);
+ // clear out the map of transient -> persistent
+ // already empty // PersistenceSession5.this.persistentByTransient.clear();
});
}
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 2e94fa3..3441cf0 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
@@ -457,9 +457,9 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
final Object pojo;
if(variant == Variant.VIEW_MODEL) {
- pojo = recreateViewModel(spec, memento);
+ pojo = objectAdapterContext.recreateViewModel(spec, memento);
} else {
- pojo = instantiateAndInjectServices(spec);
+ pojo = objectAdapterContext.instantiateAndInjectServices(spec);
}
@@ -467,48 +467,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
return initializePropertiesAndDoCallback(adapter);
}
- //FIXME[ISIS-1976] remove
- private Object recreateViewModel(final ObjectSpecification spec, final String memento) {
- final ViewModelFacet facet = spec.getFacet(ViewModelFacet.class);
- if(facet == null) {
- throw new IllegalArgumentException("spec does not have ViewModelFacet; spec is " + spec.getFullIdentifier());
- }
-
- final Object viewModelPojo;
- if(facet.getRecreationMechanism().isInitializes()) {
- viewModelPojo = instantiateAndInjectServices(spec);
- facet.initialize(viewModelPojo, memento);
- } else {
- viewModelPojo = facet.instantiate(spec.getCorrespondingClass(), memento);
- }
- return viewModelPojo;
- }
-
- @Override
- public Object instantiateAndInjectServices(final ObjectSpecification objectSpec) {
-
- final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
- if (correspondingClass.isArray()) {
- return Array.newInstance(correspondingClass.getComponentType(), 0);
- }
-
- final Class<?> cls = correspondingClass;
- if (Modifier.isAbstract(cls.getModifiers())) {
- throw new IsisException("Cannot create an instance of an abstract class: " + cls);
- }
-
- final Object newInstance;
- try {
- newInstance = cls.newInstance();
- } catch (final IllegalAccessException | InstantiationException e) {
- throw new IsisException("Failed to create instance of type " + objectSpec.getFullIdentifier(), e);
- }
-
- servicesInjector.injectServicesInto(newInstance);
- return newInstance;
-
- }
-
private ObjectAdapter initializePropertiesAndDoCallback(final ObjectAdapter adapter) {
// initialize new object
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 b7a22f5..8f3967f 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
@@ -164,8 +164,6 @@ extends
void execute(List<PersistenceCommand> persistenceCommandList);
- Object instantiateAndInjectServices(ObjectSpecification spec);
-
Object lookup(Bookmark bookmark, FieldResetPolicy fieldResetPolicy);
void resolve(Object parent);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index f4a21fa..efff6cc 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -31,12 +31,12 @@ import org.apache.isis.core.commons.ensure.IsisAssertException;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterByIdProvider;
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;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.adapter.version.Version;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -133,7 +133,9 @@ public class ObjectAdapterContext {
private final ObjectAdapterContext_MementoSupport mementoSupportMixin;
private final ObjectAdapterContext_ServiceLookup serviceLookupMixin;
private final ObjectAdapterContext_NewIdentifier newIdentifierMixin;
- private final ObjectAdapterContext_ObjectAdapterByIdProvider byIdMixin;
+ private final ObjectAdapterContext_ObjectAdapterByIdProvider objectAdapterByIdProviderMixin;
+ private final ObjectAdapterContext_DependencyInjection dependencyInjectionMixin;
+ private final ObjectAdapterContext_ObjectReCreation objectReCreationMixin;
private ObjectAdapterContext(
ServicesInjector servicesInjector,
@@ -147,7 +149,9 @@ public class ObjectAdapterContext {
this.mementoSupportMixin = new ObjectAdapterContext_MementoSupport(this, persistenceSession);
this.serviceLookupMixin = new ObjectAdapterContext_ServiceLookup(this, servicesInjector);
this.newIdentifierMixin = new ObjectAdapterContext_NewIdentifier(this, persistenceSession);
- this.byIdMixin = new ObjectAdapterContext_ObjectAdapterByIdProvider(this, persistenceSession, authenticationSession);
+ this.objectAdapterByIdProviderMixin = new ObjectAdapterContext_ObjectAdapterByIdProvider(this, persistenceSession, authenticationSession);
+ this.dependencyInjectionMixin = new ObjectAdapterContext_DependencyInjection(this, persistenceSession);
+ this.objectReCreationMixin = new ObjectAdapterContext_ObjectReCreation(this, persistenceSession);
this.persistenceSession = persistenceSession;
this.servicesInjector = servicesInjector;
@@ -165,8 +169,7 @@ public class ObjectAdapterContext {
if(LOG.isDebugEnabled()) {
String id = Integer.toHexString(this.hashCode());
String session = ""+persistenceSession;
- System.out.println("!!!!!!!!!!!!!!!!!!!!!!! "+String.format("%s id=%s session='%s'",
- msg, id, session));
+ LOG.debug(String.format("%s id=%s session='%s'", msg, id, session));
}
}
@@ -240,7 +243,13 @@ public class ObjectAdapterContext {
// -- BY-ID SUPPORT
public ObjectAdapterByIdProvider getObjectAdapterByIdProvider() {
- return byIdMixin;
+ return objectAdapterByIdProviderMixin;
+ }
+
+ // -- DEPENDENCY INJECTION
+
+ public Object instantiateAndInjectServices(ObjectSpecification objectSpec) {
+ return dependencyInjectionMixin.instantiateAndInjectServices(objectSpec);
}
// -- FACTORIES
@@ -338,6 +347,12 @@ public class ObjectAdapterContext {
return mementoSupportMixin;
}
+ // -- OBJECT RECREATION SUPPORT
+
+ public Object recreateViewModel(final ObjectSpecification spec, final String memento) {
+ return objectReCreationMixin.recreateViewModel(spec, memento);
+ }
+
// ------------------------------------------------------------------------------------------------
public ObjectAdapter disposableAdapterForViewModel(Object viewModelPojo) {
@@ -477,7 +492,5 @@ public class ObjectAdapterContext {
-
-
}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_DependencyInjection.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_DependencyInjection.java
new file mode 100644
index 0000000..edd51a2
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_DependencyInjection.java
@@ -0,0 +1,88 @@
+/*
+ * 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.isis.core.runtime.system.persistence.adaptermanager;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Modifier;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+
+/**
+ * package private mixin for ObjectAdapterContext
+ * <p>
+ * Responsibility: creates new domain object instances
+ * </p>
+ * @since 2.0.0-M2
+ */
+@SuppressWarnings("unused")
+class ObjectAdapterContext_DependencyInjection {
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_DependencyInjection.class);
+ private final ObjectAdapterContext objectAdapterContext;
+ private final PersistenceSession persistenceSession;
+ private final ServicesInjector servicesInjector;
+ private final SpecificationLoader specificationLoader;
+
+
+ ObjectAdapterContext_DependencyInjection(ObjectAdapterContext objectAdapterContext,
+ PersistenceSession persistenceSession) {
+ this.objectAdapterContext = objectAdapterContext;
+ this.persistenceSession = persistenceSession;
+ this.servicesInjector = persistenceSession.getServicesInjector();
+ this.specificationLoader = servicesInjector.getSpecificationLoader();
+ }
+
+ Object instantiateAndInjectServices(final ObjectSpecification objectSpec) {
+
+ final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
+ if (correspondingClass.isArray()) {
+ return Array.newInstance(correspondingClass.getComponentType(), 0);
+ }
+
+ final Class<?> cls = correspondingClass;
+ if (Modifier.isAbstract(cls.getModifiers())) {
+ throw new IsisException("Cannot create an instance of an abstract class: " + cls);
+ }
+
+ final Object newInstance;
+ try {
+ newInstance = cls.newInstance();
+ } catch (final IllegalAccessException | InstantiationException e) {
+ throw new IsisException("Failed to create instance of type " + objectSpec.getFullIdentifier(), e);
+ }
+
+ servicesInjector.injectServicesInto(newInstance);
+ return newInstance;
+
+ }
+
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
index beaadae..f6ed879 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
@@ -72,7 +72,7 @@ class ObjectAdapterContext_MementoSupport implements MementoRecreateObjectSuppor
if (spec.isParentedOrFreeCollection()) {
- final Object recreatedPojo = persistenceSession.instantiateAndInjectServices(spec);
+ final Object recreatedPojo = objectAdapterContext.instantiateAndInjectServices(spec);
adapter = objectAdapterContext.addRecreatedPojoToCache(oid, recreatedPojo);
adapter = populateCollection(adapter, (CollectionData) data);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
index c4a8af3..3253e52 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
@@ -46,7 +46,7 @@ import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
/**
* package private mixin for ObjectAdapterContext
* <p>
- * Responsibility: creates RootOids
+ * Responsibility: implements ObjectAdapterByIdProvider
* </p>
* @since 2.0.0-M2
*/
@@ -223,7 +223,7 @@ class ObjectAdapterContext_ObjectAdapterByIdProvider implements ObjectAdapterByI
pojo = recreateViewModel(spec, memento);
} else {
- pojo = persistenceSession.instantiateAndInjectServices(spec);
+ pojo = objectAdapterContext.instantiateAndInjectServices(spec);
}
return pojo;
@@ -237,7 +237,7 @@ class ObjectAdapterContext_ObjectAdapterByIdProvider implements ObjectAdapterByI
final Object viewModelPojo;
if(facet.getRecreationMechanism().isInitializes()) {
- viewModelPojo = persistenceSession.instantiateAndInjectServices(spec);
+ viewModelPojo = objectAdapterContext.instantiateAndInjectServices(spec);
facet.initialize(viewModelPojo, memento);
} else {
viewModelPojo = facet.instantiate(spec.getCorrespondingClass(), memento);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectReCreation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectReCreation.java
new file mode 100644
index 0000000..cb276ac
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectReCreation.java
@@ -0,0 +1,72 @@
+/*
+ * 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.isis.core.runtime.system.persistence.adaptermanager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+
+/**
+ * package private mixin for ObjectAdapterContext
+ * <p>
+ * Responsibility: re-creates domain object instances
+ * </p>
+ * @since 2.0.0-M2
+ */
+@SuppressWarnings("unused")
+class ObjectAdapterContext_ObjectReCreation {
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_ObjectReCreation.class);
+ private final ObjectAdapterContext objectAdapterContext;
+ private final PersistenceSession persistenceSession;
+ private final ServicesInjector servicesInjector;
+ private final SpecificationLoader specificationLoader;
+
+
+ ObjectAdapterContext_ObjectReCreation(ObjectAdapterContext objectAdapterContext,
+ PersistenceSession persistenceSession) {
+ this.objectAdapterContext = objectAdapterContext;
+ this.persistenceSession = persistenceSession;
+ this.servicesInjector = persistenceSession.getServicesInjector();
+ this.specificationLoader = servicesInjector.getSpecificationLoader();
+ }
+
+ Object recreateViewModel(final ObjectSpecification spec, final String memento) {
+ final ViewModelFacet facet = spec.getFacet(ViewModelFacet.class);
+ if(facet == null) {
+ throw new IllegalArgumentException("spec does not have ViewModelFacet; spec is " + spec.getFullIdentifier());
+ }
+
+ final Object viewModelPojo;
+ if(facet.getRecreationMechanism().isInitializes()) {
+ viewModelPojo = objectAdapterContext.instantiateAndInjectServices(spec);
+ facet.initialize(viewModelPojo, memento);
+ } else {
+ viewModelPojo = facet.instantiate(spec.getCorrespondingClass(), memento);
+ }
+ return viewModelPojo;
+ }
+
+}
\ No newline at end of file