You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/07/28 15:28:51 UTC

[13/39] git commit: ISIS-833: reverting isis-module-wrapper -> isis-core-wrapper.

ISIS-833: reverting isis-module-wrapper -> isis-core-wrapper.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/dec67056
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/dec67056
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/dec67056

Branch: refs/heads/master
Commit: dec670567ce96fa96fe89c8111c6dbca35b3ed3b
Parents: 172d56a
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jul 24 17:23:03 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jul 24 17:23:03 2014 +0100

----------------------------------------------------------------------
 .../applib/services/wrapper/WrapperFactory.java |   2 +-
 core/integtestsupport/pom.xml                   |   4 +-
 core/module-wrapper/pom.xml                     | 139 ----
 .../core/wrapper/WrapperFactoryAbstract.java    | 314 --------
 .../isis/core/wrapper/WrapperFactoryCglib.java  |  30 -
 .../core/wrapper/WrapperFactoryDefault.java     |  39 -
 .../core/wrapper/WrapperFactoryJavassist.java   |  30 -
 .../dispatchers/InteractionEventDispatcher.java |  28 -
 .../InteractionEventDispatcherTypeSafe.java     |  34 -
 .../AbstractCollectionInvocationHandler.java    |  92 ---
 .../handlers/CollectionInvocationHandler.java   |  53 --
 .../handlers/DelegatingInvocationHandler.java   |  32 -
 .../DelegatingInvocationHandlerDefault.java     | 131 ----
 .../handlers/DomainObjectInvocationHandler.java | 720 -------------------
 .../wrapper/handlers/MapInvocationHandler.java  |  48 --
 .../wrapper/handlers/ProxyContextHandler.java   |  84 ---
 .../core/wrapper/internal/util/Constants.java   |  52 --
 .../internal/util/MethodPrefixFinder.java       |  48 --
 .../isis/core/wrapper/internal/util/Util.java   |  53 --
 .../core/wrapper/proxy/ProxyInstantiator.java   |  26 -
 .../proxy/ProxyInstantiatorForCglib.java        | 101 ---
 .../proxy/ProxyInstantiatorForJavassist.java    |  77 --
 .../wrapper/WrapperFactoryAbstractTest.java     | 127 ----
 ...rapperFactoryAbstractTest_wrappedObject.java | 376 ----------
 ...oryAbstractTest_wrappedObject_transient.java | 257 -------
 .../WrapperFactoryCglibTest_wrappedObject.java  |  32 -
 ...actoryCglibTest_wrappedObject_transient.java |  34 -
 ...apperFactoryJavassistTest_wrappedObject.java |  32 -
 ...ryJavassistTest_wrappedObject_transient.java |  31 -
 core/pom.xml                                    |  12 +-
 core/specsupport/pom.xml                        |   4 +-
 core/wrapper/pom.xml                            | 138 ++++
 .../core/wrapper/WrapperFactoryAbstract.java    | 314 ++++++++
 .../isis/core/wrapper/WrapperFactoryCglib.java  |  30 +
 .../core/wrapper/WrapperFactoryDefault.java     |  39 +
 .../core/wrapper/WrapperFactoryJavassist.java   |  30 +
 .../dispatchers/InteractionEventDispatcher.java |  28 +
 .../InteractionEventDispatcherTypeSafe.java     |  34 +
 .../AbstractCollectionInvocationHandler.java    |  92 +++
 .../handlers/CollectionInvocationHandler.java   |  53 ++
 .../handlers/DelegatingInvocationHandler.java   |  32 +
 .../DelegatingInvocationHandlerDefault.java     | 131 ++++
 .../handlers/DomainObjectInvocationHandler.java | 720 +++++++++++++++++++
 .../wrapper/handlers/MapInvocationHandler.java  |  48 ++
 .../wrapper/handlers/ProxyContextHandler.java   |  84 +++
 .../core/wrapper/internal/util/Constants.java   |  52 ++
 .../internal/util/MethodPrefixFinder.java       |  48 ++
 .../isis/core/wrapper/internal/util/Util.java   |  53 ++
 .../core/wrapper/proxy/ProxyInstantiator.java   |  26 +
 .../proxy/ProxyInstantiatorForCglib.java        | 101 +++
 .../proxy/ProxyInstantiatorForJavassist.java    |  77 ++
 .../wrapper/WrapperFactoryAbstractTest.java     | 127 ++++
 ...rapperFactoryAbstractTest_wrappedObject.java | 376 ++++++++++
 ...oryAbstractTest_wrappedObject_transient.java | 257 +++++++
 .../WrapperFactoryCglibTest_wrappedObject.java  |  32 +
 ...actoryCglibTest_wrappedObject_transient.java |  34 +
 ...apperFactoryJavassistTest_wrappedObject.java |  32 +
 ...ryJavassistTest_wrappedObject_transient.java |  31 +
 .../application/simpleapp/integtests/pom.xml    |   4 +-
 example/application/simpleapp/webapp/pom.xml    |   4 +-
 example/application/todoapp/integtests/pom.xml  |   4 +-
 example/application/todoapp/webapp/pom.xml      |   4 +-
 62 files changed, 3038 insertions(+), 3039 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/applib/src/main/java/org/apache/isis/applib/services/wrapper/WrapperFactory.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/wrapper/WrapperFactory.java b/core/applib/src/main/java/org/apache/isis/applib/services/wrapper/WrapperFactory.java
index 31f5420..4a1a6de 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/wrapper/WrapperFactory.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/wrapper/WrapperFactory.java
@@ -62,7 +62,7 @@ import org.apache.isis.applib.services.wrapper.listeners.InteractionListener;
  *
  * <p>
  * An implementation of this service (<tt>WrapperFactoryDefault</tt>) can be registered by including
- * <tt>o.a.i.module:isis-module-wrapper</tt> on the classpath; no further configuration is required.
+ * <tt>o.a.i.core:isis-core-wrapper</tt> on the classpath; no further configuration is required.
  * </p>
  */
 @Hidden

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/integtestsupport/pom.xml
----------------------------------------------------------------------
diff --git a/core/integtestsupport/pom.xml b/core/integtestsupport/pom.xml
index 708e65d..48bc875 100644
--- a/core/integtestsupport/pom.xml
+++ b/core/integtestsupport/pom.xml
@@ -118,8 +118,8 @@
 		</dependency>
 
         <dependency>
