This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 2033-IoC
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/2033-IoC by this push:
new e61c9c8 ISIS-2033: adds a dummy RootOid provider for JPA
e61c9c8 is described below
commit e61c9c8e1dda2ea2927e2142891ca78c9c3b7ea7
Author: Andi Huber <[email protected]>
AuthorDate: Tue Jan 29 23:08:16 2019 +0100
ISIS-2033: adds a dummy RootOid provider for JPA
Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
...ctionInvocationFacetForDomainEventAbstract.java | 4 +-
...ObjectAdapterContext_ObjectAdapterProvider.java | 3 ++
.../ObjectAdapterContext_OidProviders.java | 43 ++++++++++++++++++++++
3 files changed, 48 insertions(+), 2 deletions(-)
diff --git
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 66091c0..a14d108 100644
---
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -144,10 +144,10 @@ implements ImperativeFacet {
final ObjectAdapter[] argumentAdapters,
final InteractionInitiatedBy interactionInitiatedBy) {
- final ObjectAdapter holder =
+ final ObjectAdapter executionResult =
getPersistenceSessionServiceInternal().executeWithinTransaction(()->
doInvoke(owningAction, targetAdapter, mixedInAdapter,
argumentAdapters, interactionInitiatedBy));
- return holder;
+ return executionResult;
}
ObjectAdapter doInvoke(
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 6444f5b..90ea7d7 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
@@ -73,6 +73,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements
ObjectAdapterProvide
this.oidFactory =
OidFactory.builder(pojo->specificationLoader.loadSpecification(pojo.getClass()))
.add(new
ObjectAdapterContext_OidProviders.GuardAgainstRootOid())
.add(new ObjectAdapterContext_OidProviders.OidForServices())
+ .add(new
ObjectAdapterContext_OidProviders.OidForManagedBeans())
.add(new ObjectAdapterContext_OidProviders.OidForValues())
.add(new ObjectAdapterContext_OidProviders.OidForViewModels())
.add(new ObjectAdapterContext_OidProviders.OidForPersistent())
@@ -87,6 +88,8 @@ class ObjectAdapterContext_ObjectAdapterProvider implements
ObjectAdapterProvide
return null;
}
+ //FIXME [2033] the pojo might be a managed object (eg. by Spring or
CDI), this is new
+
final RootOid rootOid = oidFactory.oidFor(pojo);
final ObjectAdapter newAdapter =
objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
return objectAdapterContext.injectServices(newAdapter);
diff --git
a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
index b960cff..4421f59 100644
---
a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
+++
b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
@@ -18,8 +18,13 @@
*/
package org.apache.isis.core.runtime.system.persistence.adaptermanager;
+import java.lang.reflect.InvocationTargetException;
import java.util.UUID;
+import javax.persistence.Entity;
+
+import org.apache.isis.commons.internal._Constants;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
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;
@@ -30,6 +35,8 @@ import
org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import
org.apache.isis.core.runtime.system.persistence.adaptermanager.factories.OidFactory.OidProvider;
+import lombok.val;
+
class ObjectAdapterContext_OidProviders {
@@ -91,6 +98,42 @@ class ObjectAdapterContext_OidProviders {
}
+ static class OidForManagedBeans implements OidProvider {
+
+ //FIXME [2033] this is just a PoC for 'Customer'
+
+ @Override
+ public boolean isHandling(Object pojo, ObjectSpecification spec) {
+ return pojo.getClass().isAnnotationPresent(Entity.class);
+ }
+
+ @Override
+ public RootOid oidFor(Object pojo, ObjectSpecification spec) {
+ try {
+ return oidForCustomer(pojo, spec);
+ } catch (NoSuchMethodException | SecurityException |
IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ throw _Exceptions.unrecoverable(e);
+ }
+ }
+
+ private RootOid oidForCustomer(Object pojo, ObjectSpecification spec)
+ throws NoSuchMethodException, SecurityException,
IllegalAccessException,
+ IllegalArgumentException, InvocationTargetException {
+
+ val idGetter = pojo.getClass().getMethod("getId",
_Constants.emptyClasses);
+ Long id = (Long)idGetter.invoke(pojo, _Constants.emptyObjects);
+ if(id!=null && id>0) {
+ final String identifier = "" + id;
+ return Oid.Factory.persistentOf(spec.getSpecId(),
identifier);
+ } else {
+ final String identifier = UUID.randomUUID().toString();
+ return Oid.Factory.transientOf(spec.getSpecId(), identifier);
+ }
+ }
+
+ }
+
static class OidForValues implements OidProvider {
@Override