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 2019/12/09 15:55:09 UTC

[isis] branch master updated: ISIS-2158: disable exception suppression for Interaction.execute(...)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 3b12fbe  ISIS-2158: disable exception suppression for Interaction.execute(...)
3b12fbe is described below

commit 3b12fbe15351aa9107ee037d467daa741ac0f50c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Dec 9 16:54:59 2019 +0100

    ISIS-2158: disable exception suppression for Interaction.execute(...)
    
    - there is an issue with exceptions getting swallowed: unless this is
    fixed, we rather print all of them, no matter whether recognized or not
    later on
    - also throw more meaningful exceptions, when the BookmarkService is
    unable to provide a bookmark for a certain type
---
 .../jaxbadapters/PersistentEntitiesAdapter.java    | 43 ++++++++++++----------
 .../jaxbadapters/PersistentEntityAdapter.java      |  2 +-
 .../isis/applib/mixins/dto/DtoMappingHelper.java   | 17 +++++----
 .../applib/mixins/layout/Object_openRestApi.java   |  8 ++--
 .../mixins/metamodel/Object_objectIdentifier.java  |  8 ++--
 .../applib/mixins/metamodel/Object_objectType.java |  9 ++---
 .../applib/services/bookmark/BookmarkService.java  | 28 +++++++++++++-
 .../isis/applib/services/iactn/Interaction.java    | 17 ++++++---
 .../isis/applib/util/schema/CommonDtoUtils.java    | 14 ++++---
 .../isis/metamodel/facets/DomainEventHelper.java   |  9 +----
 .../invocation/ActionDomainEventFacetAbstract.java |  3 --
 ...ctionInvocationFacetForDomainEventAbstract.java |  4 +-
 .../bookmarks/BookmarkServiceInternalDefault.java  | 14 ++++---
 .../ixn/InteractionDtoServiceInternalDefault.java  |  4 +-
 .../handlers/DomainObjectInvocationHandler.java    |  3 +-
 .../wicket/viewer/mixins/Object_clearHints.java    | 25 ++++++-------
 .../extensions/excel/dom/util/CellMarshaller.java  | 26 +++++++++----
 17 files changed, 140 insertions(+), 94 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntitiesAdapter.java b/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntitiesAdapter.java
index c01e22a..efc9c41 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntitiesAdapter.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntitiesAdapter.java
@@ -1,18 +1,20 @@
-/**
- *  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
+/*
+ *  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
+ *        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.
+ *  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.applib.jaxbadapters;
 
@@ -24,9 +26,10 @@ import javax.xml.bind.annotation.adapters.XmlAdapter;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.schema.common.v1.OidDto;
 import org.apache.isis.schema.common.v1.OidsDto;
 
+import lombok.val;
+
 public class PersistentEntitiesAdapter extends XmlAdapter<OidsDto, List<Object>> {
 
     @Inject private BookmarkService bookmarkService;
@@ -35,9 +38,9 @@ public class PersistentEntitiesAdapter extends XmlAdapter<OidsDto, List<Object>>
     public List<Object> unmarshal(final OidsDto oidsDto) {
 
         List<Object> domainObjects = _Lists.newArrayList();
-        for (final OidDto oidDto : oidsDto.getOid()) {
-            final Bookmark bookmark = Bookmark.from(oidDto);
-            Object domainObject = bookmarkService.lookup(bookmark);
+        for (val oidDto : oidsDto.getOid()) {
+            val bookmark = Bookmark.from(oidDto);
+            val domainObject = bookmarkService.lookup(bookmark);
             domainObjects.add(domainObject);
         }
         return domainObjects;
@@ -48,9 +51,9 @@ public class PersistentEntitiesAdapter extends XmlAdapter<OidsDto, List<Object>>
         if(domainObjects == null) {
             return null;
         }
-        OidsDto oidsDto = new OidsDto();
-        for (final Object domainObject : domainObjects) {
-            final Bookmark bookmark = getBookmarkService().bookmarkFor(domainObject);
+        val oidsDto = new OidsDto();
+        for (val domainObject : domainObjects) {
+            val bookmark = getBookmarkService().bookmarkForElseThrow(domainObject);
             oidsDto.getOid().add(bookmark.toOidDto());
         }
         return oidsDto;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntityAdapter.java b/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntityAdapter.java
index 7ec8d64..60f1e97 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntityAdapter.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/jaxbadapters/PersistentEntityAdapter.java
@@ -42,7 +42,7 @@ public class PersistentEntityAdapter extends XmlAdapter<OidDto, Object> {
         if(domainObject == null) {
             return null;
         }
-        val bookmark = bookmarkService.bookmarkFor(domainObject);
+        val bookmark = bookmarkService.bookmarkForElseThrow(domainObject);
         return bookmark.toOidDto();
     }
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
index 301502a..0043b19 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/dto/DtoMappingHelper.java
@@ -18,21 +18,22 @@
  */
 package org.apache.isis.applib.mixins.dto;
 
