You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/06/25 14:41:32 UTC

[1/2] zest-qi4j git commit: Introduced a layered EntityStoreUnitOfWork, just like the ordinary UnitOfWork, that has a wrapper which contains the current Module. To make this work, quite a lot of SPI level interfaces needed to be changed, and SPI compatib

Repository: zest-qi4j
Updated Branches:
  refs/heads/develop 0189ec78f -> c8c3286cb


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/reindexer/src/main/java/org/qi4j/index/reindexer/internal/ReindexerMixin.java
----------------------------------------------------------------------
diff --git a/extensions/reindexer/src/main/java/org/qi4j/index/reindexer/internal/ReindexerMixin.java b/extensions/reindexer/src/main/java/org/qi4j/index/reindexer/internal/ReindexerMixin.java
index 211206b..40f52d9 100644
--- a/extensions/reindexer/src/main/java/org/qi4j/index/reindexer/internal/ReindexerMixin.java
+++ b/extensions/reindexer/src/main/java/org/qi4j/index/reindexer/internal/ReindexerMixin.java
@@ -26,7 +26,6 @@ import org.qi4j.api.injection.scope.Service;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.service.ServiceReference;
-import org.qi4j.api.structure.Module;
 import org.qi4j.index.reindexer.Reindexer;
 import org.qi4j.index.reindexer.ReindexerConfiguration;
 import org.qi4j.io.Output;
