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 2013/02/01 18:31:19 UTC

[3/3] git commit: ISIS-323: first cut

Updated Branches:
  refs/heads/dan/ISIS-323 [created] 1f558615a


ISIS-323: first cut

* can publish objects, very simply
* no JTA stuff yet
* cannot publish actions yet (need a ThreadLocal)
* a few unit tests wouldn't go amiss...


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

Branch: refs/heads/dan/ISIS-323
Commit: 1f558615a0a223fed40ee8dd7ee0e53424bfbe02
Parents: 56c1fbd
Author: Dan Haywood <da...@apache.org>
Authored: Fri Feb 1 17:28:25 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Fri Feb 1 17:28:25 2013 +0000

----------------------------------------------------------------------
 .../jdo/applib/annotations/Auditable.java          |    7 +-
 .../isis/objectstore/jdo/applib/AuditService.java  |   11 +-
 .../jdo/applib/AuditServiceLogging.java            |   13 +-
 .../isis/objectstore/jdo/applib/Auditable.java     |    6 +-
 .../DataNucleusPersistenceMechanismInstaller.java  |   63 +---
 .../persistence/spi/DataNucleusTransaction.java    |   92 ----
 .../spi/DataNucleusTransactionManager.java         |   46 --
 .../auditable/AuditableAnnotationFacetFactory.java |   48 ---
 ...AuditableAnnotationInJdoApplibFacetFactory.java |   53 +++
 .../facets/object/auditable/AuditableFacet.java    |   31 --
 .../object/auditable/AuditableFacetAbstract.java   |   39 --
 .../object/auditable/AuditableFacetAnnotation.java |   31 --
 .../AuditableFacetAnnotationInJdoApplib.java       |   33 ++
 .../object/auditable/AuditableFacetImpl.java       |   30 --
 .../auditable/AuditableFacetMarkerInterface.java   |   31 --
 .../AuditableFacetMarkerInterfaceInJdoApplib.java  |   32 ++
 .../AuditableMarkerInterfaceFacetFactory.java      |   45 --
 ...ableMarkerInterfaceInJdoApplibFacetFactory.java |   49 +++
 .../GivenAuditableAnnotationFacetFactoryTest.java  |   10 +-
 ...enAuditableMarkerInterfaceFacetFactoryTest.java |   10 +-
 .../org/apache/isis/applib/annotation/Audited.java |   47 ++
 .../isis/applib/annotation/PublishedAction.java    |   47 ++
 .../isis/applib/annotation/PublishedObject.java    |   50 +++
 .../org/apache/isis/applib/marker/Auditable.java   |   39 ++
 .../applib/services/audit/AuditingService.java     |   38 ++
 .../applib/services/publish/CanonicalEvent.java    |   29 ++
 .../applib/services/publish/PublishingService.java |   41 ++
 .../isis/core/metamodel/facets/FacetFactory.java   |    3 +
 .../actions/publish/PublishedActionFacet.java      |   31 ++
 .../publish/PublishedActionFacetAbstract.java      |   37 ++
 .../facets/object/audit/AuditableFacet.java        |   31 ++
 .../object/audit/AuditableFacetAbstract.java       |   39 ++
 .../facets/object/audit/AuditableFacetImpl.java    |   30 ++
 .../AuditableAnnotationFacetFactory.java           |   48 +++
 .../audit/annotation/AuditableFacetAnnotation.java |   32 ++
 .../markerifc/AuditableFacetMarkerInterface.java   |   33 ++
 .../AuditableMarkerInterfaceFacetFactory.java      |   45 ++
 .../object/publish/PublishedObjectFacet.java       |   34 ++
 .../publish/PublishedObjectFacetAbstract.java      |   37 ++
 .../PublishedActionAnnotationFacetFactory.java     |   60 +++
 .../publish/PublishedActionFacetAnnotation.java    |   32 ++
 .../PublishedObjectAnnotationFacetFactory.java     |   60 +++
 .../publish/PublishedObjectFacetAnnotation.java    |   36 ++
 .../dflt/ProgrammingModelFacetsJava5.java          |   11 +
 .../PersistenceMechanismInstallerAbstract.java     |  147 ++++++-
 .../PersistenceSessionFactoryDelegating.java       |    5 +-
 .../system/transaction/IsisTransaction.java        |  152 ++++++-
 .../system/transaction/IsisTransactionManager.java |   24 +-
 .../PublishingServiceWithCanonicalizers.java       |   39 ++
 .../PersistenceSessionObjectStoreTest.java         |   10 +-
 ...ectStoreTransactionManagerAbstractTestCase.java |   67 ---
 ...StoreTransactionManager_EndTransactionTest.java |   41 ++-
 ...tStoreTransactionManager_InstantiationTest.java |   31 ++-
 ...oreTransactionManager_StartTransactionTest.java |   41 ++-
 .../objectstore/transaction/TransactionTest.java   |  323 --------------
 .../system/transaction/IsisTransactionTest.java    |  330 +++++++++++++++
 .../dom/src/main/java/dom/todo/ToDoItem.java       |    8 +-
 .../src/main/webapp/WEB-INF/isis.properties        |    4 +-
 58 files changed, 1852 insertions(+), 940 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/core/objectstore/jdo/applib/annotations/Auditable.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/core/objectstore/jdo/applib/annotations/Auditable.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/core/objectstore/jdo/applib/annotations/Auditable.java
