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 2016/05/13 18:13:45 UTC

[03/50] [abbrv] isis git commit: ISIS-1370: getting build to pass (moving PublishingServiceInternalDefault to package where it will be picked up as a domain service).

ISIS-1370: getting build to pass (moving PublishingServiceInternalDefault to package where it will be picked up as a domain service).

Also removing unused code in DomainObjectInvocationHandler.


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

Branch: refs/heads/master
Commit: 9d8847fc3838c84c14d3c847798b974b11e2e0e0
Parents: eee234c
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun May 1 09:16:18 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun May 1 09:16:18 2016 +0100

----------------------------------------------------------------------
 .../PublishingServiceInternalDefault.java       | 313 -------------------
 .../PublishingServiceInternalDefault.java       | 313 +++++++++++++++++++
 .../system/transaction/IsisTransaction.java     |   3 +-
 .../handlers/DomainObjectInvocationHandler.java |   8 -
 4 files changed, 314 insertions(+), 323 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9d8847fc/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternalDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternalDefault.java
deleted file mode 100644
index 756d228..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternalDefault.java
+++ /dev/null
@@ -1,313 +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.runtime.persistence.objectstore.transaction;
-
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.inject.Inject;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.PublishedAction;
-import org.apache.isis.applib.annotation.PublishedObject;
-import org.apache.isis.applib.annotation.PublishedObject.ChangeKind;
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.command.CommandContext;
-import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.applib.services.publish.EventMetadata;
-import org.apache.isis.applib.services.publish.EventPayload;
-import org.apache.isis.applib.services.publish.EventType;
-import org.apache.isis.applib.services.publish.ObjectStringifier;
-import org.apache.isis.applib.services.publish.PublishingService;
-import org.apache.isis.applib.services.user.UserService;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
-import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
-import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
-import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-
-/**
- * Wrapper around {@link PublishingService}.  Is a no-op if there is no injected service.
- */
-@DomainService(nature = NatureOfService.DOMAIN)
-public class PublishingServiceInternalDefault implements PublishingServiceInternal {
-
-    private final static Function<ObjectAdapter, ObjectAdapter> NOT_DESTROYED_ELSE_EMPTY = new Function<ObjectAdapter, ObjectAdapter>() {
-        public ObjectAdapter apply(ObjectAdapter adapter) {
-            if(adapter == null) {
-                return null;
-            }
-            if (!adapter.isDestroyed()) {
-                return adapter;
-            }
-            // objectstores such as JDO prevent the underlying pojo from being touched once it has been deleted.
-            // we therefore replace that pojo with an 'empty' one.
-
-            Object replacementObject = getPersistenceSession().instantiateAndInjectServices(adapter.getSpecification());
-            getPersistenceSession().remapRecreatedPojo(adapter, replacementObject);
-            return adapter;
-        }
-        protected PersistenceSession getPersistenceSession() {
-            return IsisContext.getPersistenceSession();
-        }
-
-    };
-
-    @Programmatic
-    public static EventType eventTypeFor(ChangeKind changeKind) {
-        if(changeKind == ChangeKind.UPDATE) {
-            return EventType.OBJECT_UPDATED;
-        }
-        if(changeKind == ChangeKind.CREATE) {
-            return EventType.OBJECT_CREATED;
-        }
-        if(changeKind == ChangeKind.DELETE) {
-            return EventType.OBJECT_DELETED;
-        }
-        throw new IllegalArgumentException("unknown ChangeKind '" + changeKind + "'");
-    }
-
-    @Override @Programmatic
-    public boolean canPublish() {
-        return publishingServiceIfAny != null;
-    }
-
-    @Override @Programmatic
-    public void publishObjects(final Map<ObjectAdapter, ChangeKind> changeKindByEnlistedAdapter) {
-
-        if(!canPublish()) {
-            return;
-        }
-
-        final String currentUser = userService.getUser().getName();
-        final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
-        final ObjectStringifier stringifier = objectStringifier();
-
-        // take a copy of enlisted adapters ... the JDO implementation of the PublishingService
-        // creates further entities which would be enlisted; taking copy of the keys avoids ConcurrentModificationException
-        final List<ObjectAdapter> enlistedAdapters =
-                Lists.newArrayList(changeKindByEnlistedAdapter.keySet());
-
-        for (final ObjectAdapter enlistedAdapter : enlistedAdapters) {
-            final ChangeKind changeKind = changeKindByEnlistedAdapter.get(enlistedAdapter);
-
-            publishObject(enlistedAdapter, changeKind, currentUser, timestamp, stringifier);
-        }
-    }
-
-    private void publishObject(
-            final ObjectAdapter enlistedAdapter,
-            final ChangeKind changeKind,
-            final String currentUser,
-            final Timestamp timestamp,
-            final ObjectStringifier stringifier) {
-
-        final PublishedObjectFacet publishedObjectFacet =
-                enlistedAdapter.getSpecification().getFacet(PublishedObjectFacet.class);
-        if(publishedObjectFacet == null) {
-            return;
-        }
-        final PublishedObject.PayloadFactory payloadFactory = publishedObjectFacet.value();
-
-        final RootOid enlistedAdapterOid = (RootOid) enlistedAdapter.getOid();
-        final String enlistedAdapterClass = CommandUtil.targetClassNameFor(enlistedAdapter);
-        final Bookmark enlistedTarget = enlistedAdapterOid.asBookmark();
-
-        final EventMetadata metadata = newEventMetadata(
-                currentUser, timestamp, changeKind, enlistedAdapterClass, enlistedTarget);
-
-        final Object pojo = ObjectAdapter.Util.unwrap(undeletedElseEmpty(enlistedAdapter));
-        final EventPayload payload = payloadFactory.payloadFor(pojo, changeKind);
-
-        payload.withStringifier(stringifier);
-        publishingServiceIfAny.publish(metadata, payload);
-    }
-
-    public void publishAction(
-            final ObjectAction objectAction,
-            final IdentifiedHolder identifiedHolder,
-            final ObjectAdapter targetAdapter,
-            final List<ObjectAdapter> parameterAdapters,
-            final ObjectAdapter resultAdapter) {
-        if(!canPublish()) {
-            return;
-        }
-
-        final String currentUser = userService.getUser().getName();
-        final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
-
-        final PublishedActionFacet publishedActionFacet =
-                identifiedHolder.getFacet(PublishedActionFacet.class);
-        if(publishedActionFacet == null) {
-            return;
-        }
-
-        final RootOid adapterOid = (RootOid) targetAdapter.getOid();
-        final String oidStr = getOidMarshaller().marshal(adapterOid);
-        final Identifier actionIdentifier = objectAction.getIdentifier();
-        final String title = oidStr + ": " + actionIdentifier.toNameParmsIdentityString();
-
-        final String actionTargetClass = CommandUtil.targetClassNameFor(targetAdapter);
-        final String actionTargetAction = CommandUtil.targetActionNameFor(objectAction);
-        final Bookmark actionTarget = CommandUtil.bookmarkFor(targetAdapter);
-        final String actionMemberIdentifier = CommandUtil.actionIdentifierFor(objectAction);
-
-        final List<String> parameterNames;
-        final List<Class<?>> parameterTypes;
-        final Class<?> returnType;
-
-        if(identifiedHolder instanceof FacetedMethod) {
-            // should always be the case
-
-            final FacetedMethod facetedMethod = (FacetedMethod) identifiedHolder;
-            returnType = facetedMethod.getType();
-
-            final List<FacetedMethodParameter> parameters = facetedMethod.getParameters();
-            parameterNames = immutableList(Iterables.transform(parameters, FacetedMethodParameter.Functions.GET_NAME));
-            parameterTypes = immutableList(Iterables.transform(parameters, FacetedMethodParameter.Functions.GET_TYPE));
-        } else {
-            parameterNames = null;
-            parameterTypes = null;
-            returnType = null;
-        }
-
-        final Command command = commandContext.getCommand();
-
-        final Interaction.SequenceName sequenceName = Interaction.SequenceName.PUBLISHED_EVENT;
-        final int nextEventSequence = command.next(sequenceName.abbr());
-        final UUID transactionId = command.getTransactionId();
-        final EventMetadata metadata = new EventMetadata(
-                transactionId, nextEventSequence, EventType.ACTION_INVOCATION, currentUser, timestamp, title,
-                actionTargetClass, actionTargetAction, actionTarget, actionMemberIdentifier, parameterNames,
-                parameterTypes, returnType);
-
-        final PublishedAction.PayloadFactory payloadFactory = publishedActionFacet.value();
-
-        final ObjectStringifier stringifier = objectStringifier();
-
-        final EventPayload payload = payloadFactory.payloadFor(
-                identifiedHolder.getIdentifier(),
-                ObjectAdapter.Util.unwrap(undeletedElseEmpty(targetAdapter)),
-                ObjectAdapter.Util.unwrap(undeletedElseEmpty(parameterAdapters)),
-                ObjectAdapter.Util.unwrap(undeletedElseEmpty(resultAdapter)));
-        payload.withStringifier(stringifier);
-        publishingServiceIfAny.publish(metadata, payload);
-    }
-
-    private static <T> List<T> immutableList(final Iterable<T> iterable) {
-        return Collections.unmodifiableList(Lists.newArrayList(iterable));
-    }
-
-    private ObjectStringifier objectStringifier() {
-        return new ObjectStringifier() {
-                @Override
-                public String toString(Object object) {
-                    if(object == null) {
-                        return null;
-                    }
-                    final ObjectAdapter adapter = IsisContext.getPersistenceSession().adapterFor(object);
-                    Oid oid = adapter.getOid();
-                    return oid != null? oid.enString(getOidMarshaller()): encodedValueOf(adapter);
-                }
-                private String encodedValueOf(ObjectAdapter adapter) {
-                    EncodableFacet facet = adapter.getSpecification().getFacet(EncodableFacet.class);
-                    return facet != null? facet.toEncodedString(adapter): adapter.toString();
-                }
-                @Override
-                public String classNameOf(Object object) {
-                    final ObjectAdapter adapter = getPersistenceSession().adapterFor(object);
-                    final String className = adapter.getSpecification().getFullIdentifier();
-                    return className;
-                }
-            };
-    }
-
-    private static List<ObjectAdapter> undeletedElseEmpty(List<ObjectAdapter> parameters) {
-        return Lists.newArrayList(Iterables.transform(parameters, NOT_DESTROYED_ELSE_EMPTY));
-    }
-
-    private static ObjectAdapter undeletedElseEmpty(ObjectAdapter adapter) {
-        return NOT_DESTROYED_ELSE_EMPTY.apply(adapter);
-    }
-
-    protected OidMarshaller getOidMarshaller() {
-        return IsisContext.getOidMarshaller();
-    }
-
-    private EventMetadata newEventMetadata(
-            final String currentUser,
-            final Timestamp timestamp,
-            final ChangeKind changeKind,
-            final String enlistedAdapterClass,
-            final Bookmark enlistedTarget) {
-        final EventType eventType = PublishingServiceInternalDefault.eventTypeFor(changeKind);
-
-        final Command command = commandContext.getCommand();
-
-        final Interaction.SequenceName sequenceName = Interaction.SequenceName.PUBLISHED_EVENT;
-        final int nextEventSequence = command.next(sequenceName.abbr());
-        final UUID transactionId = command.getTransactionId();
-        return new EventMetadata(
-                transactionId, nextEventSequence, eventType, currentUser, timestamp, enlistedTarget.toString(),
-                enlistedAdapterClass, null, enlistedTarget, null, null, null, null);
-    }
-
-    private IsisTransactionManager.PersistenceSessionTransactionManagement getPersistenceSession() {
-        return IsisContext.getPersistenceSession();
-    }
-
-
-    @Inject
-    private PublishingService publishingServiceIfAny;
-
-    @Inject
-    private CommandContext commandContext;
-
-    @Inject
-    private ClockService clockService;
-
-    @Inject
-    private UserService userService;
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/9d8847fc/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java
new file mode 100644
index 0000000..b860d2b
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java
@@ -0,0 +1,313 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.runtime.services.publishing;
+
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.PublishedAction;
+import org.apache.isis.applib.annotation.PublishedObject;
+import org.apache.isis.applib.annotation.PublishedObject.ChangeKind;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.publish.EventMetadata;
+import org.apache.isis.applib.services.publish.EventPayload;
+import org.apache.isis.applib.services.publish.EventType;
+import org.apache.isis.applib.services.publish.ObjectStringifier;
+import org.apache.isis.applib.services.publish.PublishingService;
+import org.apache.isis.applib.services.user.UserService;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
+import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
+
+/**
+ * Wrapper around {@link PublishingService}.  Is a no-op if there is no injected service.
+ */
+@DomainService(nature = NatureOfService.DOMAIN)
+public class PublishingServiceInternalDefault implements PublishingServiceInternal {
+
+    private final static Function<ObjectAdapter, ObjectAdapter> NOT_DESTROYED_ELSE_EMPTY = new Function<ObjectAdapter, ObjectAdapter>() {
+        public ObjectAdapter apply(ObjectAdapter adapter) {
+            if(adapter == null) {
+                return null;
+            }
+            if (!adapter.isDestroyed()) {
+                return adapter;
+            }
+            // objectstores such as JDO prevent the underlying pojo from being touched once it has been deleted.
+            // we therefore replace that pojo with an 'empty' one.
+
+            Object replacementObject = getPersistenceSession().instantiateAndInjectServices(adapter.getSpecification());
+            getPersistenceSession().remapRecreatedPojo(adapter, replacementObject);
+            return adapter;
+        }
+        protected PersistenceSession getPersistenceSession() {
+            return IsisContext.getPersistenceSession();
+        }
+
+    };
+
+    @Programmatic
+    public static EventType eventTypeFor(ChangeKind changeKind) {
+        if(changeKind == ChangeKind.UPDATE) {
+            return EventType.OBJECT_UPDATED;
+        }
+        if(changeKind == ChangeKind.CREATE) {
+            return EventType.OBJECT_CREATED;
+        }
+        if(changeKind == ChangeKind.DELETE) {
+            return EventType.OBJECT_DELETED;
+        }
+        throw new IllegalArgumentException("unknown ChangeKind '" + changeKind + "'");
+    }
+
+    @Override @Programmatic
+    public boolean canPublish() {
+        return publishingServiceIfAny != null;
+    }
+
+    @Override @Programmatic
+    public void publishObjects(final Map<ObjectAdapter, ChangeKind> changeKindByEnlistedAdapter) {
+
+        if(!canPublish()) {
+            return;
+        }
+
+        final String currentUser = userService.getUser().getName();
+        final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
+        final ObjectStringifier stringifier = objectStringifier();
+
+        // take a copy of enlisted adapters ... the JDO implementation of the PublishingService
+        // creates further entities which would be enlisted; taking copy of the keys avoids ConcurrentModificationException
+        final List<ObjectAdapter> enlistedAdapters =
+                Lists.newArrayList(changeKindByEnlistedAdapter.keySet());
+
+        for (final ObjectAdapter enlistedAdapter : enlistedAdapters) {
+            final ChangeKind changeKind = changeKindByEnlistedAdapter.get(enlistedAdapter);
+
+            publishObject(enlistedAdapter, changeKind, currentUser, timestamp, stringifier);
+        }
+    }
+
+    private void publishObject(
+            final ObjectAdapter enlistedAdapter,
+            final ChangeKind changeKind,
+            final String currentUser,
+            final Timestamp timestamp,
+            final ObjectStringifier stringifier) {
+
+        final PublishedObjectFacet publishedObjectFacet =
+                enlistedAdapter.getSpecification().getFacet(PublishedObjectFacet.class);
+        if(publishedObjectFacet == null) {
+            return;
+        }
+        final PublishedObject.PayloadFactory payloadFactory = publishedObjectFacet.value();
+
+        final RootOid enlistedAdapterOid = (RootOid) enlistedAdapter.getOid();
+        final String enlistedAdapterClass = CommandUtil.targetClassNameFor(enlistedAdapter);
+        final Bookmark enlistedTarget = enlistedAdapterOid.asBookmark();
+
+        final EventMetadata metadata = newEventMetadata(
+                currentUser, timestamp, changeKind, enlistedAdapterClass, enlistedTarget);
+
+        final Object pojo = ObjectAdapter.Util.unwrap(undeletedElseEmpty(enlistedAdapter));
+        final EventPayload payload = payloadFactory.payloadFor(pojo, changeKind);
+
+        payload.withStringifier(stringifier);
+        publishingServiceIfAny.publish(metadata, payload);
+    }
+
+    public void publishAction(
+            final ObjectAction objectAction,
+            final IdentifiedHolder identifiedHolder,
+            final ObjectAdapter targetAdapter,
+            final List<ObjectAdapter> parameterAdapters,
+            final ObjectAdapter resultAdapter) {
+        if(!canPublish()) {
+            return;
+        }
+
+        final String currentUser = userService.getUser().getName();
+        final Timestamp timestamp = clockService.nowAsJavaSqlTimestamp();
+
+        final PublishedActionFacet publishedActionFacet =
+                identifiedHolder.getFacet(PublishedActionFacet.class);
+        if(publishedActionFacet == null) {
+            return;
+        }
+
+        final RootOid adapterOid = (RootOid) targetAdapter.getOid();
+        final String oidStr = getOidMarshaller().marshal(adapterOid);
+        final Identifier actionIdentifier = objectAction.getIdentifier();
+        final String title = oidStr + ": " + actionIdentifier.toNameParmsIdentityString();
+
+        final String actionTargetClass = CommandUtil.targetClassNameFor(targetAdapter);
+        final String actionTargetAction = CommandUtil.targetActionNameFor(objectAction);
+        final Bookmark actionTarget = CommandUtil.bookmarkFor(targetAdapter);
+        final String actionMemberIdentifier = CommandUtil.actionIdentifierFor(objectAction);
+
+        final List<String> parameterNames;
+        final List<Class<?>> parameterTypes;
+        final Class<?> returnType;
+
+        if(identifiedHolder instanceof FacetedMethod) {
+            // should always be the case
+
+            final FacetedMethod facetedMethod = (FacetedMethod) identifiedHolder;
+            returnType = facetedMethod.getType();
+
+            final List<FacetedMethodParameter> parameters = facetedMethod.getParameters();
+            parameterNames = immutableList(Iterables.transform(parameters, FacetedMethodParameter.Functions.GET_NAME));
+            parameterTypes = immutableList(Iterables.transform(parameters, FacetedMethodParameter.Functions.GET_TYPE));
+        } else {
+            parameterNames = null;
+            parameterTypes = null;
+            returnType = null;
+        }
+
+        final Command command = commandContext.getCommand();
+
+        final Interaction.SequenceName sequenceName = Interaction.SequenceName.PUBLISHED_EVENT;
+        final int nextEventSequence = command.next(sequenceName.abbr());
+        final UUID transactionId = command.getTransactionId();
+        final EventMetadata metadata = new EventMetadata(
+                transactionId, nextEventSequence, EventType.ACTION_INVOCATION, currentUser, timestamp, title,
+                actionTargetClass, actionTargetAction, actionTarget, actionMemberIdentifier, parameterNames,
+                parameterTypes, returnType);
+
+        final PublishedAction.PayloadFactory payloadFactory = publishedActionFacet.value();
+
+        final ObjectStringifier stringifier = objectStringifier();
+
+        final EventPayload payload = payloadFactory.payloadFor(
+                identifiedHolder.getIdentifier(),
+                ObjectAdapter.Util.unwrap(undeletedElseEmpty(targetAdapter)),
+                ObjectAdapter.Util.unwrap(undeletedElseEmpty(parameterAdapters)),
+                ObjectAdapter.Util.unwrap(undeletedElseEmpty(resultAdapter)));
+        payload.withStringifier(stringifier);
+        publishingServiceIfAny.publish(metadata, payload);
+    }
+
+    private static <T> List<T> immutableList(final Iterable<T> iterable) {
+        return Collections.unmodifiableList(Lists.newArrayList(iterable));
+    }
+
+    private ObjectStringifier objectStringifier() {
+        return new ObjectStringifier() {
+                @Override
+                public String toString(Object object) {
+                    if(object == null) {
+                        return null;
+                    }
+                    final ObjectAdapter adapter = IsisContext.getPersistenceSession().adapterFor(object);
+                    Oid oid = adapter.getOid();
+                    return oid != null? oid.enString(getOidMarshaller()): encodedValueOf(adapter);
+                }
+                private String encodedValueOf(ObjectAdapter adapter) {
+                    EncodableFacet facet = adapter.getSpecification().getFacet(EncodableFacet.class);
+                    return facet != null? facet.toEncodedString(adapter): adapter.toString();
+                }
+                @Override
+                public String classNameOf(Object object) {
+                    final ObjectAdapter adapter = getPersistenceSession().adapterFor(object);
+                    final String className = adapter.getSpecification().getFullIdentifier();
+                    return className;
+                }
+            };
+    }
+
+    private static List<ObjectAdapter> undeletedElseEmpty(List<ObjectAdapter> parameters) {
+        return Lists.newArrayList(Iterables.transform(parameters, NOT_DESTROYED_ELSE_EMPTY));
+    }
+
+    private static ObjectAdapter undeletedElseEmpty(ObjectAdapter adapter) {
+        return NOT_DESTROYED_ELSE_EMPTY.apply(adapter);
+    }
+
+    protected OidMarshaller getOidMarshaller() {
+        return IsisContext.getOidMarshaller();
+    }
+
+    private EventMetadata newEventMetadata(
+            final String currentUser,
+            final Timestamp timestamp,
+            final ChangeKind changeKind,
+            final String enlistedAdapterClass,
+            final Bookmark enlistedTarget) {
+        final EventType eventType = PublishingServiceInternalDefault.eventTypeFor(changeKind);
+
+        final Command command = commandContext.getCommand();
+
+        final Interaction.SequenceName sequenceName = Interaction.SequenceName.PUBLISHED_EVENT;
+        final int nextEventSequence = command.next(sequenceName.abbr());
+        final UUID transactionId = command.getTransactionId();
+        return new EventMetadata(
+                transactionId, nextEventSequence, eventType, currentUser, timestamp, enlistedTarget.toString(),
+                enlistedAdapterClass, null, enlistedTarget, null, null, null, null);
+    }
+
+    private IsisTransactionManager.PersistenceSessionTransactionManagement getPersistenceSession() {
+        return IsisContext.getPersistenceSession();
+    }
+
+
+    @Inject
+    private PublishingService publishingServiceIfAny;
+
+    @Inject
+    private CommandContext commandContext;
+
+    @Inject
+    private ClockService clockService;
+
+    @Inject
+    private UserService userService;
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/9d8847fc/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index 5fc4934..0f2747e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -70,7 +70,6 @@ import org.apache.isis.core.metamodel.transactions.TransactionState;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceInternalDefault;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
 import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
@@ -254,7 +253,7 @@ public class IsisTransaction implements TransactionScopedComponent {
         this.interactionContext = lookupService(InteractionContext.class);
 
         this.auditingServiceIfAny = lookupServiceIfAny(AuditingService3.class);
-        this.publishingServiceInternal = lookupService(PublishingServiceInternalDefault.class);
+        this.publishingServiceInternal = lookupService(PublishingServiceInternal.class);
 
 
         this.transactionId = transactionId;

http://git-wip-us.apache.org/repos/asf/isis/blob/9d8847fc/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
index 90382f2..023921c 100644
--- a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -61,7 +61,6 @@ 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.runtimecontext.PersistenceSessionService;
-import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -73,8 +72,6 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.specimpl.ContributeeMember;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionContributee;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceInternalDefault;
-import org.apache.isis.core.runtime.system.context.IsisContext;
 
 public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandlerDefault<T> {
 
@@ -804,10 +801,5 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         return persistenceSessionService;
     }
 
-    private PublishingServiceInternal getPublishingServiceInternal() {
-        return IsisContext.getPersistenceSession()
-                .getServicesInjector().lookupService(PublishingServiceInternalDefault.class);
-    }
-
 
 }