@@ -35,99 +34,104 @@ import org.qi4j.io.Sender;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.StateChangeListener;
+import org.qi4j.spi.module.ModuleSpi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ReindexerMixin
-        implements Reindexer
+    implements Reindexer
 {
-   private static QualifiedName identityQN;
-
-   static
-   {
-      try
-      {
-         identityQN = QualifiedName.fromAccessor( Identity.class.getMethod( "identity" ) );
-      } catch (NoSuchMethodException e)
-      {
-         throw new InternalError("Qi4j Core Runtime codebase is corrupted. Contact Qi4j team: ReindexerMixin");
-      }
-   }
-
-   @This
-   private Configuration<ReindexerConfiguration> configuration;
-
-   @Service
-   private EntityStore store;
-   @Service
-   private Iterable<ServiceReference<StateChangeListener>> listeners;
-   @Structure
-   private Module module;
-
-   private Logger logger = LoggerFactory.getLogger(Reindexer.class);
+    private static QualifiedName identityQN;
+
+    static
+    {
+        try
+        {
+            identityQN = QualifiedName.fromAccessor( Identity.class.getMethod( "identity" ) );
+        }
+        catch( NoSuchMethodException e )
+        {
+            throw new InternalError( "Qi4j Core Runtime codebase is corrupted. Contact Qi4j team: ReindexerMixin" );
+        }
+    }
+
+    @This
+    private Configuration<ReindexerConfiguration> configuration;
+
+    @Service
+    private EntityStore store;
+
+    @Service
+    private Iterable<ServiceReference<StateChangeListener>> listeners;
+
+    @Structure
+    private ModuleSpi module;
+
+    private Logger logger = LoggerFactory.getLogger( Reindexer.class );
 
     @Override
-   public void reindex()
-   {
-      configuration.refresh();
-      ReindexerConfiguration conf = configuration.get();
-      Integer loadValue = conf.loadValue().get();
-      if (loadValue == null)
-      {
-         loadValue = 50;
-      }
-      new ReindexerOutput(loadValue).reindex(store);
-   }
-
-   private class ReindexerOutput
-           implements Output<EntityState, RuntimeException>, Receiver<EntityState, RuntimeException>
-   {
-      private int count;
-      private int loadValue;
-      private ArrayList<EntityState> states;
-
-      public ReindexerOutput(Integer loadValue)
-      {
-         this.loadValue = loadValue;
-         states = new ArrayList<EntityState>();
-      }
-
-      public void reindex(EntityStore store)
-      {
-
-         store.entityStates(module).transferTo(this);
-         reindexState();
-      }
-
-      @Override
-      public <SenderThrowableType extends Throwable> void receiveFrom(Sender<? extends EntityState, SenderThrowableType> sender) throws RuntimeException, SenderThrowableType
-      {
-         sender.sendTo(this);
-         reindexState();
-      }
-
-       @Override
-      public void receive(EntityState item)
-              throws RuntimeException
-      {
-         count++;
-         item.setPropertyValue( identityQN, item.identity().identity() );
-         states.add(item);
-
-         if (states.size() >= loadValue)
-         {
+    public void reindex()
+    {
+        configuration.refresh();
+        ReindexerConfiguration conf = configuration.get();
+        Integer loadValue = conf.loadValue().get();
+        if( loadValue == null )
+        {
+            loadValue = 50;
+        }
+        new ReindexerOutput( loadValue ).reindex( store );
+    }
+
+    private class ReindexerOutput
+        implements Output<EntityState, RuntimeException>, Receiver<EntityState, RuntimeException>
+    {
+        private int count;
+        private int loadValue;
+        private ArrayList<EntityState> states;
+
+        public ReindexerOutput( Integer loadValue )
+        {
+            this.loadValue = loadValue;
+            states = new ArrayList<>();
+        }
+
+        public void reindex( EntityStore store )
+        {
+
+            store.entityStates( module ).transferTo( this );
+            reindexState();
+        }
+
+        @Override
+        public <SenderThrowableType extends Throwable> void receiveFrom( Sender<? extends EntityState, SenderThrowableType> sender )
+            throws RuntimeException, SenderThrowableType
+        {
+            sender.sendTo( this );
             reindexState();
-         }
-      }
-
-      public void reindexState()
-      {
-         for (ServiceReference<StateChangeListener> listener : listeners)
-         {
-            listener.get().notifyChanges(states);
-         }
-         states.clear();
-         logger.debug("Reindexed " + count + " entities");
-      }
-   }
+        }
+
+        @Override
+        public void receive( EntityState item )
+            throws RuntimeException
+        {
+            count++;
+            item.setPropertyValue( identityQN, item.identity().identity() );
+            states.add( item );
+
+            if( states.size() >= loadValue )
+            {
+                reindexState();
+            }
+        }
+
+        public void reindexState()
+        {
+            for( ServiceReference<StateChangeListener> listener : listeners )
+            {
+                listener.get().notifyChanges( states );
+            }
+            states.clear();
+            logger.debug( "Reindexed " + count + " entities" );
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/reindexer/src/test/java/org/qi4j/index/reindexer/ReindexerTest.java
----------------------------------------------------------------------
diff --git a/extensions/reindexer/src/test/java/org/qi4j/index/reindexer/ReindexerTest.java b/extensions/reindexer/src/test/java/org/qi4j/index/reindexer/ReindexerTest.java
index d656b6f..923151d 100644
--- a/extensions/reindexer/src/test/java/org/qi4j/index/reindexer/ReindexerTest.java
+++ b/extensions/reindexer/src/test/java/org/qi4j/index/reindexer/ReindexerTest.java
@@ -39,7 +39,9 @@ import org.qi4j.library.rdf.repository.NativeConfiguration;
 import org.qi4j.test.AbstractQi4jTest;
 import org.qi4j.test.EntityTestAssembler;
 
+import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 import static org.qi4j.api.query.QueryExpressions.eq;
 import static org.qi4j.api.query.QueryExpressions.templateFor;
 
@@ -85,6 +87,10 @@ public class ReindexerTest
     public void createDataWipeIndexReindexAndAssertData()
             throws UnitOfWorkCompletionException
     {
+        File rdfDir = new File( System.getProperty( "user.dir" ), "build/testdata/qi4j-index" ).getAbsoluteFile();
+        rdfDir.mkdirs();
+        assertThat( rdfDir.exists(), is(true) );
+
         // ----> Create data and wipe index
 
         UnitOfWork uow = module.newUnitOfWork();
@@ -97,6 +103,7 @@ public class ReindexerTest
         uow.complete();
 
         deleteIndexData(); // Wipe the index data on disk
+        rdfDir.mkdirs();
 
 
         // ----> Reindex and assert data
@@ -132,7 +139,7 @@ public class ReindexerTest
     private static boolean deleteEntitiesData()
     {
         boolean success = true;
-        File esDir = new File( "build/testdata/qi4j-entities" );
+        File esDir = new File( System.getProperty( "user.dir" ), "build/testdata/qi4j-entities" ).getAbsoluteFile();
         if ( esDir.exists() ) {
             success = FileUtil.deltree( esDir );
         }
@@ -142,7 +149,7 @@ public class ReindexerTest
     private static boolean deleteIndexData()
     {
         boolean success = true;
-        File rdfDir = new File( "build/testdata/qi4j-index" );
+        File rdfDir = new File( System.getProperty( "user.dir" ), "build/testdata/qi4j-index" ).getAbsoluteFile();
         if ( rdfDir.exists() ) {
             FileUtils.delete( rdfDir );
             success = FileUtil.deltree( rdfDir );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/libraries/rdf/src/main/java/org/qi4j/library/rdf/repository/NativeRepositoryService.java
----------------------------------------------------------------------
diff --git a/libraries/rdf/src/main/java/org/qi4j/library/rdf/repository/NativeRepositoryService.java b/libraries/rdf/src/main/java/org/qi4j/library/rdf/repository/NativeRepositoryService.java
index c098fb8..94e6486 100644
--- a/libraries/rdf/src/main/java/org/qi4j/library/rdf/repository/NativeRepositoryService.java
+++ b/libraries/rdf/src/main/java/org/qi4j/library/rdf/repository/NativeRepositoryService.java
@@ -32,183 +32,190 @@ import org.qi4j.api.service.ServiceComposite;
 import org.qi4j.api.service.ServiceReference;
 import org.qi4j.library.fileconfig.FileConfiguration;
 
-@Mixins({NativeRepositoryService.NativeRepositoryMixin.class})
+@Mixins( { NativeRepositoryService.NativeRepositoryMixin.class } )
 @Activators( NativeRepositoryService.Activator.class )
 public interface NativeRepositoryService extends Repository, ServiceComposite, Availability
 {
     @Override
     void initialize()
-            throws RepositoryException;
+        throws RepositoryException;
 
     @Override
     void shutDown()
-            throws RepositoryException;
+        throws RepositoryException;
 
     public static class Activator
-            extends ActivatorAdapter<ServiceReference<NativeRepositoryService>>
+        extends ActivatorAdapter<ServiceReference<NativeRepositoryService>>
     {
 
         @Override
         public void afterActivation( ServiceReference<NativeRepositoryService> activated )
-                throws Exception
+            throws Exception
         {
             activated.get().initialize();
         }
 
         @Override
         public void beforePassivation( ServiceReference<NativeRepositoryService> passivating )
-                throws Exception
+            throws Exception
         {
             passivating.get().shutDown();
         }
-
     }
 
-
     public static abstract class NativeRepositoryMixin
-           implements NativeRepositoryService, ResetableRepository
-   {
-      @Optional
-      @Service
-      FileConfiguration fileConfiguration;
-
-      @This
-      private Configuration<NativeConfiguration> configuration;
-
-      private SailRepository repo;
-      private boolean isNotInitialized;
-
-      public NativeRepositoryMixin()
-      {
-         isNotInitialized = true;
-         repo = new SailRepository(new NativeStore());
-      }
-
-      @Override
-      public void setDataDir(File dataDir)
-      {
-         repo.setDataDir(dataDir);
-      }
-
-      @Override
-      public File getDataDir()
-      {
-         return repo.getDataDir();
-      }
-
-      @Override
-      public void initialize()
-              throws RepositoryException
-      {
-         String dataDir = configuration.get().dataDirectory().get();
-         if (dataDir == null || "".equals(dataDir))
-         {
-            if (fileConfiguration != null)
+        implements NativeRepositoryService, ResetableRepository
+    {
+        @Optional
+        @Service
+        FileConfiguration fileConfiguration;
+
+        @This
+        private Configuration<NativeConfiguration> configuration;
+
+        private SailRepository repo;
+        private boolean isNotInitialized;
+
+        public NativeRepositoryMixin()
+        {
+            isNotInitialized = true;
+            repo = new SailRepository( new NativeStore() );
+        }
+
+        @Override
+        public void setDataDir( File dataDir )
+        {
+            repo.setDataDir( dataDir );
+        }
+
+        @Override
+        public File getDataDir()
+        {
+            return repo.getDataDir();
+        }
+
+        @Override
+        public void initialize()
+            throws RepositoryException
+        {
+            String dataDir = configuration.get().dataDirectory().get();
+            File dataDirectory;
+            if( dataDir == null || "".equals( dataDir ) )
             {
-               dataDir = new File(fileConfiguration.dataDirectory(), configuration.get().identity().get()).getAbsolutePath();
-            } else
+                String serviceIdentity = configuration.get().identity().get();
+                if( fileConfiguration != null )
+                {
+                    dataDir = new File( fileConfiguration.dataDirectory(), serviceIdentity ).getAbsolutePath();
+                }
+                else
+                {
+                    if( serviceIdentity == null || "".equals( serviceIdentity ) )
+                    {
+                        dataDir = "./rdf/repositories/qi4j";
+                    }
+                    else
+                    {
+                        dataDir = "./rdf/repositories/" + serviceIdentity;
+                    }
+                }
+                configuration.get().dataDirectory().set( dataDir );
+                configuration.save();
+                dataDirectory = new File( dataDir );
+            }
+            else
             {
-               String id = configuration.get().identity().get();
-               if (id == null || "".equals(id))
-               {
-                  dataDir = "./rdf/repositories/qi4j";
-               } else
-               {
-                  dataDir = "./rdf/repositories/" + id;
-               }
+                dataDirectory = new File( dataDir ).getAbsoluteFile();
             }
-            configuration.get().dataDirectory().set(dataDir);
-            configuration.save();
-         }
-         initializeRepository(new File(dataDir));
-      }
-
-      @Override
-      public boolean isInitialized()
-      {
-         return !isNotInitialized;
-      }
-
-      @Override
-      public void shutDown()
-              throws RepositoryException
-      {
-          repo.shutDown();
-      }
-
-      @Override
-      public boolean isWritable()
-              throws RepositoryException
-      {
-         return repo.isWritable();
-      }
-
-      @Override
-      public RepositoryConnection getConnection()
-              throws RepositoryException
-      {
-         if (isNotInitialized)
-         {
-            return null;
-         }
-         return repo.getConnection();
-      }
-
-      @Override
-      public ValueFactory getValueFactory()
-      {
-         return repo.getValueFactory();
-      }
-
-      @Override
-      public void discardEntireRepository()
-              throws RepositoryException
-      {
-         File dataDir = repo.getDataDir();
-         repo.shutDown();
-         delete(dataDir);
-         initializeRepository(dataDir);
-      }
-
-      private void delete(File dataDir)
-      {
-         File[] children = dataDir.listFiles();
-         for (File child : children)
-         {
-            if (child.isDirectory())
+            initializeRepository( dataDirectory );
+        }
+
+        @Override
+        public boolean isInitialized()
+        {
+            return !isNotInitialized;
+        }
+
+        @Override
+        public void shutDown()
+            throws RepositoryException
+        {
+            repo.shutDown();
+        }
+
+        @Override
+        public boolean isWritable()
+            throws RepositoryException
+        {
+            return repo.isWritable();
+        }
+
+        @Override
+        public RepositoryConnection getConnection()
+            throws RepositoryException
+        {
+            if( isNotInitialized )
             {
-               delete(child);
-            } else
+                return null;
+            }
+            return repo.getConnection();
+        }
+
+        @Override
+        public ValueFactory getValueFactory()
+        {
+            return repo.getValueFactory();
+        }
+
+        @Override
+        public void discardEntireRepository()
+            throws RepositoryException
+        {
+            File dataDir = repo.getDataDir();
+            repo.shutDown();
+            delete( dataDir );
+            initializeRepository( dataDir );
+        }
+
+        private void delete( File dataDir )
+        {
+            File[] children = dataDir.listFiles();
+            for( File child : children )
+            {
+                if( child.isDirectory() )
+                {
+                    delete( child );
+                }
+                else
+                {
+                    //noinspection ResultOfMethodCallIgnored
+                    child.delete();
+                }
+            }
+        }
+
+        private void initializeRepository( File dataDir )
+            throws RepositoryException
+        {
+            String tripleIndexes = configuration.get().tripleIndexes().get();
+            if( tripleIndexes == null )
             {
-               //noinspection ResultOfMethodCallIgnored
-               child.delete();
+                tripleIndexes = "";
+                configuration.get().tripleIndexes().set( tripleIndexes );
             }
-         }
-      }
-
-      private void initializeRepository(File dataDir)
-              throws RepositoryException
-      {
-         String tripleIndexes = configuration.get().tripleIndexes().get();
-         if (tripleIndexes == null)
-         {
-            tripleIndexes = "";
-            configuration.get().tripleIndexes().set(tripleIndexes);
-         }
-         boolean forceSync = configuration.get().forceSync().get();
-
-         NativeStore store = (NativeStore) repo.getSail();
-         store.setDataDir(dataDir);
-         store.setTripleIndexes(tripleIndexes);
-         store.setForceSync(forceSync);
-         repo.initialize();
-         isNotInitialized = false;
-      }
-
-       @Override
-       public boolean isAvailable()
-       {
-           return !isNotInitialized;
-       }
-   }
+            boolean forceSync = configuration.get().forceSync().get();
+
+            NativeStore store = (NativeStore) repo.getSail();
+            store.setDataDir( dataDir );
+            store.setTripleIndexes( tripleIndexes );
+            store.setForceSync( forceSync );
+            repo.initialize();
+            isNotInitialized = false;
+        }
+
+        @Override
+        public boolean isAvailable()
+        {
+            return !isNotInitialized;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/libraries/rdf/src/test/java/org/qi4j/library/rdf/entity/EntitySerializerTest.java
----------------------------------------------------------------------
diff --git a/libraries/rdf/src/test/java/org/qi4j/library/rdf/entity/EntitySerializerTest.java b/libraries/rdf/src/test/java/org/qi4j/library/rdf/entity/EntitySerializerTest.java
index d41466d..a89f518 100644
--- a/libraries/rdf/src/test/java/org/qi4j/library/rdf/entity/EntitySerializerTest.java
+++ b/libraries/rdf/src/test/java/org/qi4j/library/rdf/entity/EntitySerializerTest.java
@@ -25,16 +25,17 @@ import org.qi4j.api.injection.scope.Service;
 import org.qi4j.api.injection.scope.Uses;
 import org.qi4j.api.unitofwork.UnitOfWork;
 import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
+import org.qi4j.api.usecase.Usecase;
 import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
-import org.qi4j.entitystore.memory.MemoryEntityStoreService;
 import org.qi4j.library.rdf.DcRdf;
 import org.qi4j.library.rdf.Rdfs;
 import org.qi4j.library.rdf.serializer.RdfXmlSerializer;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entitystore.EntityStore;
+import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.test.AbstractQi4jTest;
 import org.qi4j.test.EntityTestAssembler;
 import org.qi4j.valueserialization.orgjson.OrgJsonValueSerializationAssembler;
@@ -45,10 +46,13 @@ import org.qi4j.valueserialization.orgjson.OrgJsonValueSerializationAssembler;
 public class EntitySerializerTest
     extends AbstractQi4jTest
 {
-    @Service EntityStore entityStore;
-    @Uses EntityStateSerializer serializer;
+    @Service
+    EntityStore entityStore;
+    @Uses
+    EntityStateSerializer serializer;
 
-    public void assemble( ModuleAssembly module ) throws AssemblyException
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
     {
         new EntityTestAssembler().assemble( module );
         new OrgJsonValueSerializationAssembler().assemble( module );
@@ -58,8 +62,10 @@ public class EntitySerializerTest
         module.objects( EntityStateSerializer.class, EntitySerializerTest.class );
     }
 
-    @Override @Before
-    public void setUp() throws Exception
+    @Override
+    @Before
+    public void setUp()
+        throws Exception
     {
         super.setUp();
 
@@ -69,21 +75,25 @@ public class EntitySerializerTest
     }
 
     @Test
-    public void testEntitySerializer() throws RDFHandlerException
+    public void testEntitySerializer()
+        throws RDFHandlerException
     {
         EntityReference entityReference = new EntityReference( "test2" );
-        EntityState entityState = entityStore.newUnitOfWork( UsecaseBuilder.newUsecase( "Test" ), module, System.currentTimeMillis() ).entityStateOf( entityReference );
+        Usecase usecase = UsecaseBuilder.newUsecase( "Test" );
+        long currentTime = System.currentTimeMillis();
+        EntityStoreUnitOfWork unitOfWork = entityStore.newUnitOfWork( usecase, module, currentTime );
+        EntityState entityState = unitOfWork.entityStateOf( module, entityReference );
 
         Iterable<Statement> graph = serializer.serialize( entityState );
 
         String[] prefixes = new String[]{ "rdf", "dc", " vc" };
         String[] namespaces = new String[]{ Rdfs.RDF, DcRdf.NAMESPACE, "http://www.w3.org/2001/vcard-rdf/3.0#" };
 
-
         new RdfXmlSerializer().serialize( graph, new PrintWriter( System.out ), prefixes, namespaces );
     }
 
-    void createDummyData() throws UnitOfWorkCompletionException
+    void createDummyData()
+        throws UnitOfWorkCompletionException
     {
         UnitOfWork unitOfWork = module.newUnitOfWork();
         try

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/libraries/rest/src/main/java/org/qi4j/library/rest/admin/EntityResource.java
----------------------------------------------------------------------
diff --git a/libraries/rest/src/main/java/org/qi4j/library/rest/admin/EntityResource.java b/libraries/rest/src/main/java/org/qi4j/library/rest/admin/EntityResource.java
index 3474970..328d2c0 100644
--- a/libraries/rest/src/main/java/org/qi4j/library/rest/admin/EntityResource.java
+++ b/libraries/rest/src/main/java/org/qi4j/library/rest/admin/EntityResource.java
@@ -37,7 +37,6 @@ import org.qi4j.api.injection.scope.Service;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.injection.scope.Uses;
 import org.qi4j.api.property.PropertyDescriptor;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.value.ValueSerialization;
@@ -53,6 +52,7 @@ import org.qi4j.spi.entitystore.EntityNotFoundException;
 import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.helpers.JSONEntityState;
+import org.qi4j.spi.module.ModuleSpi;
 import org.restlet.data.CharacterSet;
 import org.restlet.data.Form;
 import org.restlet.data.Language;
@@ -74,10 +74,13 @@ public class EntityResource
 
     @Service
     private EntityStore entityStore;
+
     @Service
     private ValueSerialization valueSerialization;
+
     @Structure
-    private Module module;
+    private ModuleSpi module;
+
     @Uses
     private EntityStateSerializer entitySerializer;
     private String identity;
@@ -111,7 +114,7 @@ public class EntityResource
         try
         {
             EntityReference identityRef = EntityReference.parseEntityReference( identity );
-            uow.entityStateOf( identityRef ).remove();
+            uow.entityStateOf( module, identityRef ).remove();
             uow.applyChanges().commit();
             getResponse().setStatus( Status.SUCCESS_NO_CONTENT );
         }
@@ -176,7 +179,7 @@ public class EntityResource
         try
         {
             EntityReference entityReference = EntityReference.parseEntityReference( identity );
-            entityState = unitOfWork.entityStateOf( entityReference );
+            entityState = unitOfWork.entityStateOf( module, entityReference );
         }
         catch( EntityNotFoundException e )
         {
@@ -339,7 +342,6 @@ public class EntityResource
         };
         representation.setCharacterSet( CharacterSet.UTF_8 );
         return representation;
-
     }
 
     @Override
@@ -427,7 +429,7 @@ public class EntityResource
 
                         try
                         {
-                            unitOfWork.entityStateOf( reference );
+                            unitOfWork.entityStateOf( module, reference );
 
                             manyAssociation.remove( reference );
                             manyAssociation.add( index++, reference );
@@ -479,7 +481,7 @@ public class EntityResource
                         EntityReference reference = new EntityReference( identity );
                         try
                         {
-                            unitOfWork.entityStateOf( reference );
+                            unitOfWork.entityStateOf( module, reference );
 
                             namedAssociation.remove( name );
                             namedAssociation.put( name, reference );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/libraries/scheduler/src/docs/scheduler.txt
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/docs/scheduler.txt b/libraries/scheduler/src/docs/scheduler.txt
index f45d07f..8b4b5ac 100644
--- a/libraries/scheduler/src/docs/scheduler.txt
+++ b/libraries/scheduler/src/docs/scheduler.txt
@@ -137,6 +137,11 @@ To sum up, cron expressions used here have a precision of one second. The follow
 - @annualy or @yearly
 
 
+== Durability ==
+Schedules can either be ethereal or durable, passed as an argument to the +Scheduler+. If it is a durable
+schedule, then the Task must be an Entity Composite.
+
+When the
 == Observing the Timeline ==
 
 Timeline allow to browse in past and future Task runs. This feature is available only if you activate


[2/2] zest-qi4j git commit: Introduced a layered EntityStoreUnitOfWork, just like the ordinary UnitOfWork, that has a wrapper which contains the current Module. To make this work, quite a lot of SPI level interfaces needed to be changed, and SPI compatib

Posted by ni...@apache.org.
Introduced a layered EntityStoreUnitOfWork, just like the ordinary UnitOfWork, that has a wrapper which contains the current Module. To make this work, quite a lot of SPI level interfaces needed to be changed, and SPI compatibiilty breaks.


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

Branch: refs/heads/develop
Commit: c8c3286cb7d27f3c9e1a8764a05da95e06c55808
Parents: 0189ec7
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu Jun 25 14:41:23 2015 +0200
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu Jun 25 14:41:23 2015 +0200

----------------------------------------------------------------------
 .../org/qi4j/runtime/entity/EntityModel.java    |   4 +-
 .../unitofwork/EntityBuilderInstance.java       |   2 +-
 .../runtime/unitofwork/UnitOfWorkInstance.java  |   6 +-
 .../ConcurrentModificationCheckConcern.java     | 111 ++++---
 .../DefaultEntityStoreUnitOfWork.java           |  18 +-
 .../EntityAlreadyExistsException.java           |   2 +-
 .../spi/entitystore/EntityStateVersions.java    |  12 +-
 .../org/qi4j/spi/entitystore/EntityStore.java   |   5 +-
 .../qi4j/spi/entitystore/EntityStoreSPI.java    |   4 +-
 .../spi/entitystore/EntityStoreUnitOfWork.java  |   9 +-
 .../ModuleEntityStoreUnitOfWork.java            |  69 +++++
 .../StateChangeNotificationConcern.java         |   1 +
 .../entitystore/helpers/DefaultEntityState.java |  13 +-
 .../entitystore/helpers/JSONEntityState.java    |  30 +-
 .../helpers/JSONMapEntityStoreMixin.java        |  73 ++---
 .../helpers/MapEntityStoreMixin.java            |  45 ++-
 .../helpers/JSONManyAssociationStateTest.java   |   2 -
 .../java/org/qi4j/test/AbstractQi4jTest.java    |   6 +-
 .../hazelcast/HazelcastEntityStoreMixin.java    |   4 +-
 .../prefs/PreferencesEntityStoreMixin.java      |  35 +--
 .../entitystore/sql/SQLEntityStoreMixin.java    |  60 ++--
 .../elasticsearch/ElasticSearchIndexer.java     |  64 ++--
 .../index/rdf/indexing/RdfIndexingService.java  |   2 +-
 .../reindexer/internal/ReindexerMixin.java      | 180 +++++------
 .../org/qi4j/index/reindexer/ReindexerTest.java |  11 +-
 .../rdf/repository/NativeRepositoryService.java | 301 ++++++++++---------
 .../rdf/entity/EntitySerializerTest.java        |  30 +-
 .../qi4j/library/rest/admin/EntityResource.java |  16 +-
 libraries/scheduler/src/docs/scheduler.txt      |   5 +
 29 files changed, 603 insertions(+), 517 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
index 3563115..ff0b633 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
@@ -116,13 +116,13 @@ public final class EntityModel
         return ( (EntityMixinsModel) mixinsModel ).newMixin( entityInstance, entityState, mixins, method );
     }
 
-    public EntityState newEntityState( EntityStoreUnitOfWork store, EntityReference identity )
+    public EntityState newEntityState( EntityStoreUnitOfWork store, ModuleSpi module, EntityReference identity )
         throws ConstraintViolationException, EntityStoreException
     {
         try
         {
             // New EntityState
-            EntityState entityState = store.newEntityState( identity, this );
+            EntityState entityState = store.newEntityState( module, identity, this );
 
             // Set identity property
             PropertyDescriptor persistentPropertyDescriptor = state().propertyModelFor( IDENTITY_METHOD );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
index ff17a07..4ca81d9 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
@@ -117,7 +117,7 @@ public final class EntityBuilderInstance<T>
 
         // Figure out whether to use given or generated identity
         identity = (String) entityState.propertyValueOf( IDENTITY_STATE_NAME );
-        EntityState newEntityState = model.model().newEntityState( store,
+        EntityState newEntityState = model.model().newEntityState( store, uow.module(),
                                                                    EntityReference.parseEntityReference( identity ) );
 
         prototypeInstance.invokeCreate();

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
index 886fb97..ec33e08 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
@@ -31,7 +31,6 @@ import org.qi4j.api.metrics.MetricsCounterFactory;
 import org.qi4j.api.metrics.MetricsProvider;
 import org.qi4j.api.metrics.MetricsTimer;
 import org.qi4j.api.metrics.MetricsTimerFactory;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.ConcurrentEntityModificationException;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.unitofwork.NoSuchEntityException;
@@ -42,7 +41,6 @@ import org.qi4j.api.unitofwork.UnitOfWorkOptions;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.runtime.entity.EntityInstance;
 import org.qi4j.runtime.entity.EntityModel;
-import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
@@ -111,7 +109,7 @@ public final class UnitOfWorkInstance
         return currentTime;
     }
 
-    public EntityStoreUnitOfWork getEntityStoreUnitOfWork( EntityStore store, Module module )
+    public EntityStoreUnitOfWork getEntityStoreUnitOfWork( EntityStore store, ModuleSpi module )
     {
         EntityStoreUnitOfWork uow = storeUnitOfWork.get( store );
         if( uow == null )
@@ -146,7 +144,7 @@ public final class UnitOfWorkInstance
                 EntityStoreUnitOfWork storeUow = getEntityStoreUnitOfWork( store, potentialModel.module() );
                 try
                 {
-                    entityState = storeUow.entityStateOf( identity );
+                    entityState = storeUow.entityStateOf( potentialModel.module(), identity );
                 }
                 catch( EntityNotFoundException e )
                 {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
index cfeead6..118389c 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
@@ -14,19 +14,18 @@
 
 package org.qi4j.spi.entitystore;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.qi4j.api.Qi4j;
 import org.qi4j.api.concern.ConcernOf;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.injection.scope.This;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Concern that helps EntityStores do concurrent modification checks.
@@ -44,11 +43,12 @@ public abstract class ConcurrentModificationCheckConcern
 {
     @This
     private EntityStateVersions versions;
+
     @Structure
     private Qi4j api;
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime )
     {
         final EntityStoreUnitOfWork uow = next.newUnitOfWork( usecase, module, currentTime );
         return new ConcurrentCheckingEntityStoreUnitOfWork( uow, api.dereference( versions ), module, currentTime );
@@ -59,16 +59,16 @@ public abstract class ConcurrentModificationCheckConcern
     {
         private final EntityStoreUnitOfWork uow;
         private EntityStateVersions versions;
-        private Module module;
+        private ModuleSpi module;
         private long currentTime;
 
-        private List<EntityState> loaded = new ArrayList<EntityState>();
+        private List<EntityState> loaded = new ArrayList<>();
 
-        private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(  );
+        private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 
         public ConcurrentCheckingEntityStoreUnitOfWork( EntityStoreUnitOfWork uow,
                                                         EntityStateVersions versions,
-                                                        Module module,
+                                                        ModuleSpi module,
                                                         long currentTime
         )
         {
@@ -91,10 +91,13 @@ public abstract class ConcurrentModificationCheckConcern
         }
 
         @Override
-        public EntityState newEntityState( EntityReference anIdentity, EntityDescriptor entityDescriptor )
+        public EntityState newEntityState( ModuleSpi module,
+                                           EntityReference anIdentity,
+                                           EntityDescriptor entityDescriptor
+        )
             throws EntityStoreException
         {
-            return uow.newEntityState( anIdentity, entityDescriptor );
+            return uow.newEntityState( module, anIdentity, entityDescriptor );
         }
 
         @Override
@@ -105,34 +108,35 @@ public abstract class ConcurrentModificationCheckConcern
 
             try
             {
-               versions.checkForConcurrentModification( loaded, module, currentTime );
-
-               final StateCommitter committer = uow.applyChanges();
-
-               return new StateCommitter()
-               {
-                   @Override
-                   public void commit()
-                   {
-                       committer.commit();
-                       versions.forgetVersions( loaded );
-
-                       lock.writeLock().unlock();
-                   }
-
-                   @Override
-                   public void cancel()
-                   {
-                       committer.cancel();
-                       versions.forgetVersions( loaded );
-
-                       lock.writeLock().unlock();
-                   }
-               };
-            } catch( EntityStoreException e )
+                versions.checkForConcurrentModification( loaded, module, currentTime );
+
+                final StateCommitter committer = uow.applyChanges();
+
+                return new StateCommitter()
+                {
+                    @Override
+                    public void commit()
+                    {
+                        committer.commit();
+                        versions.forgetVersions( loaded );
+
+                        lock.writeLock().unlock();
+                    }
+
+                    @Override
+                    public void cancel()
+                    {
+                        committer.cancel();
+                        versions.forgetVersions( loaded );
+
+                        lock.writeLock().unlock();
+                    }
+                };
+            }
+            catch( EntityStoreException e )
             {
-               lock.writeLock().unlock();
-               throw e;
+                lock.writeLock().unlock();
+                throw e;
             }
         }
 
@@ -149,29 +153,38 @@ public abstract class ConcurrentModificationCheckConcern
 
                 try
                 {
-                   versions.forgetVersions( loaded );
-                } finally
+                    versions.forgetVersions( loaded );
+                }
+                finally
                 {
-                   lock.writeLock().unlock();
+                    lock.writeLock().unlock();
                 }
             }
         }
 
         @Override
-        public EntityState entityStateOf( EntityReference anIdentity )
+        public Usecase usecase()
+        {
+            return uow.usecase();
+        }
+
+        @SuppressWarnings( "DuplicateThrows" )
+        @Override
+        public EntityState entityStateOf( ModuleSpi module, EntityReference anIdentity )
             throws EntityStoreException, EntityNotFoundException
         {
             lock.readLock().lock();
 
             try
             {
-               EntityState entityState = uow.entityStateOf( anIdentity );
-               versions.rememberVersion( entityState.identity(), entityState.version() );
-               loaded.add( entityState );
-               return entityState;
-            } finally
+                EntityState entityState = uow.entityStateOf( module, anIdentity );
+                versions.rememberVersion( entityState.identity(), entityState.version() );
+                loaded.add( entityState );
+                return entityState;
+            }
+            finally
             {
-               lock.readLock().unlock();
+                lock.readLock().unlock();
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
index cc93430..1c1d794 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
@@ -17,9 +17,9 @@ package org.qi4j.spi.entitystore;
 import java.util.HashMap;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Default EntityStore UnitOfWork.
@@ -29,21 +29,18 @@ public final class DefaultEntityStoreUnitOfWork
 {
     private EntityStoreSPI entityStoreSPI;
     private String identity;
-    private Module module;
     private HashMap<EntityReference, EntityState> states = new HashMap<>();
     private Usecase usecase;
     private long currentTime;
 
     public DefaultEntityStoreUnitOfWork( EntityStoreSPI entityStoreSPI,
                                          String identity,
-                                         Module module,
                                          Usecase usecase,
                                          long currentTime
     )
     {
         this.entityStoreSPI = entityStoreSPI;
         this.identity = identity;
-        this.module = module;
         this.usecase = usecase;
         this.currentTime = currentTime;
     }
@@ -54,11 +51,6 @@ public final class DefaultEntityStoreUnitOfWork
         return identity;
     }
 
-    public Module module()
-    {
-        return module;
-    }
-
     @Override
     public long currentTime()
     {
@@ -73,7 +65,7 @@ public final class DefaultEntityStoreUnitOfWork
     // EntityStore
 
     @Override
-    public EntityState newEntityState( EntityReference anIdentity, EntityDescriptor descriptor )
+    public EntityState newEntityState( ModuleSpi module, EntityReference anIdentity, EntityDescriptor descriptor )
         throws EntityStoreException
     {
         EntityState entityState = states.get( anIdentity );
@@ -81,13 +73,13 @@ public final class DefaultEntityStoreUnitOfWork
         {
             throw new EntityAlreadyExistsException( anIdentity );
         }
-        EntityState state = entityStoreSPI.newEntityState( this, anIdentity, descriptor );
+        EntityState state = entityStoreSPI.newEntityState( this, module, anIdentity, descriptor );
         states.put( anIdentity, state );
         return state;
     }
 
     @Override
-    public EntityState entityStateOf( EntityReference anIdentity )
+    public EntityState entityStateOf( ModuleSpi module, EntityReference anIdentity )
         throws EntityNotFoundException
     {
 
@@ -96,7 +88,7 @@ public final class DefaultEntityStoreUnitOfWork
         {
             return entityState;
         }
-        entityState = entityStoreSPI.entityStateOf( this, anIdentity );
+        entityState = entityStoreSPI.entityStateOf( this, module, anIdentity );
         states.put( anIdentity, entityState );
         return entityState;
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
index 116e9bf..6054dcd 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
@@ -28,7 +28,7 @@ public class EntityAlreadyExistsException
 
     public EntityAlreadyExistsException( EntityReference identity )
     {
-        super("Entity " + identity + " already existed");
+        super("Entity " + identity + " already exists.");
         this.identity = identity;
     }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
index ddf1758..08e268d 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
@@ -21,10 +21,10 @@ import java.util.WeakHashMap;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.mixin.Mixins;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Entity versions state.
@@ -36,7 +36,7 @@ public interface EntityStateVersions
 
     void rememberVersion( EntityReference identity, String version );
 
-    void checkForConcurrentModification( Iterable<EntityState> loaded, Module module, long currentTime )
+    void checkForConcurrentModification( Iterable<EntityState> loaded, ModuleSpi module, long currentTime )
         throws ConcurrentEntityStateModificationException;
 
     /**
@@ -48,7 +48,7 @@ public interface EntityStateVersions
         @This
         private EntityStore store;
 
-        private final Map<EntityReference, String> versions = new WeakHashMap<EntityReference, String>();
+        private final Map<EntityReference, String> versions = new WeakHashMap<>();
 
         @Override
         public synchronized void forgetVersions( Iterable<EntityState> states )
@@ -67,7 +67,7 @@ public interface EntityStateVersions
 
         @Override
         public synchronized void checkForConcurrentModification( Iterable<EntityState> loaded,
-                                                                 Module module,
+                                                                 ModuleSpi module,
                                                                  long currentTime
         )
             throws ConcurrentEntityStateModificationException
@@ -84,7 +84,7 @@ public interface EntityStateVersions
                 if( storeVersion == null )
                 {
                     EntityStoreUnitOfWork unitOfWork = store.newUnitOfWork( Usecase.DEFAULT, module, currentTime );
-                    EntityState state = unitOfWork.entityStateOf( entityState.identity() );
+                    EntityState state = unitOfWork.entityStateOf( module, entityState.identity() );
                     storeVersion = state.version();
                     unitOfWork.discard();
                 }
@@ -93,7 +93,7 @@ public interface EntityStateVersions
                 {
                     if( changed == null )
                     {
-                        changed = new ArrayList<EntityReference>();
+                        changed = new ArrayList<>();
                     }
                     changed.add( entityState.identity() );
                 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
index fa5ac1b..b8de305 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
@@ -20,13 +20,14 @@ import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.io.Input;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Interface that must be implemented by store for persistent state of EntityComposites.
  */
 public interface EntityStore
 {
-    EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime );
+    EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime );
 
-    Input<EntityState, EntityStoreException> entityStates( Module module );
+    Input<EntityState, EntityStoreException> entityStates( ModuleSpi module );
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
index 536ceb9..521d2ce 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
@@ -17,6 +17,7 @@ package org.qi4j.spi.entitystore;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * EntityStore SPI.
@@ -24,10 +25,11 @@ import org.qi4j.spi.entity.EntityState;
 public interface EntityStoreSPI
 {
     EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                ModuleSpi module,
                                 EntityReference identity, EntityDescriptor entityDescriptor
     );
 
-    EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference identity );
+    EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, ModuleSpi module, EntityReference identity );
 
     StateCommitter applyChanges( EntityStoreUnitOfWork unitOfWork, Iterable<EntityState> state
     );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
index 21655cd..0b055bf 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
@@ -14,9 +14,12 @@
 
 package org.qi4j.spi.entitystore;
 
+import org.qi4j.api.common.MetaInfo;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * EntityStore UnitOfWork.
@@ -40,7 +43,7 @@ public interface EntityStoreUnitOfWork
      *
      * @throws EntityStoreException Thrown if creational fails.
      */
-    EntityState newEntityState( EntityReference anIdentity, EntityDescriptor entityDescriptor )
+    EntityState newEntityState( ModuleSpi module, EntityReference anIdentity, EntityDescriptor entityDescriptor )
         throws EntityStoreException;
 
     /**
@@ -54,11 +57,13 @@ public interface EntityStoreUnitOfWork
      * @throws EntityStoreException    thrown if retrieval failed.
      * @throws EntityNotFoundException if requested entity does not exist
      */
-    EntityState entityStateOf( EntityReference anIdentity )
+    EntityState entityStateOf( ModuleSpi module, EntityReference anIdentity )
         throws EntityStoreException, EntityNotFoundException;
 
     StateCommitter applyChanges()
         throws EntityStoreException;
 
     void discard();
+
+    Usecase usecase();
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java
new file mode 100644
index 0000000..8e43144
--- /dev/null
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java
@@ -0,0 +1,69 @@
+package org.qi4j.spi.entitystore;
+
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.usecase.Usecase;
+import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
+
+public class ModuleEntityStoreUnitOfWork
+    implements EntityStoreUnitOfWork
+{
+    private final ModuleSpi module;
+    private final EntityStoreUnitOfWork underlying;
+
+    public ModuleEntityStoreUnitOfWork( ModuleSpi module, EntityStoreUnitOfWork underlying )
+    {
+        this.module = module;
+        this.underlying = underlying;
+    }
+
+    public ModuleSpi module()
+    {
+        return module;
+    }
+
+    @Override
+    public String identity()
+    {
+        return underlying.identity();
+    }
+
+    @Override
+    public long currentTime()
+    {
+        return underlying.currentTime();
+    }
+
+    @Override
+    public EntityState newEntityState( ModuleSpi module, EntityReference reference, EntityDescriptor descriptor )
+        throws EntityStoreException
+    {
+        return underlying.newEntityState( module, reference, descriptor );
+    }
+
+    @Override
+    public EntityState entityStateOf( ModuleSpi module, EntityReference reference )
+        throws EntityStoreException, EntityNotFoundException
+    {
+        return underlying.entityStateOf( module, reference );
+    }
+
+    @Override
+    public StateCommitter applyChanges()
+        throws EntityStoreException
+    {
+        return underlying.applyChanges();
+    }
+
+    @Override
+    public void discard()
+    {
+        underlying.discard();
+    }
+
+    public Usecase usecase()
+    {
+        return underlying.usecase();
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
index d49e5eb..1365881 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
@@ -17,6 +17,7 @@ package org.qi4j.spi.entitystore;
 import org.qi4j.api.concern.ConcernOf;
 import org.qi4j.api.injection.scope.Service;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * State change notification Concern.

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
index e7938c3..4d66073 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
@@ -32,7 +32,6 @@ import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entity.ManyAssociationState;
 import org.qi4j.spi.entity.NamedAssociationState;
-import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
 
 /**
  * Standard implementation of EntityState.
@@ -40,8 +39,6 @@ import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
 public final class DefaultEntityState
     implements EntityState
 {
-    private DefaultEntityStoreUnitOfWork unitOfWork;
-
     private EntityStatus status;
 
     private String version;
@@ -54,13 +51,13 @@ public final class DefaultEntityState
     private final Map<QualifiedName, List<EntityReference>> manyAssociations;
     private final Map<QualifiedName, Map<String, EntityReference>> namedAssociations;
 
-    public DefaultEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
+    public DefaultEntityState( long currentTime,
                                EntityReference identity,
                                EntityDescriptor entityDescriptor
     )
     {
-        this( unitOfWork, "",
-              unitOfWork.currentTime(),
+        this( "",
+              currentTime,
               identity,
               EntityStatus.NEW,
               entityDescriptor,
@@ -70,8 +67,7 @@ public final class DefaultEntityState
               new HashMap<QualifiedName, Map<String, EntityReference>>() );
     }
 
-    public DefaultEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
-                               String version,
+    public DefaultEntityState( String version,
                                long lastModified,
                                EntityReference identity,
                                EntityStatus status,
@@ -82,7 +78,6 @@ public final class DefaultEntityState
                                Map<QualifiedName, Map<String, EntityReference>> namedAssociations
     )
     {
-        this.unitOfWork = unitOfWork;
         this.version = version;
         this.lastModified = lastModified;
         this.identity = identity;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
index bef6229..435acde 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
@@ -33,7 +33,6 @@ import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entity.ManyAssociationState;
 import org.qi4j.spi.entity.NamedAssociationState;
-import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.EntityStoreException;
 
 /**
@@ -44,15 +43,14 @@ public final class JSONEntityState
 {
     private static final String[] EMPTY_NAMES = new String[ 0 ];
     private static final String[] CLONE_NAMES =
-    {
-        JSONKeys.IDENTITY,
-        JSONKeys.APPLICATION_VERSION,
-        JSONKeys.TYPE,
-        JSONKeys.VERSION,
-        JSONKeys.MODIFIED
-    };
+        {
+            JSONKeys.IDENTITY,
+            JSONKeys.APPLICATION_VERSION,
+            JSONKeys.TYPE,
+            JSONKeys.VERSION,
+            JSONKeys.MODIFIED
+        };
 
-    private final DefaultEntityStoreUnitOfWork unitOfWork;
     private final ValueSerialization valueSerialization;
     private final String version;
     private final EntityReference identity;
@@ -62,24 +60,23 @@ public final class JSONEntityState
     private long lastModified;
     private JSONObject state;
 
-    /* package */ JSONEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
+    /* package */ JSONEntityState( long time,
                                    ValueSerialization valueSerialization,
                                    EntityReference identity,
                                    EntityDescriptor entityDescriptor,
-                                   JSONObject initialState )
+                                   JSONObject initialState
+    )
     {
-        this( unitOfWork,
-              valueSerialization,
+        this( valueSerialization,
               "",
-              unitOfWork.currentTime(),
+              time,
               identity,
               EntityStatus.NEW,
               entityDescriptor,
               initialState );
     }
 
-    /* package */ JSONEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
-                                   ValueSerialization valueSerialization,
+    /* package */ JSONEntityState( ValueSerialization valueSerialization,
                                    String version,
                                    long lastModified,
                                    EntityReference identity,
@@ -88,7 +85,6 @@ public final class JSONEntityState
                                    JSONObject state
     )
     {
-        this.unitOfWork = unitOfWork;
         this.valueSerialization = valueSerialization;
         this.version = version;
         this.lastModified = lastModified;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
index 7cbb88b..47bf17f 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
@@ -42,10 +42,8 @@ import org.qi4j.api.injection.scope.Uses;
 import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.usecase.Usecase;
-import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.value.ValueSerialization;
 import org.qi4j.io.Input;
 import org.qi4j.io.Output;
@@ -62,6 +60,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.module.ModelModule;
 import org.qi4j.spi.module.ModuleSpi;
@@ -144,15 +143,18 @@ public class JSONMapEntityStoreMixin
     // EntityStore
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecaseMetaInfo, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork = new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), usecaseMetaInfo, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     // EntityStoreSPI
 
     @Override
     public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
                                        EntityReference identity,
                                        EntityDescriptor entityDescriptor
     )
@@ -169,7 +171,7 @@ public class JSONMapEntityStoreMixin
             state.put( JSONKeys.ASSOCIATIONS, new JSONObject() );
             state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() );
             state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() );
-            return new JSONEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, valueSerialization,
+            return new JSONEntityState( unitOfWork.currentTime(), valueSerialization,
                                         identity, entityDescriptor, state );
         }
         catch( JSONException e )
@@ -179,17 +181,20 @@ public class JSONMapEntityStoreMixin
     }
 
     @Override
-    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference identity )
+    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork,
+                                                   ModuleSpi module,
+                                                   EntityReference identity
+    )
     {
-        EntityState state = fetchCachedState( identity, (DefaultEntityStoreUnitOfWork) unitOfWork );
+        EntityState state = fetchCachedState( identity, module, unitOfWork.currentTime() );
         if( state != null )
         {
             return state;
         }
         // Get state
         Reader in = mapEntityStore.get( identity );
-        JSONEntityState loadedState = readEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, in );
-        if( doCacheOnRead( (DefaultEntityStoreUnitOfWork) unitOfWork ) )
+        JSONEntityState loadedState = readEntityState( module, in );
+        if( doCacheOnRead( unitOfWork ) )
         {
             cache.put( identity.identity(), new CacheState( loadedState.state() ) );
         }
@@ -197,7 +202,8 @@ public class JSONMapEntityStoreMixin
     }
 
     @Override
-    public StateCommitter applyChanges( final EntityStoreUnitOfWork unitOfWork, final Iterable<EntityState> state
+    public StateCommitter applyChanges( final EntityStoreUnitOfWork unitOfWork,
+                                        final Iterable<EntityState> state
     )
         throws EntityStoreException
     {
@@ -214,8 +220,7 @@ public class JSONMapEntityStoreMixin
                         public void visitMap( MapEntityStore.MapChanger changer )
                             throws IOException
                         {
-                            DefaultEntityStoreUnitOfWork uow = (DefaultEntityStoreUnitOfWork) unitOfWork;
-                            CacheOptions options = uow.usecase().metaInfo( CacheOptions.class );
+                            CacheOptions options = unitOfWork.usecase().metaInfo( CacheOptions.class );
                             if( options == null )
                             {
                                 options = CacheOptions.ALWAYS;
@@ -226,7 +231,7 @@ public class JSONMapEntityStoreMixin
                                 JSONEntityState state = (JSONEntityState) entityState;
                                 if( state.status().equals( EntityStatus.NEW ) )
                                 {
-                                    try( Writer writer = changer.newEntity( state.identity(), state.entityDescriptor() ) )
+                                    try (Writer writer = changer.newEntity( state.identity(), state.entityDescriptor() ))
                                     {
                                         writeEntityState( state, writer, unitOfWork.identity(), unitOfWork.currentTime() );
                                     }
@@ -237,7 +242,7 @@ public class JSONMapEntityStoreMixin
                                 }
                                 else if( state.status().equals( EntityStatus.UPDATED ) )
                                 {
-                                    try( Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ) )
+                                    try (Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ))
                                     {
                                         writeEntityState( state, writer, unitOfWork.identity(), unitOfWork.currentTime() );
                                     }
@@ -269,7 +274,7 @@ public class JSONMapEntityStoreMixin
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -283,20 +288,7 @@ public class JSONMapEntityStoreMixin
                     public <ReceiverThrowableType extends Throwable> void sendTo( final Receiver<? super EntityState, ReceiverThrowableType> receiver )
                         throws ReceiverThrowableType, EntityStoreException
                     {
-                        Usecase usecase = UsecaseBuilder
-                            .buildUsecase( "qi4j.entitystore.entitystates" )
-                            .withMetaInfo( CacheOptions.NEVER )
-                            .newUsecase();
-
-                        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork(
-                            entityStoreSpi,
-                            newUnitOfWorkId(),
-                            module,
-                            usecase,
-                            System.currentTimeMillis() );
-
                         final List<EntityState> migrated = new ArrayList<>();
-
                         try
                         {
                             mapEntityStore.entityStates().transferTo( new Output<Reader, ReceiverThrowableType>()
@@ -311,7 +303,7 @@ public class JSONMapEntityStoreMixin
                                         public void receive( Reader item )
                                             throws ReceiverThrowableType
                                         {
-                                            final EntityState entity = readEntityState( uow, item );
+                                            final EntityState entity = readEntityState( module, item );
                                             if( entity.status() == EntityStatus.UPDATED )
                                             {
                                                 migrated.add( entity );
@@ -370,7 +362,7 @@ public class JSONMapEntityStoreMixin
                 for( EntityState migratedEntity : migratedEntities )
                 {
                     JSONEntityState state = (JSONEntityState) migratedEntity;
-                    try( Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ) )
+                    try (Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ))
                     {
                         writeEntityState( state, writer, state.version(), state.lastModified() );
                     }
@@ -401,12 +393,11 @@ public class JSONMapEntityStoreMixin
         }
     }
 
-    protected JSONEntityState readEntityState( DefaultEntityStoreUnitOfWork unitOfWork, Reader entityState )
+    protected JSONEntityState readEntityState( ModuleSpi module, Reader entityState )
         throws EntityStoreException
     {
         try
         {
-            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -449,8 +440,7 @@ public class JSONMapEntityStoreMixin
                                                        ) );
             }
 
-            return new JSONEntityState( unitOfWork,
-                                        valueSerialization,
+            return new JSONEntityState( valueSerialization,
                                         version,
                                         modified,
                                         EntityReference.parseEntityReference( identity ),
@@ -469,7 +459,7 @@ public class JSONMapEntityStoreMixin
     public JSONObject jsonStateOf( String id )
         throws IOException
     {
-        try( Reader reader = mapEntityStore.get( EntityReference.parseEntityReference( id ) ) )
+        try (Reader reader = mapEntityStore.get( EntityReference.parseEntityReference( id ) ))
         {
             return new JSONObject( new JSONTokener( reader ) );
         }
@@ -479,7 +469,7 @@ public class JSONMapEntityStoreMixin
         }
     }
 
-    private EntityState fetchCachedState( EntityReference identity, DefaultEntityStoreUnitOfWork unitOfWork )
+    private EntityState fetchCachedState( EntityReference identity, ModuleSpi module, long currentTime )
     {
         CacheState cacheState = cache.get( identity.identity() );
         if( cacheState != null )
@@ -488,8 +478,8 @@ public class JSONMapEntityStoreMixin
             try
             {
                 String type = data.getString( JSONKeys.TYPE );
-                EntityDescriptor entityDescriptor = unitOfWork.module().entityDescriptor( type );
-                return new JSONEntityState( unitOfWork, valueSerialization, identity, entityDescriptor, data );
+                EntityDescriptor entityDescriptor = module.entityDescriptor( type );
+                return new JSONEntityState( currentTime, valueSerialization, identity, entityDescriptor, data );
             }
             catch( JSONException e )
             {
@@ -500,18 +490,18 @@ public class JSONMapEntityStoreMixin
         return null;
     }
 
-    private boolean doCacheOnRead( DefaultEntityStoreUnitOfWork unitOfWork )
+    private boolean doCacheOnRead( EntityStoreUnitOfWork unitOfWork )
     {
         CacheOptions cacheOptions = unitOfWork.usecase().metaInfo( CacheOptions.class );
         return cacheOptions == null || cacheOptions.cacheOnRead();
     }
 
-    private static class CacheState
+    public static class CacheState
         implements Externalizable
     {
         public JSONObject json;
 
-        private CacheState()
+        public CacheState()
         {
         }
 
@@ -541,5 +531,4 @@ public class JSONMapEntityStoreMixin
             }
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
index a41b308..a2d02bc 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
@@ -34,7 +34,6 @@ import org.json.JSONObject;
 import org.json.JSONTokener;
 import org.json.JSONWriter;
 import org.qi4j.api.association.AssociationDescriptor;
-import org.qi4j.api.cache.CacheOptions;
 import org.qi4j.api.common.Optional;
 import org.qi4j.api.common.QualifiedName;
 import org.qi4j.api.entity.EntityDescriptor;
@@ -47,11 +46,9 @@ import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.ValueType;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.usecase.Usecase;
-import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.value.ValueSerialization;
 import org.qi4j.io.Input;
 import org.qi4j.io.Output;
@@ -65,6 +62,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.module.ModelModule;
 import org.qi4j.spi.module.ModuleSpi;
@@ -118,27 +116,33 @@ public class MapEntityStoreMixin
 
     // EntityStore
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecaseMetaInfo, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork =
+            new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), usecaseMetaInfo, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     // EntityStoreSPI
     @Override
     public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
                                        EntityReference identity,
                                        EntityDescriptor entityDescriptor
     )
     {
-        return new DefaultEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, identity, entityDescriptor );
+        return new DefaultEntityState( unitOfWork.currentTime(), identity, entityDescriptor );
     }
 
     @Override
-    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitofwork, EntityReference identity )
+    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitofwork,
+                                                   ModuleSpi module,
+                                                   EntityReference identity
+    )
     {
-        DefaultEntityStoreUnitOfWork unitOfWork = (DefaultEntityStoreUnitOfWork) unitofwork;
         Reader in = mapEntityStore.get( identity );
-        return readEntityState( unitOfWork, in );
+        return readEntityState( module, in );
     }
 
     @Override
@@ -198,7 +202,7 @@ public class MapEntityStoreMixin
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -212,20 +216,7 @@ public class MapEntityStoreMixin
                     public <ReceiverThrowableType extends Throwable> void sendTo( final Receiver<? super EntityState, ReceiverThrowableType> receiver )
                         throws ReceiverThrowableType, EntityStoreException
                     {
-                        Usecase usecase = UsecaseBuilder
-                            .buildUsecase( "qi4j.entitystore.entitystates" )
-                            .withMetaInfo( CacheOptions.NEVER )
-                            .newUsecase();
-
-                        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork(
-                            entityStoreSpi,
-                            newUnitOfWorkId(),
-                            module,
-                            usecase,
-                            System.currentTimeMillis() );
-
                         final List<EntityState> migrated = new ArrayList<>();
-
                         try
                         {
                             mapEntityStore.entityStates().transferTo( new Output<Reader, ReceiverThrowableType>()
@@ -240,7 +231,7 @@ public class MapEntityStoreMixin
                                         public void receive( Reader item )
                                             throws ReceiverThrowableType
                                         {
-                                            final EntityState entity = readEntityState( uow, item );
+                                            final EntityState entity = readEntityState( module, item );
                                             if( entity.status() == EntityStatus.UPDATED )
                                             {
                                                 migrated.add( entity );
@@ -394,12 +385,11 @@ public class MapEntityStoreMixin
         }
     }
 
-    protected EntityState readEntityState( DefaultEntityStoreUnitOfWork unitOfWork, Reader entityState )
+    protected EntityState readEntityState( ModuleSpi module, Reader entityState )
         throws EntityStoreException
     {
         try
         {
-            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -539,8 +529,7 @@ public class MapEntityStoreMixin
                 }
             }
 
-            return new DefaultEntityState( unitOfWork,
-                                           version,
+            return new DefaultEntityState( version,
                                            modified,
                                            EntityReference.parseEntityReference( identity ),
                                            status,

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
----------------------------------------------------------------------
diff --git a/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java b/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
index d0c3426..dba4b58 100644
--- a/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
+++ b/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
@@ -45,7 +45,6 @@ public class JSONManyAssociationStateTest
         state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() );
         state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() );
         JSONEntityState entityState = new JSONEntityState( null,
-                                                           null,
                                                            "0",
                                                            System.currentTimeMillis(),
                                                            EntityReference.parseEntityReference( "123" ),
@@ -71,7 +70,6 @@ public class JSONManyAssociationStateTest
         state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() );
         state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() );
         JSONEntityState entityState = new JSONEntityState( null,
-                                                           null,
                                                            "0",
                                                            System.currentTimeMillis(),
                                                            EntityReference.parseEntityReference( "123" ),

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java b/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
index 7b7adbb..2ef0647 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
@@ -16,13 +16,13 @@ package org.qi4j.test;
 
 import org.junit.After;
 import org.junit.Before;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.UnitOfWork;
 import org.qi4j.bootstrap.ApplicationAssembly;
 import org.qi4j.bootstrap.Assembler;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.LayerAssembly;
 import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Base class for Composite tests.
@@ -30,7 +30,7 @@ import org.qi4j.bootstrap.ModuleAssembly;
 public abstract class AbstractQi4jTest extends AbstractQi4jBaseTest
     implements Assembler
 {
-    protected Module module;
+    protected ModuleSpi module;
 
     @Before
     @Override
@@ -42,7 +42,7 @@ public abstract class AbstractQi4jTest extends AbstractQi4jBaseTest
         {
             return; // failure in Assembly.
         }
-        module = application.findModule( "Layer 1", "Module 1" );
+        module = (ModuleSpi) application.findModule( "Layer 1", "Module 1" );
         module.injectTo( this );
     }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java b/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
index 501b34b..ebc54a0 100644
--- a/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
+++ b/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
@@ -157,8 +157,8 @@ public class HazelcastEntityStoreMixin
                 output.receiveFrom( new Sender<Reader, IOException>()
                 {
                     @Override
-                    public <ReceiverThrowableType extends Throwable> void sendTo( Receiver<? super Reader, ReceiverThrowableType> receiver )
-                        throws ReceiverThrowableType, IOException
+                    public <RTT extends Throwable> void sendTo( Receiver<? super Reader, RTT> receiver )
+                        throws RTT, IOException
                     {
                         for( Map.Entry<String, String> eachEntry : stringMap.entrySet() )
                         {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java b/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
index 6017b80..b078d8d 100644
--- a/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
+++ b/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
@@ -43,7 +43,6 @@ import org.qi4j.api.service.ServiceActivation;
 import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.CollectionType;
 import org.qi4j.api.type.EnumType;
 import org.qi4j.api.type.MapType;
@@ -67,6 +66,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
 import org.qi4j.spi.module.ModelModule;
@@ -174,13 +174,15 @@ public class PreferencesEntityStoreMixin
     }
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecase, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork = new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), usecase, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -196,18 +198,16 @@ public class PreferencesEntityStoreMixin
                     {
                         UsecaseBuilder builder = UsecaseBuilder.buildUsecase( "qi4j.entitystore.preferences.visit" );
                         Usecase visitUsecase = builder.withMetaInfo( CacheOptions.NEVER ).newUsecase();
-                        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork(
-                            entityStoreSpi,
-                            newUnitOfWorkId(),
-                            module,
-                            visitUsecase,
-                            System.currentTimeMillis() );
+                        final EntityStoreUnitOfWork uow =
+                            newUnitOfWork( visitUsecase, module, System.currentTimeMillis() );
+
                         try
                         {
                             String[] identities = root.childrenNames();
                             for( String identity : identities )
                             {
-                                EntityState entityState = uow.entityStateOf( EntityReference.parseEntityReference( identity ) );
+                                EntityReference reference = EntityReference.parseEntityReference( identity );
+                                EntityState entityState = uow.entityStateOf( module, reference );
                                 receiver.receive( entityState );
                             }
                         }
@@ -223,22 +223,19 @@ public class PreferencesEntityStoreMixin
 
     @Override
     public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
                                        EntityReference identity,
                                        EntityDescriptor entityDescriptor
     )
     {
-        return new DefaultEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, identity, entityDescriptor );
+        return new DefaultEntityState( unitOfWork.currentTime(), identity, entityDescriptor );
     }
 
     @Override
-    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference identity )
+    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, ModuleSpi module, EntityReference identity )
     {
         try
         {
-            DefaultEntityStoreUnitOfWork desuw = (DefaultEntityStoreUnitOfWork) unitOfWork;
-
-            ModuleSpi module = (ModuleSpi) desuw.module();
-
             if( !root.nodeExists( identity.identity() ) )
             {
                 throw new NoSuchEntityException( identity, UnknownType.class );
@@ -443,8 +440,7 @@ public class PreferencesEntityStoreMixin
                 }
             }
 
-            return new DefaultEntityState( desuw,
-                                           entityPrefs.get( "version", "" ),
+            return new DefaultEntityState( entityPrefs.get( "version", "" ),
                                            entityPrefs.getLong( "modified", unitOfWork.currentTime() ),
                                            identity,
                                            status,
@@ -466,6 +462,7 @@ public class PreferencesEntityStoreMixin
     {
         return new StateCommitter()
         {
+            @SuppressWarnings( "SynchronizeOnNonFinalField" )
             @Override
             public void commit()
             {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java b/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
index ddeca7b..b57dcf0 100644
--- a/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
+++ b/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
@@ -48,7 +48,6 @@ import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.service.ServiceActivation;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.ValueType;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.usecase.Usecase;
@@ -73,6 +72,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
 import org.qi4j.spi.entitystore.helpers.JSONKeys;
@@ -237,31 +237,34 @@ public class SQLEntityStoreMixin
     }
 
     @Override
-    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference entityRef )
+    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, ModuleSpi module, EntityReference entityRef )
     {
         EntityValueResult valueResult = getValue( entityRef );
-        return new DefaultSQLEntityState( readEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork,
-                                                           valueResult.getReader() ),
-                                          valueResult.getEntityPK(),
-                                          valueResult.getEntityOptimisticLock() );
+        DefaultEntityState state = readEntityState( module, valueResult.getReader() );
+        return new DefaultSQLEntityState( state, valueResult.getEntityPK(), valueResult.getEntityOptimisticLock() );
     }
 
     @Override
-    public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork, EntityReference entityRef, EntityDescriptor entityDescriptor )
+    public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
+                                       EntityReference entityRef,
+                                       EntityDescriptor entityDescriptor
+    )
     {
-        return new DefaultSQLEntityState( new DefaultEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork,
-                                                                  entityRef,
-                                                                  entityDescriptor ) );
+        return new DefaultSQLEntityState( new DefaultEntityState( unitOfWork.currentTime(), entityRef, entityDescriptor ) );
     }
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSPI, newUnitOfWorkId(), module, usecase, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork =
+            new DefaultEntityStoreUnitOfWork( entityStoreSPI, newUnitOfWorkId(), usecase, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -298,16 +301,15 @@ public class SQLEntityStoreMixin
         };
     }
 
-    private void queryAllEntities( Module module, EntityStatesVisitor entityStatesVisitor )
+    private void queryAllEntities( ModuleSpi module, EntityStatesVisitor entityStatesVisitor )
     {
         Connection connection = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
         UsecaseBuilder builder = UsecaseBuilder.buildUsecase( "qi4j.entitystore.sql.visit" );
         Usecase usecase = builder.withMetaInfo( CacheOptions.NEVER ).newUsecase();
-        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork( entityStoreSPI,
-                                                                                   newUnitOfWorkId(), module, usecase,
-                                                                                   System.currentTimeMillis() );
+        final ModuleEntityStoreUnitOfWork uow =
+            (ModuleEntityStoreUnitOfWork) newUnitOfWork( usecase, module, System.currentTimeMillis() );
         try
         {
             connection = database.getConnection();
@@ -316,7 +318,7 @@ public class SQLEntityStoreMixin
             rs = ps.executeQuery();
             while( rs.next() )
             {
-                DefaultEntityState entityState = readEntityState( uow, database.getEntityValue( rs ).getReader() );
+                DefaultEntityState entityState = readEntityState( module, database.getEntityValue( rs ).getReader() );
                 if( !entityStatesVisitor.visit( entityState ) )
                 {
                     return;
@@ -345,12 +347,11 @@ public class SQLEntityStoreMixin
         return uuid + Integer.toHexString( count.incrementAndGet() );
     }
 
-    protected DefaultEntityState readEntityState( DefaultEntityStoreUnitOfWork unitOfWork, Reader entityState )
+    protected DefaultEntityState readEntityState( ModuleSpi module, Reader entityState )
         throws EntityStoreException
     {
         try
         {
-            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -491,7 +492,7 @@ public class SQLEntityStoreMixin
                 }
             }
 
-            return new DefaultEntityState( unitOfWork, version, modified,
+            return new DefaultEntityState( version, modified,
                                            EntityReference.parseEntityReference( identity ), status, entityDescriptor,
                                            properties, associations, manyAssociations, namedAssociations );
         }
@@ -506,7 +507,7 @@ public class SQLEntityStoreMixin
         throws IOException
     {
         JSONObject jsonObject;
-        try( Reader reader = getValue( EntityReference.parseEntityReference( id ) ).getReader() )
+        try (Reader reader = getValue( EntityReference.parseEntityReference( id ) ).getReader())
         {
             jsonObject = new JSONObject( new JSONTokener( reader ) );
         }
@@ -532,10 +533,7 @@ public class SQLEntityStoreMixin
             {
                 throw new EntityNotFoundException( ref );
             }
-
-            EntityValueResult result = database.getEntityValue( rs );
-
-            return result;
+            return database.getEntityValue( rs );
         }
         catch( SQLException sqle )
         {
@@ -590,7 +588,8 @@ public class SQLEntityStoreMixin
             }
 
             JSONWriter associations = properties.endObject().key( JSONKeys.ASSOCIATIONS ).object();
-            for( Map.Entry<QualifiedName, EntityReference> stateNameEntityReferenceEntry : state.associations().entrySet() )
+            for( Map.Entry<QualifiedName, EntityReference> stateNameEntityReferenceEntry : state.associations()
+                .entrySet() )
             {
                 EntityReference value = stateNameEntityReferenceEntry.getValue();
                 associations.key( stateNameEntityReferenceEntry.getKey().name() ).
@@ -598,7 +597,8 @@ public class SQLEntityStoreMixin
             }
 
             JSONWriter manyAssociations = associations.endObject().key( JSONKeys.MANY_ASSOCIATIONS ).object();
-            for( Map.Entry<QualifiedName, List<EntityReference>> stateNameListEntry : state.manyAssociations().entrySet() )
+            for( Map.Entry<QualifiedName, List<EntityReference>> stateNameListEntry : state.manyAssociations()
+                .entrySet() )
             {
                 JSONWriter assocs = manyAssociations.key( stateNameListEntry.getKey().name() ).array();
                 for( EntityReference entityReference : stateNameListEntry.getValue() )
@@ -609,7 +609,8 @@ public class SQLEntityStoreMixin
             }
 
             JSONWriter namedAssociations = manyAssociations.endObject().key( JSONKeys.NAMED_ASSOCIATIONS ).object();
-            for( Map.Entry<QualifiedName, Map<String, EntityReference>> stateNameMapEntry : state.namedAssociations().entrySet() )
+            for( Map.Entry<QualifiedName, Map<String, EntityReference>> stateNameMapEntry : state.namedAssociations()
+                .entrySet() )
             {
                 JSONWriter assocs = namedAssociations.key( stateNameMapEntry.getKey().name() ).object();
                 for( Map.Entry<String, EntityReference> entry : stateNameMapEntry.getValue().entrySet() )
@@ -625,5 +626,4 @@ public class SQLEntityStoreMixin
             throw new EntityStoreException( "Could not store EntityState", e );
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
index 58172d5..329c8e5 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
@@ -34,7 +34,6 @@ import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.mixin.Mixins;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.ValueType;
 import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.util.Classes;
@@ -49,6 +48,7 @@ import org.qi4j.spi.entity.NamedAssociationState;
 import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateChangeListener;
+import org.qi4j.spi.module.ModuleSpi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,13 +67,17 @@ public interface ElasticSearchIndexer
     {
 
         private static final Logger LOGGER = LoggerFactory.getLogger( ElasticSearchIndexer.class );
+
         @Structure
-        private Module module;
+        private ModuleSpi module;
+
         @Service
         private EntityStore entityStore;
+
         @Service
         @Tagged( ValueSerialization.Formats.JSON )
         private ValueSerializer valueSerializer;
+
         @This
         private ElasticSearchSupport support;
 
@@ -111,27 +115,27 @@ public interface ElasticSearchIndexer
                 {
                     switch( changedState.status() )
                     {
-                        case REMOVED:
-                            LOGGER.trace( "Removing Entity State from Index: {}", changedState );
-                            remove( bulkBuilder, changedState.identity().identity() );
-                            break;
-                        case UPDATED:
-                            LOGGER.trace( "Updating Entity State in Index: {}", changedState );
-                            remove( bulkBuilder, changedState.identity().identity() );
-                            String updatedJson = toJSON( changedState, newStates, uow );
-                            LOGGER.trace( "Will index: {}", updatedJson );
-                            index( bulkBuilder, changedState.identity().identity(), updatedJson );
-                            break;
-                        case NEW:
-                            LOGGER.trace( "Creating Entity State in Index: {}", changedState );
-                            String newJson = toJSON( changedState, newStates, uow );
-                            LOGGER.trace( "Will index: {}", newJson );
-                            index( bulkBuilder, changedState.identity().identity(), newJson );
-                            break;
-                        case LOADED:
-                        default:
-                            // Ignored
-                            break;
+                    case REMOVED:
+                        LOGGER.trace( "Removing Entity State from Index: {}", changedState );
+                        remove( bulkBuilder, changedState.identity().identity() );
+                        break;
+                    case UPDATED:
+                        LOGGER.trace( "Updating Entity State in Index: {}", changedState );
+                        remove( bulkBuilder, changedState.identity().identity() );
+                        String updatedJson = toJSON( changedState, newStates, uow );
+                        LOGGER.trace( "Will index: {}", updatedJson );
+                        index( bulkBuilder, changedState.identity().identity(), updatedJson );
+                        break;
+                    case NEW:
+                        LOGGER.trace( "Creating Entity State in Index: {}", changedState );
+                        String newJson = toJSON( changedState, newStates, uow );
+                        LOGGER.trace( "Will index: {}", newJson );
+                        index( bulkBuilder, changedState.identity().identity(), newJson );
+                        break;
+                    case LOADED:
+                    default:
+                        // Ignored
+                        break;
                     }
                 }
             }
@@ -154,7 +158,6 @@ public interface ElasticSearchIndexer
 
                 // Refresh index
                 support.client().admin().indices().prepareRefresh( support.index() ).execute().actionGet();
-
             }
         }
 
@@ -190,7 +193,8 @@ public interface ElasticSearchIndexer
                 JSONObject json = new JSONObject();
 
                 json.put( "_identity", state.identity().identity() );
-                json.put( "_types", Iterables.toList( Iterables.map( Classes.toClassName(), state.entityDescriptor().mixinTypes() ) ) );
+                json.put( "_types", Iterables.toList( Iterables.map( Classes.toClassName(), state.entityDescriptor()
+                    .mixinTypes() ) ) );
 
                 EntityDescriptor entityType = state.entityDescriptor();
 
@@ -247,7 +251,8 @@ public interface ElasticSearchIndexer
                                 }
                                 else
                                 {
-                                    EntityState assocState = uow.entityStateOf( EntityReference.parseEntityReference( associated.identity() ) );
+                                    EntityReference reference = EntityReference.parseEntityReference( associated.identity() );
+                                    EntityState assocState = uow.entityStateOf( module, reference );
                                     value = new JSONObject( toJSON( assocState, newStates, uow ) );
                                 }
                             }
@@ -278,7 +283,8 @@ public interface ElasticSearchIndexer
                                 }
                                 else
                                 {
-                                    EntityState assocState = uow.entityStateOf( EntityReference.parseEntityReference( associated.identity() ) );
+                                    EntityReference reference = EntityReference.parseEntityReference( associated.identity() );
+                                    EntityState assocState = uow.entityStateOf( module, reference );
                                     array.put( new JSONObject( toJSON( assocState, newStates, uow ) ) );
                                 }
                             }
@@ -312,7 +318,8 @@ public interface ElasticSearchIndexer
                                 }
                                 else
                                 {
-                                    EntityState assocState = uow.entityStateOf( EntityReference.parseEntityReference( identity ) );
+                                    EntityReference reference = EntityReference.parseEntityReference( identity );
+                                    EntityState assocState = uow.entityStateOf( module, reference );
                                     JSONObject obj = new JSONObject( toJSON( assocState, newStates, uow ) );
                                     obj.put( "_named", name );
                                     array.put( obj );
@@ -338,5 +345,4 @@ public interface ElasticSearchIndexer
             }
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java b/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
index f2a03ff..444aa17 100644
--- a/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
+++ b/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
@@ -86,7 +86,7 @@ public interface RdfIndexingService
         @Override
         public void initialize()
         {
-            indexedEntityTypes = new HashSet<EntityDescriptor>();
+            indexedEntityTypes = new HashSet<>();
         }
 
         @Override