-import lombok.extern.log4j.Log4j2;
-
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.schema.common.v1.BookmarkObjectState;
 import org.apache.isis.schema.common.v1.OidDto;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Service;
+
+import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isisApplib.DtoMappingHelper")
@@ -41,6 +42,8 @@ import org.springframework.stereotype.Service;
 @Qualifier("Default")
 @Log4j2
 public class DtoMappingHelper {
+    
+    @Inject private BookmarkService bookmarkService;
 
     public OidDto oidDtoFor(final Object object) {
         final Bookmark bookmark = bookmarkService.bookmarkFor(object);
@@ -74,5 +77,5 @@ public class DtoMappingHelper {
 
     }
 
-    @Inject BookmarkService bookmarkService;
+    
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java b/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
index ef143ba..b03e4f4 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_openRestApi.java
@@ -29,7 +29,6 @@ import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.mixins.MixinConstants;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
-import org.apache.isis.applib.services.swagger.SwaggerService;
 import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.commons.internal.resources._Resources;
 
@@ -40,6 +39,8 @@ import lombok.val;
 @RequiredArgsConstructor
 public class Object_openRestApi {
 
+    @Inject private BookmarkService bookmarkService;
+    
     private final Object holder;
 
     public static class ActionDomainEvent
@@ -57,7 +58,7 @@ public class Object_openRestApi {
             )
     @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "750.1")
     public LocalResourcePath act() {
-        val bookmark = bookmarkService.bookmarkFor(holder);
+        val bookmark = bookmarkService.bookmarkForElseThrow(holder);
         val objType = bookmark.getObjectType();
         val objId = bookmark.getIdentifier();
         val restfulPathIfAny = _Resources.getRestfulPathIfAny();
@@ -68,7 +69,6 @@ public class Object_openRestApi {
                         : new LocalResourcePath(String.format(
                                 "/objects/%s/%s", objType, objId));
     }
-
-    @Inject BookmarkService bookmarkService;
+    
 
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java b/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java
index 9cd5181..f74af70 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectIdentifier.java
@@ -29,15 +29,17 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.mixins.MixinConstants;
-import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 
 import lombok.RequiredArgsConstructor;
+import lombok.val;
 
 @Mixin(method="prop") 
 @RequiredArgsConstructor
 public class Object_objectIdentifier {
 
+    @Inject private BookmarkService bookmarkService;
+    
     private final Object holder;
 
     public static class ActionDomainEvent 
@@ -53,11 +55,11 @@ public class Object_objectIdentifier {
     @Property()
     @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.2")
     public String prop() {
-        final Bookmark bookmark = bookmarkService.bookmarkFor(this.holder);
+        val bookmark = bookmarkService.bookmarkForElseThrow(this.holder);
         return bookmark.getIdentifier();
     }
 
 
-    @Inject BookmarkService bookmarkService;
+    
 
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java b/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java
index 92cba00..963224b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_objectType.java
@@ -29,14 +29,16 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.mixins.MixinConstants;
-import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 
 import lombok.RequiredArgsConstructor;
+import lombok.val;
 
 @Mixin(method="prop") 
 @RequiredArgsConstructor
 public class Object_objectType {
+    
+    @Inject private BookmarkService bookmarkService;
 
     private final Object holder;
 
@@ -53,11 +55,8 @@ public class Object_objectType {
     @Property()
     @MemberOrder(name = MixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "700.1")
     public String prop() {
-        final Bookmark bookmark = bookmarkService.bookmarkFor(this.holder);
+        val bookmark = bookmarkService.bookmarkForElseThrow(this.holder);
         return bookmark.getObjectType();
     }
 
-
-    @Inject BookmarkService bookmarkService;
-
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/BookmarkService.java b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/BookmarkService.java
index 2508361..da05d27 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/BookmarkService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/BookmarkService.java
@@ -18,7 +18,14 @@
  */
 package org.apache.isis.applib.services.bookmark;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+
+import static org.apache.isis.commons.internal.base._With.requires;
+
+import lombok.val;
 
 /**
  * This service enables a serializable 'bookmark' to be created for an entity.
@@ -26,7 +33,26 @@ import org.apache.isis.commons.internal.base._Casts;
  */
 public interface BookmarkService {
 
-    Bookmark bookmarkFor(Object domainObject);
+    /**
+     * Given any {@link Bookmark} this service is 
+     * able to reconstruct to originating domain object the {@link Bookmark} was created for.
+     * <p>
+     * Note: Not every domain object is bookmark-able. 
+     * @param domainObject
+     * @return optionally a {@link Bookmark} representing given {@code domainObject} 
+     */
+    Bookmark bookmarkFor(@Nullable Object domainObject);
+    
+    default Bookmark bookmarkForElseThrow(Object domainObject) {
+        requires(domainObject, "domainObject");
+        val bookmark = bookmarkFor(domainObject);
+        if(bookmark!=null) {
+            return bookmark;
+        }
+        throw _Exceptions.illegalArgument(
+                        "cannot create bookmark for type %s", domainObject.getClass().getName());
+    }
+    
 
     Bookmark bookmarkFor(Class<?> cls, String identifier);
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index 5b1b4e4..ac58ed7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -164,8 +164,8 @@ public class Interaction implements HasUniqueId {
             final MemberExecutor<T> memberExecutor,
             final T execution) {
 
-        // as a convenience, since in all cases we want the command to start when the first interaction executes,
-        // we populate the command here.
+        // as a convenience, since in all cases we want the command to start when the first 
+        // interaction executes, we populate the command here.
 
         try {
             try {
@@ -174,9 +174,16 @@ public class Interaction implements HasUniqueId {
                 return result;
             } catch (Exception ex) {
                 
-                // just because an exception has thrown, does not mean it is that significant; it could be that
-                // it is recognized by an ExceptionRecognizer and is not severe, eg unique index violation in the DB.
-                currentExecution.setThrew(ex);
+                //TODO there is an issue with exceptions getting swallowed, unless this is fixed,
+                // we rather print all of them, no matter whether recognized or not later on
+                // examples are IllegalArgument- or NullPointer- exceptions being swallowed when using the
+                // WrapperFactory utilizing async calls
+                ex.printStackTrace();
+                
+                // just because an exception has thrown, does not mean it is that significant; 
+                // it could be that it is recognized by an ExceptionRecognizer and is not severe 
+                // eg. unique index violation in the DB
+                getCurrentExecution().setThrew(ex);
 
                 // propagate (as in previous design); caller will need to trap and decide
                 throw ex;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java b/core/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
index 16c618f..179c420 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
@@ -250,13 +250,15 @@ public final class CommonDtoUtils {
         case REFERENCE: {
             final Bookmark bookmark = val instanceof Bookmark
                     ? (Bookmark) val
-                            : bookmarkService!=null ? bookmarkService.bookmarkFor(val) : null;
+                            : bookmarkService!=null 
+                                ? bookmarkService.bookmarkFor(val) 
+                                        : null;
 
-                            if (bookmark != null) {
-                                OidDto argValue = bookmark.toOidDto();
-                                valueDto.setReference(argValue);
-                            }
-                            return valueDto;
+            if (bookmark != null) {
+                OidDto argValue = bookmark.toOidDto();
+                valueDto.setReference(argValue);
+            }
+            return valueDto;
         }
         case BLOB: {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DomainEventHelper.java
index 8630c74..2e27420 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DomainEventHelper.java
@@ -32,10 +32,8 @@ import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.assertions._Assert;
-import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -69,11 +67,10 @@ public class DomainEventHelper {
             final ManagedObject targetAdapter,
             final ManagedObject mixedInAdapter,
             final ManagedObject[] argumentAdapters,
-            final Command command,
             final ManagedObject resultAdapter) {
         
         return postEventForAction(phase, uncheckedCast(eventType), /*existingEvent*/null, objectAction, identified, 
-                targetAdapter, mixedInAdapter, argumentAdapters, command, resultAdapter);
+                targetAdapter, mixedInAdapter, argumentAdapters, resultAdapter);
     }
     
     // variant using existing event and not eventType (is derived from event)
@@ -85,12 +82,11 @@ public class DomainEventHelper {
             final ManagedObject targetAdapter,
             final ManagedObject mixedInAdapter,
             final ManagedObject[] argumentAdapters,
-            final Command command,
             final ManagedObject resultAdapter) {
         
         return postEventForAction(phase, 
                 uncheckedCast(existingEvent.getClass()), existingEvent, objectAction, identified, 
-                targetAdapter, mixedInAdapter, argumentAdapters, command, resultAdapter);
+                targetAdapter, mixedInAdapter, argumentAdapters, resultAdapter);
     }
 
     private <S> ActionDomainEvent<S> postEventForAction(
@@ -102,7 +98,6 @@ public class DomainEventHelper {
             final ManagedObject targetAdapter,
             final ManagedObject mixedInAdapter,
             final ManagedObject[] argumentAdapters,
-            final Command command,
             final ManagedObject resultAdapter) {
         
         _Assert.assertTypeIsInstanceOf(eventType, ActionDomainEvent.class);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
index a07552e..448c4ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
@@ -81,7 +81,6 @@ implements ActionDomainEventFacet {
                         getEventType(),
                         actionFrom(ic), getIdentified(),
                         ic.getTarget(), ic.getMixedIn(), argumentAdaptersFrom(ic),
-                        null,
                         null);
         if (event != null && event.isHidden()) {
             return "Hidden by subscriber";
@@ -98,7 +97,6 @@ implements ActionDomainEventFacet {
                         getEventType(),
                         actionFrom(ic), getIdentified(),
                         ic.getTarget(), ic.getMixedIn(), argumentAdaptersFrom(ic),
-                        null,
                         null);
         if (event != null && event.isDisabled()) {
             final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable();
@@ -121,7 +119,6 @@ implements ActionDomainEventFacet {
                         getEventType(),
                         actionFrom(ic), getIdentified(),
                         ic.getTarget(), ic.getMixedIn(), aic.getArgs(),
-                        null,
                         null);
         if (event != null && event.isInvalid()) {
             final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable();
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 04b3901..0f22089 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -328,7 +328,7 @@ implements ImperativeFacet {
             }
             if(getRepositoryService().isPersistent(domainObject)) {
                 BookmarkService bookmarkService = getBookmarkService();
-                Bookmark bookmark = bookmarkService.bookmarkFor(domainObject);
+                Bookmark bookmark = bookmarkService.bookmarkForElseThrow(domainObject);
                 command.internal().setResult(bookmark);
             }
             break;
@@ -461,7 +461,6 @@ implements ImperativeFacet {
                         getEventType(),
                         owningAction, owningAction,
                         targetAdapter, mixedInAdapter, argumentAdapters,
-                        command,
                         null);
 
                 // set event onto the execution
@@ -478,7 +477,6 @@ implements ImperativeFacet {
                         AbstractDomainEvent.Phase.EXECUTED,
                         actionDomainEvent,
                         owningAction, owningAction, targetAdapter, mixedInAdapter, argumentAdapters,
-                        command,
                         resultAdapterPossiblyCloned);
 
                 final Object returnValue = actionDomainEvent.getReturnValue();
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
index 66161e8..85d997a 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
@@ -22,11 +22,17 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkHolder;
@@ -43,13 +49,9 @@ import org.apache.isis.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Service;
 
-import lombok.extern.log4j.Log4j2;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * This service enables a serializable 'bookmark' to be created for an entity.
@@ -201,7 +203,7 @@ public class BookmarkServiceInternalDefault implements BookmarkService, Serializ
         if(isPredefinedSerializable(value.getClass())) {
             return (Serializable) value;
         } else {
-            final Bookmark valueBookmark = bookmarkFor(value);
+            val valueBookmark = bookmarkFor(value);
             return valueBookmark;
         }
     }
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
index 4a27c3f..973af39 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ixn/InteractionDtoServiceInternalDefault.java
@@ -74,7 +74,7 @@ public class InteractionDtoServiceInternalDefault implements InteractionDtoServi
         final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
 
         final Object targetPojo = targetAdapter.getPojo();
-        final Bookmark targetBookmark = bookmarkService.bookmarkFor(targetPojo);
+        final Bookmark targetBookmark = bookmarkService.bookmarkForElseThrow(targetPojo);
 
         final String actionIdentifier = objectAction.getIdentifier().toClassAndNameIdentityString();
         final String actionId = actionIdentifier.substring(actionIdentifier.indexOf('#')+1);
@@ -120,7 +120,7 @@ public class InteractionDtoServiceInternalDefault implements InteractionDtoServi
         final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
 
         final Object targetPojo = targetAdapter.getPojo();
-        final Bookmark targetBookmark = bookmarkService.bookmarkFor(targetPojo);
+        final Bookmark targetBookmark = bookmarkService.bookmarkForElseThrow(targetPojo);
 
         final String propertyIdentifier = property.getIdentifier().toClassAndNameIdentityString();
         final String propertyId = propertyIdentifier.substring(propertyIdentifier.indexOf('#')+1);
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
index 3c89374..73a5561 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -42,9 +42,9 @@ import org.apache.isis.applib.services.wrapper.events.UsabilityEvent;
 import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
 import org.apache.isis.applib.services.wrapper.events.VisibilityEvent;
 import org.apache.isis.commons.internal.collections._Arrays;
-import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.consent.InteractionResult;
+import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.facets.ImperativeFacet;
 import org.apache.isis.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.metamodel.facets.object.entity.EntityFacet;
@@ -242,6 +242,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
             }
 
             return handleActionMethod(actualTargetAdapter, args, actualObjectAction, contributeeMember);
+            
         }
 
         throw new UnsupportedOperationException(String.format("Unknown member type '%s'", objectMember));
diff --git a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java
index 1ee3bbd..55e6936 100644
--- a/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java
+++ b/core/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/mixins/Object_clearHints.java
@@ -27,22 +27,24 @@ import org.apache.isis.applib.annotation.Contributed;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.hint.HintStore;
 import org.apache.isis.viewer.wicket.viewer.services.HintStoreUsingWicketSession;
 
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+
 @Mixin(method="act")
+@RequiredArgsConstructor
 public class Object_clearHints {
 
-    private final Object object;
-
-    public Object_clearHints(Object object) {
-        this.object = object;
-    }
+    @Inject private HintStore hintStore;
+    @Inject private BookmarkService bookmarkService;
+    
+    private final Object holder;
 
-    public static class ActionDomainEvent extends org.apache.isis.applib.events.domain.ActionDomainEvent<Object> {
-        private static final long serialVersionUID = 1L; }
+    public static class ActionDomainEvent 
+    extends org.apache.isis.applib.events.domain.ActionDomainEvent<Object> {}
 
     @Action(
             domainEvent = ActionDomainEvent.class,
@@ -57,10 +59,10 @@ public class Object_clearHints {
     @MemberOrder(name = "datanucleusIdLong", sequence = "400.1")
     public Object act() {
         if (getHintStoreUsingWicketSession() != null) {
-            final Bookmark bookmark = bookmarkService.bookmarkFor(object);
+            val bookmark = bookmarkService.bookmarkForElseThrow(holder);
             getHintStoreUsingWicketSession().removeAll(bookmark);
         }
-        return object;
+        return holder;
     }
 
     public boolean hideAct() {
@@ -73,7 +75,4 @@ public class Object_clearHints {
                         : null;
     }
 
-    @Inject HintStore hintStore;
-    @Inject BookmarkService bookmarkService;
-
 }
diff --git a/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/util/CellMarshaller.java b/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/util/CellMarshaller.java
index b2b5ba0..75963ae 100644
--- a/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/util/CellMarshaller.java
+++ b/extensions/lib/excel/impl/src/main/java/org/apache/isis/extensions/excel/dom/util/CellMarshaller.java
@@ -4,18 +4,30 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Date;
 
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.BookmarkService;
-import org.apache.isis.metamodel.spec.ManagedObject;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
-import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.poi.common.usermodel.HyperlinkType;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Comment;
+import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.ss.usermodel.Drawing;
+import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFHyperlink;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.metamodel.spec.ManagedObject;
+import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
+
 final class CellMarshaller {
 
     private final CellStyle dateCellStyle;
@@ -224,7 +236,7 @@ final class CellMarshaller {
     }
 
     private void setCellValueForBookmark(final Cell cell, final Object propertyAsObject, final String propertyAsTitle, final CellStyle cellStyle) {
-        Bookmark bookmark = bookmarkService.bookmarkFor(propertyAsObject);
+        Bookmark bookmark = bookmarkService.bookmarkForElseThrow(propertyAsObject);
         setCellComment(cell, bookmark.toString());
         
         cell.setCellValue(propertyAsTitle);