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
