POLYGENE-226 - Start on the Initial Value Provider stuff. Not trivial, and need to make a partial commit which is not complete and not working yet.
Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/8e8ac22c Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/8e8ac22c Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/8e8ac22c Branch: refs/heads/develop Commit: 8e8ac22cbf46498874f0093814f8023e2a276ea1 Parents: 7410895 Author: niclas <[email protected]> Authored: Tue Feb 14 12:53:11 2017 +0800 Committer: niclas <[email protected]> Committed: Tue Feb 14 12:53:11 2017 +0800 ---------------------------------------------------------------------- .../polygene/api/entity/EntityReference.java | 2 +- .../api/property/InitialValueProvider.java | 8 + .../api/property/PropertyDescriptor.java | 5 +- .../polygene/bootstrap/MetaInfoDeclaration.java | 8 + .../polygene/bootstrap/MixinDeclaration.java | 4 + .../bootstrap/CompositeAssemblyImpl.java | 10 +- .../runtime/composite/TransientInstance.java | 1 - .../polygene/runtime/entity/EntityInstance.java | 1 - .../polygene/runtime/entity/EntityModel.java | 2 +- .../runtime/property/PropertyModel.java | 151 ++++++++++++------- .../ImportedServiceReferenceInstance.java | 9 +- .../runtime/service/ServiceInstance.java | 6 +- .../polygene/runtime/service/ServiceModel.java | 2 +- .../service/ServiceReferenceInstance.java | 15 +- .../runtime/structure/ModuleInstance.java | 123 ++++++++------- .../polygene/runtime/value/ValueInstance.java | 5 +- .../polygene/api/common/PropertyTypeTest.java | 1 + .../polygene/test/entity/CanRemoveAll.java | 7 + .../prefs/PreferencesEntityStoreMixin.java | 20 +-- .../entitystore/sql/SQLEntityStoreMixin.java | 2 +- .../skeletons/SQLCompatEntityStateWrapper.java | 2 + .../polygene/migration/MigrationService.java | 2 + .../migration/assembly/MigrationBuilder.java | 10 +- .../migration/assembly/MigrationRules.java | 10 +- .../constraints/NotEmptyStringConstraint.java | 4 - .../rest/server/api/ContextResource.java | 2 +- .../ValueDescriptorResponseWriter.java | 2 +- 27 files changed, 235 insertions(+), 179 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/api/src/main/java/org/apache/polygene/api/entity/EntityReference.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/entity/EntityReference.java b/core/api/src/main/java/org/apache/polygene/api/entity/EntityReference.java index 731d3c3..fcfcb0e 100644 --- a/core/api/src/main/java/org/apache/polygene/api/entity/EntityReference.java +++ b/core/api/src/main/java/org/apache/polygene/api/entity/EntityReference.java @@ -35,7 +35,7 @@ public final class EntityReference implements Serializable { /** - * Parse an Entity reference to an EntityReference. + * Parse an Entity reference string to an EntityReference. * * @param identityString the EntityReference reference * @return the EntityReference represented by the given reference http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/api/src/main/java/org/apache/polygene/api/property/InitialValueProvider.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/property/InitialValueProvider.java b/core/api/src/main/java/org/apache/polygene/api/property/InitialValueProvider.java new file mode 100644 index 0000000..7fd6cc3 --- /dev/null +++ b/core/api/src/main/java/org/apache/polygene/api/property/InitialValueProvider.java @@ -0,0 +1,8 @@ +package org.apache.polygene.api.property; + +import java.util.function.BiFunction; +import org.apache.polygene.api.structure.Module; + +public interface InitialValueProvider extends BiFunction<Module, PropertyDescriptor, Object> +{ +} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/api/src/main/java/org/apache/polygene/api/property/PropertyDescriptor.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/property/PropertyDescriptor.java b/core/api/src/main/java/org/apache/polygene/api/property/PropertyDescriptor.java index 52b217c..2f5e641 100644 --- a/core/api/src/main/java/org/apache/polygene/api/property/PropertyDescriptor.java +++ b/core/api/src/main/java/org/apache/polygene/api/property/PropertyDescriptor.java @@ -24,6 +24,7 @@ import java.lang.reflect.AccessibleObject; import java.lang.reflect.Type; import org.apache.polygene.api.common.QualifiedName; import org.apache.polygene.api.structure.MetaInfoHolder; +import org.apache.polygene.api.structure.Module; import org.apache.polygene.api.structure.ModuleDescriptor; import org.apache.polygene.api.type.ValueType; @@ -54,7 +55,9 @@ public interface PropertyDescriptor extends MetaInfoHolder AccessibleObject accessor(); - Object initialValue( ModuleDescriptor module ); + InitialValueProvider initialValueProvider(); + + Object resolveInitialValue(ModuleDescriptor moduleDescriptor); ValueType valueType(); http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MetaInfoDeclaration.java ---------------------------------------------------------------------- diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MetaInfoDeclaration.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MetaInfoDeclaration.java index 2967fe5..348ac10 100644 --- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MetaInfoDeclaration.java +++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MetaInfoDeclaration.java @@ -29,6 +29,7 @@ import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.Map; import org.apache.polygene.api.common.MetaInfo; +import org.apache.polygene.api.property.InitialValueProvider; import org.apache.polygene.api.property.Property; /** @@ -217,5 +218,12 @@ public final class MetaInfoDeclaration metaInfo.set( info ); return this; } + + @Override + public MixinDeclaration<T> declareInitialValueProvider(InitialValueProvider provider) + { + metaInfo.add( InitialValueProvider.class, provider); + return this; + } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MixinDeclaration.java ---------------------------------------------------------------------- diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MixinDeclaration.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MixinDeclaration.java index 90e22f4..a50f305 100644 --- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MixinDeclaration.java +++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/MixinDeclaration.java @@ -20,6 +20,8 @@ package org.apache.polygene.bootstrap; +import org.apache.polygene.api.property.InitialValueProvider; + /** * Fluent API for declaring information about properties * @@ -30,4 +32,6 @@ public interface MixinDeclaration<T> T declareDefaults(); MixinDeclaration<T> setMetaInfo( Object info ); + + MixinDeclaration<T> declareInitialValueProvider(InitialValueProvider provider); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java index 3158cff..709f614 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java @@ -61,6 +61,7 @@ import org.apache.polygene.api.mixin.Initializable; import org.apache.polygene.api.mixin.Mixins; import org.apache.polygene.api.property.GenericPropertyInfo; import org.apache.polygene.api.property.Immutable; +import org.apache.polygene.api.property.InitialValueProvider; import org.apache.polygene.api.property.Property; import org.apache.polygene.api.sideeffect.SideEffects; import org.apache.polygene.api.type.HasTypes; @@ -465,13 +466,15 @@ public abstract class CompositeAssemblyImpl } boolean useDefaults = useDefaultsDeclaration != null || stateDeclarations.useDefaults( accessor ); boolean immutable = this.immutable || metaInfo.get( Immutable.class ) != null; + InitialValueProvider initialValueProvider = metaInfo.get(InitialValueProvider.class); return new PropertyModel( accessor, immutable, useDefaults, valueConstraintsInstance, metaInfo, - initialValue + initialValue, + initialValueProvider ); } @@ -492,8 +495,9 @@ public abstract class CompositeAssemblyImpl .findFirst().orElse( null ); String name = nameAnnotation == null ? "param" + ( i + 1 ) : nameAnnotation.value(); - boolean optional = Stream.of( parameterAnnotation ).filter( isType( Optional.class ) ) - .findFirst().isPresent(); + boolean optional = Stream.of( parameterAnnotation ) + .filter( isType( Optional.class ) ) + .findFirst().isPresent(); ValueConstraintsModel parameterConstraintsModel = constraintsFor( Arrays.stream( parameterAnnotation ), parameterTypes[ i ], http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/composite/TransientInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/TransientInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/TransientInstance.java index a251349..edc1a8b 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/TransientInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/TransientInstance.java @@ -57,7 +57,6 @@ public class TransientInstance this.compositeModel = compositeModel; this.mixins = mixins; this.state = state; - proxy = compositeModel.newProxy( this ); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityInstance.java index a58cee9..22432ec 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityInstance.java @@ -157,7 +157,6 @@ public final class EntityInstance { initState(); } - return state; } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityModel.java index 4fd073d..b468be6 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityModel.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityModel.java @@ -132,7 +132,7 @@ public final class EntityModel extends CompositeModel { // Set new properties to default value state().properties().forEach( propertyDescriptor -> { - entityState.setPropertyValue( propertyDescriptor.qualifiedName(), propertyDescriptor.initialValue( module ) ); + entityState.setPropertyValue( propertyDescriptor.qualifiedName(), propertyDescriptor.resolveInitialValue(module) ); } ); // Set new associations to null http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java index 6aa5041..565b218 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java @@ -35,10 +35,12 @@ import org.apache.polygene.api.constraint.ConstraintViolationException; import org.apache.polygene.api.entity.Queryable; import org.apache.polygene.api.property.DefaultValues; import org.apache.polygene.api.property.GenericPropertyInfo; +import org.apache.polygene.api.property.InitialValueProvider; import org.apache.polygene.api.property.InvalidPropertyTypeException; import org.apache.polygene.api.property.Property; import org.apache.polygene.api.property.PropertyDescriptor; import org.apache.polygene.api.service.NoSuchServiceException; +import org.apache.polygene.api.structure.Module; import org.apache.polygene.api.structure.ModuleDescriptor; import org.apache.polygene.api.type.Serialization; import org.apache.polygene.api.type.ValueCompositeType; @@ -63,7 +65,6 @@ public class PropertyModel implements PropertyDescriptor, PropertyInfo, Binder, Visitable<PropertyModel> { private Type type; - private transient AccessibleObject accessor; // Interface accessor private final QualifiedName qualifiedName; @@ -72,9 +73,7 @@ public class PropertyModel protected final MetaInfo metaInfo; - private final Object initialValue; - - private final boolean useDefaults; + private final InitialValueProvider initialValueProvider; private final boolean immutable; @@ -89,7 +88,8 @@ public class PropertyModel boolean useDefaults, ValueConstraintsInstance constraints, MetaInfo metaInfo, - Object initialValue + Object initialValue, + InitialValueProvider initialValueProvider ) { if( accessor instanceof Method ) @@ -105,13 +105,15 @@ public class PropertyModel type = GenericPropertyInfo.propertyTypeOf( accessor ); this.accessor = accessor; qualifiedName = QualifiedName.fromAccessor( accessor ); - - this.useDefaults = useDefaults; - - this.initialValue = initialValue; - + if( initialValueProvider != null ) + { + this.initialValueProvider = initialValueProvider; + } + else + { + this.initialValueProvider = new DefaultInitialValueProvider(useDefaults, initialValue); + } this.constraints = constraints; - final Queryable queryable = accessor.getAnnotation( Queryable.class ); this.queryable = queryable == null || queryable.value(); } @@ -169,53 +171,18 @@ public class PropertyModel } @Override - public Object initialValue( ModuleDescriptor module ) + public InitialValueProvider initialValueProvider() { - // Use supplied value from assembly - Object value = initialValue; + return initialValueProvider; + } - // Check for @UseDefaults annotation - if( useDefaults ) - { - if( value == null || ( ( value instanceof String ) && ( (String) value ).length() == 0 ) ) - { - if( valueType instanceof ValueCompositeType ) - { - Class<?> propertyType = valueType().types().findFirst().orElse( null ); - value = module.instance().newValue( propertyType ); - } - else - { - value = DefaultValues.getDefaultValueOf( type ); - } - } - else - { - Class<?> propertyType = valueType().types().findFirst().orElse( null ); - if( value instanceof String && !propertyType.equals( String.class ) ) - { - try - { - // here we could possibly deserialize json to other types... - ValueDeserializer deserializer = module.instance() - .serviceFinder() - .findService( ValueDeserializer.class ) - .get(); - if( deserializer != null ) - { - value = deserializer.deserialize( module, propertyType ).apply( (String) value ); - } - } - catch( NoSuchServiceException e ) - { - throw new MissingValueSerializationException( "@UseDefaults with initialization value requires that there is a visible ValueDeserializer service available.", e); - } - } - } - } - return value; + @Override + public Object resolveInitialValue(ModuleDescriptor moduleDescriptor) + { + return initialValueProvider.apply(moduleDescriptor.instance(), this); } + @Override public void bind( Resolution resolution ) throws BindingException @@ -335,4 +302,80 @@ public class PropertyModel } } } + + private static class NullInitialValueProvider + implements InitialValueProvider + { + @Override + public Object apply(Module module, PropertyDescriptor property) + { + return null; + } + } + + private class DefaultInitialValueProvider + implements InitialValueProvider + { + private final boolean useDefaults; + private final Object initialValue; + + private DefaultInitialValueProvider(boolean useDefaults, Object initialValue) + { + this.useDefaults = useDefaults; + this.initialValue = initialValue; + } + + @Override + public Object apply(Module module, PropertyDescriptor property) + { + return initialValue(module.descriptor(), initialValue, useDefaults); + } + + private Object initialValue( ModuleDescriptor module, Object initialValue, boolean useDefaults ) + { + // Use supplied value from assembly + Object value = initialValue; + + // Check for @UseDefaults annotation + if( useDefaults ) + { + if( value == null || ( ( value instanceof String ) && ( (String) value ).length() == 0 ) ) + { + if( valueType instanceof ValueCompositeType ) + { + Class<?> propertyType = valueType().types().findFirst().orElse( null ); + value = module.instance().newValue( propertyType ); + } + else + { + value = DefaultValues.getDefaultValueOf( type ); + } + } + else + { + Class<?> propertyType = valueType().types().findFirst().orElse( null ); + if( value instanceof String && !propertyType.equals( String.class ) ) + { + try + { + // here we could possibly deserialize json to other types... + ValueDeserializer deserializer = module.instance() + .serviceFinder() + .findService( ValueDeserializer.class ) + .get(); + if( deserializer != null ) + { + value = deserializer.deserialize( module, propertyType ).apply( (String) value ); + } + } + catch( NoSuchServiceException e ) + { + throw new MissingValueSerializationException( "@UseDefaults with initialization value requires that there is a visible ValueDeserializer service available.", e); + } + } + } + } + return value; + } + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/service/ImportedServiceReferenceInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ImportedServiceReferenceInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ImportedServiceReferenceInstance.java index cf13122..697d12c 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ImportedServiceReferenceInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ImportedServiceReferenceInstance.java @@ -156,23 +156,22 @@ public final class ImportedServiceReferenceInstance<T> { if( serviceInstance == null ) { - serviceInstance = serviceModel.importInstance( module ); - instance = serviceInstance.instance(); - + ImportedServiceInstance<T> newServiceInstance = serviceModel.importInstance( module ); try { activation.activate( serviceModel.newActivatorsInstance( module ), - serviceInstance, () -> { + newServiceInstance, () -> { active = true; } ); } catch( Exception e ) { - serviceInstance = null; throw new ServiceUnavailableException( "Could not activate service " + serviceModel.identity(), e ); } + serviceInstance = newServiceInstance; + instance = newServiceInstance.instance(); } } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceInstance.java index da40e1f..cae9e4b 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceInstance.java @@ -35,8 +35,7 @@ import org.apache.polygene.runtime.composite.TransientStateInstance; /** * JAVADOC */ -public class ServiceInstance - extends TransientInstance +public class ServiceInstance extends TransientInstance implements Activation { public static TransientInstance serviceInstanceOf( ServiceComposite composite ) @@ -54,8 +53,7 @@ public class ServiceInstance { super( compositeModel, mixins, state ); - implementsServiceAvailable = - Classes.assignableTypeSpecification( Availability.class ).test( descriptor() ); + implementsServiceAvailable = Classes.assignableTypeSpecification( Availability.class ).test( descriptor() ); hasEnabledConfiguration = compositeModel.configurationType() != null && Enabled.class.isAssignableFrom( compositeModel.configurationType() ); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceModel.java index abbe40b..74dd852 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceModel.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceModel.java @@ -134,7 +134,7 @@ public final class ServiceModel extends CompositeModel Map<AccessibleObject, Property<?>> properties = new HashMap<>(); stateModel.properties().forEach( propertyModel -> { - Object initialValue = propertyModel.initialValue( module ); + Object initialValue = propertyModel.resolveInitialValue(module); if( propertyModel.accessor().equals( HasIdentity.IDENTITY_METHOD ) ) { initialValue = identity; http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java index e6e53bd..8cf7a1c 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java @@ -149,19 +149,19 @@ public final class ServiceReferenceInstance<T> { if( instance == null ) { - instance = serviceModel.newInstance( module ); + ServiceInstance newInstance = serviceModel.newInstance( module ); try { activation.activate( serviceModel.newActivatorsInstance( module ), - instance, + newInstance, () -> active = true ); } catch( Exception e ) { - instance = null; throw new ServiceUnavailableException( "Could not activate service " + serviceModel.identity(), e ); } + instance = newInstance; } } } @@ -262,16 +262,7 @@ public final class ServiceReferenceInstance<T> return serviceModel.toString().hashCode(); } } - ServiceInstance instance = getInstance(); - -/* - if (!instance.isAvailable()) - { - throw new ServiceUnavailableException("Service is currently not available"); - } - -*/ return instance.invoke( object, method, objects ); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/structure/ModuleInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/structure/ModuleInstance.java index 4eb9ac1..3735130 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/structure/ModuleInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/structure/ModuleInstance.java @@ -216,8 +216,9 @@ public class ModuleInstance model.state().properties().forEach( propertyModel -> { + Object initialValue = propertyModel.resolveInitialValue( model.module() ); Property<?> property = new PropertyInstance<>( ( (PropertyModel) propertyModel ).getBuilderInfo(), - propertyModel.initialValue( model.module() ) ); + initialValue ); properties.put( propertyModel.accessor(), property ); } ); @@ -296,7 +297,7 @@ public class ModuleInstance @Override public Object getPropertyState( PropertyDescriptor propertyDescriptor ) { - return propertyDescriptor.initialValue( module ); + return propertyDescriptor.resolveInitialValue(module); } @Override @@ -468,18 +469,21 @@ public class ModuleInstance public EntityStore entityStore() { - synchronized( this ) + if( store == null ) { - if( store == null ) + synchronized( this ) { - try + if( store == null ) { - ServiceReference<EntityStore> service = findService( EntityStore.class ); - store = service.get(); - } - catch( NoSuchServiceException e ) - { - throw new UnitOfWorkException( "No EntityStore service available in module " + name() ); + try + { + ServiceReference<EntityStore> service = findService( EntityStore.class ); + store = service.get(); + } + catch( NoSuchServiceException e ) + { + throw new UnitOfWorkException( "No EntityStore service available in module " + name() ); + } } } } @@ -488,18 +492,21 @@ public class ModuleInstance public UnitOfWorkFactory unitOfWorkFactory() { - synchronized( this ) + if( uowf == null ) { - if( uowf == null ) + synchronized( this ) { - try - { - ServiceReference<UnitOfWorkFactory> service = findService( UnitOfWorkFactory.class ); - uowf = service.get(); - } - catch( NoSuchServiceException e ) + if( uowf == null ) { - throw new UnitOfWorkException( "No UnitOfWorkFactory service available in module " + name() ); + try + { + ServiceReference<UnitOfWorkFactory> service = findService( UnitOfWorkFactory.class ); + uowf = service.get(); + } + catch( NoSuchServiceException e ) + { + throw new UnitOfWorkException( "No UnitOfWorkFactory service available in module " + name() ); + } } } } @@ -532,31 +539,37 @@ public class ModuleInstance public IdentityGenerator identityGenerator() { - synchronized( this ) + if( generator == null ) { - if( generator == null ) + synchronized( this ) { - ServiceReference<IdentityGenerator> service = findService( IdentityGenerator.class ); - generator = service.get(); + if( generator == null ) + { + ServiceReference<IdentityGenerator> service = findService( IdentityGenerator.class ); + generator = service.get(); + } } - return generator; } + return generator; } public ValueSerialization valueSerialization() { - synchronized( this ) + if( valueSerialization == null ) { - if( valueSerialization == null ) + synchronized( this ) { - try + if( valueSerialization == null ) { - ServiceReference<ValueSerialization> service = findService( ValueSerialization.class ); - valueSerialization = service.get(); - } - catch( NoSuchServiceException e ) - { - throw new ValueSerializationException( "No ValueSeriaservice available in module " + name() ); + try + { + ServiceReference<ValueSerialization> service = findService( ValueSerialization.class ); + valueSerialization = service.get(); + } + catch( NoSuchServiceException e ) + { + throw new ValueSerializationException( "No ValueSeriaservice available in module " + name() ); + } } } } @@ -565,42 +578,24 @@ public class ModuleInstance public MetricsProvider metricsProvider() { - synchronized( this ) + if( metrics == null ) { - if( metrics == null ) + synchronized( this ) { - try + if( metrics == null ) { - ServiceReference<MetricsProvider> service = findService( MetricsProvider.class ); - metrics = service.get(); - } - catch( NoSuchServiceException e ) - { - metrics = new MetricsProviderAdapter(); + try + { + ServiceReference<MetricsProvider> service = findService( MetricsProvider.class ); + metrics = service.get(); + } + catch( NoSuchServiceException e ) + { + metrics = new MetricsProviderAdapter(); + } } } } return metrics; } - -// public Stream<ServiceReference<?>> visibleServices( Visibility visibility ) -// { -// return concat( services.visibleServices( visibility ), -// importedServices.visibleServices( visibility ) ); -// } -// -// -// -// public Stream<ServiceReference<?>> findVisibleServiceTypes() -// { -// return concat( visibleServices( Visibility.module ), -// concat( -// layer().visibleServices( Visibility.layer ), -// concat( -// layer().visibleServices( Visibility.application ), -// layer().usedLayers().layers().flatMap( layer -> layer.visibleServices(Visibility.application) ) -// ) -// ) -// ); -// } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueInstance.java index 12ba7d9..573d659 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueInstance.java @@ -39,10 +39,7 @@ public final class ValueInstance return (ValueInstance) Proxy.getInvocationHandler( composite ); } - public ValueInstance( ValueModel compositeModel, - Object[] mixins, - ValueStateInstance state - ) + public ValueInstance( ValueModel compositeModel, Object[] mixins, ValueStateInstance state ) { super( compositeModel, mixins, state ); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java b/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java index 4f33076..79349ae 100644 --- a/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java +++ b/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java @@ -22,6 +22,7 @@ package org.apache.polygene.api.common; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import org.apache.polygene.api.injection.scope.Invocation; import org.apache.polygene.test.AbstractPolygeneTest; import org.junit.Test; import org.apache.polygene.api.composite.TransientBuilder; http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/core/testsupport/src/main/java/org/apache/polygene/test/entity/CanRemoveAll.java ---------------------------------------------------------------------- diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/entity/CanRemoveAll.java b/core/testsupport/src/main/java/org/apache/polygene/test/entity/CanRemoveAll.java new file mode 100644 index 0000000..80b0a55 --- /dev/null +++ b/core/testsupport/src/main/java/org/apache/polygene/test/entity/CanRemoveAll.java @@ -0,0 +1,7 @@ +package org.apache.polygene.test.entity; + + +public interface CanRemoveAll +{ + void removeAll(); +} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/extensions/entitystore-preferences/src/main/java/org/apache/polygene/entitystore/prefs/PreferencesEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-preferences/src/main/java/org/apache/polygene/entitystore/prefs/PreferencesEntityStoreMixin.java b/extensions/entitystore-preferences/src/main/java/org/apache/polygene/entitystore/prefs/PreferencesEntityStoreMixin.java index 72f4298..3198347 100644 --- a/extensions/entitystore-preferences/src/main/java/org/apache/polygene/entitystore/prefs/PreferencesEntityStoreMixin.java +++ b/extensions/entitystore-preferences/src/main/java/org/apache/polygene/entitystore/prefs/PreferencesEntityStoreMixin.java @@ -243,22 +243,22 @@ public class PreferencesEntityStoreMixin if( primaryType.equals( Long.class ) ) { properties.put( persistentPropertyDescriptor.qualifiedName(), - this.getNumber( propsPrefs, persistentPropertyDescriptor, LONG_PARSER ) ); + this.getNumber( propsPrefs, module, persistentPropertyDescriptor, LONG_PARSER ) ); } else if( primaryType.equals( Integer.class ) ) { properties.put( persistentPropertyDescriptor.qualifiedName(), - this.getNumber( propsPrefs, persistentPropertyDescriptor, INT_PARSER ) ); + this.getNumber( propsPrefs, module, persistentPropertyDescriptor, INT_PARSER ) ); } else if( primaryType.equals( Double.class ) ) { properties.put( persistentPropertyDescriptor.qualifiedName(), - this.getNumber( propsPrefs, persistentPropertyDescriptor, DOUBLE_PARSER ) ); + this.getNumber( propsPrefs, module, persistentPropertyDescriptor, DOUBLE_PARSER ) ); } else if( primaryType.equals( Float.class ) ) { properties.put( persistentPropertyDescriptor.qualifiedName(), - this.getNumber( propsPrefs, persistentPropertyDescriptor, FLOAT_PARSER ) ); + this.getNumber( propsPrefs, module, persistentPropertyDescriptor, FLOAT_PARSER ) ); } else { @@ -279,7 +279,7 @@ public class PreferencesEntityStoreMixin } else if( primaryType.equals( Boolean.class ) ) { - Boolean initialValue = (Boolean) persistentPropertyDescriptor.initialValue( module ); + Boolean initialValue = (Boolean) persistentPropertyDescriptor.resolveInitialValue(module); properties.put( persistentPropertyDescriptor.qualifiedName(), propsPrefs.getBoolean( persistentPropertyDescriptor.qualifiedName().name(), initialValue == null ? false : initialValue ) ); @@ -306,10 +306,10 @@ public class PreferencesEntityStoreMixin String json = propsPrefs.get( persistentPropertyDescriptor.qualifiedName().name(), null ); if( json == null ) { - if( persistentPropertyDescriptor.initialValue( module ) != null ) + if( persistentPropertyDescriptor.resolveInitialValue( module ) != null ) { - properties.put( persistentPropertyDescriptor.qualifiedName(), persistentPropertyDescriptor - .initialValue( module ) ); + properties.put( persistentPropertyDescriptor.qualifiedName(), + persistentPropertyDescriptor.resolveInitialValue( module ) ); } else { @@ -640,9 +640,9 @@ public class PreferencesEntityStoreMixin private static final NumberParser<Float> FLOAT_PARSER = Float::parseFloat; - private <T> T getNumber( Preferences prefs, PropertyDescriptor pDesc, NumberParser<T> parser ) + private <T> T getNumber( Preferences prefs, ModuleDescriptor module, PropertyDescriptor pDesc, NumberParser<T> parser ) { - Object initialValue = pDesc.initialValue( null ); + Object initialValue = pDesc.resolveInitialValue( module ); String str = prefs.get( pDesc.qualifiedName().name(), initialValue == null ? null : initialValue.toString() ); T result = null; if( str != null ) http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLEntityStoreMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLEntityStoreMixin.java index d3e3f3f..123a613 100644 --- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLEntityStoreMixin.java +++ b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLEntityStoreMixin.java @@ -389,7 +389,7 @@ public class SQLEntityStoreMixin catch( JSONException e ) { // Value not found, default it - Object initialValue = propertyDescriptor.initialValue( module ); + Object initialValue = propertyDescriptor.resolveInitialValue( module ); properties.put( propertyDescriptor.qualifiedName(), initialValue ); status[ 0 ] = EntityStatus.UPDATED; } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java b/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java index b3c7621..6648590 100644 --- a/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java +++ b/extensions/indexing-sql/src/main/java/org/apache/polygene/index/sql/support/skeletons/SQLCompatEntityStateWrapper.java @@ -29,6 +29,7 @@ import org.apache.polygene.api.common.QualifiedName; import org.apache.polygene.api.common.Visibility; import org.apache.polygene.api.entity.EntityDescriptor; import org.apache.polygene.api.entity.EntityReference; +import org.apache.polygene.api.identity.Identity; import org.apache.polygene.api.property.PropertyDescriptor; import org.apache.polygene.api.structure.ModuleDescriptor; import org.apache.polygene.api.type.CollectionType; @@ -81,6 +82,7 @@ class SQLCompatEntityStateWrapper || Character.class.isAssignableFrom( primaryType ) || Enum.class.isAssignableFrom( primaryType ) || String.class.isAssignableFrom( primaryType ) + || Identity.class.isAssignableFrom( primaryType ) // || Date.class.isAssignableFrom( primaryType ) // || DateTime.class.isAssignableFrom( primaryType ) // || LocalDateTime.class.isAssignableFrom( primaryType ) http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java ---------------------------------------------------------------------- diff --git a/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java b/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java index 9f700d7..09b4663 100644 --- a/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java +++ b/extensions/migration/src/main/java/org/apache/polygene/migration/MigrationService.java @@ -94,8 +94,10 @@ public interface MigrationService @Service StateStore store; + @Service EntityStore entityStore; + @Structure UnitOfWorkFactory uowf; http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationBuilder.java ---------------------------------------------------------------------- diff --git a/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationBuilder.java b/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationBuilder.java index e7d0c83..1b02746 100644 --- a/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationBuilder.java +++ b/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationBuilder.java @@ -25,15 +25,15 @@ package org.apache.polygene.migration.assembly; */ public class MigrationBuilder { - MigrationRules<EntityMigrationRule> entityRules; - MigrationRules<MigrationRule> rules; + private MigrationRules<EntityMigrationRule> entityRules; + private MigrationRules<MigrationRule> rules; - String fromVersion; + private String fromVersion; public MigrationBuilder( String fromVersion ) { - this.entityRules = new MigrationRules<EntityMigrationRule>(); - this.rules = new MigrationRules<MigrationRule>(); + this.entityRules = new MigrationRules<>(); + this.rules = new MigrationRules<>(); this.fromVersion = fromVersion; } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationRules.java ---------------------------------------------------------------------- diff --git a/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationRules.java b/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationRules.java index f407cde..920e3de 100644 --- a/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationRules.java +++ b/extensions/migration/src/main/java/org/apache/polygene/migration/assembly/MigrationRules.java @@ -31,10 +31,10 @@ import org.apache.polygene.api.util.ListMap; public class MigrationRules<T extends AbstractMigrationRule> { // to-version -> List of from-versions - ListMap<String, String> versionChanges = new ListMap<String, String>(); + private ListMap<String, String> versionChanges = new ListMap<>(); // key=fromversion->toversion value=list of rules for that transition - ListMap<String, T> rules = new ListMap<String, T>(); + private ListMap<String, T> rules = new ListMap<>(); public void addRule( T migrationRule ) { @@ -70,7 +70,7 @@ public class MigrationRules<T extends AbstractMigrationRule> if( fromVersion.equals( possibleFromVersion ) ) { // We found the end of the version transitions - return rules, but filter on entity type - return new ArrayList<T>( getRulesForTransition( fromVersion, toVersion ) ); + return new ArrayList<>( getRulesForTransition( fromVersion, toVersion ) ); } else { @@ -99,8 +99,8 @@ public class MigrationRules<T extends AbstractMigrationRule> { if( versionChanges.get( toVersion ) == null ) { - List<String> toVersions = new ArrayList<String>( versionChanges.keySet() ); - Collections.sort( toVersions, Collections.reverseOrder() ); + List<String> toVersions = new ArrayList<>(versionChanges.keySet()); + toVersions.sort(Collections.reverseOrder()); for( String version : toVersions ) { if( version.compareTo( toVersion ) <= 0 ) http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/libraries/constraints/src/main/java/org/apache/polygene/library/constraints/NotEmptyStringConstraint.java ---------------------------------------------------------------------- diff --git a/libraries/constraints/src/main/java/org/apache/polygene/library/constraints/NotEmptyStringConstraint.java b/libraries/constraints/src/main/java/org/apache/polygene/library/constraints/NotEmptyStringConstraint.java index dd1b9df..f00ef26 100644 --- a/libraries/constraints/src/main/java/org/apache/polygene/library/constraints/NotEmptyStringConstraint.java +++ b/libraries/constraints/src/main/java/org/apache/polygene/library/constraints/NotEmptyStringConstraint.java @@ -28,13 +28,9 @@ import org.apache.polygene.library.constraints.annotation.NotEmpty; public class NotEmptyStringConstraint implements Constraint<NotEmpty, String> { - - private static final long serialVersionUID = 1L; - @Override public boolean isValid( NotEmpty annotation, String value ) { return value.trim().length() > 0; } - } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/api/ContextResource.java ---------------------------------------------------------------------- diff --git a/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/api/ContextResource.java b/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/api/ContextResource.java index d66a8a8..a50f29c 100644 --- a/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/api/ContextResource.java +++ b/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/api/ContextResource.java @@ -880,7 +880,7 @@ public class ContextResource String value = getValue( propertyDescriptor.qualifiedName().name(), queryAsForm, entityAsForm ); if( value == null ) { - Object initialValue = propertyDescriptor.initialValue( module.descriptor() ); + Object initialValue = propertyDescriptor.resolveInitialValue(module.descriptor()); if( initialValue != null ) { value = initialValue.toString(); http://git-wip-us.apache.org/repos/asf/polygene-java/blob/8e8ac22c/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/restlet/responsewriter/ValueDescriptorResponseWriter.java ---------------------------------------------------------------------- diff --git a/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/restlet/responsewriter/ValueDescriptorResponseWriter.java b/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/restlet/responsewriter/ValueDescriptorResponseWriter.java index 5bf1d1b..7ff8a84 100644 --- a/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/restlet/responsewriter/ValueDescriptorResponseWriter.java +++ b/libraries/rest-server/src/main/java/org/apache/polygene/library/rest/server/restlet/responsewriter/ValueDescriptorResponseWriter.java @@ -68,7 +68,7 @@ public class ValueDescriptorResponseWriter extends AbstractResponseWriter vd.state().properties().forEach( propertyDescriptor -> { try { - Object o = propertyDescriptor.initialValue( module ); + Object o = propertyDescriptor.resolveInitialValue(module); if( o == null ) { json.put( propertyDescriptor.qualifiedName().name(), JSONObject.NULL );
