Reduction of code in Associations API implementation, as they actually shared a lot of code across the 3 types. General cleanup.
Signed-off-by: niclas <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/37251c5b Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/37251c5b Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/37251c5b Branch: refs/heads/develop Commit: 37251c5bd803dae17206f5e5cc2eb204d442dc2a Parents: cf3e885 Author: niclas <[email protected]> Authored: Fri May 12 18:01:22 2017 +0800 Committer: niclas <[email protected]> Committed: Sun May 14 12:07:56 2017 +0800 ---------------------------------------------------------------------- .../api/activation/ActivationException.java | 1 - .../ApplicationPassivationThread.java | 1 - .../api/activation/PassivationException.java | 2 - .../api/association/AssociationStateHolder.java | 3 +- .../polygene/api/entity/EntityReference.java | 2 +- .../association/AbstractAssociationModel.java | 198 ++++++++++++++++ .../runtime/association/AssociationModel.java | 190 +-------------- .../association/ManyAssociationInstance.java | 3 +- .../association/ManyAssociationModel.java | 226 +----------------- .../association/ManyAssociationsModel.java | 4 +- .../association/NamedAssociationInstance.java | 12 +- .../association/NamedAssociationModel.java | 229 +------------------ .../composite/ValueConstraintsInstance.java | 2 - .../runtime/entity/EntityStateInstance.java | 41 ++-- .../polygene/runtime/value/ValueInstance.java | 6 +- .../runtime/value/ValueStateInstance.java | 6 +- 16 files changed, 249 insertions(+), 677 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java index cf6d978..b4e6e29 100644 --- a/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ActivationException.java @@ -24,7 +24,6 @@ package org.apache.polygene.api.activation; */ public class ActivationException extends Exception { - private static final long serialVersionUID = 1L; public ActivationException( String message, Throwable cause ) { super( message, cause ); http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java b/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java index 7197257..c758d04 100644 --- a/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java +++ b/core/api/src/main/java/org/apache/polygene/api/activation/ApplicationPassivationThread.java @@ -71,7 +71,6 @@ public final class ApplicationPassivationThread private static class ApplicationPassivation implements Runnable { - private final Application application; private final PrintStream output; private final Logger logger; http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java b/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java index 98eaa0f..a4f8540 100644 --- a/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java +++ b/core/api/src/main/java/org/apache/polygene/api/activation/PassivationException.java @@ -31,8 +31,6 @@ import java.util.List; public final class PassivationException extends Exception { - - private static final long serialVersionUID = 1L; private final List<Exception> causes; /** http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java b/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java index 9cf336b..ed68517 100644 --- a/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java +++ b/core/api/src/main/java/org/apache/polygene/api/association/AssociationStateHolder.java @@ -26,8 +26,7 @@ import org.apache.polygene.api.property.StateHolder; /** * This represents the state of a entity (properties+associations). */ -public interface AssociationStateHolder - extends StateHolder +public interface AssociationStateHolder extends StateHolder { /** * Get an association for a specific accessor method. http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/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 c15532e..1f28a0e 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 @@ -80,7 +80,7 @@ public final class EntityReference * * @return The reference of the Entity that this EntityReference.is referring to */ - public final Identity identity() + public Identity identity() { return identity; } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java new file mode 100644 index 0000000..974a978 --- /dev/null +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AbstractAssociationModel.java @@ -0,0 +1,198 @@ +package org.apache.polygene.runtime.association; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import java.lang.reflect.Member; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import org.apache.polygene.api.association.AbstractAssociation; +import org.apache.polygene.api.association.AssociationDescriptor; +import org.apache.polygene.api.association.GenericAssociationInfo; +import org.apache.polygene.api.common.MetaInfo; +import org.apache.polygene.api.common.QualifiedName; +import org.apache.polygene.api.constraint.ConstraintViolationException; +import org.apache.polygene.api.entity.Aggregated; +import org.apache.polygene.api.entity.Queryable; +import org.apache.polygene.api.property.Immutable; +import org.apache.polygene.api.util.Classes; +import org.apache.polygene.api.util.Visitable; +import org.apache.polygene.api.util.Visitor; +import org.apache.polygene.bootstrap.BindingException; +import org.apache.polygene.runtime.composite.ValueConstraintsInstance; +import org.apache.polygene.runtime.model.Binder; +import org.apache.polygene.runtime.model.Resolution; + +public class AbstractAssociationModel<AT> + implements AbstractAssociation, AssociationDescriptor, AssociationInfo, Binder, Visitable<AT> +{ + private final MetaInfo metaInfo; + private final AccessibleObject accessor; + private final QualifiedName qualifiedName; + private final ValueConstraintsInstance constraints; + private final ValueConstraintsInstance associationConstraints; + private final boolean queryable; + private final boolean immutable; + private final boolean aggregated; + private Type type; + private AssociationInfo builderInfo; + + public AbstractAssociationModel( AccessibleObject accessor, + ValueConstraintsInstance valueConstraintsInstance, + ValueConstraintsInstance associationConstraintsInstance, + MetaInfo metaInfo ) + { + this.metaInfo = metaInfo; + this.constraints = valueConstraintsInstance; + this.associationConstraints = associationConstraintsInstance; + this.accessor = accessor; + this.type = GenericAssociationInfo.associationTypeOf( accessor ); + this.qualifiedName = QualifiedName.fromAccessor( accessor ); + this.immutable = metaInfo.get( Immutable.class ) != null; + this.aggregated = metaInfo.get( Aggregated.class ) != null; + + Queryable queryable = accessor.getAnnotation( Queryable.class ); + this.queryable = queryable == null || queryable.value(); + } + + @Override + public <T> T metaInfo( Class<T> infoType ) + { + return metaInfo.get( infoType ); + } + + @Override + public QualifiedName qualifiedName() + { + return qualifiedName; + } + + @Override + public Type type() + { + return type; + } + + @Override + public boolean isImmutable() + { + return immutable; + } + + @Override + public boolean isAggregated() + { + return aggregated; + } + + @Override + public AccessibleObject accessor() + { + return accessor; + } + + @Override + public boolean queryable() + { + return queryable; + } + + @Override + public void checkConstraints( Object value ) + throws ConstraintViolationException + { + constraints.checkConstraints( value, accessor ); + } + + public void checkAssociationConstraints( AbstractAssociation association ) + throws ConstraintViolationException + { + associationConstraints.checkConstraints( association, accessor ); + } + + public AssociationInfo builderInfo() + { + return builderInfo; + } + + @Override + public void bind( Resolution resolution ) + throws BindingException + { + builderInfo = new AssociationInfo() + { + @Override + public boolean isImmutable() + { + return false; + } + + @Override + public QualifiedName qualifiedName() + { + return qualifiedName; + } + + @Override + public Type type() + { + return type; + } + + @Override + public void checkConstraints( Object value ) + throws ConstraintViolationException + { + AbstractAssociationModel.this.checkConstraints( value ); + } + }; + + if( type instanceof TypeVariable ) + { + Class mainType = resolution.model().types().findFirst().orElse( null ); + type = Classes.resolveTypeVariable( (TypeVariable) type, ( (Member) accessor ).getDeclaringClass(), mainType ); + } + } + + @Override + @SuppressWarnings( "unchecked" ) + public <ThrowableType extends Throwable> boolean accept( Visitor<? super AT, ThrowableType> visitor ) + throws ThrowableType + { + return visitor.visit( (AT) this ); + } + + @Override + public boolean equals( Object o ) + { + if( this == o ) + { + return true; + } + if( o == null || getClass() != o.getClass() ) + { + return false; + } + AbstractAssociationModel that = (AbstractAssociationModel) o; + return accessor.equals( that.accessor ); + } + + @Override + public int hashCode() + { + return accessor.hashCode(); + } + + @Override + public String toString() + { + if( accessor instanceof Field ) + { + return ( (Field) accessor ).toGenericString(); + } + else + { + return ( (Method) accessor ).toGenericString(); + } + } +} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AssociationModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/AssociationModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AssociationModel.java index b83021e..33c2193 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/association/AssociationModel.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/AssociationModel.java @@ -21,46 +21,18 @@ package org.apache.polygene.runtime.association; import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Field; -import java.lang.reflect.Member; -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.lang.reflect.TypeVariable; -import org.apache.polygene.api.association.Association; import org.apache.polygene.api.association.AssociationDescriptor; -import org.apache.polygene.api.association.GenericAssociationInfo; import org.apache.polygene.api.common.MetaInfo; -import org.apache.polygene.api.common.QualifiedName; -import org.apache.polygene.api.constraint.ConstraintViolationException; -import org.apache.polygene.api.entity.Aggregated; -import org.apache.polygene.api.entity.Queryable; -import org.apache.polygene.api.property.Immutable; -import org.apache.polygene.api.util.Classes; -import org.apache.polygene.api.util.Visitable; -import org.apache.polygene.api.util.Visitor; -import org.apache.polygene.bootstrap.BindingException; import org.apache.polygene.runtime.composite.ValueConstraintsInstance; -import org.apache.polygene.runtime.model.Binder; -import org.apache.polygene.runtime.model.Resolution; /** * Model for an Association. * * <p>Equality is based on the Association accessor object (associated type and name), not on the QualifiedName.</p> */ -public final class AssociationModel - implements AssociationDescriptor, AssociationInfo, Binder, Visitable<AssociationModel> +public final class AssociationModel extends AbstractAssociationModel<AssociationModel> + implements AssociationDescriptor, AssociationInfo { - private MetaInfo metaInfo; - private Type type; - private AccessibleObject accessor; - private QualifiedName qualifiedName; - private ValueConstraintsInstance constraints; - private ValueConstraintsInstance associationConstraints; - private boolean queryable; - private boolean immutable; - private boolean aggregated; - private AssociationInfo builderInfo; public AssociationModel( AccessibleObject accessor, ValueConstraintsInstance valueConstraintsInstance, @@ -68,162 +40,6 @@ public final class AssociationModel MetaInfo metaInfo ) { - this.metaInfo = metaInfo; - this.constraints = valueConstraintsInstance; - this.associationConstraints = associationConstraintsInstance; - this.accessor = accessor; - initialize(); - } - - private void initialize() - { - this.type = GenericAssociationInfo.associationTypeOf( accessor ); - this.qualifiedName = QualifiedName.fromAccessor( accessor ); - this.immutable = metaInfo.get( Immutable.class ) != null; - this.aggregated = metaInfo.get( Aggregated.class ) != null; - - final Queryable queryable = accessor.getAnnotation( Queryable.class ); - this.queryable = queryable == null || queryable.value(); - } - - @Override - public <T> T metaInfo( Class<T> infoType ) - { - return metaInfo.get( infoType ); - } - - @Override - public QualifiedName qualifiedName() - { - return qualifiedName; - } - - @Override - public Type type() - { - return type; - } - - @Override - public boolean isImmutable() - { - return immutable; - } - - @Override - public boolean isAggregated() - { - return aggregated; - } - - @Override - public AccessibleObject accessor() - { - return accessor; - } - - @Override - public boolean queryable() - { - return queryable; - } - - public AssociationInfo getBuilderInfo() - { - return builderInfo; - } - - @Override - public <ThrowableType extends Throwable> boolean accept( Visitor<? super AssociationModel, ThrowableType> visitor ) - throws ThrowableType - { - return visitor.visit( this ); - } - - @Override - public void checkConstraints( Object value ) - throws ConstraintViolationException - { - constraints.checkConstraints( value, accessor ); - } - - public void checkAssociationConstraints( Association<?> association ) - throws ConstraintViolationException - { - associationConstraints.checkConstraints( association, accessor ); - } - - @Override - public void bind( Resolution resolution ) - throws BindingException - { - builderInfo = new AssociationInfo() - { - @Override - public boolean isImmutable() - { - return false; - } - - @Override - public QualifiedName qualifiedName() - { - return qualifiedName; - } - - @Override - public Type type() - { - return type; - } - - @Override - public void checkConstraints( Object value ) - throws ConstraintViolationException - { - AssociationModel.this.checkConstraints( value ); - } - }; - - if( type instanceof TypeVariable ) - { - - Class mainType = resolution.model().types().findFirst().orElse( null ); - type = Classes.resolveTypeVariable( (TypeVariable) type, ( (Member) accessor ).getDeclaringClass(), mainType ); - } - } - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - AssociationModel that = (AssociationModel) o; - return accessor.equals( that.accessor ); - } - - @Override - public int hashCode() - { - return accessor.hashCode(); - } - - @Override - public String toString() - { - if( accessor instanceof Field ) - { - return ( (Field) accessor ).toGenericString(); - } - else - { - return ( (Method) accessor ).toGenericString(); - } + super( accessor, valueConstraintsInstance, associationConstraintsInstance, metaInfo ); } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationInstance.java index e8dd66c..d10b950 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationInstance.java @@ -38,8 +38,7 @@ import org.apache.polygene.spi.entity.ManyAssociationState; /** * JAVADOC */ -public class ManyAssociationInstance<T> - extends AbstractAssociationInstance<T> +public class ManyAssociationInstance<T> extends AbstractAssociationInstance<T> implements ManyAssociation<T> { private ManyAssociationState manyAssociationState; http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationModel.java index e8fd0b6..98e2e2b 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationModel.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationModel.java @@ -20,34 +20,12 @@ package org.apache.polygene.runtime.association; import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Field; -import java.lang.reflect.Member; -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.lang.reflect.TypeVariable; -import java.util.List; -import java.util.function.BiFunction; -import java.util.stream.Stream; -import org.apache.polygene.api.association.AssociationDescriptor; -import org.apache.polygene.api.association.GenericAssociationInfo; import org.apache.polygene.api.association.ManyAssociation; import org.apache.polygene.api.common.MetaInfo; -import org.apache.polygene.api.common.QualifiedName; -import org.apache.polygene.api.constraint.ConstraintViolation; -import org.apache.polygene.api.constraint.ConstraintViolationException; -import org.apache.polygene.api.entity.Aggregated; -import org.apache.polygene.api.entity.EntityReference; -import org.apache.polygene.api.entity.Queryable; -import org.apache.polygene.api.property.Immutable; import org.apache.polygene.api.util.Classes; -import org.apache.polygene.api.util.Visitable; -import org.apache.polygene.api.util.Visitor; -import org.apache.polygene.bootstrap.BindingException; import org.apache.polygene.runtime.composite.ValueConstraintsInstance; -import org.apache.polygene.runtime.model.Binder; -import org.apache.polygene.runtime.model.Resolution; -import org.apache.polygene.runtime.unitofwork.ModuleUnitOfWork; import org.apache.polygene.runtime.unitofwork.BuilderEntityState; +import org.apache.polygene.runtime.unitofwork.ModuleUnitOfWork; import org.apache.polygene.spi.entity.EntityState; /** @@ -55,211 +33,23 @@ import org.apache.polygene.spi.entity.EntityState; * * <p>Equality is based on the ManyAssociation accessor object (associated type and name), not on the QualifiedName.</p> */ -public final class ManyAssociationModel - implements AssociationDescriptor, AssociationInfo, Binder, Visitable<ManyAssociationModel> +public final class ManyAssociationModel extends AbstractAssociationModel<ManyAssociationModel> { - private final ValueConstraintsInstance associationConstraints; - private final MetaInfo metaInfo; - private Type type; - private final AccessibleObject accessor; - private QualifiedName qualifiedName; - private final ValueConstraintsInstance constraints; - private boolean queryable; - private boolean immutable; - private boolean aggregated; - private AssociationInfo builderInfo; - public ManyAssociationModel( AccessibleObject accessor, ValueConstraintsInstance valueConstraintsInstance, ValueConstraintsInstance associationConstraintsInstance, MetaInfo metaInfo ) { - this.metaInfo = metaInfo; - this.constraints = valueConstraintsInstance; - this.associationConstraints = associationConstraintsInstance; - this.accessor = accessor; - initialize(); - } - - private void initialize() - { - this.type = GenericAssociationInfo.associationTypeOf( accessor ); - this.qualifiedName = QualifiedName.fromAccessor( accessor ); - this.immutable = metaInfo.get( Immutable.class ) != null; - this.aggregated = metaInfo.get( Aggregated.class ) != null; - - final Queryable queryable = accessor.getAnnotation( Queryable.class ); - this.queryable = queryable == null || queryable.value(); - } - - @Override - public <T> T metaInfo( Class<T> infoType ) - { - return metaInfo.get( infoType ); - } - - @Override - public QualifiedName qualifiedName() - { - return qualifiedName; - } - - @Override - public Type type() - { - return type; - } - - @Override - public boolean isImmutable() - { - return immutable; - } - - @Override - public boolean isAggregated() - { - return aggregated; - } - - @Override - public AccessibleObject accessor() - { - return accessor; - } - - @Override - public boolean queryable() - { - return queryable; - } - - public AssociationInfo getBuilderInfo() - { - return builderInfo; + super( accessor, valueConstraintsInstance, associationConstraintsInstance, metaInfo ); } public <T> ManyAssociation<T> newInstance( final ModuleUnitOfWork uow, EntityState state ) { - return new ManyAssociationInstance<>( state instanceof BuilderEntityState ? builderInfo : this, new BiFunction<EntityReference, Type, Object>() - { - @Override - public Object apply( EntityReference entityReference, Type type ) - { - return uow.get( Classes.RAW_CLASS.apply( type ), entityReference.identity() ); - } - }, state.manyAssociationValueOf( qualifiedName ) ); - } - - @Override - public void checkConstraints( Object composite ) - throws ConstraintViolationException - { - if( constraints != null ) - { - List<ConstraintViolation> violations = constraints.checkConstraints( composite ); - if( !violations.isEmpty() ) - { - Stream<Class<?>> empty = Stream.empty(); - throw new ConstraintViolationException( "", empty, (Member) accessor, violations ); - } - } - } - - public void checkAssociationConstraints( ManyAssociation manyAssociation ) - throws ConstraintViolationException - { - if( associationConstraints != null ) - { - List<ConstraintViolation> violations = associationConstraints.checkConstraints( manyAssociation ); - if( !violations.isEmpty() ) - { - Stream<Class<?>> empty = Stream.empty(); - throw new ConstraintViolationException( "", empty, (Member) accessor, violations ); - } - } - } - - @Override - public <ThrowableType extends Throwable> boolean accept( Visitor<? super ManyAssociationModel, ThrowableType> visitor ) - throws ThrowableType - { - return visitor.visit( this ); - } - - @Override - public void bind( Resolution resolution ) - throws BindingException - { - builderInfo = new AssociationInfo() - { - @Override - public boolean isImmutable() - { - return false; - } - - @Override - public QualifiedName qualifiedName() - { - return qualifiedName; - } - - @Override - public Type type() - { - return type; - } - - @Override - public void checkConstraints( Object value ) - throws ConstraintViolationException - { - ManyAssociationModel.this.checkConstraints( value ); - } - }; - - if( type instanceof TypeVariable ) - { - Class mainType = resolution.model().types().findFirst().orElse( null ); - type = Classes.resolveTypeVariable( (TypeVariable) type, ( (Member) accessor ).getDeclaringClass(), mainType ); - } - } - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - - ManyAssociationModel that = (ManyAssociationModel) o; - - return accessor.equals( that.accessor ); - } - - @Override - public int hashCode() - { - return accessor.hashCode(); - } - - @Override - public String toString() - { - if( accessor instanceof Field ) - { - return ( (Field) accessor ).toGenericString(); - } - else - { - return ( (Method) accessor ).toGenericString(); - } + return new ManyAssociationInstance<>( + state instanceof BuilderEntityState ? builderInfo() : this, + ( entityReference, type ) -> uow.get( Classes.RAW_CLASS.apply( type ), entityReference.identity() ), + state.manyAssociationValueOf( qualifiedName() ) + ); } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationsModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationsModel.java index 090b180..8765f42 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationsModel.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/ManyAssociationsModel.java @@ -120,7 +120,9 @@ public final class ManyAssociationsModel { for( ManyAssociationModel manyAssociationModel : mapAccessorAssociationModel.values() ) { - manyAssociationModel.checkAssociationConstraints( state.manyAssociationFor( manyAssociationModel.accessor() ) ); + AccessibleObject accessor = manyAssociationModel.accessor(); + ManyAssociationInstance<?> instance = state.manyAssociationFor( accessor ); + manyAssociationModel.checkAssociationConstraints( instance ); } } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationInstance.java index 536a6ca..e855c57 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationInstance.java @@ -37,17 +37,15 @@ import org.apache.polygene.api.entity.EntityReference; import org.apache.polygene.api.identity.HasIdentity; import org.apache.polygene.spi.entity.NamedAssociationState; -public class NamedAssociationInstance<T> - extends AbstractAssociationInstance<T> +public class NamedAssociationInstance<T> extends AbstractAssociationInstance<T> implements NamedAssociation<T> { - private final NamedAssociationState namedAssociationState; public NamedAssociationInstance( AssociationInfo associationInfo, BiFunction<EntityReference, Type, Object> associationFunction, NamedAssociationState namedAssociationState - ) + ) { super( associationInfo, associationFunction ); this.namedAssociationState = namedAssociationState; @@ -78,7 +76,7 @@ public class NamedAssociationInstance<T> checkImmutable(); checkType( entity ); associationInfo.checkConstraints( entity ); - return namedAssociationState.put( name, EntityReference.create( ((HasIdentity) entity).identity().get() ) ); + return namedAssociationState.put( name, EntityReference.create( ( (HasIdentity) entity ).identity().get() ) ); } @Override @@ -135,10 +133,9 @@ public class NamedAssociationInstance<T> return Collections.unmodifiableMap( StreamSupport.stream( namedAssociationState.spliterator(), false ) .collect( Collectors.toMap( Function.identity(), namedAssociationState::get ) ) - ).entrySet(); + ).entrySet(); } - @Override public boolean equals( Object o ) { @@ -195,5 +192,4 @@ public class NamedAssociationInstance<T> } return hash; } - } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationModel.java index bfcec63..7c9b053 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationModel.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/association/NamedAssociationModel.java @@ -20,246 +20,35 @@ package org.apache.polygene.runtime.association; import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Field; -import java.lang.reflect.Member; -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.lang.reflect.TypeVariable; -import java.util.List; -import java.util.function.BiFunction; -import java.util.stream.Stream; -import org.apache.polygene.api.association.AssociationDescriptor; -import org.apache.polygene.api.association.GenericAssociationInfo; import org.apache.polygene.api.association.NamedAssociation; import org.apache.polygene.api.common.MetaInfo; -import org.apache.polygene.api.common.QualifiedName; -import org.apache.polygene.api.constraint.ConstraintViolation; -import org.apache.polygene.api.constraint.ConstraintViolationException; -import org.apache.polygene.api.entity.Aggregated; -import org.apache.polygene.api.entity.EntityReference; -import org.apache.polygene.api.entity.Queryable; -import org.apache.polygene.api.property.Immutable; import org.apache.polygene.api.util.Classes; -import org.apache.polygene.api.util.Visitable; -import org.apache.polygene.api.util.Visitor; -import org.apache.polygene.bootstrap.BindingException; import org.apache.polygene.runtime.composite.ValueConstraintsInstance; -import org.apache.polygene.runtime.model.Binder; -import org.apache.polygene.runtime.model.Resolution; -import org.apache.polygene.runtime.unitofwork.ModuleUnitOfWork; import org.apache.polygene.runtime.unitofwork.BuilderEntityState; +import org.apache.polygene.runtime.unitofwork.ModuleUnitOfWork; import org.apache.polygene.spi.entity.EntityState; /** * Model for a NamedAssociation. - * + * <p> * <p>Equality is based on the NamedAssociation accessor object (associated type and name), not on the QualifiedName.</p> */ -public final class NamedAssociationModel - implements AssociationDescriptor, AssociationInfo, Binder, Visitable<NamedAssociationModel> +public final class NamedAssociationModel extends AbstractAssociationModel<NamedAssociationModel> { - private final ValueConstraintsInstance associationConstraints; - private final MetaInfo metaInfo; - private Type type; - private final AccessibleObject accessor; - private QualifiedName qualifiedName; - private final ValueConstraintsInstance constraints; - private boolean queryable; - private boolean immutable; - private boolean aggregated; - private AssociationInfo builderInfo; - public NamedAssociationModel( AccessibleObject accessor, ValueConstraintsInstance valueConstraintsInstance, ValueConstraintsInstance associationConstraintsInstance, MetaInfo metaInfo - ) - { - this.metaInfo = metaInfo; - this.constraints = valueConstraintsInstance; - this.associationConstraints = associationConstraintsInstance; - this.accessor = accessor; - initialize(); - } - - private void initialize() - { - this.type = GenericAssociationInfo.associationTypeOf( accessor ); - this.qualifiedName = QualifiedName.fromAccessor( accessor ); - this.immutable = metaInfo.get( Immutable.class ) != null; - this.aggregated = metaInfo.get( Aggregated.class ) != null; - - final Queryable queryable = accessor.getAnnotation( Queryable.class ); - this.queryable = queryable == null || queryable.value(); - } - - @Override - public <T> T metaInfo( Class<T> infoType ) - { - return metaInfo.get( infoType ); - } - - @Override - public QualifiedName qualifiedName() - { - return qualifiedName; - } - - @Override - public Type type() - { - return type; - } - - @Override - public boolean isImmutable() - { - return immutable; - } - - @Override - public boolean isAggregated() + ) { - return aggregated; - } - - @Override - public AccessibleObject accessor() - { - return accessor; - } - - @Override - public boolean queryable() - { - return queryable; - } - - public AssociationInfo getBuilderInfo() - { - return builderInfo; + super( accessor, valueConstraintsInstance, associationConstraintsInstance, metaInfo ); } public <T> NamedAssociation<T> newInstance( final ModuleUnitOfWork uow, EntityState state ) { - return new NamedAssociationInstance<>( state instanceof BuilderEntityState ? builderInfo : this, new BiFunction<EntityReference, Type, Object>() - { - @Override - public Object apply( EntityReference entityReference, Type type ) - { - return uow.get( Classes.RAW_CLASS.apply( type ), entityReference.identity() ); - } - }, state.namedAssociationValueOf( qualifiedName ) ); - } - - @Override - public void checkConstraints( Object composite ) - throws ConstraintViolationException - { - if( constraints != null ) - { - List<ConstraintViolation> violations = constraints.checkConstraints( composite ); - if( !violations.isEmpty() ) - { - Stream<Class<?>> empty = Stream.empty(); - throw new ConstraintViolationException( "", empty, (Member) accessor, violations ); - } - } - } - - public void checkAssociationConstraints( NamedAssociation association ) - throws ConstraintViolationException - { - if( associationConstraints != null ) - { - List<ConstraintViolation> violations = associationConstraints.checkConstraints( association ); - if( !violations.isEmpty() ) - { - Stream<Class<?>> empty = Stream.empty(); - throw new ConstraintViolationException( "", empty, (Member) accessor, violations ); - } - } - } - - @Override - public <ThrowableType extends Throwable> boolean accept( Visitor<? super NamedAssociationModel, ThrowableType> visitor ) - throws ThrowableType - { - return visitor.visit( this ); - } - - @Override - public void bind( Resolution resolution ) - throws BindingException - { - builderInfo = new AssociationInfo() - { - @Override - public boolean isImmutable() - { - return false; - } - - @Override - public QualifiedName qualifiedName() - { - return qualifiedName; - } - - @Override - public Type type() - { - return type; - } - - @Override - public void checkConstraints( Object value ) - throws ConstraintViolationException - { - NamedAssociationModel.this.checkConstraints( value ); - } - }; - - if( type instanceof TypeVariable ) - { - Class mainType = resolution.model().types().findFirst().orElse( null ); - type = Classes.resolveTypeVariable( (TypeVariable) type, ( (Member) accessor ).getDeclaringClass(), mainType ); - } - } - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - - NamedAssociationModel that = (NamedAssociationModel) o; - - return accessor.equals( that.accessor ); - } - - @Override - public int hashCode() - { - return accessor.hashCode(); - } - - @Override - public String toString() - { - if( accessor instanceof Field ) - { - return ( (Field) accessor ).toGenericString(); - } - else - { - return ( (Method) accessor ).toGenericString(); - } + return new NamedAssociationInstance<>( + state instanceof BuilderEntityState ? builderInfo() : this, + ( entityReference, type ) -> uow.get( Classes.RAW_CLASS.apply( type ), entityReference.identity() ), + state.namedAssociationValueOf( qualifiedName() ) ); } } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ValueConstraintsInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ValueConstraintsInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ValueConstraintsInstance.java index 783a4ef..ff53af8 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ValueConstraintsInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ValueConstraintsInstance.java @@ -107,12 +107,10 @@ public final class ValueConstraintsInstance } } } - if( violations == null ) { violations = Collections.emptyList(); } - return violations; } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityStateInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityStateInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityStateInstance.java index 3f1a05c..c726223 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityStateInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/entity/EntityStateInstance.java @@ -55,7 +55,7 @@ public final class EntityStateInstance private EntityState entityState; private final BiFunction<EntityReference, Type, Object> entityFunction; - public EntityStateInstance( EntityStateModel stateModel, final UnitOfWork uow, EntityState entityState ) + EntityStateInstance( EntityStateModel stateModel, final UnitOfWork uow, EntityState entityState ) { this.stateModel = stateModel; this.entityState = entityState; @@ -104,9 +104,7 @@ public final class EntityStateInstance { final AssociationModel associationModel = stateModel.getAssociation( accessor ); association = new AssociationInstance<>( - entityState instanceof BuilderEntityState - ? associationModel.getBuilderInfo() - : associationModel, + entityState instanceof BuilderEntityState ? associationModel.builderInfo() : associationModel, entityFunction, new Property<EntityReference>() { @@ -125,7 +123,6 @@ public final class EntityStateInstance } ); state.put( accessor, association ); } - return association; } @@ -140,21 +137,16 @@ public final class EntityStateInstance public <T> ManyAssociation<T> manyAssociationFor( AccessibleObject accessor ) { Map<AccessibleObject, Object> state = state(); - ManyAssociation<T> manyAssociation = (ManyAssociation<T>) state.get( accessor ); - if( manyAssociation == null ) { ManyAssociationModel associationModel = stateModel.getManyAssociation( accessor ); manyAssociation = new ManyAssociationInstance<>( - entityState instanceof BuilderEntityState - ? associationModel.getBuilderInfo() - : associationModel, + entityState instanceof BuilderEntityState ? associationModel.builderInfo() : associationModel, entityFunction, entityState.manyAssociationValueOf( associationModel.qualifiedName() ) ); state.put( accessor, manyAssociation ); } - return manyAssociation; } @@ -169,21 +161,16 @@ public final class EntityStateInstance public <T> NamedAssociation<T> namedAssociationFor( AccessibleObject accessor ) { Map<AccessibleObject, Object> state = state(); - NamedAssociation<T> namedAssociation = (NamedAssociation<T>) state.get( accessor ); - if( namedAssociation == null ) { NamedAssociationModel associationModel = stateModel.getNamedAssociation( accessor ); namedAssociation = new NamedAssociationInstance<>( - entityState instanceof BuilderEntityState - ? associationModel.getBuilderInfo() - : associationModel, + entityState instanceof BuilderEntityState ? associationModel.builderInfo() : associationModel, entityFunction, entityState.namedAssociationValueOf( associationModel.qualifiedName() ) ); state.put( accessor, namedAssociation ); } - return namedAssociation; } @@ -195,15 +182,17 @@ public final class EntityStateInstance public void checkConstraints() { - stateModel.properties().forEach( propertyDescriptor -> { - Property<Object> property = this.propertyFor( propertyDescriptor.accessor() ); - propertyDescriptor.checkConstraints( property.get() ); - } ); - - stateModel.associations().forEach( associationDescriptor -> { - Association<Object> association = this.associationFor( associationDescriptor.accessor() ); - associationDescriptor.checkConstraints( association.get() ); - } ); + stateModel.properties().forEach( propertyDescriptor -> + { + Property<Object> property = this.propertyFor( propertyDescriptor.accessor() ); + propertyDescriptor.checkConstraints( property.get() ); + } ); + + stateModel.associations().forEach( associationDescriptor -> + { + Association<Object> association = this.associationFor( associationDescriptor.accessor() ); + associationDescriptor.checkConstraints( association.get() ); + } ); // TODO Should ManyAssociations and NamedAssociations be checked too? } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/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 fe2c838..47e8460 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 @@ -111,17 +111,17 @@ public final class ValueInstance descriptor().state().associations().forEach( associationDescriptor -> { state().associationFor( associationDescriptor.accessor() ) - .setAssociationInfo( associationDescriptor.getBuilderInfo() ); + .setAssociationInfo( associationDescriptor.builderInfo() ); } ); descriptor().state().manyAssociations().forEach( associationDescriptor -> { state().manyAssociationFor( associationDescriptor.accessor() ) - .setAssociationInfo( associationDescriptor.getBuilderInfo() ); + .setAssociationInfo( associationDescriptor.builderInfo() ); } ); descriptor().state().namedAssociations().forEach( associationDescriptor -> { state().namedAssociationFor( associationDescriptor.accessor() ) - .setAssociationInfo( associationDescriptor.getBuilderInfo() ); + .setAssociationInfo( associationDescriptor.builderInfo() ); } ); } http://git-wip-us.apache.org/repos/asf/polygene-java/blob/37251c5b/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueStateInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueStateInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueStateInstance.java index aab6597..23be1be 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueStateInstance.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/value/ValueStateInstance.java @@ -81,7 +81,7 @@ public final class ValueStateInstance this.associations = new LinkedHashMap<>(); valueModel.state().associations().forEach( associationDescriptor -> { - AssociationInfo builderInfo = associationDescriptor.getBuilderInfo(); + AssociationInfo builderInfo = associationDescriptor.builderInfo(); EntityReference value = stateResolver.getAssociationState( associationDescriptor ); AssociationInstance<Object> associationInstance1 = new AssociationInstance<>( builderInfo, @@ -92,7 +92,7 @@ public final class ValueStateInstance this.manyAssociations = new LinkedHashMap<>(); valueModel.state().manyAssociations().forEach( associationDescriptor -> { - AssociationInfo builderInfo = associationDescriptor.getBuilderInfo(); + AssociationInfo builderInfo = associationDescriptor.builderInfo(); List<EntityReference> value = stateResolver.getManyAssociationState( associationDescriptor ) .collect( toList() ); ManyAssociationValueState manyAssociationState = new ManyAssociationValueState( value ); @@ -105,7 +105,7 @@ public final class ValueStateInstance this.namedAssociations = new LinkedHashMap<>(); valueModel.state().namedAssociations().forEach( associationDescriptor -> { - AssociationInfo builderInfo = associationDescriptor.getBuilderInfo(); + AssociationInfo builderInfo = associationDescriptor.builderInfo(); Map<String, EntityReference> value = stateResolver.getNamedAssociationState( associationDescriptor ) .collect( toMap( LinkedHashMap::new ) ); NamedAssociationValueState namedAssociationState = new NamedAssociationValueState( value );