index 09d0d87..6124860 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/core/objectstore/jdo/applib/annotations/Auditable.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/core/objectstore/jdo/applib/annotations/Auditable.java
@@ -26,12 +26,9 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * Indicates that the entity is auditable.
- * 
- * <p>
- * Alternatively, the type can implement the 
- * {@link org.apache.isis.objectstore.jdo.applib.Auditable Auditable} marker interface.
+ * @deprecated use the {@link org.apache.isis.applib.marker.Auditable the applib Auditable} annotation instead.
  */
+@Deprecated
 @Inherited
 @Target({ ElementType.TYPE })
 @Retention(RetentionPolicy.RUNTIME)

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditService.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditService.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditService.java
index b5a3a3a..d823658 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditService.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditService.java
@@ -18,11 +18,10 @@
  */
 package org.apache.isis.objectstore.jdo.applib;
 
-import org.apache.isis.applib.annotation.Hidden;
 
-public interface AuditService {
-    
-    @Hidden
-    public void audit(String user, long currentTimestampEpoch, String objectType, String identifier, String preValue, String postValue);
-    
+/**
+ * @deprecated use the {@link org.apache.isis.applib.services.audit.AuditingService the applib AuditService} instead.
+ */
+@Deprecated
+public interface AuditService extends org.apache.isis.applib.services.audit.AuditingService {
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditServiceLogging.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditServiceLogging.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditServiceLogging.java
index a2e6ca4..3e394da 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditServiceLogging.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/AuditServiceLogging.java
@@ -18,18 +18,19 @@
  */
 package org.apache.isis.objectstore.jdo.applib;
 
-import org.apache.isis.applib.AbstractFactoryAndRepository;
 import org.apache.isis.applib.annotation.Hidden;
 import org.apache.log4j.Logger;
 
-public class AuditServiceLogging extends AbstractFactoryAndRepository  implements AuditService {
-    
-    private static Logger LOG = Logger.getLogger(AuditServiceLogging.class);
+
+@SuppressWarnings("deprecation")
+public class AuditServiceLogging implements AuditService {
+
+    private final static Logger LOG = Logger.getLogger(AuditServiceLogging.class);
     
     @Hidden
     public void audit(String user, long currentTimestampEpoch, String objectType, String identifier, String preValue, String postValue) {
-        String auditMessage = objectType + ":" + identifier + " by " + user + ": " + preValue + " -> " + postValue; 
+        String auditMessage = objectType + ":" + identifier + " by " + user + ": " + preValue + " -> " + postValue;
         LOG.info(auditMessage);
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/Auditable.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/Auditable.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/Auditable.java
index a06eaa0..8035bfd 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/Auditable.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/Auditable.java
@@ -19,8 +19,8 @@
 package org.apache.isis.objectstore.jdo.applib;
 
 /**
- * Marker interface to indicate that an entity should be audited.
+ * @deprecated use the {@link org.apache.isis.applib.marker.Auditable the applib Auditable} marker interface instead.
  */
-public interface Auditable {
-
+@Deprecated
+public interface Auditable extends org.apache.isis.applib.marker.Auditable {
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 9a0173c..96982f3 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -18,13 +18,8 @@
  */
 package org.apache.isis.objectstore.jdo.datanucleus;
 
-import java.util.List;
 import java.util.Map;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
 import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
@@ -38,23 +33,16 @@ import org.apache.isis.core.runtime.bytecode.identity.ObjectFactoryBasic;
 import org.apache.isis.core.runtime.installerregistry.installerapi.PersistenceMechanismInstallerAbstract;
 import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi;
 import org.apache.isis.core.runtime.persistence.objectstore.algorithm.PersistAlgorithm;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.AdapterManagerSpi;
 import org.apache.isis.core.runtime.system.persistence.IdentifierGenerator;
 import org.apache.isis.core.runtime.system.persistence.ObjectFactory;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
-import org.apache.isis.core.runtime.system.transaction.EnlistedObjectDirtying;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-import org.apache.isis.objectstore.jdo.applib.AuditService;
 import org.apache.isis.objectstore.jdo.datanucleus.bytecode.DataNucleusTypesClassSubstitutor;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.adaptermanager.DataNucleusPojoRecreator;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.DataNucleusIdentifierGenerator;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.DataNucleusSimplePersistAlgorithm;
-import org.apache.isis.objectstore.jdo.datanucleus.persistence.spi.DataNucleusTransactionManager;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableAnnotationFacetFactory;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableMarkerInterfaceFacetFactory;
+import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableAnnotationInJdoApplibFacetFactory;
+import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableMarkerInterfaceInJdoApplibFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.datastoreidentity.JdoDatastoreIdentityAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.discriminator.JdoDiscriminatorAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.embeddedonly.JdoEmbeddedOnlyAnnotationFacetFactory;
@@ -63,10 +51,6 @@ import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryAnn
 import org.apache.isis.objectstore.jdo.metamodel.facets.prop.primarykey.JdoPrimaryKeyAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.specloader.validator.JdoMetaModelValidator;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
 /**
  * Configuration files are read in the usual fashion (as per {@link Installer#getConfigurationResources()}, ie will consult all of:
  * <ul>
@@ -86,22 +70,12 @@ import com.google.common.collect.Iterables;
  */
 public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechanismInstallerAbstract {
 
-    private static final Predicate<Object> LOCATE_AUDIT_SERVICE = new Predicate<Object>() {
-
-        @Override
-        public boolean apply(Object input) {
-            return input instanceof AuditService;
-        }
-    };
 
     public static final String NAME = "datanucleus";
     private static final String ISIS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl";
 
     private DataNucleusApplicationComponents applicationComponents = null;
 
-    // only search once
-    private boolean searchedForAuditService;
-    private AuditService auditService;
     
     public DataNucleusPersistenceMechanismInstaller() {
         super(NAME);
@@ -156,29 +130,6 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
     }
 
     ////////////////////////////////////////////////////////////////////////
-    // createPersistenceSession
-    ////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public PersistenceSession createPersistenceSession(PersistenceSessionFactory persistenceSessionFactory) {
-        PersistenceSession persistenceSession = super.createPersistenceSession(persistenceSessionFactory);
-        searchAndCacheAuditServiceIfNotAlreadyDoneSo(persistenceSessionFactory);
-        return persistenceSession;
-    }
-
-    private void searchAndCacheAuditServiceIfNotAlreadyDoneSo(PersistenceSessionFactory persistenceSessionFactory) {
-        if(searchedForAuditService) {
-            return;
-        } 
-        List<Object> services = persistenceSessionFactory.getServices();
-        final Optional<Object> optionalService = Iterables.tryFind(services, LOCATE_AUDIT_SERVICE);
-        if(optionalService.isPresent()) {
-            auditService = (AuditService) optionalService.get();
-        }
-        searchedForAuditService = true;
-    }
-
-    ////////////////////////////////////////////////////////////////////////
     // PersistenceSessionFactoryDelegate impl
     ////////////////////////////////////////////////////////////////////////
 
@@ -213,8 +164,8 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
 
         baseProgrammingModel.addFactory(JdoQueryAnnotationFacetFactory.class);
         
-        baseProgrammingModel.addFactory(AuditableAnnotationFacetFactory.class);
-        baseProgrammingModel.addFactory(AuditableMarkerInterfaceFacetFactory.class);
+        baseProgrammingModel.addFactory(AuditableAnnotationInJdoApplibFacetFactory.class);
+        baseProgrammingModel.addFactory(AuditableMarkerInterfaceInJdoApplibFacetFactory.class);
     }
 
     private void addDataNucleusFacetFactoriesTo(ProgrammingModel baseProgrammingModel) {
@@ -229,11 +180,6 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
 
 
     @Override
-    protected IsisTransactionManager createTransactionManager(final EnlistedObjectDirtying persistor, final TransactionalResource objectStore) {
-        return new DataNucleusTransactionManager(persistor, objectStore, auditService);
-    }
-
-    @Override
     public ObjectFactory createObjectFactory(IsisConfiguration configuration) {
         return new ObjectFactoryBasic();
     }
@@ -245,7 +191,6 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
 
 
 
-
     
     ////////////////////////////////////////////////////////////////////////
     // Dependencies

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransaction.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransaction.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransaction.java
deleted file mode 100644
index 4427f7d..0000000
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransaction.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.objectstore.jdo.datanucleus.persistence.spi;
-
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.isis.applib.clock.Clock;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-import org.apache.isis.core.runtime.system.transaction.MessageBroker;
-import org.apache.isis.core.runtime.system.transaction.UpdateNotifier;
-import org.apache.isis.objectstore.jdo.applib.AuditService;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableFacet;
-
-public class DataNucleusTransaction extends IsisTransaction {
-
-    private final AuditService auditService;
-    
-    public DataNucleusTransaction(
-                final IsisTransactionManager transactionManager, 
-                final MessageBroker messageBroker, 
-                final UpdateNotifier updateNotifier, 
-                final TransactionalResource objectStore, 
-                final AuditService auditService) {
-        super(transactionManager, messageBroker, updateNotifier, objectStore);
-        this.auditService = auditService;
-    }
-
-    @Override
-    protected void doAudit(final Set<Entry<AdapterAndProperty, PreAndPostValues>> auditEntries) {
-        if(auditService == null) {
-            super.doAudit(auditEntries);
-            return;
-        }
-        final String currentUser = getAuthenticationSession().getUserName();
-        final long currentTimestampEpoch = currentTimestampEpoch();
-        for (Entry<AdapterAndProperty, PreAndPostValues> auditEntry : auditEntries) {
-            audit(currentUser, currentTimestampEpoch, auditEntry);
-        }
-    }
-
-    private long currentTimestampEpoch() {
-        return Clock.getTime();
-    }
-
-    private void audit(final String currentUser, final long currentTimestampEpoch, final Entry<AdapterAndProperty, PreAndPostValues> auditEntry) {
-        final AdapterAndProperty aap = auditEntry.getKey();
-        final ObjectAdapter adapter = aap.getAdapter();
-        if(!adapter.getSpecification().containsFacet(AuditableFacet.class)) {
-            return;
-        }
-        final RootOid oid = (RootOid) adapter.getOid();
-        final String objectType = oid.getObjectSpecId().asString();
-        final String identifier = oid.getIdentifier();
-        final PreAndPostValues papv = auditEntry.getValue();
-        final String preValue = asString(papv.getPre());
-        final String postValue = asString(papv.getPost());
-        auditService.audit(currentUser, currentTimestampEpoch, objectType, identifier, preValue, postValue);
-    }
-
-    private static String asString(Object object) {
-        return object != null? object.toString(): null;
-    }
-
-
-    protected AuthenticationSession getAuthenticationSession() {
-        return IsisContext.getAuthenticationSession();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransactionManager.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransactionManager.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransactionManager.java
deleted file mode 100644
index b6d50fc..0000000
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/DataNucleusTransactionManager.java
+++ /dev/null
@@ -1,46 +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.objectstore.jdo.datanucleus.persistence.spi;
-
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
-import org.apache.isis.core.runtime.system.transaction.EnlistedObjectDirtying;
-import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-import org.apache.isis.core.runtime.system.transaction.MessageBroker;
-import org.apache.isis.core.runtime.system.transaction.UpdateNotifier;
-import org.apache.isis.objectstore.jdo.applib.AuditService;
-
-public class DataNucleusTransactionManager extends IsisTransactionManager {
-    
-    private final AuditService auditService;
-
-    public DataNucleusTransactionManager(
-            final EnlistedObjectDirtying objectPersistor, 
-            final TransactionalResource objectStore, 
-            final AuditService auditService) {
-        super(objectPersistor, objectStore);
-        this.auditService = auditService;
-    }
-    
-    @Override
-    protected IsisTransaction createTransaction(final MessageBroker messageBroker, final UpdateNotifier updateNotifier) {
-        return new DataNucleusTransaction(this, messageBroker, updateNotifier, getTransactionalResource(), auditService);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationFacetFactory.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationFacetFactory.java
deleted file mode 100644
index 44c4ec3..0000000
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationFacetFactory.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.objectstore.jdo.metamodel.facets.object.auditable;
-
-
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.objectstore.jdo.applib.annotations.Auditable;
-
-
-public class AuditableAnnotationFacetFactory extends FacetFactoryAbstract {
-
-    public AuditableAnnotationFacetFactory() {
-        super(FeatureType.OBJECTS_ONLY);
-    }
-
-    @Override
-    public void process(ProcessClassContext processClassContext) {
-        final Class<?> cls = processClassContext.getCls();
-        final Auditable annotation = Annotations.getAnnotation(cls, Auditable.class);
-        if (annotation == null) {
-            return;
-        }
-        FacetUtil.addFacet(new AuditableFacetAnnotation(
-                processClassContext.getFacetHolder()));
-        return;
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationInJdoApplibFacetFactory.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationInJdoApplibFacetFactory.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationInJdoApplibFacetFactory.java
new file mode 100644
index 0000000..b53bc4f
--- /dev/null
+++ b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableAnnotationInJdoApplibFacetFactory.java
@@ -0,0 +1,53 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.object.auditable;
+
+
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.objectstore.jdo.applib.annotations.Auditable;
+
+/**
+ * Required only for backward compatibility to support the JDO applib's version of the
+ * {@link Auditable} annotation.
+ * 
+ */
+@Deprecated
+public class AuditableAnnotationInJdoApplibFacetFactory extends FacetFactoryAbstract {
+
+    public AuditableAnnotationInJdoApplibFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(ProcessClassContext processClassContext) {
+        final Class<?> cls = processClassContext.getCls();
+        final Auditable annotation = Annotations.getAnnotation(cls, Auditable.class);
+        if (annotation == null) {
+            return;
+        }
+        FacetUtil.addFacet(new AuditableFacetAnnotationInJdoApplib(
+                processClassContext.getFacetHolder()));
+        return;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacet.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacet.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacet.java
deleted file mode 100644
index 178e135..0000000
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacet.java
+++ /dev/null
@@ -1,31 +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.objectstore.jdo.metamodel.facets.object.auditable;
-
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.objectstore.jdo.applib.annotations.Auditable;
-
-
-/**
- * Corresponds to annotating the class with the {@link Auditable} annotation.
- */
-public interface AuditableFacet extends Facet {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAbstract.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAbstract.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAbstract.java
deleted file mode 100644
index 94e8c45..0000000
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAbstract.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.objectstore.jdo.metamodel.facets.object.auditable;
-
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-
-public abstract class AuditableFacetAbstract extends FacetAbstract implements
-        AuditableFacet {
-
-
-    public static Class<? extends Facet> type() {
-        return AuditableFacet.class;
-    }
-
-    public AuditableFacetAbstract(FacetHolder facetHolder) {
-        super(AuditableFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotation.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotation.java
deleted file mode 100644
index 1ab563e..0000000
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotation.java
+++ /dev/null
@@ -1,31 +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.objectstore.jdo.metamodel.facets.object.auditable;
-
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-
-public class AuditableFacetAnnotation extends AuditableFacetImpl {
-
-    public AuditableFacetAnnotation(FacetHolder facetHolder) {
-        super(facetHolder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotationInJdoApplib.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotationInJdoApplib.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotationInJdoApplib.java
new file mode 100644
index 0000000..4eafb05
--- /dev/null
+++ b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetAnnotationInJdoApplib.java
@@ -0,0 +1,33 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.object.auditable;
+
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.audit.annotation.AuditableFacetAnnotation;
+
+
+@Deprecated
+public class AuditableFacetAnnotationInJdoApplib extends AuditableFacetAnnotation {
+
+    public AuditableFacetAnnotationInJdoApplib(FacetHolder facetHolder) {
+        super(facetHolder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetImpl.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetImpl.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetImpl.java
deleted file mode 100644
index b0c73fb..0000000
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetImpl.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.objectstore.jdo.metamodel.facets.object.auditable;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-
-public class AuditableFacetImpl extends AuditableFacetAbstract {
-
-    public AuditableFacetImpl(FacetHolder facetHolder) {
-        super(facetHolder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterface.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterface.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterface.java
deleted file mode 100644
index 288be6a..0000000
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterface.java
+++ /dev/null
@@ -1,31 +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.objectstore.jdo.metamodel.facets.object.auditable;
-
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-
-public class AuditableFacetMarkerInterface extends AuditableFacetImpl {
-
-    public AuditableFacetMarkerInterface(FacetHolder facetHolder) {
-        super(facetHolder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterfaceInJdoApplib.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterfaceInJdoApplib.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterfaceInJdoApplib.java
new file mode 100644
index 0000000..896a400
--- /dev/null
+++ b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableFacetMarkerInterfaceInJdoApplib.java
@@ -0,0 +1,32 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.object.auditable;
+
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.audit.markerifc.AuditableFacetMarkerInterface;
+
+@Deprecated
+public class AuditableFacetMarkerInterfaceInJdoApplib extends AuditableFacetMarkerInterface {
+
+    public AuditableFacetMarkerInterfaceInJdoApplib(FacetHolder facetHolder) {
+        super(facetHolder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceFacetFactory.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceFacetFactory.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceFacetFactory.java
deleted file mode 100644
index 39720ef..0000000
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceFacetFactory.java
+++ /dev/null
@@ -1,45 +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.objectstore.jdo.metamodel.facets.object.auditable;
-
-
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.objectstore.jdo.applib.Auditable;
-
-
-public class AuditableMarkerInterfaceFacetFactory extends FacetFactoryAbstract {
-
-    public AuditableMarkerInterfaceFacetFactory() {
-        super(FeatureType.OBJECTS_ONLY);
-    }
-
-    @Override
-    public void process(ProcessClassContext processClassContext) {
-        final Class<?> cls = processClassContext.getCls();
-        if(!Auditable.class.isAssignableFrom(cls)) {
-            return;
-        }
-        FacetUtil.addFacet(new AuditableFacetMarkerInterface(
-                processClassContext.getFacetHolder()));
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceInJdoApplibFacetFactory.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceInJdoApplibFacetFactory.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceInJdoApplibFacetFactory.java
new file mode 100644
index 0000000..ec4437d
--- /dev/null
+++ b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/AuditableMarkerInterfaceInJdoApplibFacetFactory.java
@@ -0,0 +1,49 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.object.auditable;
+
+
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.objectstore.jdo.applib.Auditable;
+
+/**
+ * Required only for backward compatibility to support the JDO applib's version of the
+ * {@link Auditable} marker interface.
+ */
+@Deprecated
+public class AuditableMarkerInterfaceInJdoApplibFacetFactory extends FacetFactoryAbstract {
+
+    public AuditableMarkerInterfaceInJdoApplibFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(ProcessClassContext processClassContext) {
+        final Class<?> cls = processClassContext.getCls();
+        if(!Auditable.class.isAssignableFrom(cls)) {
+            return;
+        }
+        FacetUtil.addFacet(new AuditableFacetMarkerInterfaceInJdoApplib(
+                processClassContext.getFacetHolder()));
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
index 4f92a08..5a9ae86 100644
--- a/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
+++ b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
@@ -29,11 +29,11 @@ import junit.framework.Assert;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacet;
+import org.apache.isis.core.metamodel.facets.object.audit.annotation.AuditableFacetAnnotation;
 import org.apache.isis.core.objectstore.jdo.applib.annotations.Auditable;
 import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableAnnotationFacetFactory;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableFacet;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableFacetAnnotation;
+import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableAnnotationInJdoApplibFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableAnnotationFacetFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacetAnnotation;
@@ -42,13 +42,13 @@ import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapabl
 public class GivenAuditableAnnotationFacetFactoryTest extends
         AbstractFacetFactoryTest {
 
-    private AuditableAnnotationFacetFactory facetFactory;
+    private AuditableAnnotationInJdoApplibFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new AuditableAnnotationFacetFactory();
+        facetFactory = new AuditableAnnotationInJdoApplibFacetFactory();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableMarkerInterfaceFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableMarkerInterfaceFacetFactoryTest.java b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableMarkerInterfaceFacetFactoryTest.java
index 3f33aa5..d543bf2 100644
--- a/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableMarkerInterfaceFacetFactoryTest.java
+++ b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableMarkerInterfaceFacetFactoryTest.java
@@ -27,23 +27,23 @@ import junit.framework.Assert;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacet;
+import org.apache.isis.core.metamodel.facets.object.audit.markerifc.AuditableFacetMarkerInterface;
 import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.objectstore.jdo.applib.Auditable;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableFacet;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableFacetMarkerInterface;
-import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableMarkerInterfaceFacetFactory;
+import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableMarkerInterfaceInJdoApplibFacetFactory;
 
 
 public class GivenAuditableMarkerInterfaceFacetFactoryTest extends
         AbstractFacetFactoryTest {
 
-    private AuditableMarkerInterfaceFacetFactory facetFactory;
+    private AuditableMarkerInterfaceInJdoApplibFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new AuditableMarkerInterfaceFacetFactory();
+        facetFactory = new AuditableMarkerInterfaceInJdoApplibFacetFactory();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/applib/src/main/java/org/apache/isis/applib/annotation/Audited.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Audited.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Audited.java
new file mode 100644
index 0000000..5749314
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Audited.java
@@ -0,0 +1,47 @@
+/*
+ *  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.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.services.audit.AuditingService;
+
+/**
+ * Indicates that the entity should be audited.
+ * 
+ * <p>
+ * Requires that an implementation of the {@link AuditingService} is registered with the framework.
+ * 
+ * <p>
+ * Check that the configured object store supports the annotation.  For example, the
+ * JDO objectstore does support this annotation, but others may not.
+ * 
+ * <p>
+ * Alternatively can use the similarly named {@link org.apache.isis.applib.marker.Auditable marker interface}.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Audited {
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedAction.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedAction.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedAction.java
new file mode 100644
index 0000000..773c251
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedAction.java
@@ -0,0 +1,47 @@
+/*
+ *  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.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.List;
+
+import org.apache.isis.applib.services.publish.CanonicalEvent;
+import org.apache.isis.applib.services.publish.PublishingService;
+
+/**
+ * Indicates that the action should be published.
+ * 
+ * <p>
+ * Requires that an implementation of the {@link PublishingService} is registered with the framework.
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PublishedAction {
+    
+    public interface EventCanonicalizer {
+        public CanonicalEvent canonicalizeAction(Object invoked, String actionMethodName, List<Object> args, Object actionResult);
+    }
+    Class<? extends EventCanonicalizer> canonicalizeWith()  default EventCanonicalizer.class;
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedObject.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedObject.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedObject.java
new file mode 100644
index 0000000..ab5c714
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PublishedObject.java
@@ -0,0 +1,50 @@
+/*
+ *  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.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.services.publish.CanonicalEvent;
+import org.apache.isis.applib.services.publish.PublishingService;
+
+/**
+ * Indicates that changes to the object's (properties) should be published.
+ * 
+ * <p>
+ * Requires that an implementation of the {@link PublishingService} is registered with the framework.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PublishedObject {
+    
+    /**
+     * @see http://en.wikipedia.org/wiki/Canonicalization
+     */
+    public interface EventCanonicalizer {
+        public CanonicalEvent canonicalizeObject(Object changedObject);
+    }
+    
+    Class<? extends EventCanonicalizer> canonicalizeWith() default EventCanonicalizer.class;
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/applib/src/main/java/org/apache/isis/applib/marker/Auditable.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/marker/Auditable.java b/core/applib/src/main/java/org/apache/isis/applib/marker/Auditable.java
new file mode 100644
index 0000000..86cb8b6
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/marker/Auditable.java
@@ -0,0 +1,39 @@
+/*
+ *  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.applib.marker;
+
+import org.apache.isis.applib.services.audit.AuditingService;
+
+/**
+ * Marker interface to indicate that an entity should be audited.
+ * 
+ * <p>
+ * Requires that an implementation of the {@link AuditingService} is registered with the framework.
+ * 
+ * <p>
+ * Check that the configured object store supports the annotation.  For example, the
+ * JDO objectstore does support this annotation, but others may not.
+ * 
+ * <p>
+ * Alternatively can use the similarly named {@link org.apache.isis.applib.annotation.Audited annotation}.
+ * 
+ */
+public interface Auditable {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditingService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditingService.java b/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditingService.java
new file mode 100644
index 0000000..4726fa6
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditingService.java
@@ -0,0 +1,38 @@
+/*
+ *  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.applib.services.audit;
+
+import org.apache.isis.applib.annotation.Hidden;
+
+public interface AuditingService {
+    
+    @Hidden
+    public void audit(String user, long currentTimestampEpoch, String objectType, String identifier, String preValue, String postValue);
+    
+    
+    public static class Stdout implements AuditingService {
+
+        @Hidden
+        public void audit(String user, long currentTimestampEpoch, String objectType, String identifier, String preValue, String postValue) {
+            String auditMessage = objectType + ":" + identifier + " by " + user + ": " + preValue + " -> " + postValue;
+            System.out.println(auditMessage);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/applib/src/main/java/org/apache/isis/applib/services/publish/CanonicalEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/CanonicalEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/CanonicalEvent.java
new file mode 100644
index 0000000..4c742db
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/CanonicalEvent.java
@@ -0,0 +1,29 @@
+package org.apache.isis.applib.services.publish;
+
+/**
+ * An event in canonical form to be published
+ * 
+ */
+public interface CanonicalEvent {
+
+    public final static class Default implements CanonicalEvent {
+
+        private final String str;
+        
+        public Default(String str) {
+            this.str = str;
+        }
+
+        @Override
+        public String asString() {
+            return str;
+        }
+
+        @Override
+        public String toString() {
+            return asString();
+        }
+    }
+
+    public String asString();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishingService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishingService.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishingService.java
new file mode 100644
index 0000000..2d47643
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublishingService.java
@@ -0,0 +1,41 @@
+/*
+ *  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.applib.services.publish;
+
+import java.util.UUID;
+
+import org.apache.isis.applib.annotation.Hidden;
+
+public interface PublishingService {
+    
+    @Hidden
+    public void publish(UUID guid, String currentUser, long currentTimestampEpoch, CanonicalEvent canonicalEvent);
+    
+    public static class Stderr implements PublishingService {
+
+        @Hidden
+        @Override
+        public void publish(UUID guid, String currentUser, long currentTimestampEpoch, CanonicalEvent canonicalEvent) {
+            System.err.println("PUBLISHED OBJECT: " + guid + ":" + currentTimestampEpoch + ":" + currentTimestampEpoch + ":" + canonicalEvent.asString());
+        }
+        
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
index 2ce67d2..c39458f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
@@ -63,6 +63,9 @@ public interface FacetFactory {
             this.methodRemover = methodRemover;
         }
 
+        /**
+         * The class being processed.
+         */
         public Class<?> getCls() {
             return cls;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacet.java
new file mode 100644
index 0000000..07e1a61
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacet.java
@@ -0,0 +1,31 @@
+/*
+ *  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.metamodel.facets.actions.publish;
+
+import org.apache.isis.applib.annotation.PublishedAction;
+import org.apache.isis.core.metamodel.facets.SingleValueFacet;
+
+/**
+ * Indicates that the invocation of action should be published, specifying the means by which a
+ * canonical event representing this invocation should be created.
+ */
+public interface PublishedActionFacet extends SingleValueFacet<PublishedAction.EventCanonicalizer> {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java
new file mode 100644
index 0000000..a82dafa
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/PublishedActionFacetAbstract.java
@@ -0,0 +1,37 @@
+/*
+ *  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.metamodel.facets.actions.publish;
+
+import org.apache.isis.applib.annotation.PublishedAction;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
+
+public abstract class PublishedActionFacetAbstract extends SingleValueFacetAbstract<PublishedAction.EventCanonicalizer> implements PublishedActionFacet {
+
+    public static Class<? extends Facet> type() {
+        return PublishedActionFacet.class;
+    }
+
+    public PublishedActionFacetAbstract(final PublishedAction.EventCanonicalizer eventCanonicalizer, final FacetHolder holder) {
+        super(type(), eventCanonicalizer, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java
new file mode 100644
index 0000000..306bcc7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java
@@ -0,0 +1,31 @@
+/*
+ *  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.metamodel.facets.object.audit;
+
+
+import org.apache.isis.applib.marker.Auditable;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+
+
+/**
+ * Corresponds to annotating the class with the {@link Auditable} annotation.
+ */
+public interface AuditableFacet extends Facet {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetAbstract.java
new file mode 100644
index 0000000..de19e87
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetAbstract.java
@@ -0,0 +1,39 @@
+/*
+ *  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.metamodel.facets.object.audit;
+
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+
+public abstract class AuditableFacetAbstract extends FacetAbstract implements
+        AuditableFacet {
+
+
+    public static Class<? extends Facet> type() {
+        return AuditableFacet.class;
+    }
+
+    public AuditableFacetAbstract(FacetHolder facetHolder) {
+        super(AuditableFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetImpl.java
new file mode 100644
index 0000000..741134f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacetImpl.java
@@ -0,0 +1,30 @@
+/*
+ *  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.metamodel.facets.object.audit;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+
+public class AuditableFacetImpl extends AuditableFacetAbstract {
+
+    public AuditableFacetImpl(FacetHolder facetHolder) {
+        super(facetHolder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableAnnotationFacetFactory.java
new file mode 100644
index 0000000..f711612
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableAnnotationFacetFactory.java
@@ -0,0 +1,48 @@
+/*
+ *  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.metamodel.facets.object.audit.annotation;
+
+
+import org.apache.isis.applib.annotation.Audited;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+
+
+public class AuditableAnnotationFacetFactory extends FacetFactoryAbstract {
+
+    public AuditableAnnotationFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(ProcessClassContext processClassContext) {
+        final Class<?> cls = processClassContext.getCls();
+        final Audited annotation = Annotations.getAnnotation(cls, Audited.class);
+        if (annotation == null) {
+            return;
+        }
+        FacetUtil.addFacet(new AuditableFacetAnnotation(
+                processClassContext.getFacetHolder()));
+        return;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableFacetAnnotation.java
new file mode 100644
index 0000000..dbd5cb9
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/annotation/AuditableFacetAnnotation.java
@@ -0,0 +1,32 @@
+/*
+ *  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.metamodel.facets.object.audit.annotation;
+
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacetImpl;
+
+
+public class AuditableFacetAnnotation extends AuditableFacetImpl {
+
+    public AuditableFacetAnnotation(FacetHolder facetHolder) {
+        super(facetHolder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f558615/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/markerifc/AuditableFacetMarkerInterface.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/markerifc/AuditableFacetMarkerInterface.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/markerifc/AuditableFacetMarkerInterface.java
new file mode 100644
index 0000000..f9a94a0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/markerifc/AuditableFacetMarkerInterface.java
@@ -0,0 +1,33 @@
+/*
+ *  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.metamodel.facets.object.audit.markerifc;
+
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacetImpl;
+
+
+@Deprecated
+public class AuditableFacetMarkerInterface extends AuditableFacetImpl {
+
+    public AuditableFacetMarkerInterface(FacetHolder facetHolder) {
+        super(facetHolder);
+    }
+
+}