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 10:13:49 UTC
[1/6] zest-qi4j git commit: Introduced ModuleSpi interface as an
injectable entry point for primarily extensions. Reduced ModuleInstance use
to ModuleSpi as much as possible. Provided a lot more information in
EntityTypeNotFoundException, about which en
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
[4/6] zest-qi4j git commit: Merge remote-tracking branch
'origin/develop' into develop
Posted by ni...@apache.org.
Merge remote-tracking branch 'origin/develop' into develop
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/8630305f
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/8630305f
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/8630305f
Branch: refs/heads/develop
Commit: 8630305f0c3af818bc8c35a06b1946c21bb77cbc
Parents: 205cbe9 ac7d88a
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 24 22:51:55 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 24 22:51:55 2015 +0800
----------------------------------------------------------------------
README.txt | 40 ++--
build.gradle | 193 ++++++++++++++-----
.../qi4j/spi/value/ValueSerializerAdapter.java | 2 +-
.../org/qi4j/entitystore/leveldb/package.html | 2 +-
.../rest/server/api/ContextResource.java | 9 +-
.../java/org/qi4j/library/servlet/package.html | 4 +-
.../src/docs/tutorials/howto-build-system.txt | 2 +-
src/bin-dist/NOTICE.txt | 5 +
src/bin-dist/README.txt | 50 +++++
9 files changed, 233 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
[5/6] zest-qi4j git commit: Clarifying error message.
Posted by ni...@apache.org.
Clarifying error message.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/3a089bc7
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/3a089bc7
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/3a089bc7
Branch: refs/heads/develop
Commit: 3a089bc79a1ecc59b741388e9f78768d8ec12404
Parents: 8630305
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu Jun 25 15:53:04 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu Jun 25 15:53:04 2015 +0800
----------------------------------------------------------------------
.../main/java/org/qi4j/runtime/injection/DependencyModel.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3a089bc7/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
index b01f799..a01d061 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
@@ -293,9 +293,14 @@ public final class DependencyModel
}
if( injectedValue == null && !optional )
{
+ String simpleName = injectionAnnotation.annotationType().getSimpleName();
String message = "[Module " + context.module().name() + "] Non-optional @" +
- injectionAnnotation.annotationType().getSimpleName() + " " + injectionType.toString() +
+ simpleName + " " + injectionType.toString() +
" was null in " + injectedClass.getName();
+ if( simpleName.toLowerCase().contains( "service" ) )
+ {
+ message = message + ". Did you mean the @Service injection scope?";
+ }
throw new ConstructionException( message );
}
return getInjectedValue( injectedValue );
[3/6] zest-qi4j git commit: SchedulerMixin didn't shut down properly.
Posted by ni...@apache.org.
SchedulerMixin didn't shut down properly.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/205cbe99
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/205cbe99
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/205cbe99
Branch: refs/heads/develop
Commit: 205cbe994016555300846f0e8dd042fc82e8c92b
Parents: 0b9b655
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 24 22:21:58 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 24 22:21:58 2015 +0800
----------------------------------------------------------------------
.../java/org/qi4j/library/scheduler/SchedulerMixin.java | 9 +++++++++
1 file changed, 9 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/205cbe99/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
index 02f3132..6650573 100644
--- a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
+++ b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
@@ -265,6 +265,15 @@ public class SchedulerMixin
public void passivateService()
throws Exception
{
+ managementExecutor.shutdown();
+ taskExecutor.shutdown();
+
+ managementExecutor.awaitTermination( 5, TimeUnit.SECONDS );
+ managementExecutor.shutdownNow();
+
+ taskExecutor.awaitTermination( 5, TimeUnit.SECONDS );
+ taskExecutor.shutdownNow();
+
LOGGER.debug( "Passivated" );
}
[6/6] zest-qi4j git commit: Merge remote-tracking branch
'origin/develop' into develop
Posted by ni...@apache.org.
Merge remote-tracking branch 'origin/develop' into develop
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/0189ec78
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/0189ec78
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/0189ec78
Branch: refs/heads/develop
Commit: 0189ec78ffa27543c04437810400e83a28f5910e
Parents: 3a089bc 4f2a0b0
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu Jun 25 10:13:41 2015 +0200
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu Jun 25 10:13:41 2015 +0200
----------------------------------------------------------------------
build.gradle | 6 +++++-
libraries.gradle | 7 -------
2 files changed, 5 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
[2/6] zest-qi4j git commit: Introduced ModuleSpi interface as an
injectable entry point for primarily extensions. Reduced ModuleInstance use
to ModuleSpi as much as possible. Provided a lot more information in
EntityTypeNotFoundException, about which en
Posted by ni...@apache.org.
Introduced ModuleSpi interface as an injectable entry point for primarily extensions.
Reduced ModuleInstance use to ModuleSpi as much as possible.
Provided a lot more information in EntityTypeNotFoundException, about which entities that are visible and from which module it was being accessed.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/0b9b6555
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/0b9b6555
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/0b9b6555
Branch: refs/heads/develop
Commit: 0b9b6555558ff0fc90e221fa44fba0f2bdd3d0c9
Parents: 5e2b139
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 24 21:56:43 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 24 21:56:43 2015 +0800
----------------------------------------------------------------------
.../java/org/qi4j/api/structure/Module.java | 4 +
.../unitofwork/EntityTypeNotFoundException.java | 28 +-
.../java/org/qi4j/runtime/Qi4jRuntimeImpl.java | 13 +-
.../composite/AbstractModifierModel.java | 6 +-
.../runtime/composite/CompositeMethodModel.java | 10 +-
.../composite/CompositeMethodsModel.java | 4 +-
.../qi4j/runtime/composite/CompositeModel.java | 4 +-
.../qi4j/runtime/composite/ConcernsModel.java | 4 +-
.../runtime/composite/SideEffectsModel.java | 4 +-
.../composite/TransientBuilderInstance.java | 2 +-
.../runtime/composite/TransientInstance.java | 14 +-
.../qi4j/runtime/composite/TransientModel.java | 4 +-
.../org/qi4j/runtime/entity/EntityInstance.java | 8 +-
.../org/qi4j/runtime/entity/EntityModel.java | 6 +-
.../qi4j/runtime/injection/DependencyModel.java | 11 +-
.../runtime/injection/InjectedFieldModel.java | 4 +-
.../runtime/injection/InjectionContext.java | 11 +-
.../StructureInjectionProviderFactory.java | 12 +-
.../provider/UsesInjectionProviderFactory.java | 3 +-
.../qi4j/runtime/structure/LayerInstance.java | 42 ++-
.../org/qi4j/runtime/structure/ModelModule.java | 107 ------
.../qi4j/runtime/structure/ModuleInstance.java | 83 ++++-
.../runtime/structure/ModuleUnitOfWork.java | 41 ++-
.../org/qi4j/runtime/structure/TypeLookup.java | 176 +++++-----
.../runtime/structure/UsedLayersInstance.java | 29 +-
.../unitofwork/EntityBuilderInstance.java | 2 +-
.../runtime/unitofwork/UnitOfWorkInstance.java | 12 +-
.../runtime/value/ValueBuilderInstance.java | 2 +-
.../value/ValueBuilderWithPrototype.java | 2 +-
.../runtime/value/ValueBuilderWithState.java | 2 +-
.../org/qi4j/runtime/value/ValueInstance.java | 18 +-
.../java/org/qi4j/runtime/value/ValueModel.java | 4 +-
.../qi4j/runtime/value/ValueStateInstance.java | 2 +-
.../spi/src/main/java/org/qi4j/spi/Qi4jSPI.java | 7 +
.../helpers/JSONMapEntityStoreMixin.java | 15 +-
.../helpers/MapEntityStoreMixin.java | 32 +-
.../java/org/qi4j/spi/module/ModelModule.java | 124 +++++++
.../java/org/qi4j/spi/module/ModuleSpi.java | 30 ++
.../prefs/PreferencesEntityStoreMixin.java | 26 +-
.../entitystore/sql/SQLEntityStoreMixin.java | 15 +-
.../conversion/values/ValueToEntityMixin.java | 335 ++++++++++---------
.../org/qi4j/library/scheduler/Scheduler.java | 15 +-
42 files changed, 764 insertions(+), 509 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/api/src/main/java/org/qi4j/api/structure/Module.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/structure/Module.java b/core/api/src/main/java/org/qi4j/api/structure/Module.java
index 7360f96..47ffab8 100644
--- a/core/api/src/main/java/org/qi4j/api/structure/Module.java
+++ b/core/api/src/main/java/org/qi4j/api/structure/Module.java
@@ -26,6 +26,9 @@ import org.qi4j.api.service.ServiceFinder;
import org.qi4j.api.unitofwork.UnitOfWorkFactory;
import org.qi4j.api.value.ValueBuilderFactory;
import org.qi4j.api.value.ValueDescriptor;
+import org.qi4j.functional.Function;
+import org.qi4j.functional.Visitable;
+import org.qi4j.functional.Visitor;
/**
* API for interacting with a Module. Instances
@@ -76,4 +79,5 @@ public interface Module
* @return the descriptor for a value composite or null if the class could not be found or the value composite is not visible
*/
ValueDescriptor valueDescriptor( String typeName );
+
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java b/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
index 311da62..5f51e65 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
@@ -15,6 +15,10 @@
*/
package org.qi4j.api.unitofwork;
+import org.qi4j.functional.Function;
+
+import static org.qi4j.functional.Iterables.fold;
+
/**
* Qi4j exception to be thrown in case that an entity composite
* was not found during a lookup call.
@@ -24,12 +28,32 @@ public class EntityTypeNotFoundException
{
private final String compositeType;
- public EntityTypeNotFoundException( String entityType )
+ public EntityTypeNotFoundException( String entityType, String moduleName, Iterable<String> visibility )
{
- super("Could not find an EntityComposite of type " + entityType);
+ super( "Could not find an EntityComposite of type " + entityType + " in module [" + moduleName + "].\n" +
+ "\tThe following entity types are visible:\n" + join(visibility) );
this.compositeType = entityType;
}
+ private static String join( Iterable<String> visibility )
+ {
+ return fold( new Function<String, String>()
+ {
+ StringBuilder result;
+ {
+ result = new StringBuilder();
+ }
+
+ @Override
+ public String map( String type )
+ {
+ result.append( type );
+ result.append( "\n" );
+ return result.toString();
+ }
+ }, visibility );
+ }
+
public String compositeType()
{
return compositeType;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
index 23ba27b..6869dae 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
@@ -15,7 +15,6 @@ package org.qi4j.runtime;
import java.lang.reflect.InvocationHandler;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.Map;
import org.qi4j.api.Qi4j;
import org.qi4j.api.association.AbstractAssociation;
@@ -33,11 +32,10 @@ import org.qi4j.api.composite.CompositeInstance;
import org.qi4j.api.composite.ModelDescriptor;
import org.qi4j.api.composite.TransientComposite;
import org.qi4j.api.composite.TransientDescriptor;
-import org.qi4j.api.entity.EntityBuilder;
import org.qi4j.api.entity.EntityComposite;
import org.qi4j.api.entity.EntityDescriptor;
import org.qi4j.api.entity.EntityReference;
-import org.qi4j.api.entity.Identity;
+import org.qi4j.api.object.ObjectDescriptor;
import org.qi4j.api.property.Property;
import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.api.property.PropertyWrapper;
@@ -46,35 +44,31 @@ import org.qi4j.api.service.ServiceComposite;
import org.qi4j.api.service.ServiceDescriptor;
import org.qi4j.api.service.ServiceReference;
import org.qi4j.api.structure.Module;
-import org.qi4j.api.unitofwork.NoSuchEntityException;
import org.qi4j.api.unitofwork.UnitOfWork;
-import org.qi4j.api.value.ValueBuilder;
import org.qi4j.api.value.ValueComposite;
import org.qi4j.api.value.ValueDescriptor;
import org.qi4j.bootstrap.ApplicationAssemblyFactory;
import org.qi4j.bootstrap.ApplicationModelFactory;
import org.qi4j.bootstrap.Qi4jRuntime;
-import org.qi4j.functional.Function;
import org.qi4j.runtime.association.AbstractAssociationInstance;
import org.qi4j.runtime.association.AssociationInstance;
import org.qi4j.runtime.association.ManyAssociationInstance;
import org.qi4j.runtime.association.NamedAssociationInstance;
import org.qi4j.runtime.bootstrap.ApplicationAssemblyFactoryImpl;
import org.qi4j.runtime.bootstrap.ApplicationModelFactoryImpl;
-import org.qi4j.runtime.composite.FunctionStateResolver;
import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
import org.qi4j.runtime.composite.TransientInstance;
import org.qi4j.runtime.entity.EntityInstance;
-import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.runtime.property.PropertyInstance;
import org.qi4j.runtime.service.ImportedServiceReferenceInstance;
import org.qi4j.runtime.service.ServiceInstance;
import org.qi4j.runtime.service.ServiceReferenceInstance;
+import org.qi4j.runtime.structure.ModuleInstance;
import org.qi4j.runtime.structure.ModuleUnitOfWork;
import org.qi4j.runtime.value.ValueInstance;
import org.qi4j.spi.Qi4jSPI;
import org.qi4j.spi.entity.EntityState;
-import org.qi4j.spi.entity.NamedAssociationState;
+import org.qi4j.spi.module.ModelModule;
import static java.lang.reflect.Proxy.getInvocationHandler;
import static org.qi4j.runtime.composite.TransientInstance.compositeInstanceOf;
@@ -364,5 +358,4 @@ public final class Qi4jRuntimeImpl
{
return ( (NamedAssociationInstance) assoc ).getEntityReferences();
}
-
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
index 09499cb..b457f1d 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
@@ -25,7 +25,7 @@ import org.qi4j.runtime.injection.DependencyModel;
import org.qi4j.runtime.injection.InjectedFieldsModel;
import org.qi4j.runtime.injection.InjectedMethodsModel;
import org.qi4j.runtime.injection.InjectionContext;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
import static org.qi4j.api.util.Classes.RAW_CLASS;
import static org.qi4j.api.util.Classes.interfacesOf;
@@ -57,7 +57,7 @@ public abstract class AbstractModifierModel
injectedFieldsModel = new InjectedFieldsModel( declaredModifierClass );
injectedMethodsModel = new InjectedMethodsModel( declaredModifierClass );
Class<Class<?>> componentType = (Class<Class<?>>) Class.class.cast( Class.class );
- nextInterfaces = toArray( componentType, unique( map( RAW_CLASS, interfacesOf( declaredModifierClass ) ) ));
+ nextInterfaces = toArray( componentType, unique( map( RAW_CLASS, interfacesOf( declaredModifierClass ) ) ) );
}
public Class<?> modifierClass()
@@ -96,7 +96,7 @@ public abstract class AbstractModifierModel
}
// Context
- public InvocationHandler newInstance( ModuleInstance moduleInstance,
+ public InvocationHandler newInstance( ModuleSpi moduleInstance,
InvocationHandler next,
ProxyReferenceInvocationHandler proxyHandler,
Method method
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
index e925b9d..3162130 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
@@ -29,7 +29,7 @@ import org.qi4j.functional.HierarchicalVisitor;
import org.qi4j.functional.VisitableHierarchy;
import org.qi4j.runtime.injection.Dependencies;
import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
import static org.qi4j.functional.Iterables.filter;
import static org.qi4j.functional.Iterables.flattenIterables;
@@ -101,7 +101,7 @@ public final class CompositeMethodModel
}
// Context
- public Object invoke( Object composite, Object[] params, MixinsInstance mixins, ModuleInstance moduleInstance )
+ public Object invoke( Object composite, Object[] params, MixinsInstance mixins, ModuleSpi moduleInstance )
throws Throwable
{
constraintsInstance.checkValid( composite, method, params );
@@ -117,7 +117,7 @@ public final class CompositeMethodModel
}
}
- private CompositeMethodInstance getInstance( ModuleInstance moduleInstance )
+ private CompositeMethodInstance getInstance( ModuleSpi moduleInstance )
{
CompositeMethodInstance methodInstance = instancePool.obtainInstance();
if( methodInstance == null )
@@ -128,7 +128,7 @@ public final class CompositeMethodModel
return methodInstance;
}
- private CompositeMethodInstance newCompositeMethodInstance( ModuleInstance moduleInstance )
+ private CompositeMethodInstance newCompositeMethodInstance( ModuleSpi moduleInstance )
throws ConstructionException
{
FragmentInvocationHandler mixinInvocationHandler = mixins.newInvocationHandler( method );
@@ -197,7 +197,7 @@ public final class CompositeMethodModel
public Iterable<Method> invocationsFor( Class<?> mixinClass )
{
- return mixins.invocationsFor(mixinClass);
+ return mixins.invocationsFor( mixinClass );
}
public class CompositeMethodAnnotatedElement
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
index f18d222..bf0c113 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
@@ -22,7 +22,7 @@ import org.qi4j.functional.Iterables;
import org.qi4j.functional.VisitableHierarchy;
import org.qi4j.runtime.injection.Dependencies;
import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
import static org.qi4j.functional.Iterables.map;
@@ -51,7 +51,7 @@ public final class CompositeMethodsModel
Object proxy,
Method method,
Object[] args,
- ModuleInstance moduleInstance
+ ModuleSpi moduleInstance
)
throws Throwable
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
index b7f0e6c..a6ea122 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
@@ -25,12 +25,14 @@ import org.qi4j.api.common.Visibility;
import org.qi4j.api.composite.Composite;
import org.qi4j.api.composite.CompositeDescriptor;
import org.qi4j.api.composite.InvalidCompositeException;
+import org.qi4j.api.structure.Module;
import org.qi4j.functional.HierarchicalVisitor;
import org.qi4j.functional.Iterables;
import org.qi4j.functional.VisitableHierarchy;
import org.qi4j.runtime.injection.Dependencies;
import org.qi4j.runtime.injection.DependencyModel;
import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
import static java.lang.reflect.Proxy.newProxyInstance;
import static org.qi4j.functional.Iterables.first;
@@ -204,7 +206,7 @@ public abstract class CompositeModel
Object proxy,
Method method,
Object[] args,
- ModuleInstance moduleInstance
+ ModuleSpi moduleInstance
)
throws Throwable
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
index 9488c4b..74882f7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
@@ -24,7 +24,7 @@ import org.qi4j.functional.Iterables;
import org.qi4j.functional.VisitableHierarchy;
import org.qi4j.runtime.injection.Dependencies;
import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
/**
* JAVADOC
@@ -48,7 +48,7 @@ public final class ConcernsModel
}
// Context
- public ConcernsInstance newInstance( Method method, ModuleInstance moduleInstance,
+ public ConcernsInstance newInstance( Method method, ModuleSpi moduleInstance,
FragmentInvocationHandler mixinInvocationHandler
)
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
index 11018ff..10ae779 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
@@ -25,7 +25,7 @@ import org.qi4j.functional.Iterables;
import org.qi4j.functional.VisitableHierarchy;
import org.qi4j.runtime.injection.Dependencies;
import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
/**
* JAVADOC
@@ -49,7 +49,7 @@ public final class SideEffectsModel
}
// Context
- public SideEffectsInstance newInstance( Method method, ModuleInstance moduleInstance, InvocationHandler invoker )
+ public SideEffectsInstance newInstance( Method method, ModuleSpi moduleInstance, InvocationHandler invoker )
{
ProxyReferenceInvocationHandler proxyHandler = new ProxyReferenceInvocationHandler();
SideEffectInvocationHandlerResult result = new SideEffectInvocationHandlerResult();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
index 0bb343f..ffb3fc6 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
@@ -20,7 +20,7 @@ import org.qi4j.api.composite.TransientBuilder;
import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.runtime.property.PropertyInfo;
import org.qi4j.runtime.property.PropertyInstance;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
/**
* JAVADOC
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
index 811fce7..78bc5a2 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
@@ -24,7 +24,10 @@ import org.qi4j.api.Qi4j;
import org.qi4j.api.composite.Composite;
import org.qi4j.api.composite.CompositeInstance;
import org.qi4j.api.property.StateHolder;
+import org.qi4j.api.structure.Layer;
+import org.qi4j.api.structure.Module;
import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
/**
* InvocationHandler for proxy objects.
@@ -42,10 +45,10 @@ public class TransientInstance
protected final Object[] mixins;
protected StateHolder state;
protected final CompositeModel compositeModel;
- private final ModuleInstance moduleInstance;
+ private final ModuleSpi moduleInstance;
public TransientInstance( CompositeModel compositeModel,
- ModuleInstance moduleInstance,
+ ModuleSpi moduleInstance,
Object[] mixins,
StateHolder state
)
@@ -105,11 +108,16 @@ public class TransientInstance
}
@Override
- public ModuleInstance module()
+ public Module module()
{
return moduleInstance;
}
+ public Layer layer()
+ {
+ return ( (ModuleInstance) moduleInstance ).layerInstance();
+ }
+
@Override
public StateHolder state()
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
index c5ffe79..968fa5e 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
@@ -20,7 +20,7 @@ import org.qi4j.api.composite.TransientDescriptor;
import org.qi4j.api.constraint.ConstraintViolationException;
import org.qi4j.runtime.injection.InjectionContext;
import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
/**
* Model for Transient Composites
@@ -39,7 +39,7 @@ public class TransientModel
super( types, visibility, metaInfo, mixinsModel, stateModel, compositeMethodsModel );
}
- public TransientInstance newInstance( ModuleInstance moduleInstance,
+ public TransientInstance newInstance( ModuleSpi moduleInstance,
UsesInstance uses,
TransientStateInstance state
)
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
index 6e7e513..86affb7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
@@ -31,6 +31,7 @@ import org.qi4j.api.entity.EntityComposite;
import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.entity.Identity;
import org.qi4j.api.entity.LifecycleException;
+import org.qi4j.api.structure.Module;
import org.qi4j.api.unitofwork.NoSuchEntityException;
import org.qi4j.api.unitofwork.UnitOfWork;
import org.qi4j.api.unitofwork.UnitOfWorkException;
@@ -40,6 +41,7 @@ import org.qi4j.runtime.structure.ModuleInstance;
import org.qi4j.runtime.structure.ModuleUnitOfWork;
import org.qi4j.spi.entity.EntityState;
import org.qi4j.spi.entity.EntityStatus;
+import org.qi4j.spi.module.ModuleSpi;
/**
* Entity instance
@@ -54,7 +56,7 @@ public final class EntityInstance
private final EntityComposite proxy;
private final ModuleUnitOfWork uow;
- private final ModuleInstance moduleInstance;
+ private final ModuleSpi moduleInstance;
private final EntityModel entityModel;
private final EntityReference identity;
private final EntityState entityState;
@@ -63,7 +65,7 @@ public final class EntityInstance
private EntityStateInstance state;
public EntityInstance( ModuleUnitOfWork uow,
- ModuleInstance moduleInstance,
+ ModuleSpi moduleInstance,
EntityModel entityModel,
EntityState entityState
)
@@ -134,7 +136,7 @@ public final class EntityInstance
}
@Override
- public ModuleInstance module()
+ public ModuleSpi module()
{
return moduleInstance;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 77103f9..3563115 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
@@ -33,12 +33,12 @@ import org.qi4j.functional.Iterables;
import org.qi4j.runtime.composite.CompositeMethodsModel;
import org.qi4j.runtime.composite.CompositeModel;
import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
import org.qi4j.runtime.structure.ModuleUnitOfWork;
import org.qi4j.spi.entity.EntityState;
import org.qi4j.spi.entitystore.EntityAlreadyExistsException;
import org.qi4j.spi.entitystore.EntityStoreException;
import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.module.ModuleSpi;
import static org.qi4j.functional.Iterables.filter;
import static org.qi4j.functional.Iterables.first;
@@ -96,7 +96,7 @@ public final class EntityModel
return (EntityStateModel) super.state();
}
- public EntityInstance newInstance( ModuleUnitOfWork uow, ModuleInstance moduleInstance, EntityState state )
+ public EntityInstance newInstance( ModuleUnitOfWork uow, ModuleSpi moduleInstance, EntityState state )
{
EntityInstance instance = new EntityInstance( uow, moduleInstance, this, state );
return instance;
@@ -140,7 +140,7 @@ public final class EntityModel
}
}
- public void initState( ModuleInstance module, EntityState entityState )
+ public void initState( ModuleSpi module, EntityState entityState )
{
// Set new properties to default value
for( PropertyModel propertyDescriptor : state().properties() )
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
index bfc5317..b01f799 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
@@ -287,16 +287,15 @@ public final class DependencyModel
ex = ex.getCause();
}
- String message = "[Module " + context.module()
- .name() + "] InjectionProvider unable to resolve @" + injectionAnnotation.annotationType()
- .getSimpleName() + " " + injectionType.toString();
+ String message = "[Module " + context.module().name() + "] InjectionProvider unable to resolve @" +
+ injectionAnnotation.annotationType().getSimpleName() + " " + injectionType.toString();
throw new ConstructionException( message, ex );
}
if( injectedValue == null && !optional )
{
- String message = "[Module " + context.module()
- .name() + "] Non-optional @" + injectionAnnotation.annotationType()
- .getSimpleName() + " " + injectionType.toString() + " was null in " + injectedClass.getName();
+ String message = "[Module " + context.module().name() + "] Non-optional @" +
+ injectionAnnotation.annotationType().getSimpleName() + " " + injectionType.toString() +
+ " was null in " + injectedClass.getName();
throw new ConstructionException( message );
}
return getInjectedValue( injectedValue );
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
index 6b35f2a..bd51924 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
@@ -87,9 +87,7 @@ public final class InjectedFieldModel
{
TransientInstance handler = (TransientInstance) invocationHandler;
valueClassName = Classes.toString( handler.descriptor().types() )
- + " in [" + handler.module().name() + "] of [" + handler.module()
- .layerInstance()
- .name() + "]";
+ + " in [" + handler.module().name() + "] of [" + handler.layer().name() + "]";
}
else
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
index f9c1deb..b3c4981 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
@@ -19,13 +19,14 @@ import org.qi4j.api.property.StateHolder;
import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
import org.qi4j.runtime.composite.UsesInstance;
import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
/**
* JAVADOC
*/
public final class InjectionContext
{
- private final ModuleInstance moduleInstance;
+ private final ModuleSpi moduleInstance;
private CompositeInstance compositeInstance;
private UsesInstance uses;
private StateHolder state;
@@ -44,28 +45,28 @@ public final class InjectionContext
}
// For concerns and side-effects
- public InjectionContext( ModuleInstance moduleInstance, Object next, ProxyReferenceInvocationHandler proxyHandler )
+ public InjectionContext( ModuleSpi moduleInstance, Object next, ProxyReferenceInvocationHandler proxyHandler )
{
this.moduleInstance = moduleInstance;
this.next = next;
this.proxyHandler = proxyHandler;
}
- public InjectionContext( ModuleInstance moduleInstance, UsesInstance uses )
+ public InjectionContext( ModuleSpi moduleInstance, UsesInstance uses )
{
this.moduleInstance = moduleInstance;
this.uses = uses;
}
// For inner classes
- public InjectionContext( ModuleInstance moduleInstance, UsesInstance uses, Object instance )
+ public InjectionContext( ModuleSpi moduleInstance, UsesInstance uses, Object instance )
{
this.moduleInstance = moduleInstance;
this.uses = uses;
this.instance = instance;
}
- public ModuleInstance module()
+ public ModuleSpi module()
{
return moduleInstance;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
index dd461e6..6ad4e30 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
@@ -34,6 +34,8 @@ import org.qi4j.runtime.injection.InjectionContext;
import org.qi4j.runtime.injection.InjectionProvider;
import org.qi4j.runtime.injection.InjectionProviderFactory;
import org.qi4j.runtime.model.Resolution;
+import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
public final class StructureInjectionProviderFactory
implements InjectionProviderFactory
@@ -93,17 +95,21 @@ public final class StructureInjectionProviderFactory
{
return context.module();
}
+ else if( ModuleSpi.class.isAssignableFrom( clazz ) )
+ {
+ return context.module();
+ }
else if( Layer.class.isAssignableFrom( clazz ) )
{
- return context.module().layerInstance();
+ return (( ModuleInstance) context.module()).layerInstance();
}
else if( Application.class.isAssignableFrom( clazz ) )
{
- return context.module().layerInstance().applicationInstance();
+ return (( ModuleInstance) context.module()).layerInstance().applicationInstance();
}
else if( Qi4j.class.isAssignableFrom( clazz ) )
{
- return context.module().layerInstance().applicationInstance().runtime();
+ return (( ModuleInstance) context.module()).layerInstance().applicationInstance().runtime();
}
return null;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
index c0e5f3d..2069d07 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
@@ -21,6 +21,7 @@ package org.qi4j.runtime.injection.provider;
import java.lang.reflect.Constructor;
import org.qi4j.api.composite.NoSuchTransientException;
import org.qi4j.api.object.NoSuchObjectException;
+import org.qi4j.api.structure.Module;
import org.qi4j.bootstrap.InvalidInjectionException;
import org.qi4j.runtime.composite.UsesInstance;
import org.qi4j.runtime.injection.DependencyModel;
@@ -71,7 +72,7 @@ public final class UsesInjectionProviderFactory
{
// No @Uses object provided
// Try instantiating a Transient or Object for the given type
- ModuleInstance moduleInstance = context.module();
+ Module moduleInstance = context.module();
try
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
index 9ed77bb..9e678e8 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
@@ -20,14 +20,15 @@ import org.qi4j.api.activation.ActivationEventListener;
import org.qi4j.api.activation.ActivationException;
import org.qi4j.api.activation.PassivationException;
import org.qi4j.api.common.Visibility;
+import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.object.ObjectDescriptor;
import org.qi4j.api.service.ServiceReference;
import org.qi4j.api.structure.Layer;
+import org.qi4j.api.value.ValueDescriptor;
import org.qi4j.functional.Function;
import org.qi4j.runtime.activation.ActivationDelegate;
-import org.qi4j.runtime.composite.TransientModel;
-import org.qi4j.runtime.entity.EntityModel;
-import org.qi4j.runtime.object.ObjectModel;
-import org.qi4j.runtime.value.ValueModel;
+import org.qi4j.spi.module.ModelModule;
import static org.qi4j.functional.Iterables.flattenIterables;
import static org.qi4j.functional.Iterables.map;
@@ -49,7 +50,8 @@ public class LayerInstance
public LayerInstance( LayerModel model,
ApplicationInstance applicationInstance,
- UsedLayersInstance usedLayersInstance )
+ UsedLayersInstance usedLayersInstance
+ )
{
// Constructor parameters
this.layerModel = model;
@@ -130,59 +132,55 @@ public class LayerInstance
return usedLayersInstance;
}
- /* package */ Iterable<ModelModule<ObjectModel>> visibleObjects( final Visibility visibility )
+ /* package */ Iterable<ModelModule<ObjectDescriptor>> visibleObjects( final Visibility visibility )
{
- return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ObjectModel>>>()
+ return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ObjectDescriptor>>>()
{
@Override
- public Iterable<ModelModule<ObjectModel>> map( ModuleInstance moduleInstance )
+ public Iterable<ModelModule<ObjectDescriptor>> map( ModuleInstance moduleInstance )
{
return moduleInstance.visibleObjects( visibility );
}
-
}, moduleInstances ) );
}
- /* package */ Iterable<ModelModule<TransientModel>> visibleTransients( final Visibility visibility )
+ /* package */ Iterable<ModelModule<TransientDescriptor>> visibleTransients( final Visibility visibility )
{
- return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<TransientModel>>>()
+ return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<TransientDescriptor>>>()
{
@Override
- public Iterable<ModelModule<TransientModel>> map( ModuleInstance moduleInstance )
+ public Iterable<ModelModule<TransientDescriptor>> map( ModuleInstance moduleInstance )
{
return moduleInstance.visibleTransients( visibility );
}
-
}, moduleInstances ) );
}
- /* package */ Iterable<ModelModule<EntityModel>> visibleEntities( final Visibility visibility )
+ /* package */ Iterable<ModelModule<EntityDescriptor>> visibleEntities( final Visibility visibility )
{
- return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<EntityModel>>>()
+ return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<EntityDescriptor>>>()
{
@Override
- public Iterable<ModelModule<EntityModel>> map( ModuleInstance moduleInstance )
+ public Iterable<ModelModule<EntityDescriptor>> map( ModuleInstance moduleInstance )
{
return moduleInstance.visibleEntities( visibility );
}
-
}, moduleInstances ) );
}
- /* package */ Iterable<ModelModule<ValueModel>> visibleValues( final Visibility visibility )
+ /* package */ Iterable<ModelModule<ValueDescriptor>> visibleValues( final Visibility visibility )
{
- return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ValueModel>>>()
+ return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ValueDescriptor>>>()
{
@Override
- public Iterable<ModelModule<ValueModel>> map( ModuleInstance moduleInstance )
+ public Iterable<ModelModule<ValueDescriptor>> map( ModuleInstance moduleInstance )
{
return moduleInstance.visibleValues( visibility );
}
-
}, moduleInstances ) );
}
@@ -196,7 +194,6 @@ public class LayerInstance
{
return moduleInstance.visibleServices( visibility );
}
-
}, moduleInstances ) );
}
@@ -212,5 +209,4 @@ public class LayerInstance
throw new IllegalArgumentException( "No such module:" + moduleName );
}
-
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
deleted file mode 100644
index dae30b9..0000000
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.qi4j.runtime.structure;
-
-import org.qi4j.api.composite.ModelDescriptor;
-import org.qi4j.functional.Function;
-
-/**
- * TODO
- */
-public class ModelModule<T extends ModelDescriptor>
-{
- public static <T extends ModelDescriptor> Function<T, ModelModule<T>> modelModuleFunction( final ModuleInstance 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 ModuleInstance module;
- private final T model;
-
- public ModelModule( ModuleInstance module, T model )
- {
- this.module = module;
- this.model = model;
- }
-
- public ModuleInstance 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/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
index c009c75..97addf3 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
@@ -50,6 +50,7 @@ import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.api.query.QueryBuilder;
import org.qi4j.api.query.QueryBuilderFactory;
import org.qi4j.api.service.NoSuchServiceException;
+import org.qi4j.api.service.ServiceDescriptor;
import org.qi4j.api.service.ServiceReference;
import org.qi4j.api.structure.Module;
import org.qi4j.api.unitofwork.UnitOfWork;
@@ -69,6 +70,7 @@ import org.qi4j.functional.Specification;
import org.qi4j.functional.Specifications;
import org.qi4j.runtime.activation.ActivationDelegate;
import org.qi4j.runtime.composite.FunctionStateResolver;
+import org.qi4j.runtime.composite.StateResolver;
import org.qi4j.runtime.composite.TransientBuilderInstance;
import org.qi4j.runtime.composite.TransientModel;
import org.qi4j.runtime.composite.TransientStateInstance;
@@ -88,7 +90,6 @@ import org.qi4j.runtime.service.ImportedServicesModel;
import org.qi4j.runtime.service.ServicesInstance;
import org.qi4j.runtime.service.ServicesModel;
import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
-import org.qi4j.runtime.composite.StateResolver;
import org.qi4j.runtime.value.ValueBuilderInstance;
import org.qi4j.runtime.value.ValueBuilderWithPrototype;
import org.qi4j.runtime.value.ValueBuilderWithState;
@@ -97,8 +98,13 @@ import org.qi4j.runtime.value.ValueModel;
import org.qi4j.runtime.value.ValuesModel;
import org.qi4j.spi.entitystore.EntityStore;
import org.qi4j.spi.metrics.MetricsProviderAdapter;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
import org.qi4j.valueserialization.orgjson.OrgJsonValueSerialization;
+import static org.qi4j.api.common.Visibility.application;
+import static org.qi4j.api.common.Visibility.layer;
+import static org.qi4j.api.common.Visibility.module;
import static org.qi4j.api.util.Classes.RAW_CLASS;
import static org.qi4j.api.util.Classes.modelTypeSpecification;
import static org.qi4j.functional.Iterables.cast;
@@ -113,7 +119,7 @@ import static org.qi4j.functional.Iterables.toList;
* Instance of a Qi4j Module. Contains the various composites for this Module.
*/
public class ModuleInstance
- implements Module, Activation
+ implements Module, ModuleSpi, Activation
{
// Constructor parameters
private final ModuleModel model;
@@ -139,7 +145,8 @@ public class ModuleInstance
@SuppressWarnings( "LeakingThisInConstructor" )
public ModuleInstance( ModuleModel moduleModel, LayerInstance layerInstance, TransientsModel transientsModel,
EntitiesModel entitiesModel, ObjectsModel objectsModel, ValuesModel valuesModel,
- ServicesModel servicesModel, ImportedServicesModel importedServicesModel )
+ ServicesModel servicesModel, ImportedServicesModel importedServicesModel
+ )
{
// Constructor parameters
model = moduleModel;
@@ -360,7 +367,8 @@ public class ModuleInstance
Function<PropertyDescriptor, Object> propertyFunction,
Function<AssociationDescriptor, EntityReference> associationFunction,
Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
- Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction )
+ Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction
+ )
{
NullArgumentException.validateNotNull( "propertyFunction", propertyFunction );
NullArgumentException.validateNotNull( "associationFunction", associationFunction );
@@ -383,9 +391,9 @@ public class ModuleInstance
private static class InitialStateResolver
implements StateResolver
{
- private final ModuleInstance module;
+ private final Module module;
- private InitialStateResolver( ModuleInstance module )
+ private InitialStateResolver( Module module )
{
this.module = module;
}
@@ -567,7 +575,6 @@ public class ModuleInstance
activation.deregisterActivationEventListener( listener );
}
-
// Other methods
/* package */ ModuleModel model()
{
@@ -624,7 +631,7 @@ public class ModuleInstance
return store;
}
- /* package */ IdentityGenerator identityGenerator()
+ public IdentityGenerator identityGenerator()
{
synchronized( this )
{
@@ -677,31 +684,31 @@ public class ModuleInstance
return metrics;
}
- Iterable<ModelModule<ObjectModel>> visibleObjects( Visibility visibility )
+ public Iterable<ModelModule<ObjectDescriptor>> visibleObjects( Visibility visibility )
{
- return map( ModelModule.<ObjectModel>modelModuleFunction( this ),
+ return map( ModelModule.<ObjectDescriptor>modelModuleFunction( this ),
filter( new VisibilitySpecification( visibility ), objects.models() ) );
}
- Iterable<ModelModule<TransientModel>> visibleTransients( Visibility visibility )
+ public Iterable<ModelModule<TransientDescriptor>> visibleTransients( Visibility visibility )
{
- return map( ModelModule.<TransientModel>modelModuleFunction( this ),
+ return map( ModelModule.<TransientDescriptor>modelModuleFunction( this ),
filter( new VisibilitySpecification( visibility ), transients.models() ) );
}
- Iterable<ModelModule<EntityModel>> visibleEntities( Visibility visibility )
+ public Iterable<ModelModule<EntityDescriptor>> visibleEntities( Visibility visibility )
{
- return map( ModelModule.<EntityModel>modelModuleFunction( this ),
+ return map( ModelModule.<EntityDescriptor>modelModuleFunction( this ),
filter( new VisibilitySpecification( visibility ), entities.models() ) );
}
- Iterable<ModelModule<ValueModel>> visibleValues( Visibility visibility )
+ public Iterable<ModelModule<ValueDescriptor>> visibleValues( Visibility visibility )
{
- return map( ModelModule.<ValueModel>modelModuleFunction( this ),
+ return map( ModelModule.<ValueDescriptor>modelModuleFunction( this ),
filter( new VisibilitySpecification( visibility ), values.models() ) );
}
- Iterable<ServiceReference<?>> visibleServices( Visibility visibility )
+ public Iterable<ServiceReference<?>> visibleServices( Visibility visibility )
{
return flatten( services.visibleServices( visibility ),
importedServices.visibleServices( visibility ) );
@@ -824,4 +831,46 @@ public class ModuleInstance
return clazz;
}
}
+
+ public Iterable<ModelModule<ValueDescriptor>> findVisibleValueTypes()
+ {
+ return flatten( visibleValues( Visibility.module ),
+ layerInstance().visibleValues( Visibility.layer ),
+ layerInstance().visibleValues( Visibility.application ),
+ layerInstance().usedLayersInstance().visibleValues()
+ );
+ }
+
+ public Iterable<ModelModule<EntityDescriptor>> findVisibleEntityTypes()
+ {
+ return flatten( visibleEntities( Visibility.module ),
+ layerInstance().visibleEntities( Visibility.layer ),
+ layerInstance().visibleEntities( Visibility.application ),
+ layerInstance().usedLayersInstance().visibleEntities()
+ );
+ }
+ public Iterable<ModelModule<TransientDescriptor>> findVisibleTransientTypes()
+ {
+ return flatten( visibleTransients( Visibility.module ),
+ layerInstance().visibleTransients( Visibility.layer ),
+ layerInstance().visibleTransients( Visibility.application ),
+ layerInstance().usedLayersInstance().visibleTransients()
+ );
+ }
+ public Iterable<ModelModule<ServiceDescriptor>> findVisibleServiceTypes()
+ {
+ return flatten( visibleServices( Visibility.module ),
+ layerInstance().visibleServices( Visibility.layer ),
+ layerInstance().visibleServices( Visibility.application ),
+ layerInstance().usedLayersInstance().visibleServices()
+ );
+ }
+ public Iterable<ModelModule<ObjectDescriptor>> findVisibleObjectTypes()
+ {
+ return flatten( visibleObjects( Visibility.module ),
+ layerInstance().visibleObjects( Visibility.layer ),
+ layerInstance().visibleObjects( Visibility.application ),
+ layerInstance().usedLayersInstance().visibleObjects()
+ );
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
index a4b6b06..77aebc5 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
@@ -61,10 +61,12 @@ import org.qi4j.runtime.property.PropertyModel;
import org.qi4j.runtime.unitofwork.EntityBuilderInstance;
import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
import org.qi4j.runtime.value.ValueInstance;
+import org.qi4j.spi.Qi4jSPI;
import org.qi4j.spi.entity.EntityState;
import org.qi4j.spi.entity.EntityStatus;
import org.qi4j.spi.entity.NamedAssociationState;
import org.qi4j.spi.entitystore.EntityStore;
+import org.qi4j.spi.module.ModelModule;
import org.qi4j.spi.query.EntityFinder;
import org.qi4j.spi.query.EntityFinderException;
import org.qi4j.spi.query.QueryBuilderSPI;
@@ -72,6 +74,7 @@ import org.qi4j.spi.query.QuerySource;
import static org.qi4j.api.entity.EntityReference.parseEntityReference;
import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
/**
* JAVADOC
@@ -94,17 +97,17 @@ public class ModuleUnitOfWork
}
private final UnitOfWorkInstance uow;
- private final ModuleInstance moduleInstance;
+ private final ModuleInstance module;
- ModuleUnitOfWork( ModuleInstance moduleInstance, UnitOfWorkInstance uow )
+ ModuleUnitOfWork( ModuleInstance module, UnitOfWorkInstance uow )
{
- this.moduleInstance = moduleInstance;
+ this.module = module;
this.uow = uow;
}
public ModuleInstance module()
{
- return moduleInstance;
+ return module;
}
public UnitOfWorkInstance instance()
@@ -115,7 +118,7 @@ public class ModuleUnitOfWork
@Override
public UnitOfWorkFactory unitOfWorkFactory()
{
- return moduleInstance;
+ return module;
}
@Override
@@ -176,11 +179,15 @@ public class ModuleUnitOfWork
public <T> EntityBuilder<T> newEntityBuilder( Class<T> type, String identity )
throws EntityTypeNotFoundException
{
- ModelModule<EntityModel> model = moduleInstance.typeLookup().lookupEntityModel( type );
+ ModelModule<EntityModel> model = module.typeLookup().lookupEntityModel( type );
if( model == null )
{
- throw new EntityTypeNotFoundException( type.getName() );
+ throw new EntityTypeNotFoundException( type.getName(),
+ module.name(),
+ map( ModelModule.toStringFunction,
+ module.findVisibleEntityTypes()
+ ) );
}
EntityStore entityStore = model.module().entityStore();
@@ -199,7 +206,7 @@ public class ModuleUnitOfWork
builder = new EntityBuilderInstance<>( model,
this,
- uow.getEntityStoreUnitOfWork( entityStore, moduleInstance ),
+ uow.getEntityStoreUnitOfWork( entityStore, module ),
identity );
return builder;
}
@@ -236,11 +243,15 @@ public class ModuleUnitOfWork
NullArgumentException.validateNotNull( "manyAssociationFunction", manyAssociationFunction );
NullArgumentException.validateNotNull( "namedAssociationFunction", namedAssociationFunction );
- ModelModule<EntityModel> model = moduleInstance.typeLookup().lookupEntityModel( type );
+ ModelModule<EntityModel> model = module.typeLookup().lookupEntityModel( type );
if( model == null )
{
- throw new EntityTypeNotFoundException( type.getName() );
+ throw new EntityTypeNotFoundException( type.getName(),
+ module.name(),
+ map( ModelModule.toStringFunction,
+ module.findVisibleEntityTypes()
+ ) );
}
EntityStore entityStore = model.module().entityStore();
@@ -268,7 +279,7 @@ public class ModuleUnitOfWork
return new EntityBuilderInstance<>( model,
this,
- uow.getEntityStoreUnitOfWork( entityStore, moduleInstance ),
+ uow.getEntityStoreUnitOfWork( entityStore, module ),
identity,
stateResolver );
}
@@ -277,11 +288,15 @@ public class ModuleUnitOfWork
public <T> T get( Class<T> type, String identity )
throws EntityTypeNotFoundException, NoSuchEntityException
{
- Iterable<ModelModule<EntityModel>> models = moduleInstance.typeLookup().lookupEntityModels( type );
+ Iterable<ModelModule<EntityModel>> models = module.typeLookup().lookupEntityModels( type );
if( !models.iterator().hasNext() )
{
- throw new EntityTypeNotFoundException( type.getName() );
+ throw new EntityTypeNotFoundException( type.getName(),
+ module.name(),
+ map( ModelModule.toStringFunction,
+ module.findVisibleEntityTypes()
+ ) );
}
return uow.get( parseEntityReference( identity ), this, models, type );
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
index 1383ce8..91b49ff 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
@@ -27,7 +27,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import org.qi4j.api.common.Visibility;
import org.qi4j.api.composite.AmbiguousTypeException;
import org.qi4j.api.composite.ModelDescriptor;
import org.qi4j.api.service.NoSuchServiceException;
@@ -39,7 +38,11 @@ import org.qi4j.runtime.composite.TransientModel;
import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.runtime.object.ObjectModel;
import org.qi4j.runtime.value.ValueModel;
+import org.qi4j.spi.module.ModelModule;
+import static org.qi4j.api.common.Visibility.application;
+import static org.qi4j.api.common.Visibility.layer;
+import static org.qi4j.api.common.Visibility.module;
import static org.qi4j.api.util.Classes.RAW_CLASS;
import static org.qi4j.api.util.Classes.interfacesOf;
import static org.qi4j.functional.Iterables.cast;
@@ -99,8 +102,9 @@ public class TypeLookup
*
* <p>Type lookup is done lazily and cached.</p>
*
- * @param type Looked up Type
- * @return First matching Object Model
+ * @param type Looked up Type
+ *
+ * @return First matching Object Model
*/
@SuppressWarnings( { "raw", "unchecked" } )
/* package */ ModelModule<ObjectModel> lookupObjectModel( final Class type )
@@ -113,16 +117,20 @@ public class TypeLookup
Iterable<ModelModule<ObjectModel>> flatten = flatten(
ambiguousTypeCheck( type,
findModels( new ExactTypeLookupSpecification( type ),
- moduleInstance.visibleObjects( Visibility.module ),
- moduleInstance.layerInstance().visibleObjects( Visibility.layer ),
- moduleInstance.layerInstance().visibleObjects( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleObjects() ) ),
+ moduleInstance.visibleObjects( module ),
+ moduleInstance.layerInstance().visibleObjects( layer ),
+ moduleInstance.layerInstance().visibleObjects( application ),
+ moduleInstance.layerInstance()
+ .usedLayersInstance()
+ .visibleObjects() ) ),
ambiguousTypeCheck( type,
findModels( new AssignableTypeLookupSpecification( type ),
- moduleInstance.visibleObjects( Visibility.module ),
- moduleInstance.layerInstance().visibleObjects( Visibility.layer ),
- moduleInstance.layerInstance().visibleObjects( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleObjects() ) ) );
+ moduleInstance.visibleObjects( module ),
+ moduleInstance.layerInstance().visibleObjects( layer ),
+ moduleInstance.layerInstance().visibleObjects( application ),
+ moduleInstance.layerInstance()
+ .usedLayersInstance()
+ .visibleObjects() ) ) );
model = first( flatten );
@@ -146,8 +154,9 @@ public class TypeLookup
*
* <p>Type lookup is done lazily and cached.</p>
*
- * @param type Looked up Type
- * @return First matching Transient Model
+ * @param type Looked up Type
+ *
+ * @return First matching Transient Model
*/
@SuppressWarnings( { "raw", "unchecked" } )
/* package */ ModelModule<TransientModel> lookupTransientModel( final Class type )
@@ -160,16 +169,22 @@ public class TypeLookup
Iterable<ModelModule<TransientModel>> allModels = flatten(
ambiguousTypeCheck( type,
findModels( new ExactTypeLookupSpecification( type ),
- moduleInstance.visibleTransients( Visibility.module ),
- moduleInstance.layerInstance().visibleTransients( Visibility.layer ),
- moduleInstance.layerInstance().visibleTransients( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleTransients() ) ),
+ moduleInstance.visibleTransients( module ),
+ moduleInstance.layerInstance().visibleTransients( layer ),
+ moduleInstance.layerInstance().visibleTransients( application ),
+ moduleInstance.layerInstance().usedLayersInstance().visibleTransients()
+ )
+ ),
+
ambiguousTypeCheck( type,
findModels( new AssignableTypeLookupSpecification( type ),
- moduleInstance.visibleTransients( Visibility.module ),
- moduleInstance.layerInstance().visibleTransients( Visibility.layer ),
- moduleInstance.layerInstance().visibleTransients( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleTransients() ) ) );
+ moduleInstance.visibleTransients( module ),
+ moduleInstance.layerInstance().visibleTransients( layer ),
+ moduleInstance.layerInstance().visibleTransients( application ),
+ moduleInstance.layerInstance().usedLayersInstance().visibleTransients()
+ )
+ )
+ );
model = first( allModels );
if( model != null )
@@ -192,8 +207,9 @@ public class TypeLookup
*
* <p>Type lookup is done lazily and cached.</p>
*
- * @param type Looked up Type
- * @return First matching Value Model
+ * @param type Looked up Type
+ *
+ * @return First matching Value Model
*/
@SuppressWarnings( { "raw", "unchecked" } )
public ModelModule<ValueModel> lookupValueModel( final Class type )
@@ -206,16 +222,19 @@ public class TypeLookup
Iterable<ModelModule<ValueModel>> flatten = flatten(
ambiguousTypeCheck( type,
findModels( new ExactTypeLookupSpecification( type ),
- moduleInstance.visibleValues( Visibility.module ),
- moduleInstance.layerInstance().visibleValues( Visibility.layer ),
- moduleInstance.layerInstance().visibleValues( Visibility.application ),
+ moduleInstance.visibleValues( module ),
+ moduleInstance.layerInstance().visibleValues( layer ),
+ moduleInstance.layerInstance().visibleValues( application ),
moduleInstance.layerInstance().usedLayersInstance().visibleValues() ) ),
ambiguousTypeCheck( type,
findModels( new AssignableTypeLookupSpecification( type ),
- moduleInstance.visibleValues( Visibility.module ),
- moduleInstance.layerInstance().visibleValues( Visibility.layer ),
- moduleInstance.layerInstance().visibleValues( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleValues() ) ) );
+ moduleInstance.visibleValues( module ),
+ moduleInstance.layerInstance().visibleValues( layer ),
+ moduleInstance.layerInstance().visibleValues( application ),
+ moduleInstance.layerInstance().usedLayersInstance().visibleValues()
+ )
+ )
+ );
model = first( flatten );
@@ -242,8 +261,9 @@ public class TypeLookup
* <p><b>Should be used for creational use cases only.</b> For non-creational use cases see
* {@link #lookupEntityModels(java.lang.Class)}.</p>
*
- * @param type Looked up Type
- * @return First matching Entity Model
+ * @param type Looked up Type
+ *
+ * @return First matching Entity Model
*/
@SuppressWarnings( { "raw", "unchecked" } )
/* package */ ModelModule<EntityModel> lookupEntityModel( final Class type )
@@ -256,16 +276,21 @@ public class TypeLookup
Iterable<ModelModule<EntityModel>> allModels = flatten(
ambiguousTypeCheck( type,
findModels( new ExactTypeLookupSpecification( type ),
- moduleInstance.visibleEntities( Visibility.module ),
- moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
- moduleInstance.layerInstance().visibleEntities( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) ),
+ moduleInstance.visibleEntities( module ),
+ moduleInstance.layerInstance().visibleEntities( layer ),
+ moduleInstance.layerInstance().visibleEntities( application ),
+ moduleInstance.layerInstance()
+ .usedLayersInstance()
+ .visibleEntities() ) ),
ambiguousTypeCheck( type,
findModels( new AssignableTypeLookupSpecification( type ),
- moduleInstance.visibleEntities( Visibility.module ),
- moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
- moduleInstance.layerInstance().visibleEntities( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) ) );
+ moduleInstance.visibleEntities( module ),
+ moduleInstance.layerInstance().visibleEntities( layer ),
+ moduleInstance.layerInstance().visibleEntities( application ),
+ moduleInstance.layerInstance().usedLayersInstance().visibleEntities()
+ )
+ )
+ );
model = first( allModels );
@@ -284,8 +309,8 @@ public class TypeLookup
* <p>Returned Iterable contains, in order, Entity Models that: </p>
*
* <ul>
- * <li>exactly match the given type, in Visibility then Assembly order ;</li>
- * <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
+ * <li>exactly match the given type, in Visibility then Assembly order ;</li>
+ * <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
* </ul>
*
* <p>Multiple <b>exact</b> matches with the same Visibility are <b>forbidden</b> and result in an AmbiguousTypeException.</p>
@@ -296,8 +321,9 @@ public class TypeLookup
* <p><b>Should be used for non-creational use cases only.</b> For creational use cases see
* {@link #lookupEntityModel(java.lang.Class)}.</p>
*
- * @param type Looked up Type
- * @return All matching Entity Models
+ * @param type Looked up Type
+ *
+ * @return All matching Entity Models
*/
@SuppressWarnings( { "raw", "unchecked" } )
/* package */ Iterable<ModelModule<EntityModel>> lookupEntityModels( final Class type )
@@ -309,14 +335,16 @@ public class TypeLookup
Iterable<ModelModule<EntityModel>> matchingEntityModels = flatten(
ambiguousTypeCheck( type,
findModels( new ExactTypeLookupSpecification( type ),
- moduleInstance.visibleEntities( Visibility.module ),
- moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
- moduleInstance.layerInstance().visibleEntities( Visibility.application ),
- moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) ),
+ moduleInstance.visibleEntities( module ),
+ moduleInstance.layerInstance().visibleEntities( layer ),
+ moduleInstance.layerInstance().visibleEntities( application ),
+ moduleInstance.layerInstance().usedLayersInstance().visibleEntities()
+ )
+ ),
findModels( new AssignableTypeLookupSpecification( type ),
- moduleInstance.visibleEntities( Visibility.module ),
- moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
- moduleInstance.layerInstance().visibleEntities( Visibility.application ),
+ moduleInstance.visibleEntities( module ),
+ moduleInstance.layerInstance().visibleEntities( layer ),
+ moduleInstance.layerInstance().visibleEntities( application ),
moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) );
// Don't return the same EntityModel multiple times
@@ -335,9 +363,10 @@ public class TypeLookup
*
* <p>See {@link #lookupServiceReferences(java.lang.reflect.Type)}.</p>
*
- * @param <T> Service Type
- * @param serviceType Looked up Type
- * @return First matching ServiceReference
+ * @param <T> Service Type
+ * @param serviceType Looked up Type
+ *
+ * @return First matching ServiceReference
*/
/* package */
@SuppressWarnings( "unchecked" )
@@ -368,8 +397,8 @@ public class TypeLookup
* <p>Returned Iterable contains, in order, ServiceReferences that: </p>
*
* <ul>
- * <li>exactly match the given type, in Visibility then Assembly order ;</li>
- * <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
+ * <li>exactly match the given type, in Visibility then Assembly order ;</li>
+ * <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
* </ul>
*
* <p>Multiple <b>exact</b> matches with the same Visibility are <b>allowed</b> to enable polymorphic lookup/injection.</p>
@@ -377,9 +406,10 @@ public class TypeLookup
*
* <p>Type lookup is done lazily and cached.</p>
*
- * @param <T> Service Type
- * @param serviceType Looked up Type
- * @return All matching ServiceReferences
+ * @param <T> Service Type
+ * @param serviceType Looked up Type
+ *
+ * @return All matching ServiceReferences
*/
@SuppressWarnings( "unchecked" )
/* package */ <T> Iterable<ServiceReference<T>> lookupServiceReferences( final Type serviceType )
@@ -390,14 +420,14 @@ public class TypeLookup
// Lazily resolve ServicesReferences
Iterable<ServiceReference<?>> matchingServices = flatten(
findServiceReferences( new ExactTypeLookupSpecification( serviceType ),
- moduleInstance.visibleServices( Visibility.module ),
- moduleInstance.layerInstance().visibleServices( Visibility.layer ),
- moduleInstance.layerInstance().visibleServices( Visibility.application ),
+ moduleInstance.visibleServices( module ),
+ moduleInstance.layerInstance().visibleServices( layer ),
+ moduleInstance.layerInstance().visibleServices( application ),
moduleInstance.layerInstance().usedLayersInstance().visibleServices() ),
findServiceReferences( new AssignableTypeLookupSpecification( serviceType ),
- moduleInstance.visibleServices( Visibility.module ),
- moduleInstance.layerInstance().visibleServices( Visibility.layer ),
- moduleInstance.layerInstance().visibleServices( Visibility.application ),
+ moduleInstance.visibleServices( module ),
+ moduleInstance.layerInstance().visibleServices( layer ),
+ moduleInstance.layerInstance().visibleServices( application ),
moduleInstance.layerInstance().usedLayersInstance().visibleServices() ) );
// Don't return the same ServiceReference multiple times
@@ -412,7 +442,8 @@ public class TypeLookup
@SuppressWarnings( { "raw", "unchecked" } )
private static <T extends ModelDescriptor> Iterable<ModelModule<T>> findModels( Specification<Iterable<Class<?>>> specification,
- Iterable<ModelModule<T>>... models )
+ Iterable<ModelModule<T>>... models
+ )
{
Specification<ModelModule<T>> spec = Specifications.translate( new ModelModuleTypesFunction(), specification );
Iterable<ModelModule<T>> flattened = flattenIterables( iterable( models ) );
@@ -421,7 +452,8 @@ public class TypeLookup
@SuppressWarnings( { "raw", "unchecked" } )
private static Iterable<ServiceReference<?>> findServiceReferences( Specification<Iterable<Class<?>>> specification,
- Iterable<ServiceReference<?>>... references )
+ Iterable<ServiceReference<?>>... references
+ )
{
Specification<ServiceReference<?>> spec = Specifications.translate( new ServiceReferenceTypesFunction(), specification );
Iterable<ServiceReference<?>> flattened = flattenIterables( iterable( references ) );
@@ -434,7 +466,8 @@ public class TypeLookup
*/
@SuppressWarnings( "raw" )
private static <T extends ModelDescriptor> Iterable<ModelModule<T>> ambiguousTypeCheck( final Class type,
- final Iterable<ModelModule<T>> models )
+ final Iterable<ModelModule<T>> models
+ )
{
return new Iterable<ModelModule<T>>()
{
@@ -473,7 +506,6 @@ public class TypeLookup
// Ambiguity check done, and no ambiguities found. Return results
return results.iterator();
}
-
};
}
@@ -486,7 +518,6 @@ public class TypeLookup
{
return modelModule.model().types();
}
-
}
private static class ServiceReferenceTypesFunction
@@ -498,7 +529,6 @@ public class TypeLookup
{
return serviceReference.types();
}
-
}
private static abstract class AbstractTypeLookupSpecification
@@ -563,7 +593,6 @@ public class TypeLookup
}
protected abstract boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType );
-
}
private static final class ExactTypeLookupSpecification
@@ -580,7 +609,6 @@ public class TypeLookup
{
return candidate.equals( lookedUpType );
}
-
}
private static final class AssignableTypeLookupSpecification
@@ -597,7 +625,5 @@ public class TypeLookup
{
return !candidate.equals( lookedUpType ) && lookedUpType.isAssignableFrom( candidate );
}
-
}
-
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
index 1c0f650..7eb57b9 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
@@ -16,12 +16,17 @@ package org.qi4j.runtime.structure;
import java.util.List;
import org.qi4j.api.common.Visibility;
+import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.object.ObjectDescriptor;
import org.qi4j.api.service.ServiceReference;
+import org.qi4j.api.value.ValueDescriptor;
import org.qi4j.functional.Function;
import org.qi4j.runtime.composite.TransientModel;
import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.runtime.object.ObjectModel;
import org.qi4j.runtime.value.ValueModel;
+import org.qi4j.spi.module.ModelModule;
import static org.qi4j.functional.Iterables.*;
@@ -37,48 +42,48 @@ public final class UsedLayersInstance
this.usedLayerInstances = usedLayerInstances;
}
- /* package */ Iterable<ModelModule<ObjectModel>> visibleObjects()
+ /* package */ Iterable<ModelModule<ObjectDescriptor>> visibleObjects()
{
- return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ObjectModel>>>()
+ return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ObjectDescriptor>>>()
{
@Override
- public Iterable<ModelModule<ObjectModel>> map( LayerInstance layerInstance )
+ public Iterable<ModelModule<ObjectDescriptor>> map( LayerInstance layerInstance )
{
return layerInstance.visibleObjects( Visibility.application );
}
}, usedLayerInstances ) );
}
- /* package */ Iterable<ModelModule<TransientModel>> visibleTransients()
+ /* package */ Iterable<ModelModule<TransientDescriptor>> visibleTransients()
{
- return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<TransientModel>>>()
+ return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<TransientDescriptor>>>()
{
@Override
- public Iterable<ModelModule<TransientModel>> map( LayerInstance layerInstance )
+ public Iterable<ModelModule<TransientDescriptor>> map( LayerInstance layerInstance )
{
return layerInstance.visibleTransients( Visibility.application );
}
}, usedLayerInstances ) );
}
- /* package */ Iterable<ModelModule<EntityModel>> visibleEntities()
+ /* package */ Iterable<ModelModule<EntityDescriptor>> visibleEntities()
{
- return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<EntityModel>>>()
+ return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<EntityDescriptor>>>()
{
@Override
- public Iterable<ModelModule<EntityModel>> map( LayerInstance layerInstance )
+ public Iterable<ModelModule<EntityDescriptor>> map( LayerInstance layerInstance )
{
return layerInstance.visibleEntities( Visibility.application );
}
}, usedLayerInstances ) );
}
- /* package */ Iterable<ModelModule<ValueModel>> visibleValues()
+ /* package */ Iterable<ModelModule<ValueDescriptor>> visibleValues()
{
- return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ValueModel>>>()
+ return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ValueDescriptor>>>()
{
@Override
- public Iterable<ModelModule<ValueModel>> map( LayerInstance layerInstance )
+ public Iterable<ModelModule<ValueDescriptor>> map( LayerInstance layerInstance )
{
return layerInstance.visibleValues( Visibility.application );
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 eae69b1..ff17a07 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
@@ -24,7 +24,7 @@ import org.qi4j.api.entity.LifecycleException;
import org.qi4j.runtime.composite.FunctionStateResolver;
import org.qi4j.runtime.entity.EntityInstance;
import org.qi4j.runtime.entity.EntityModel;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
import org.qi4j.runtime.structure.ModuleUnitOfWork;
import org.qi4j.spi.entity.EntityState;
import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;