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


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 4919860..886fb97 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
@@ -42,7 +42,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.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
@@ -53,9 +52,12 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.metrics.DefaultMetric;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static 
org.qi4j.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.COMPLETED;
 import static 
org.qi4j.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.DISCARDED;
+import static org.qi4j.functional.Iterables.map;
 
 public final class UnitOfWorkInstance
 {
@@ -136,7 +138,7 @@ public final class UnitOfWorkInstance
             // Check if this is a root UoW, or if no parent UoW knows about 
this entity
             EntityState entityState = null;
             EntityModel model = null;
-            ModuleInstance module = null;
+            ModuleSpi module = null;
             // Figure out what EntityStore to use
             for( ModelModule<EntityModel> potentialModel : potentialModels )
             {
@@ -166,7 +168,11 @@ public final class UnitOfWorkInstance
                 }
                 else
                 {
-                    throw new EntityTypeNotFoundException( mixinType.getName() 
);
+                    throw new EntityTypeNotFoundException( mixinType.getName(),
+                                                           module.name(),
+                                                           map( 
ModelModule.toStringFunction,
+                                                                
module.findVisibleEntityTypes()
+                                                           ) );
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
----------------------------------------------------------------------
diff --git 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
index 0d70463..6bd6eeb 100644
--- 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
+++ 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
@@ -19,7 +19,7 @@ import org.qi4j.api.composite.Composite;
 import org.qi4j.api.value.NoSuchValueException;
 import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.runtime.composite.StateResolver;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 import static org.qi4j.functional.Iterables.first;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
----------------------------------------------------------------------
diff --git 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
index 5b6352a..b6f3e98 100644
--- 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
+++ 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
@@ -37,7 +37,7 @@ import org.qi4j.runtime.composite.MixinsModel;
 import org.qi4j.runtime.composite.StateResolver;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.injection.InjectionContext;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 /**

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
----------------------------------------------------------------------
diff --git 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
index ec1f7b3..b76ea26 100644
--- 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
+++ 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
@@ -17,7 +17,7 @@ import org.qi4j.api.association.AssociationStateHolder;
 import org.qi4j.api.common.ConstructionException;
 import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.runtime.composite.StateResolver;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 public class ValueBuilderWithState<T> implements ValueBuilder<T>

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
----------------------------------------------------------------------
diff --git 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
index ae8a4ab..fc7c95e 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
@@ -25,7 +25,7 @@ import org.qi4j.runtime.composite.MixinsInstance;
 import org.qi4j.runtime.composite.TransientInstance;
 import org.qi4j.runtime.property.PropertyInstance;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * ValueComposite instance
@@ -40,9 +40,10 @@ public final class ValueInstance
     }
 
     public ValueInstance( ValueModel compositeModel,
-                          ModuleInstance moduleInstance,
+                          ModuleSpi moduleInstance,
                           Object[] mixins,
-                          ValueStateInstance state )
+                          ValueStateInstance state
+    )
     {
         super( compositeModel, moduleInstance, mixins, state );
     }
@@ -50,11 +51,12 @@ public final class ValueInstance
     /**
      * Perform equals with {@code o} argument.
      * <p>
-     *     The definition of equals() for the Value is that if both the state 
and descriptor are equal,
-     *     then the values are equal.
+     * The definition of equals() for the Value is that if both the state and 
descriptor are equal,
+     * then the values are equal.
      * </p>
      *
      * @param o The other object to compare.
+     *
      * @return Returns a {@code boolean} indicator whether this object is 
equals the other.
      */
     @Override
@@ -106,7 +108,7 @@ public final class ValueInstance
         for( PropertyModel propertyDescriptor : 
descriptor().state().properties() )
         {
             PropertyInstance<Object> propertyInstance =
-                                     (PropertyInstance<Object>) 
state.propertyFor( propertyDescriptor.accessor() );
+                (PropertyInstance<Object>) state.propertyFor( 
propertyDescriptor.accessor() );
 
             propertyInstance.prepareToBuild( propertyDescriptor );
         }
@@ -133,7 +135,7 @@ public final class ValueInstance
         for( PropertyModel propertyDescriptor : 
descriptor().state().properties() )
         {
             PropertyInstance<Object> propertyInstance =
-                                     (PropertyInstance<Object>) 
state.propertyFor( propertyDescriptor.accessor() );
+                (PropertyInstance<Object>) state.propertyFor( 
propertyDescriptor.accessor() );
             propertyInstance.prepareBuilderState( propertyDescriptor );
         }
 
@@ -163,6 +165,6 @@ public final class ValueInstance
     @Override
     public String toString()
     {
-        return module().valueSerialization().serialize( 
this.<ValueComposite>proxy() );
+        return ( (ModuleSpi) module() ).valueSerialization().serialize( 
this.<ValueComposite>proxy() );
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
index 4904aae..0efe6f5 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
@@ -28,8 +28,8 @@ import org.qi4j.runtime.composite.MixinsModel;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.injection.InjectionContext;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Model for ValueComposites
@@ -90,7 +90,7 @@ public final class ValueModel
         }
     }
 
-    public ValueInstance newValueInstance( ModuleInstance moduleInstance,
+    public ValueInstance newValueInstance( ModuleSpi moduleInstance,
                                            ValueStateInstance state
     )
     {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
----------------------------------------------------------------------
diff --git 
a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java 
b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
index 68dd5c7..ad5b5f2 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
@@ -39,7 +39,7 @@ import org.qi4j.runtime.composite.StateResolver;
 import org.qi4j.runtime.property.PropertyInfo;
 import org.qi4j.runtime.property.PropertyInstance;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 /**

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java 
b/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
index cff2507..cfd82b2 100644
--- a/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
+++ b/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
@@ -21,11 +21,18 @@ import org.qi4j.api.association.AssociationStateHolder;
 import org.qi4j.api.association.ManyAssociation;
 import org.qi4j.api.association.NamedAssociation;
 import org.qi4j.api.composite.TransientComposite;
+import org.qi4j.api.composite.TransientDescriptor;
 import org.qi4j.api.entity.EntityComposite;
+import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.object.ObjectDescriptor;
 import org.qi4j.api.property.StateHolder;
+import org.qi4j.api.service.ServiceDescriptor;
+import org.qi4j.api.structure.Module;
 import org.qi4j.api.value.ValueComposite;
+import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModelModule;
 
 /**
  * Encapsulation of the Qi4j SPI. This is implemented by the runtime.

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 21d641a..7cbb88b 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
@@ -51,6 +51,7 @@ import org.qi4j.io.Input;
 import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.cache.Cache;
 import org.qi4j.spi.cache.CachePool;
 import org.qi4j.spi.cache.NullCache;
@@ -62,8 +63,11 @@ import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * Implementation of EntityStore that works with an implementation of 
MapEntityStore.
@@ -83,6 +87,9 @@ public class JSONMapEntityStoreMixin
     private EntityStoreSPI entityStoreSpi;
 
     @Structure
+    private Qi4jSPI spi;
+
+    @Structure
     private Application application;
 
     @Service
@@ -399,7 +406,7 @@ public class JSONMapEntityStoreMixin
     {
         try
         {
-            Module module = unitOfWork.module();
+            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( 
entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -435,7 +442,11 @@ public class JSONMapEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type 
);
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( 
ModelModule.toStringFunction,
+                                                            
module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             return new JSONEntityState( unitOfWork,

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 0e91b0a..a41b308 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
@@ -57,6 +57,7 @@ import org.qi4j.io.Input;
 import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
@@ -65,8 +66,11 @@ import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * Implementation of EntityStore that works with an implementation of 
MapEntityStore.
@@ -86,6 +90,9 @@ public class MapEntityStoreMixin
     private EntityStoreSPI entityStoreSpi;
 
     @Structure
+    private Qi4jSPI spi;
+
+    @Structure
     private Application application;
 
     @Service
@@ -157,14 +164,14 @@ public class MapEntityStoreMixin
                                 DefaultEntityState state = 
(DefaultEntityState) 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() );
                                     }
                                 }
                                 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() );
                                     }
@@ -292,7 +299,7 @@ public class MapEntityStoreMixin
                 for( EntityState migratedEntity : migratedEntities )
                 {
                     DefaultEntityState state = (DefaultEntityState) 
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() );
                     }
@@ -348,7 +355,8 @@ public class MapEntityStoreMixin
             }
 
             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() ).
@@ -356,7 +364,8 @@ public class MapEntityStoreMixin
             }
 
             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() )
@@ -367,7 +376,8 @@ public class MapEntityStoreMixin
             }
 
             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> namedRef : 
stateNameMapEntry.getValue().entrySet() )
@@ -389,7 +399,7 @@ public class MapEntityStoreMixin
     {
         try
         {
-            Module module = unitOfWork.module();
+            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( 
entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -419,7 +429,11 @@ public class MapEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type 
);
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( 
ModelModule.toStringFunction,
+                                                            
module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             Map<QualifiedName, Object> properties = new HashMap<>();
@@ -548,7 +562,7 @@ public class MapEntityStoreMixin
         throws IOException
     {
         JSONObject jsonObject;
-        try( Reader reader = mapEntityStore.get( 
EntityReference.parseEntityReference( id ) ) )
+        try (Reader reader = mapEntityStore.get( 
EntityReference.parseEntityReference( id ) ))
         {
             jsonObject = new JSONObject( new JSONTokener( reader ) );
         }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java 
b/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java
new file mode 100644
index 0000000..4d7d37e
--- /dev/null
+++ b/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.spi.module;
+
+import org.qi4j.api.composite.ModelDescriptor;
+import org.qi4j.functional.Function;
+import org.qi4j.spi.Qi4jSPI;
+
+import static org.qi4j.functional.Iterables.map;
+
+/**
+ * TODO
+ */
+public class ModelModule<T extends ModelDescriptor>
+{
+
+    public static Function<?, String> toStringFunction = new 
Function<ModelModule<?>, String>()
+    {
+        @Override
+        public String map( ModelModule item )
+        {
+            return item.model()
+                       .types()
+                       .iterator()
+                       .next()
+                       .getName() + "[" + item.module().name() + "]";
+        }
+    };
+
+    public static <T extends ModelDescriptor> Function<T, ModelModule<T>> 
modelModuleFunction( final ModuleSpi module )
+    {
+        return new Function<T, ModelModule<T>>()
+        {
+            @Override
+            public ModelModule<T> map( T model )
+            {
+                return new ModelModule<>( module, model );
+            }
+        };
+    }
+
+    public static <T extends ModelDescriptor> Function<ModelModule<T>, T> 
modelFunction()
+    {
+        return new Function<ModelModule<T>, T>()
+        {
+            @Override
+            public T map( ModelModule<T> modelModule )
+            {
+                return modelModule.model();
+            }
+        };
+    }
+
+    private final ModuleSpi module;
+    private final T model;
+
+    public ModelModule( ModuleSpi module, T model )
+    {
+        this.module = module;
+        this.model = model;
+    }
+
+    public ModuleSpi module()
+    {
+        return module;
+    }
+
+    public T model()
+    {
+        return model;
+    }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if( this == o )
+        {
+            return true;
+        }
+        if( o == null || getClass() != o.getClass() )
+        {
+            return false;
+        }
+
+        ModelModule that = (ModelModule) o;
+
+        if( model != null ? !model.equals( that.model ) : that.model != null )
+        {
+            return false;
+        }
+
+        return !( module != null ? !module.equals( that.module ) : that.module 
!= null );
+    }
+
+    @Override
+    public int hashCode()
+    {
+        int result = module != null ? module.hashCode() : 0;
+        result = 31 * result + ( model != null ? model.hashCode() : 0 );
+        return result;
+    }
+
+    @Override
+    public String toString()
+    {
+        return module.name() + ":" + model;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java 
b/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java
new file mode 100644
index 0000000..6555cdf
--- /dev/null
+++ b/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java
@@ -0,0 +1,30 @@
+package org.qi4j.spi.module;
+
+import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.IdentityGenerator;
+import org.qi4j.api.object.ObjectDescriptor;
+import org.qi4j.api.service.ServiceDescriptor;
+import org.qi4j.api.structure.Module;
+import org.qi4j.api.value.ValueDescriptor;
+import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.spi.entitystore.EntityStore;
+
+public interface ModuleSpi extends Module
+{
+    EntityStore entityStore();
+
+    IdentityGenerator identityGenerator();
+
+    ValueSerialization valueSerialization();
+
+    Iterable<ModelModule<EntityDescriptor>> findVisibleEntityTypes();
+
+    Iterable<ModelModule<ValueDescriptor>> findVisibleValueTypes();
+
+    Iterable<ModelModule<TransientDescriptor>> findVisibleTransientTypes();
+
+    Iterable<ModelModule<ObjectDescriptor>> findVisibleObjectTypes();
+
+    Iterable<ModelModule<ServiceDescriptor>> findVisibleServiceTypes();
+}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 ed48871..6017b80 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
@@ -59,6 +59,7 @@ import org.qi4j.io.Input;
 import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
@@ -68,10 +69,13 @@ import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * Implementation of EntityStore that is backed by the Preferences API.
@@ -87,6 +91,9 @@ import static org.qi4j.functional.Iterables.first;
 public class PreferencesEntityStoreMixin
     implements ServiceActivation, EntityStore, EntityStoreSPI
 {
+    @Structure
+    private Qi4jSPI spi;
+
     @This
     private EntityStoreSPI entityStoreSpi;
 
@@ -230,7 +237,7 @@ public class PreferencesEntityStoreMixin
         {
             DefaultEntityStoreUnitOfWork desuw = 
(DefaultEntityStoreUnitOfWork) unitOfWork;
 
-            Module module = desuw.module();
+            ModuleSpi module = (ModuleSpi) desuw.module();
 
             if( !root.nodeExists( identity.identity() ) )
             {
@@ -245,7 +252,11 @@ public class PreferencesEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type 
);
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( 
ModelModule.toStringFunction,
+                                                            
module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             Map<QualifiedName, Object> properties = new HashMap<>();
@@ -424,8 +435,8 @@ public class PreferencesEntityStoreMixin
                     }
                     for( int idx = 0; idx < namedRefs.length; idx += 2 )
                     {
-                        String name = namedRefs[idx];
-                        String ref = namedRefs[idx + 1];
+                        String name = namedRefs[ idx ];
+                        String ref = namedRefs[ idx + 1 ];
                         references.put( name, 
EntityReference.parseEntityReference( ref ) );
                     }
                     namedAssociations.put( 
namedAssociationType.qualifiedName(), references );
@@ -595,7 +606,8 @@ public class PreferencesEntityStoreMixin
             if( !state.manyAssociations().isEmpty() )
             {
                 Preferences manyAssocsPrefs = entityPrefs.node( 
"manyassociations" );
-                for( Map.Entry<QualifiedName, List<EntityReference>> 
manyAssociation : state.manyAssociations().entrySet() )
+                for( Map.Entry<QualifiedName, List<EntityReference>> 
manyAssociation : state.manyAssociations()
+                    .entrySet() )
                 {
                     StringBuilder manyAssocs = new StringBuilder();
                     for( EntityReference entityReference : 
manyAssociation.getValue() )
@@ -617,7 +629,8 @@ public class PreferencesEntityStoreMixin
             if( !state.namedAssociations().isEmpty() )
             {
                 Preferences namedAssocsPrefs = entityPrefs.node( 
"namedassociations" );
-                for( Map.Entry<QualifiedName, Map<String, EntityReference>> 
namedAssociation : state.namedAssociations().entrySet() )
+                for( Map.Entry<QualifiedName, Map<String, EntityReference>> 
namedAssociation : state.namedAssociations()
+                    .entrySet() )
                 {
                     StringBuilder namedAssocs = new StringBuilder();
                     for( Map.Entry<String, EntityReference> namedRef : 
namedAssociation.getValue().entrySet() )
@@ -702,5 +715,4 @@ public class PreferencesEntityStoreMixin
     private static class UnknownType
     {
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 8ba2aac..ddeca7b 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
@@ -64,6 +64,7 @@ import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
 import org.qi4j.library.sql.common.SQLUtil;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
@@ -77,10 +78,13 @@ import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
 import org.qi4j.spi.entitystore.helpers.JSONKeys;
 import org.qi4j.spi.entitystore.helpers.Migration;
 import org.qi4j.spi.entitystore.helpers.StateStore;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * SQL EntityStore core Mixin.
@@ -103,6 +107,9 @@ public class SQLEntityStoreMixin
     private EntityStoreSPI entityStoreSPI;
 
     @Structure
+    private Qi4jSPI spi;
+
+    @Structure
     private Application application;
 
     @Service
@@ -343,7 +350,7 @@ public class SQLEntityStoreMixin
     {
         try
         {
-            Module module = unitOfWork.module();
+            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( 
entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -377,7 +384,11 @@ public class SQLEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type 
);
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( 
ModelModule.toStringFunction,
+                                                            
module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             Map<QualifiedName, Object> properties = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
----------------------------------------------------------------------
diff --git 
a/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
 
b/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
index b5d91bb..7bfc17d 100644
--- 
a/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
+++ 
b/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
@@ -35,7 +35,6 @@ import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.entity.Identity;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.property.PropertyDescriptor;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.unitofwork.NoSuchEntityException;
 import org.qi4j.api.value.ValueComposite;
@@ -43,7 +42,10 @@ import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.functional.Function;
 import org.qi4j.functional.Iterables;
 import org.qi4j.spi.Qi4jSPI;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
+import static org.qi4j.functional.Iterables.map;
 import static 
org.qi4j.library.conversion.values.Shared.STRING_COLLECTION_TYPE_SPEC;
 import static org.qi4j.library.conversion.values.Shared.STRING_MAP_TYPE_SPEC;
 import static org.qi4j.library.conversion.values.Shared.STRING_TYPE_SPEC;
@@ -144,7 +146,7 @@ public class ValueToEntityMixin
     private Qi4jSPI spi;
 
     @Structure
-    private Module module;
+    private ModuleSpi module;
 
     @Override
     public <T> T create( Class<T> entityType, Object value )
@@ -193,7 +195,8 @@ public class ValueToEntityMixin
     @Override
     public <T> Iterable<T> create( final Class<T> entityType,
                                    final Iterable<Object> values,
-                                   final Function<T, T> prototypeOpportunity )
+                                   final Function<T, T> prototypeOpportunity
+    )
     {
         return Iterables.map(
             new Function<Object, T>()
@@ -213,7 +216,11 @@ public class ValueToEntityMixin
         EntityDescriptor eDesc = module.entityDescriptor( entityType.getName() 
);
         if( eDesc == null )
         {
-            throw new EntityTypeNotFoundException( entityType.getName() );
+            throw new EntityTypeNotFoundException( entityType.getName(),
+                                                   module.name(),
+                                                   map( 
ModelModule.toStringFunction,
+                                                        
module.findVisibleEntityTypes()
+                                                   ) );
         }
 
         ValueComposite vComposite = (ValueComposite) value;
@@ -237,118 +244,118 @@ public class ValueToEntityMixin
     {
         Function<PropertyDescriptor, Object> props
             = new Function<PropertyDescriptor, Object>()
+        {
+            @Override
+            public Object map( PropertyDescriptor ePropDesc )
             {
-                @Override
-                public Object map( PropertyDescriptor ePropDesc )
+                try
                 {
-                    try
-                    {
-                        return vState.propertyFor( ePropDesc.accessor() 
).get();
-                    }
-                    catch( IllegalArgumentException propNotFoundOnValue )
-                    {
-                        // Property not found
-                        return null;
-                    }
+                    return vState.propertyFor( ePropDesc.accessor() ).get();
                 }
-            };
+                catch( IllegalArgumentException propNotFoundOnValue )
+                {
+                    // Property not found
+                    return null;
+                }
+            }
+        };
         Function<AssociationDescriptor, EntityReference> assocs
             = new Function<AssociationDescriptor, EntityReference>()
+        {
+            @Override
+            public EntityReference map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public EntityReference map( AssociationDescriptor eAssocDesc )
+                try
+                {
+                    return EntityReference.entityReferenceFor( 
vState.associationFor( eAssocDesc.accessor() ) );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
                 {
+                    // Find String Property and convert to Association
+                    String propName = eAssocDesc.qualifiedName().name();
                     try
                     {
-                        return EntityReference.entityReferenceFor( 
vState.associationFor( eAssocDesc.accessor() ) );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find String Property and convert to Association
-                        String propName = eAssocDesc.qualifiedName().name();
-                        try
-                        {
-                            PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
-                            if( STRING_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
-                            {
-                                String assocState = (String) 
vState.propertyFor( vPropDesc.accessor() ).get();
-                                return EntityReference.parseEntityReference( 
assocState );
-                            }
-                            return null;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
+                        PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
+                        if( STRING_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
                         {
-                            return null;
+                            String assocState = (String) vState.propertyFor( 
vPropDesc.accessor() ).get();
+                            return EntityReference.parseEntityReference( 
assocState );
                         }
+                        return null;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return null;
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocs
             = new Function<AssociationDescriptor, Iterable<EntityReference>>()
+        {
+            @Override
+            public Iterable<EntityReference> map( AssociationDescriptor 
eAssocDesc )
             {
-                @Override
-                public Iterable<EntityReference> map( AssociationDescriptor 
eAssocDesc )
+                try
                 {
+                    ManyAssociation<Object> vAssocState = 
vState.manyAssociationFor( eAssocDesc.accessor() );
+                    return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( vAssocState 
);
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Find Collection<String> Property and convert to 
ManyAssociation
+                    String propName = eAssocDesc.qualifiedName().name();
                     try
                     {
-                        ManyAssociation<Object> vAssocState = 
vState.manyAssociationFor( eAssocDesc.accessor() );
-                        return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( 
vAssocState );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find Collection<String> Property and convert to 
ManyAssociation
-                        String propName = eAssocDesc.qualifiedName().name();
-                        try
+                        PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
+                        if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
-                            if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
-                            {
-                                Collection<String> vAssocState = (Collection) 
vState
+                            Collection<String> vAssocState = (Collection) 
vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return 
STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
-                            }
-                            return Iterables.empty();
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Iterables.empty();
+                            return STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( 
vAssocState );
                         }
+                        return Iterables.empty();
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Iterables.empty();
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Map<String, EntityReference>> 
namedAssocs
             = new Function<AssociationDescriptor, Map<String, 
EntityReference>>()
+        {
+            @Override
+            public Map<String, EntityReference> map( AssociationDescriptor 
eAssocDesc )
             {
-                @Override
-                public Map<String, EntityReference> map( AssociationDescriptor 
eAssocDesc )
+                try
                 {
+                    NamedAssociation<?> vAssocState = 
vState.namedAssociationFor( eAssocDesc.accessor() );
+                    return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Find Map<String,String> Property and convert to 
NamedAssociation
+                    String propName = eAssocDesc.qualifiedName().name();
                     try
                     {
-                        NamedAssociation<?> vAssocState = 
vState.namedAssociationFor( eAssocDesc.accessor() );
-                        return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState 
);
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find Map<String,String> Property and convert to 
NamedAssociation
-                        String propName = eAssocDesc.qualifiedName().name();
-                        try
+                        PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
+                        if( STRING_MAP_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
-                            if( STRING_MAP_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
-                            {
-                                Map<String, String> vAssocState = (Map) vState
+                            Map<String, String> vAssocState = (Map) vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return STRING_MAP_TO_ENTITY_REF_MAP.map( 
vAssocState );
-                            }
-                            return Collections.EMPTY_MAP;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Collections.EMPTY_MAP;
+                            return STRING_MAP_TO_ENTITY_REF_MAP.map( 
vAssocState );
                         }
+                        return Collections.EMPTY_MAP;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Collections.EMPTY_MAP;
                     }
                 }
-            };
+            }
+        };
         return module.currentUnitOfWork().newEntityBuilderWithState(
             entityType, identity, props, assocs, manyAssocs, namedAssocs
         );
@@ -361,124 +368,124 @@ public class ValueToEntityMixin
     {
         Function<PropertyDescriptor, Object> props
             = new Function<PropertyDescriptor, Object>()
+        {
+            @Override
+            public Object map( PropertyDescriptor ePropDesc )
             {
-                @Override
-                public Object map( PropertyDescriptor ePropDesc )
+                String propName = ePropDesc.qualifiedName().name();
+                try
                 {
-                    String propName = ePropDesc.qualifiedName().name();
-                    try
-                    {
-                        PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
-                        return vState.propertyFor( vPropDesc.accessor() 
).get();
-                    }
-                    catch( IllegalArgumentException propNotFoundOnValue )
-                    {
-                        // Property not found on Value
-                        return null;
-                    }
+                    PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( propName );
+                    return vState.propertyFor( vPropDesc.accessor() ).get();
                 }
-            };
+                catch( IllegalArgumentException propNotFoundOnValue )
+                {
+                    // Property not found on Value
+                    return null;
+                }
+            }
+        };
         Function<AssociationDescriptor, EntityReference> assocs
             = new Function<AssociationDescriptor, EntityReference>()
+        {
+            @Override
+            public EntityReference map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public EntityReference map( AssociationDescriptor eAssocDesc )
+                String assocName = eAssocDesc.qualifiedName().name();
+                try
                 {
-                    String assocName = eAssocDesc.qualifiedName().name();
+                    AssociationDescriptor vAssocDesc = 
vStateDesc.getAssociationByName( assocName );
+                    Object assocEntity = vState.associationFor( 
vAssocDesc.accessor() ).get();
+                    return assocEntity == null ? null : 
EntityReference.entityReferenceFor( assocEntity );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Association not found on Value, find Property<String> 
and convert to Association
                     try
                     {
-                        AssociationDescriptor vAssocDesc = 
vStateDesc.getAssociationByName( assocName );
-                        Object assocEntity = vState.associationFor( 
vAssocDesc.accessor() ).get();
-                        return assocEntity == null ? null : 
EntityReference.entityReferenceFor( assocEntity );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Association not found on Value, find 
Property<String> and convert to Association
-                        try
-                        {
-                            PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( assocName );
-                            if( STRING_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
-                            {
-                                String assocId = (String) vState.propertyFor( 
vPropDesc.accessor() ).get();
-                                return assocId == null ? null : 
EntityReference.parseEntityReference( assocId );
-                            }
-                            return null;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
+                        PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( assocName );
+                        if( STRING_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
                         {
-                            return null;
+                            String assocId = (String) vState.propertyFor( 
vPropDesc.accessor() ).get();
+                            return assocId == null ? null : 
EntityReference.parseEntityReference( assocId );
                         }
+                        return null;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return null;
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocs
             = new Function<AssociationDescriptor, Iterable<EntityReference>>()
+        {
+            @Override
+            public Iterable<EntityReference> map( AssociationDescriptor 
eAssocDesc )
             {
-                @Override
-                public Iterable<EntityReference> map( AssociationDescriptor 
eAssocDesc )
+                String assocName = eAssocDesc.qualifiedName().name();
+                try
                 {
-                    String assocName = eAssocDesc.qualifiedName().name();
+                    AssociationDescriptor vAssocDesc = 
vStateDesc.getManyAssociationByName( assocName );
+                    ManyAssociation<Object> vManyAssoc = 
vState.manyAssociationFor( vAssocDesc.accessor() );
+                    return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( vManyAssoc );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // ManyAssociation not found on Value, find List<String> 
and convert to ManyAssociation
                     try
                     {
-                        AssociationDescriptor vAssocDesc = 
vStateDesc.getManyAssociationByName( assocName );
-                        ManyAssociation<Object> vManyAssoc = 
vState.manyAssociationFor( vAssocDesc.accessor() );
-                        return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( 
vManyAssoc );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // ManyAssociation not found on Value, find 
List<String> and convert to ManyAssociation
-                        try
+                        PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( assocName );
+                        if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( assocName );
-                            if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
-                            {
-                                Collection<String> vAssocState = (Collection) 
vState
+                            Collection<String> vAssocState = (Collection) 
vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return 
STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
-                            }
-                            return Iterables.empty();
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Iterables.empty();
+                            return STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( 
vAssocState );
                         }
+                        return Iterables.empty();
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Iterables.empty();
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Map<String, EntityReference>> 
namedAssocs
             = new Function<AssociationDescriptor, Map<String, 
EntityReference>>()
+        {
+            @Override
+            public Map<String, EntityReference> map( AssociationDescriptor 
eAssocDesc )
             {
-                @Override
-                public Map<String, EntityReference> map( AssociationDescriptor 
eAssocDesc )
+                String assocName = eAssocDesc.qualifiedName().name();
+                try
                 {
-                    String assocName = eAssocDesc.qualifiedName().name();
+                    AssociationDescriptor vAssocDesc = 
vStateDesc.getNamedAssociationByName( assocName );
+                    NamedAssociation<Object> vAssocState = 
vState.namedAssociationFor( vAssocDesc.accessor() );
+                    return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Find Map<String,String> Property and convert to 
NamedAssociation
                     try
                     {
-                        AssociationDescriptor vAssocDesc = 
vStateDesc.getNamedAssociationByName( assocName );
-                        NamedAssociation<Object> vAssocState = 
vState.namedAssociationFor( vAssocDesc.accessor() );
-                        return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState 
);
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find Map<String,String> Property and convert to 
NamedAssociation
-                        try
+                        PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( assocName );
+                        if( STRING_MAP_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = 
vStateDesc.findPropertyModelByName( assocName );
-                            if( STRING_MAP_TYPE_SPEC.satisfiedBy( 
vPropDesc.valueType() ) )
-                            {
-                                Map<String, String> vAssocState = (Map) vState
+                            Map<String, String> vAssocState = (Map) vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return STRING_MAP_TO_ENTITY_REF_MAP.map( 
vAssocState );
-                            }
-                            return Collections.EMPTY_MAP;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Collections.EMPTY_MAP;
+                            return STRING_MAP_TO_ENTITY_REF_MAP.map( 
vAssocState );
                         }
+                        return Collections.EMPTY_MAP;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Collections.EMPTY_MAP;
                     }
                 }
-            };
+            }
+        };
         return module.currentUnitOfWork().newEntityBuilderWithState(
             entityType, identity, props, assocs, manyAssocs, namedAssocs
         );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
----------------------------------------------------------------------
diff --git 
a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java 
b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
index 5052055..14df2ee 100644
--- 
a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
+++ 
b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
@@ -32,15 +32,24 @@ import static 
org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation.Propagation.
 
 /**
  * Scheduler.
- *
+ * <p>
  * This is the only interface you should use in your application for 
scheduling tasks.
- *
+ * </p>
+ * <p>
  * See {@link SchedulerConfiguration} for configuration properties.
+ * </p>
+ * <p>
  * See in {@link SchedulerAssembler} how to assemble a {@link Scheduler} and 
optional {@link Timeline}.
- *
+ * </p>
+ * <p>
  * By default, a {@link Schedule} is not durable. In other words, it do not 
survive an {@link Application} restart.
+ * </p>
+ * <p>
  * To make a {@link Schedule} durable, set it's durable property to true once 
its scheduled.
+ * </p>
+ * <p>
  * Durable {@link Schedule}s that have no future run are removed by {@code 
SchedulerGarbageCollector} (not implemented?).
+ * </p>
  */
 @Concerns( UnitOfWorkConcern.class )
 public interface Scheduler

Reply via email to