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 <ahu...@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