-            <groupId>org.apache.isis.module</groupId>
-            <artifactId>isis-module-wrapper</artifactId>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-wrapper</artifactId>
         </dependency>
 
         <dependency>

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/pom.xml
----------------------------------------------------------------------
diff --git a/core/module-wrapper/pom.xml b/core/module-wrapper/pom.xml
deleted file mode 100644
index b15c9b7..0000000
--- a/core/module-wrapper/pom.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.isis.core</groupId>
-        <artifactId>isis</artifactId>
-        <version>1.6.0-SNAPSHOT</version>
-	</parent>
-
-    <groupId>org.apache.isis.module</groupId>
-	<artifactId>isis-module-wrapper</artifactId>
-
-	<name>Isis Core Wrapper Service</name>
-	<description>Isis Core Wrapper Service</description>
-
-
-	<properties>
-        <siteBaseDir>..</siteBaseDir>
-		<relativeUrl>wrapper/</relativeUrl>
-	</properties>
-
-    <!-- used in Site generation for relative references. -->
-    <url>http://isis.apache.org/${relativeUrl}</url>
-
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <inherited>false</inherited>
-                <configuration>
-                	<dependencyLocationsEnabled>false</dependencyLocationsEnabled>
-                </configuration>
-                <reportSets>
-                    <reportSet>
-                        <inherited>false</inherited>
-                        <reports>
-                            <report>dependencies</report>
-                            <report>dependency-convergence</report>
-                            <report>plugins</report>
-                            <report>summary</report>
-                        </reports>
-                    </reportSet>
-                </reportSets>
-            </plugin>
-        </plugins>
-    </reporting>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>asm</groupId>
-                <artifactId>asm</artifactId>
-                <version>3.3.1</version>
-            </dependency>
-            <dependency>
-                <groupId>cglib</groupId>
-                <artifactId>cglib-nodep</artifactId>
-                <version>2.2.2</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-	<dependencies>
-        <dependency>
-		    <groupId>org.apache.isis.core</groupId>
-		    <artifactId>isis-core-runtime</artifactId>
-        </dependency>
-
-		<dependency>
-		    <groupId>org.apache.isis.core</groupId>
-		    <artifactId>isis-core-metamodel</artifactId>
-		    <type>test-jar</type>
-		    <scope>test</scope>
-        </dependency>
-		<dependency>
-		    <groupId>org.apache.isis.core</groupId>
-		    <artifactId>isis-core-runtime</artifactId>
-		    <type>test-jar</type>
-		    <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-unittestsupport</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-tck-dom</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.objenesis</groupId>
-            <artifactId>objenesis</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.javassist</groupId>
-            <artifactId>javassist</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>asm</groupId>
-            <artifactId>asm</artifactId>
-            <!-- explicitly include for use of WrapperFactoryCglib -->
-            <optional>true</optional>
-        </dependency>
-
-        <dependency>
-            <groupId>cglib</groupId>
-            <artifactId>cglib-nodep</artifactId>
-            <!-- explicitly include for use of WrapperFactoryCglib -->
-            <optional>true</optional>
-        </dependency>
-
-	</dependencies>
-
-</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryAbstract.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryAbstract.java
deleted file mode 100644
index ceea4a5..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryAbstract.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- *  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.wrapper;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.events.*;
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.applib.services.wrapper.WrappingObject;
-import org.apache.isis.applib.services.wrapper.listeners.InteractionListener;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProviderAware;
-import org.apache.isis.core.metamodel.adapter.ObjectPersistor;
-import org.apache.isis.core.metamodel.adapter.ObjectPersistorAware;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
-import org.apache.isis.core.wrapper.dispatchers.InteractionEventDispatcher;
-import org.apache.isis.core.wrapper.dispatchers.InteractionEventDispatcherTypeSafe;
-import org.apache.isis.core.wrapper.handlers.ProxyContextHandler;
-import org.apache.isis.core.wrapper.proxy.ProxyInstantiator;
-
-public abstract class WrapperFactoryAbstract implements WrapperFactory, AuthenticationSessionProviderAware, SpecificationLoaderAware, AdapterManagerAware, ObjectPersistorAware {
-
-    private final List<InteractionListener> listeners = new ArrayList<InteractionListener>();
-    private final Map<Class<? extends InteractionEvent>, InteractionEventDispatcher> dispatchersByEventClass = new HashMap<Class<? extends InteractionEvent>, InteractionEventDispatcher>();
-
-    private AuthenticationSessionProvider authenticationSessionProvider;
-    private SpecificationLoader specificationLookup;
-    private AdapterManager adapterManager;
-    private ObjectPersistor objectPersistor;
-
-    private final ProxyContextHandler proxy;
-
-    public WrapperFactoryAbstract(final ProxyInstantiator proxyInstantiator) {
-        
-        proxy = new ProxyContextHandler(proxyInstantiator);
-        
-        dispatchersByEventClass.put(ObjectTitleEvent.class, new InteractionEventDispatcherTypeSafe<ObjectTitleEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ObjectTitleEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.objectTitleRead(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyVisibilityEvent.class, new InteractionEventDispatcherTypeSafe<PropertyVisibilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyVisibilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyVisible(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyUsabilityEvent.class, new InteractionEventDispatcherTypeSafe<PropertyUsabilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyUsabilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyUsable(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyAccessEvent.class, new InteractionEventDispatcherTypeSafe<PropertyAccessEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyAccessEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyAccessed(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyModifyEvent.class, new InteractionEventDispatcherTypeSafe<PropertyModifyEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyModifyEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyModified(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionVisibilityEvent.class, new InteractionEventDispatcherTypeSafe<CollectionVisibilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionVisibilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionVisible(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionUsabilityEvent.class, new InteractionEventDispatcherTypeSafe<CollectionUsabilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionUsabilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionUsable(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionAccessEvent.class, new InteractionEventDispatcherTypeSafe<CollectionAccessEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionAccessEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionAccessed(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionAddToEvent.class, new InteractionEventDispatcherTypeSafe<CollectionAddToEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionAddToEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionAddedTo(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionRemoveFromEvent.class, new InteractionEventDispatcherTypeSafe<CollectionRemoveFromEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionRemoveFromEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionRemovedFrom(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionVisibilityEvent.class, new InteractionEventDispatcherTypeSafe<ActionVisibilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionVisibilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionVisible(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionUsabilityEvent.class, new InteractionEventDispatcherTypeSafe<ActionUsabilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionUsabilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionUsable(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionArgumentEvent.class, new InteractionEventDispatcherTypeSafe<ActionArgumentEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionArgumentEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionArgument(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionInvocationEvent.class, new InteractionEventDispatcherTypeSafe<ActionInvocationEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionInvocationEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionInvoked(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ObjectValidityEvent.class, new InteractionEventDispatcherTypeSafe<ObjectValidityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ObjectValidityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.objectPersisted(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionMethodEvent.class, new InteractionEventDispatcherTypeSafe<CollectionMethodEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionMethodEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionMethodInvoked(interactionEvent);
-                }
-            }
-        });
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // wrap and unwrap
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public <T> T wrap(final T domainObject) {
-        return wrap(domainObject, ExecutionMode.EXECUTE);
-    }
-
-    @Override
-    public <T> T wrapNoExecute(final T domainObject) {
-        return wrap(domainObject, ExecutionMode.NO_EXECUTE);
-    }
-    
-    @Override
-    public <T> T wrapSkipRules(final T domainObject) {
-        return wrap(domainObject, ExecutionMode.SKIP_RULES);
-    }
-    
-    @Override
-    public <T> T wrap(final T domainObject, final ExecutionMode mode) {
-        if (domainObject instanceof WrappingObject) {
-            final WrappingObject wrapperObject = (WrappingObject) domainObject;
-            final ExecutionMode wrapperMode = wrapperObject.__isis_executionMode();
-            if(wrapperMode != mode) {
-                final Object underlyingDomainObject = wrapperObject.__isis_wrapped();
-                return (T)createProxy(underlyingDomainObject, mode);
-            }
-            return domainObject;
-        }
-        return createProxy(domainObject, mode);
-    }
-
-    protected <T> T createProxy(final T domainObject, final ExecutionMode mode) {
-        return proxy.proxy(domainObject, this, mode, getAuthenticationSessionProvider(), getSpecificationLookup(), getAdapterManager(), getObjectPersistor());
-    }
-
-    @Override
-    public boolean isWrapper(final Object possibleWrappedDomainObject) {
-        return possibleWrappedDomainObject instanceof WrappingObject;
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    @Programmatic
-    public <T> T unwrap(T possibleWrappedDomainObject) {
-        if(isWrapper(possibleWrappedDomainObject)) {
-            final WrappingObject wrappingObject = (WrappingObject) possibleWrappedDomainObject;
-            return (T) wrappingObject.__isis_wrapped();
-        } 
-        return possibleWrappedDomainObject;
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Listeners
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public List<InteractionListener> getListeners() {
-        return listeners;
-    }
-
-    @Override
-    public boolean addInteractionListener(final InteractionListener listener) {
-        return listeners.add(listener);
-    }
-
-    @Override
-    public boolean removeInteractionListener(final InteractionListener listener) {
-        return listeners.remove(listener);
-    }
-
-    @Override
-    public void notifyListeners(final InteractionEvent interactionEvent) {
-        final InteractionEventDispatcher dispatcher = dispatchersByEventClass.get(interactionEvent.getClass());
-        if (dispatcher == null) {
-            throw new RuntimeException("Unknown InteractionEvent - register into dispatchers map");
-        }
-        dispatcher.dispatch(interactionEvent);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Listeners
-    // /////////////////////////////////////////////////////////////
-
-    protected AuthenticationSessionProvider getAuthenticationSessionProvider() {
-        return authenticationSessionProvider;
-    }
-    @Programmatic
-    @Override
-    public void setAuthenticationSessionProvider(final AuthenticationSessionProvider authenticationSessionProvider) {
-        this.authenticationSessionProvider = authenticationSessionProvider;
-    }
-
-    protected AdapterManager getAdapterManager() {
-        return adapterManager;
-    }
-    @Programmatic
-    @Override
-    public void setAdapterManager(final AdapterManager adapterManager) {
-        this.adapterManager = adapterManager;
-    }
-
-    
-    protected SpecificationLoader getSpecificationLookup() {
-        return specificationLookup;
-    }
-    @Programmatic
-    @Override
-    public void setSpecificationLookup(final SpecificationLoader specificationLookup) {
-        this.specificationLookup = specificationLookup;
-    }
-
-    protected ObjectPersistor getObjectPersistor() {
-        return objectPersistor;
-    }
-    @Programmatic
-    @Override
-    public void setObjectPersistor(final ObjectPersistor objectPersistor) {
-        this.objectPersistor = objectPersistor;
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryCglib.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryCglib.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryCglib.java
deleted file mode 100644
index fd75b59..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryCglib.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  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.wrapper;
-
-import org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForCglib;
-
-public class WrapperFactoryCglib extends WrapperFactoryAbstract  {
-
-    public WrapperFactoryCglib() {
-        super(new ProxyInstantiatorForCglib());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryDefault.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryDefault.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryDefault.java
deleted file mode 100644
index c72eca8..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryDefault.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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.wrapper;
-
-
-import org.apache.isis.applib.annotation.DomainService;
-
-/**
- * This service provides the ability to &quot;wrap&quot; of a domain object such that it can
- * be interacted with while enforcing the hide/disable/validate rules implies by
- * the Isis programming model.
- *
- * <p>
- * This implementation has no UI-visible actions and is the supported implementation, so it is annotated with
- * {@link org.apache.isis.applib.annotation.DomainService}.   This means that by including
- * <tt>o.a.i.module:isis-module-wrapper</tt> on the classpath, the service is automatically registered; no further
- * configuration is required.
- */
-@DomainService
-public class WrapperFactoryDefault extends WrapperFactoryJavassist {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryJavassist.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryJavassist.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryJavassist.java
deleted file mode 100644
index e71580f..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/WrapperFactoryJavassist.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  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.wrapper;
-
-import org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist;
-
-public class WrapperFactoryJavassist extends WrapperFactoryAbstract  {
-
-    public WrapperFactoryJavassist() {
-        super(new ProxyInstantiatorForJavassist());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcher.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcher.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcher.java
deleted file mode 100644
index 2dfa70c..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcher.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  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.wrapper.dispatchers;
-
-import org.apache.isis.applib.events.InteractionEvent;
-
-public interface InteractionEventDispatcher {
-
-    void dispatch(InteractionEvent interactionEvent);
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcherTypeSafe.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcherTypeSafe.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcherTypeSafe.java
deleted file mode 100644
index c568633..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/dispatchers/InteractionEventDispatcherTypeSafe.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  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.wrapper.dispatchers;
-
-import org.apache.isis.applib.events.InteractionEvent;
-
-public abstract class InteractionEventDispatcherTypeSafe<T extends InteractionEvent> implements InteractionEventDispatcher {
-
-    public abstract void dispatchTypeSafe(T interactionEvent);
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void dispatch(final InteractionEvent interactionEvent) {
-        dispatchTypeSafe((T) interactionEvent);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/AbstractCollectionInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/AbstractCollectionInvocationHandler.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/AbstractCollectionInvocationHandler.java
deleted file mode 100644
index b8a4464..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/AbstractCollectionInvocationHandler.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  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.wrapper.handlers;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.events.CollectionMethodEvent;
-import org.apache.isis.applib.events.InteractionEvent;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-abstract class AbstractCollectionInvocationHandler<T, C> extends DelegatingInvocationHandlerDefault<C> {
-
-    private final List<Method> interceptedMethods = Lists.newArrayList();
-    private final List<Method> vetoedMethods = Lists.newArrayList();
-
-    private final String collectionName;
-    private final OneToManyAssociation oneToManyAssociation;
-    private final T domainObject;
-
-    public AbstractCollectionInvocationHandler(final C collectionOrMapToProxy, final String collectionName, final DomainObjectInvocationHandler<T> handler, final OneToManyAssociation otma) {
-        super(collectionOrMapToProxy, handler.getHeadlessViewer(), handler.getExecutionMode());
-        this.collectionName = collectionName;
-        this.oneToManyAssociation = otma;
-        this.domainObject = handler.getDelegate();
-    }
-
-    protected Method intercept(final Method method) {
-        this.interceptedMethods.add(method);
-        return method;
-    }
-
-    protected Method veto(final Method method) {
-        this.vetoedMethods.add(method);
-        return method;
-    }
-
-    public String getCollectionName() {
-        return collectionName;
-    }
-
-    public OneToManyAssociation getCollection() {
-        return oneToManyAssociation;
-    }
-
-    public T getDomainObject() {
-        return domainObject;
-    }
-
-    @Override
-    public Object invoke(final Object collectionObject, final Method method, final Object[] args) throws Throwable {
-
-        // delegate
-        final Object returnValueObj = delegate(method, args);
-
-        if (interceptedMethods.contains(method)) {
-
-            resolveIfRequired(domainObject);
-
-            final InteractionEvent ev = new CollectionMethodEvent(getDelegate(), getCollection().getIdentifier(), getDomainObject(), method.getName(), args, returnValueObj);
-            notifyListeners(ev);
-            return returnValueObj;
-        }
-
-        if (vetoedMethods.contains(method)) {
-            throw new UnsupportedOperationException(String.format("Method '%s' may not be called directly.", method.getName()));
-        }
-
-        return returnValueObj;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/CollectionInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/CollectionInvocationHandler.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/CollectionInvocationHandler.java
deleted file mode 100644
index bcf2973..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/CollectionInvocationHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  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.wrapper.handlers;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.isis.core.commons.lang.ObjectExtensions;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-class CollectionInvocationHandler<T, R> extends AbstractCollectionInvocationHandler<T, R> {
-
-    public CollectionInvocationHandler(final R collectionToProxy, final String collectionName, final DomainObjectInvocationHandler<T> handler, final OneToManyAssociation otma) {
-        super(collectionToProxy, collectionName, handler, otma);
-
-        try {
-            intercept(ObjectExtensions.getMethod(collectionToProxy, "contains", Object.class));
-            intercept(ObjectExtensions.getMethod(collectionToProxy, "size"));
-            intercept(ObjectExtensions.getMethod(collectionToProxy, "isEmpty"));
-            if (collectionToProxy instanceof List) {
-                intercept(ObjectExtensions.getMethod(collectionToProxy, "get", int.class));
-            }
-            veto(ObjectExtensions.getMethod(collectionToProxy, "add", Object.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "remove", Object.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "addAll", Collection.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "removeAll", Collection.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "retainAll", Collection.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "clear"));
-        } catch (final NoSuchMethodException e) {
-            // ///CLOVER:OFF
-            throw new RuntimeException("A Collection method could not be found: " + e.getMessage());
-            // ///CLOVER:ON
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandler.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandler.java
deleted file mode 100644
index d424f64..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandler.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  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.wrapper.handlers;
-
-import java.lang.reflect.InvocationHandler;
-
-public interface DelegatingInvocationHandler<T> extends InvocationHandler {
-
-    T getDelegate();
-
-    public boolean isResolveObjectChangedEnabled();
-
-    public void setResolveObjectChangedEnabled(boolean resolveObjectChangedEnabled);
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandlerDefault.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandlerDefault.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandlerDefault.java
deleted file mode 100644
index e1b7cdd..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DelegatingInvocationHandlerDefault.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  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.wrapper.handlers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.apache.isis.applib.events.InteractionEvent;
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.applib.services.wrapper.WrapperFactory.ExecutionMode;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.runtime.persistence.container.DomainObjectContainerObjectChanged;
-import org.apache.isis.core.runtime.persistence.container.DomainObjectContainerResolve;
-
-public class DelegatingInvocationHandlerDefault<T> implements DelegatingInvocationHandler<T> {
-
-    private final T delegate;
-    protected final WrapperFactory wrapperFactory;
-    private final ExecutionMode executionMode;
-
-    protected final Method equalsMethod;
-    protected final Method hashCodeMethod;
-    protected final Method toStringMethod;
-
-    private final DomainObjectContainerObjectChanged domainObjectContainerObjectChanged;
-    private final DomainObjectContainerResolve domainObjectContainerResolve;
-
-    private boolean resolveObjectChangedEnabled;
-
-    public DelegatingInvocationHandlerDefault(final T delegate, final WrapperFactory headlessViewer, final ExecutionMode executionMode) {
-        if (delegate == null) {
-            throw new IllegalArgumentException("delegate must not be null");
-        }
-        this.delegate = delegate;
-        this.wrapperFactory = headlessViewer;
-        this.executionMode = executionMode;
-
-        this.domainObjectContainerResolve = new DomainObjectContainerResolve();
-        this.domainObjectContainerObjectChanged = new DomainObjectContainerObjectChanged();
-
-        try {
-            equalsMethod = delegate.getClass().getMethod("equals", new Class[] { Object.class });
-            hashCodeMethod = delegate.getClass().getMethod("hashCode", new Class[] {});
-            toStringMethod = delegate.getClass().getMethod("toString", new Class[] {});
-        } catch (final NoSuchMethodException e) {
-            // ///CLOVER:OFF
-            throw new RuntimeException("An Object method could not be found: " + e.getMessage());
-            // ///CLOVER:ON
-        }
-    }
-
-    @Override
-    public boolean isResolveObjectChangedEnabled() {
-        return resolveObjectChangedEnabled;
-    }
-
-    @Override
-    public void setResolveObjectChangedEnabled(final boolean resolveObjectChangedEnabled) {
-        this.resolveObjectChangedEnabled = resolveObjectChangedEnabled;
-    }
-
-    protected void resolveIfRequired(final ObjectAdapter targetAdapter) {
-        resolveIfRequired(targetAdapter.getObject());
-    }
-
-    protected void resolveIfRequired(final Object domainObject) {
-        if (resolveObjectChangedEnabled) {
-            domainObjectContainerResolve.resolve(domainObject);
-        }
-    }
-
-    protected void objectChangedIfRequired(final ObjectAdapter targetAdapter) {
-        objectChangedIfRequired(targetAdapter.getObject());
-    }
-
-    protected void objectChangedIfRequired(final Object domainObject) {
-        if (resolveObjectChangedEnabled) {
-            domainObjectContainerObjectChanged.objectChanged(domainObject);
-        }
-    }
-
-    public WrapperFactory getHeadlessViewer() {
-        return wrapperFactory;
-    }
-
-    @Override
-    public T getDelegate() {
-        return delegate;
-    }
-
-    public ExecutionMode getExecutionMode() {
-        return executionMode;
-    }
-
-    protected Object delegate(final Method method, final Object[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
-
-        return method.invoke(getDelegate(), args);
-    }
-
-    protected boolean isObjectMethod(final Method method) {
-        return toStringMethod.equals(method) || hashCodeMethod.equals(method) || equalsMethod.equals(method);
-    }
-
-    @Override
-    public Object invoke(final Object object, final Method method, final Object[] args) throws Throwable {
-        return method.invoke(object, args);
-    }
-
-    protected InteractionEvent notifyListeners(final InteractionEvent interactionEvent) {
-        wrapperFactory.notifyListeners(interactionEvent);
-        return interactionEvent;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
deleted file mode 100644
index d505add..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
+++ /dev/null
@@ -1,720 +0,0 @@
-/*
- *  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.wrapper.handlers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.events.*;
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.applib.services.wrapper.*;
-import org.apache.isis.applib.services.wrapper.WrapperFactory.ExecutionMode;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectPersistor;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
-import org.apache.isis.core.metamodel.facetapi.DecoratingFacet;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
-import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
-
-public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandlerDefault<T> {
-
-    private final Map<Method, Collection<?>> collectionViewObjectsByMethod = new HashMap<Method, Collection<?>>();
-    private final Map<Method, Map<?, ?>> mapViewObjectsByMethod = new HashMap<Method, Map<?, ?>>();
-
-    private final AuthenticationSessionProvider authenticationSessionProvider;
-    private final SpecificationLoader specificationLookup;
-    private final AdapterManager adapterManager;
-    private final ObjectPersistor objectPersistor;
-
-    private final ProxyContextHandler proxy;
-    private final ExecutionMode executionMode;
-
-    /**
-     * The <tt>title()</tt> method; may be <tt>null</tt>.
-     */
-    protected Method titleMethod;
-
-    /**
-     * The <tt>__isis_save()</tt> method from {@link WrapperObject#__isis_save()}.
-     */
-    protected Method __isis_saveMethod;
-
-    /**
-     * The <tt>save()</tt> method from {@link WrapperObject#save()}.
-     */
-    @Deprecated
-    protected Method saveMethod;
-
-    /**
-     * The <tt>__isis_wrapped()</tt> method from {@link WrapperObject#__isis_wrapped()}.
-     */
-    protected Method __isis_wrappedMethod;
-
-    /**
-     * The <tt>wrapped()</tt> method from {@link WrapperObject#wrapped()}.
-     */
-    @Deprecated
-    protected Method wrappedMethod;
-
-    /**
-     * The <tt>__isis_executionMode()</tt> method from {@link WrapperObject#__isis_executionMode()}.
-     */
-    protected Method __isis_executionMode;
-
-    public DomainObjectInvocationHandler(
-            final T delegate,
-            final WrapperFactory wrapperFactory,
-            final ExecutionMode mode,
-            final AuthenticationSessionProvider authenticationSessionProvider,
-            final SpecificationLoader specificationLookup,
-            final AdapterManager adapterManager,
-            final ObjectPersistor objectPersistor,
-            final ProxyContextHandler proxy) {
-        super(delegate, wrapperFactory, mode);
-
-        this.proxy = proxy;
-        this.authenticationSessionProvider = authenticationSessionProvider;
-        this.specificationLookup = specificationLookup;
-        this.adapterManager = adapterManager;
-        this.objectPersistor = objectPersistor;
-        this.executionMode = mode;
-
-        try {
-            titleMethod = delegate.getClass().getMethod("title", new Class[]{});
-            __isis_saveMethod = WrapperObject.class.getMethod("__isis_save", new Class[]{});
-            __isis_wrappedMethod = WrapperObject.class.getMethod("__isis_wrapped", new Class[]{});
-            __isis_executionMode = WrapperObject.class.getMethod("__isis_executionMode", new Class[]{});
-            saveMethod = WrapperObject.class.getMethod("save", new Class[] {});
-            wrappedMethod = WrapperObject.class.getMethod("wrapped", new Class[] {});
-        } catch (final NoSuchMethodException e) {
-        }
-    }
-
-    @Override
-    public Object invoke(final Object proxyObject, final Method method, final Object[] args) throws Throwable {
-
-        if (isObjectMethod(method)) {
-            return delegate(method, args);
-        }
-
-        // workaround for JDO-enhanced..
-        if(isJdoMethod(method)) {
-            return delegate(method, args);
-        }
-
-        if(isInjectMethod(method)) {
-            return delegate(method, args);
-        }
-
-        final ObjectAdapter targetAdapter = getAdapterManager().adapterFor(getDelegate());
-
-        if (isTitleMethod(method)) {
-            return handleTitleMethod(method, args, targetAdapter);
-        }
-
-
-        final ObjectSpecification targetNoSpec = targetAdapter.getSpecification();
-
-        // save method, through the proxy
-        if (isSaveMethod(method)) {
-            return handleSaveMethod(getAuthenticationSession(), targetAdapter, targetNoSpec);
-        }
-
-        if (isWrappedMethod(method)) {
-            return getDelegate();
-        }
-
-        if (isExecutionModeMethod(method)) {
-            return executionMode;
-        }
-
-        final ObjectMember objectMember = locateAndCheckMember(method);
-
-        final String memberName = objectMember.getName();
-
-        final Intent intent = ImperativeFacet.Util.getIntent(objectMember, method);
-        if(intent == Intent.CHECK_IF_HIDDEN || intent == Intent.CHECK_IF_DISABLED) {
-            throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'", memberName));
-        }
-
-        final String methodName = method.getName();
-
-        if (intent == Intent.DEFAULTS || intent == Intent.CHOICES_OR_AUTOCOMPLETE) {
-            return method.invoke(getDelegate(), args);
-        }
-
-        if (objectMember.isOneToOneAssociation()) {
-
-            if (intent == Intent.CHECK_IF_VALID || intent == Intent.MODIFY_PROPERTY_SUPPORTING) {
-                throw new UnsupportedOperationException(String.format("Cannot invoke supporting method for '%s'; use only property accessor/mutator", memberName));
-            }
-
-            final OneToOneAssociation otoa = (OneToOneAssociation) objectMember;
-            
-            if (intent == Intent.ACCESSOR) {
-                return handleGetterMethodOnProperty(args, targetAdapter, otoa, methodName);
-            }
-            
-            if (intent == Intent.MODIFY_PROPERTY || intent == Intent.INITIALIZATION) {
-                return handleSetterMethodOnProperty(args, getAuthenticationSession(), targetAdapter, otoa, methodName);
-            }
-        }
-        if (objectMember.isOneToManyAssociation()) {
-
-            if (intent == Intent.CHECK_IF_VALID) {
-                throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only collection accessor/mutator", memberName));
-            }
-
-            final OneToManyAssociation otma = (OneToManyAssociation) objectMember;
-            if (intent == Intent.ACCESSOR) {
-                return handleGetterMethodOnCollection(method, args, targetAdapter, otma, memberName);
-            }
-            if (intent == Intent.MODIFY_COLLECTION_ADD) {
-                return handleCollectionAddToMethod(args, targetAdapter, otma, methodName);
-            }
-            if (intent == Intent.MODIFY_COLLECTION_REMOVE) {
-                return handleCollectionRemoveFromMethod(args, targetAdapter, otma, methodName);
-            }
-        }
-
-        if (objectMember instanceof ObjectAction) {
-
-            if (intent == Intent.CHECK_IF_VALID) {
-                throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only the 'invoke' method", memberName));
-            }
-
-            final ObjectAction noa = (ObjectAction) objectMember;
-            return handleActionMethod(args, getAuthenticationSession(), targetAdapter, noa, memberName);
-        }
-
-        throw new UnsupportedOperationException(String.format("Unknown member type '%s'", objectMember));
-    }
-
-    private boolean isJdoMethod(final Method method) {
-        return methodStartsWith(method, "jdo");
-    }
-
-    private boolean isInjectMethod(final Method method) {
-        return methodStartsWith(method, "inject");
-    }
-
-    private boolean methodStartsWith(final Method method, final String prefix) {
-        return method.getName().startsWith(prefix);
-    }
-    
-    public List<Facet> getImperativeFacets(final ObjectMember objectMember, final Method method) {
-        final List<Facet> imperativeFacets = objectMember.getFacets(new Filter<Facet>() {
-            @Override
-            public boolean accept(final Facet facet) {
-                final ImperativeFacet imperativeFacet = asImperativeFacet(facet);
-                if (imperativeFacet == null) {
-                    return false;
-                }
-                return imperativeFacet.getMethods().contains(method);
-            }
-
-            private ImperativeFacet asImperativeFacet(final Facet facet) {
-                if (facet == null) {
-                    return null;
-                }
-                if (facet instanceof ImperativeFacet) {
-                    return (ImperativeFacet) facet;
-                }
-                Facet underlyingFacet = facet.getUnderlyingFacet();
-                return asImperativeFacet(underlyingFacet);
-            }
-        });
-
-        // there will be at least one
-        if (imperativeFacets.isEmpty()) {
-            throw new IllegalStateException("should be at least one imperative facet");
-        }
-        return imperativeFacets;
-    }
-
-    private static boolean instanceOf(final List<?> objects, final Class<?>... superTypes) {
-        for (final Class<?> superType : superTypes) {
-            // REVIEW: this is all a bit hacky...
-            for (Object obj : objects) {
-                // handle the *decorators
-                if(obj instanceof DecoratingFacet) {
-                    DecoratingFacet<?> decoratingFacet = (DecoratingFacet<?>) obj;
-                    obj = ((DecoratingFacet<?>) obj).getDecoratedFacet();
-                }
-                if (superType.isAssignableFrom(obj.getClass())) {
-                    return true;
-                }
-                if(obj instanceof Facet) {
-                    Facet facet = (Facet) obj;
-                    // handle any wrapping (eg PostPropertyChangedSetterEventFacet)
-                    Facet underlyingFacet = facet.getUnderlyingFacet();
-                    if(underlyingFacet != null && superType.isAssignableFrom(obj.getClass())) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // title
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleTitleMethod(final Method method, final Object[] args, final ObjectAdapter targetAdapter) throws IllegalAccessException, InvocationTargetException {
-
-        resolveIfRequired(targetAdapter);
-
-        final ObjectSpecification targetNoSpec = targetAdapter.getSpecification();
-        final ObjectTitleContext titleContext = targetNoSpec.createTitleInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER, targetAdapter);
-        final ObjectTitleEvent titleEvent = titleContext.createInteractionEvent();
-        notifyListeners(titleEvent);
-        return titleEvent.getTitle();
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // save
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleSaveMethod(final AuthenticationSession session, final ObjectAdapter targetAdapter, final ObjectSpecification targetNoSpec) {
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            final InteractionResult interactionResult = targetNoSpec.isValidResult(targetAdapter);
-            notifyListenersAndVetoIfRequired(interactionResult);
-        }
-
-        if (getExecutionMode().shouldExecute()) {
-            if (targetAdapter.isTransient()) {
-                getObjectPersistor().makePersistent(targetAdapter);
-            }
-        }
-        return null;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // property - access
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleGetterMethodOnProperty(final Object[] args, final ObjectAdapter targetAdapter, final OneToOneAssociation otoa, final String methodName) {
-
-        if (args.length != 0) {
-            throw new IllegalArgumentException("Invoking a 'get' should have no arguments");
-        }
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(getAuthenticationSession(), targetAdapter, otoa);
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final ObjectAdapter currentReferencedAdapter = otoa.get(targetAdapter);
-        final Object currentReferencedObj = ObjectAdapter.Util.unwrap(currentReferencedAdapter);
-
-        final PropertyAccessEvent ev = new PropertyAccessEvent(getDelegate(), otoa.getIdentifier(), currentReferencedObj);
-        notifyListeners(ev);
-        return currentReferencedObj;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // property - modify
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleSetterMethodOnProperty(final Object[] args, final AuthenticationSession session, final ObjectAdapter targetAdapter, final OneToOneAssociation otoa, final String methodName) {
-        if (args.length != 1) {
-            throw new IllegalArgumentException("Invoking a setter should only have a single argument");
-        }
-
-        final Object argumentObj = underlying(args[0]);
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(getAuthenticationSession(), targetAdapter, otoa);
-            checkUsability(getAuthenticationSession(), targetAdapter, otoa);
-        }
-
-        final ObjectAdapter argumentAdapter = argumentObj != null ? getAdapterManager().adapterFor(argumentObj) : null;
-
-        resolveIfRequired(targetAdapter);
-
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            final InteractionResult interactionResult = otoa.isAssociationValid(targetAdapter, argumentAdapter).getInteractionResult();
-            notifyListenersAndVetoIfRequired(interactionResult);
-        }
-
-        if (getExecutionMode().shouldExecute()) {
-            otoa.set(targetAdapter, argumentAdapter);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-
-    // /////////////////////////////////////////////////////////////////
-    // collection - access
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleGetterMethodOnCollection(final Method method, final Object[] args, final ObjectAdapter targetAdapter, final OneToManyAssociation otma, final String memberName) {
-
-
-        if (args.length != 0) {
-            throw new IllegalArgumentException("Invoking a 'get' should have no arguments");
-        }
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(getAuthenticationSession(), targetAdapter, otma);
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final ObjectAdapter currentReferencedAdapter = otma.get(targetAdapter);
-        final Object currentReferencedObj = ObjectAdapter.Util.unwrap(currentReferencedAdapter);
-
-        final CollectionAccessEvent ev = new CollectionAccessEvent(getDelegate(), otma.getIdentifier());
-
-        if (currentReferencedObj instanceof Collection) {
-            final Collection<?> collectionViewObject = lookupViewObject(method, memberName, (Collection<?>) currentReferencedObj, otma);
-            notifyListeners(ev);
-            return collectionViewObject;
-        } else if (currentReferencedObj instanceof Map) {
-            final Map<?, ?> mapViewObject = lookupViewObject(method, memberName, (Map<?, ?>) currentReferencedObj, otma);
-            notifyListeners(ev);
-            return mapViewObject;
-        }
-        throw new IllegalArgumentException(String.format("Collection type '%s' not supported by framework", currentReferencedObj.getClass().getName()));
-    }
-
-    /**
-     * Looks up (or creates) a proxy for this object.
-     */
-    private Collection<?> lookupViewObject(final Method method, final String memberName, final Collection<?> collectionToLookup, final OneToManyAssociation otma) {
-        Collection<?> collectionViewObject = collectionViewObjectsByMethod.get(method);
-        if (collectionViewObject == null) {
-            if (collectionToLookup instanceof WrapperObject) {
-                collectionViewObject = collectionToLookup;
-            } else {
-                collectionViewObject = proxy.proxy(collectionToLookup, memberName, this, otma);
-            }
-            collectionViewObjectsByMethod.put(method, collectionViewObject);
-        }
-        return collectionViewObject;
-    }
-
-    private Map<?, ?> lookupViewObject(final Method method, final String memberName, final Map<?, ?> mapToLookup, final OneToManyAssociation otma) {
-        Map<?, ?> mapViewObject = mapViewObjectsByMethod.get(method);
-        if (mapViewObject == null) {
-            if (mapToLookup instanceof WrapperObject) {
-                mapViewObject = mapToLookup;
-            } else {
-                mapViewObject = proxy.proxy(mapToLookup, memberName, this, otma);
-            }
-            mapViewObjectsByMethod.put(method, mapViewObject);
-        }
-        return mapViewObject;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // collection - add to
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleCollectionAddToMethod(final Object[] args, final ObjectAdapter targetAdapter, final OneToManyAssociation otma, final String methodName) {
-
-        if (args.length != 1) {
-            throw new IllegalArgumentException("Invoking a addTo should only have a single argument");
-        }
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(getAuthenticationSession(), targetAdapter, otma);
-            checkUsability(getAuthenticationSession(), targetAdapter, otma);
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final Object argumentObj = underlying(args[0]);
-        if (argumentObj == null) {
-            throw new IllegalArgumentException("Must provide a non-null object to add");
-        }
-        final ObjectAdapter argumentNO = getAdapterManager().adapterFor(argumentObj);
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            final InteractionResult interactionResult = otma.isValidToAdd(targetAdapter, argumentNO).getInteractionResult();
-            notifyListenersAndVetoIfRequired(interactionResult);
-        }
-
-        if (getExecutionMode().shouldExecute()) {
-            otma.addElement(targetAdapter, argumentNO);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-
-    // /////////////////////////////////////////////////////////////////
-    // collection - remove from
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleCollectionRemoveFromMethod(final Object[] args, final ObjectAdapter targetAdapter, final OneToManyAssociation otma, final String methodName) {
-        if (args.length != 1) {
-            throw new IllegalArgumentException("Invoking a removeFrom should only have a single argument");
-        }
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(getAuthenticationSession(), targetAdapter, otma);
-            checkUsability(getAuthenticationSession(), targetAdapter, otma);
-        }
-
-
-        resolveIfRequired(targetAdapter);
-
-        final Object argumentObj = underlying(args[0]);
-        if (argumentObj == null) {
-            throw new IllegalArgumentException("Must provide a non-null object to remove");
-        }
-        final ObjectAdapter argumentAdapter = getAdapterManager().adapterFor(argumentObj);
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            final InteractionResult interactionResult = otma.isValidToRemove(targetAdapter, argumentAdapter).getInteractionResult();
-            notifyListenersAndVetoIfRequired(interactionResult);
-        }
-
-        if (getExecutionMode().shouldExecute()) {
-            otma.removeElement(targetAdapter, argumentAdapter);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // action
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleActionMethod(final Object[] args, final AuthenticationSession session, final ObjectAdapter targetAdapter, final ObjectAction noa, final String memberName) {
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(getAuthenticationSession(), targetAdapter, noa);
-            checkUsability(getAuthenticationSession(), targetAdapter, noa);
-        }
-
-        final Object[] underlyingArgs = new Object[args.length];
-        int i = 0;
-        for (final Object arg : args) {
-            underlyingArgs[i++] = underlying(arg);
-        }
-
-        final ObjectAdapter[] argAdapters = new ObjectAdapter[underlyingArgs.length];
-        int j = 0;
-        for (final Object underlyingArg : underlyingArgs) {
-            argAdapters[j++] = underlyingArg != null ? getAdapterManager().adapterFor(underlyingArg) : null;
-        }
-
-        if(getExecutionMode().shouldEnforceRules()) {
-            final InteractionResult interactionResult = noa.isProposedArgumentSetValid(targetAdapter, argAdapters).getInteractionResult();
-            notifyListenersAndVetoIfRequired(interactionResult);
-        }
-
-        if (getExecutionMode().shouldExecute()) {
-            final ObjectAdapter actionReturnNO = noa.execute(targetAdapter, argAdapters);
-            return ObjectAdapter.Util.unwrap(actionReturnNO);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-    private Object underlying(final Object arg) {
-        if (arg instanceof WrapperObject) {
-            final WrapperObject argViewObject = (WrapperObject) arg;
-            return argViewObject.wrapped();
-        } else {
-            return arg;
-        }
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // visibility and usability checks (common to all members)
-    // /////////////////////////////////////////////////////////////////
-
-    /**
-     * REVIEW: ideally should provide some way to allow to caller to indicate the 'where' context.  Having
-     * a hard-coded value like this is an approximation. 
-     */
-    private final Where where = Where.ANYWHERE;
-
-    private void checkVisibility(final AuthenticationSession session, final ObjectAdapter targetObjectAdapter, final ObjectMember objectMember) {
-        final Consent visibleConsent = objectMember.isVisible(getAuthenticationSession(), targetObjectAdapter, where);
-        final InteractionResult interactionResult = visibleConsent.getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-    }
-
-    private void checkUsability(final AuthenticationSession session, final ObjectAdapter targetObjectAdapter, final ObjectMember objectMember) {
-        final InteractionResult interactionResult = objectMember.isUsable(getAuthenticationSession(), targetObjectAdapter, where).getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // notify listeners
-    // /////////////////////////////////////////////////////////////////
-
-    private void notifyListenersAndVetoIfRequired(final InteractionResult interactionResult) {
-        final InteractionEvent interactionEvent = interactionResult.getInteractionEvent();
-        notifyListeners(interactionEvent);
-        if (interactionEvent.isVeto()) {
-            throw toException(interactionEvent);
-        }
-    }
-
-    private String decode(final ObjectMember objectMember) {
-        if (objectMember instanceof OneToOneAssociation) {
-            return "a property";
-        }
-        if (objectMember instanceof OneToManyAssociation) {
-            return "a collection";
-        }
-        if (objectMember instanceof ObjectAction) {
-            return "an action";
-        }
-        return "an UNKNOWN member type";
-    }
-
-    /**
-     * Wraps a {@link InteractionEvent#isVeto() vetoing}
-     * {@link InteractionEvent} in a corresponding {@link InteractionException},
-     * and returns it.
-     */
-    private InteractionException toException(final InteractionEvent interactionEvent) {
-        if (!interactionEvent.isVeto()) {
-            throw new IllegalArgumentException("Provided interactionEvent must be a veto");
-        }
-        if (interactionEvent instanceof ValidityEvent) {
-            final ValidityEvent validityEvent = (ValidityEvent) interactionEvent;
-            return new InvalidException(validityEvent);
-        }
-        if (interactionEvent instanceof VisibilityEvent) {
-            final VisibilityEvent visibilityEvent = (VisibilityEvent) interactionEvent;
-            return new HiddenException(visibilityEvent);
-        }
-        if (interactionEvent instanceof UsabilityEvent) {
-            final UsabilityEvent usabilityEvent = (UsabilityEvent) interactionEvent;
-            return new DisabledException(usabilityEvent);
-        }
-        throw new IllegalArgumentException("Provided interactionEvent must be a VisibilityEvent, UsabilityEvent or a ValidityEvent");
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // switching
-    // /////////////////////////////////////////////////////////////////
-
-    private ObjectMember locateAndCheckMember(final Method method) {
-        final ObjectSpecificationDefault objectSpecificationDefault = getJavaSpecificationOfOwningClass(method);
-        final ObjectMember member = objectSpecificationDefault.getMember(method);
-        
-        if (member == null) {
-            final String methodName = method.getName();
-            throw new UnsupportedOperationException("Method '" + methodName + "' being invoked does not correspond to any of the object's fields or actions.");
-        }
-        return member;
-    }
-
-    protected boolean isTitleMethod(final Method method) {
-        return method.equals(titleMethod);
-    }
-
-    protected boolean isSaveMethod(final Method method) {
-        return method.equals(saveMethod) || method.equals(__isis_saveMethod);
-    }
-
-    protected boolean isWrappedMethod(final Method method) {
-        return method.equals(wrappedMethod) || method.equals(__isis_wrappedMethod);
-    }
-
-    protected boolean isExecutionModeMethod(final Method method) {
-        return method.equals(__isis_executionMode);
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // Specification lookup
-    // /////////////////////////////////////////////////////////////////
-
-    private ObjectSpecificationDefault getJavaSpecificationOfOwningClass(final Method method) {
-        return getJavaSpecification(method.getDeclaringClass());
-    }
-
-    private ObjectSpecificationDefault getJavaSpecification(final Class<?> clazz) {
-        final ObjectSpecification nos = getSpecification(clazz);
-        if (!(nos instanceof ObjectSpecificationDefault)) {
-            throw new UnsupportedOperationException("Only Java is supported (specification is '" + nos.getClass().getCanonicalName() + "')");
-        }
-        return (ObjectSpecificationDefault) nos;
-    }
-
-    private ObjectSpecification getSpecification(final Class<?> type) {
-        final ObjectSpecification nos = getSpecificationLookup().loadSpecification(type);
-        return nos;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // Dependencies
-    // /////////////////////////////////////////////////////////////////
-
-    protected SpecificationLoader getSpecificationLookup() {
-        return specificationLookup;
-    }
-
-    public AuthenticationSessionProvider getAuthenticationSessionProvider() {
-        return authenticationSessionProvider;
-    }
-
-    protected AuthenticationSession getAuthenticationSession() {
-        return getAuthenticationSessionProvider().getAuthenticationSession();
-    }
-
-    protected AdapterManager getAdapterManager() {
-        return adapterManager;
-    }
-
-    protected ObjectPersistor getObjectPersistor() {
-        return objectPersistor;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/dec67056/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/MapInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/MapInvocationHandler.java b/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/MapInvocationHandler.java
deleted file mode 100644
index ed6cbc1..0000000
--- a/core/module-wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/MapInvocationHandler.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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.wrapper.handlers;
-
-import java.util.Map;
-
-import org.apache.isis.core.commons.lang.ObjectExtensions;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-class MapInvocationHandler<T, C> extends AbstractCollectionInvocationHandler<T, C> {
-
-    public MapInvocationHandler(final C collectionToProxy, final String collectionName, final DomainObjectInvocationHandler<T> handler, final OneToManyAssociation otma) {
-        super(collectionToProxy, collectionName, handler, otma);
-
-        try {
-            intercept(ObjectExtensions.getMethod(collectionToProxy, "containsKey", Object.class));
-            intercept(ObjectExtensions.getMethod(collectionToProxy, "containsValue", Object.class));
-            intercept(ObjectExtensions.getMethod(collectionToProxy, "size"));
-            intercept(ObjectExtensions.getMethod(collectionToProxy, "isEmpty"));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "put", Object.class, Object.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "remove", Object.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "putAll", Map.class));
-            veto(ObjectExtensions.getMethod(collectionToProxy, "clear"));
-        } catch (final NoSuchMethodException e) {
-            // ///CLOVER:OFF
-            throw new RuntimeException("A Collection method could not be found: " + e.getMessage());
-            // ///CLOVER:ON
-        }
-    }
-
-}