http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsModel.java deleted file mode 100644 index 04fc728..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsModel.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2012-2014, Paul Merlin. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.runtime.activation; - -import java.util.ArrayList; -import java.util.List; -import org.qi4j.api.activation.ActivationException; -import org.qi4j.api.activation.Activator; -import org.qi4j.api.structure.Module; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.composite.UsesInstance; -import org.qi4j.runtime.injection.InjectionContext; -import org.qi4j.runtime.structure.ModuleInstance; - -/** - * Activators Model. - * - * @param <ActivateeType> Type of the activation target - */ -public class ActivatorsModel<ActivateeType> - implements VisitableHierarchy<Object, Object> -{ - - private final List<ActivatorModel<ActivateeType>> activatorModels = new ArrayList<>(); - private final Iterable<Class<? extends Activator<ActivateeType>>> activatorsClasses; - - public ActivatorsModel( Iterable<Class<? extends Activator<ActivateeType>>> activatorsClasses ) - { - this.activatorsClasses = activatorsClasses; - for( Class<? extends Activator<ActivateeType>> activatorClass : activatorsClasses ) - { - activatorModels.add( new ActivatorModel<>( activatorClass ) ); - } - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> visitor ) - throws ThrowableType - { - if( visitor.visitEnter( this ) ) - { - for( ActivatorModel<ActivateeType> activatorModel : activatorModels ) - { - if( !activatorModel.accept( visitor ) ) - { - break; - } - } - } - return visitor.visitLeave( this ); - } - - public Iterable<ActivatorModel<ActivateeType>> models() - { - return activatorModels; - } - - public Iterable<Activator<ActivateeType>> newInstances() - throws ActivationException - { - List<Activator<ActivateeType>> activators = new ArrayList<>(); - for( ActivatorModel<ActivateeType> activatorModel : activatorModels ) - { - activators.add( activatorModel.newInstance() ); - } - return activators; - } - - public Iterable<Activator<ActivateeType>> newInstances( Module module ) - throws ActivationException - { - List<Activator<ActivateeType>> activators = new ArrayList<>(); - for( ActivatorModel<ActivateeType> activatorModel : activatorModels ) - { - InjectionContext injectionContext = new InjectionContext( (ModuleInstance) module, UsesInstance.EMPTY_USES ); - activators.add( activatorModel.newInstance( injectionContext ) ); - } - return activators; - } - -}
http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java deleted file mode 100644 index 21d696a..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.qi4j.runtime.association; - -import java.lang.reflect.Type; -import org.qi4j.api.association.AbstractAssociation; -import org.qi4j.api.entity.EntityReference; -import org.qi4j.api.entity.Identity; -import org.qi4j.functional.Function2; - -/** - * Implementation of AbstractAssociation. Includes helper methods for subclasses - */ -public abstract class AbstractAssociationInstance<T> - implements AbstractAssociation -{ - protected AssociationInfo associationInfo; - private final Function2<EntityReference, Type, Object> entityFunction; - - public AbstractAssociationInstance( AssociationInfo associationInfo, - Function2<EntityReference, Type, Object> entityFunction - ) - { - this.associationInfo = associationInfo; - this.entityFunction = entityFunction; - } - - public AssociationInfo associationInfo() - { - return associationInfo; - } - - public void setAssociationInfo( AssociationInfo newInfo ) - { - this.associationInfo = newInfo; - } - - @SuppressWarnings( "unchecked" ) - protected T getEntity( EntityReference entityId ) - { - if( entityId == null ) - { - return null; - } - - return (T) entityFunction.map( entityId, associationInfo.type() ); - } - - protected EntityReference getEntityReference( Object composite ) - { - if( composite == null ) - { - return null; - } - - return new EntityReference( ( (Identity) composite ).identity().get() ); - } - - protected void checkType( Object instance ) - { - - if( instance instanceof Identity || instance == null ) - { - return; - } - throw new IllegalArgumentException( "Object must be a subtype of org.qi4j.api.identity.Identity: " + instance.getClass() ); - } - - protected void checkImmutable() - throws IllegalStateException - { - if( associationInfo.isImmutable() ) - { - throw new IllegalStateException( "Association [" + associationInfo.qualifiedName() + "] is immutable." ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java deleted file mode 100644 index fd6695d..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.qi4j.runtime.association; - -import java.lang.reflect.Type; -import org.qi4j.api.common.QualifiedName; -import org.qi4j.runtime.composite.ConstraintsCheck; - -/** - * TODO - */ -public interface AssociationInfo - extends ConstraintsCheck -{ - boolean isImmutable(); - - QualifiedName qualifiedName(); - - Type type(); -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java deleted file mode 100644 index e42d8eb..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2007, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.qi4j.runtime.association; - -import java.lang.reflect.Type; -import org.qi4j.api.association.Association; -import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.AssociationWrapper; -import org.qi4j.api.entity.EntityReference; -import org.qi4j.api.entity.Identity; -import org.qi4j.api.property.Property; -import org.qi4j.functional.Function2; - -/** - * Implementation of Association to a single Entity. - */ -public final class AssociationInstance<T> - extends AbstractAssociationInstance<T> - implements Association<T> -{ - private Property<EntityReference> associationState; - - public AssociationInstance( AssociationInfo associationInfo, - Function2<EntityReference, Type, Object> entityFunction, - Property<EntityReference> associationState - ) - { - super( associationInfo, entityFunction ); - this.associationState = associationState; - } - - // Association implementation - @Override - public T get() - { - return getEntity( associationState.get() ); - } - - @Override - public void set( T newValue ) - throws IllegalArgumentException - { - checkImmutable(); - checkType( newValue ); - - associationInfo.checkConstraints( newValue ); - - // Change association - associationState.set( EntityReference.create( (Identity) newValue )); - } - - @Override - public EntityReference reference() - { - return associationState.get(); - } - - public Property<EntityReference> getAssociationState() - { - return associationState; - } - - @Override - public String toString() - { - if( associationState.get() == null ) - { - return ""; - } - else - { - return associationState.get().toString(); - } - } - - @Override - public int hashCode() - { - int hash = associationInfo.hashCode() * 39; // Descriptor - if( associationState.get() != null ) - { - hash = hash * 997 + associationState.get().hashCode(); // State - } - return hash; - } - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - Association<?> that = (Association) o; - // Unwrap if needed - while( that instanceof AssociationWrapper ) - { - that = ( (AssociationWrapper) that ).next(); - } - // Descriptor equality - AssociationInstance<?> thatInstance = (AssociationInstance) that; - AssociationDescriptor thatDescriptor = (AssociationDescriptor) thatInstance.associationInfo(); - if( !associationInfo.equals( thatDescriptor ) ) - { - return false; - } - // State equality - if( associationState.get() != null - ? !associationState.get().equals( thatInstance.associationState.get() ) - : thatInstance.associationState.get() != null ) - { - return false; - } - return true; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationModel.java deleted file mode 100644 index d1d5f36..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationModel.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2008, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.qi4j.runtime.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 org.qi4j.api.association.Association; -import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.GenericAssociationInfo; -import org.qi4j.api.common.MetaInfo; -import org.qi4j.api.common.QualifiedName; -import org.qi4j.api.composite.Composite; -import org.qi4j.api.constraint.ConstraintViolation; -import org.qi4j.api.constraint.ConstraintViolationException; -import org.qi4j.api.entity.Aggregated; -import org.qi4j.api.entity.Queryable; -import org.qi4j.api.property.Immutable; -import org.qi4j.api.util.Classes; -import org.qi4j.bootstrap.BindingException; -import org.qi4j.functional.Visitable; -import org.qi4j.functional.Visitor; -import org.qi4j.runtime.composite.ValueConstraintsInstance; -import org.qi4j.runtime.model.Binder; -import org.qi4j.runtime.model.Resolution; - -import static org.qi4j.functional.Iterables.empty; -import static org.qi4j.functional.Iterables.first; - -/** - * 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> -{ - 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, - 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; - } - - @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 - { - if( constraints != null ) - { - List<ConstraintViolation> violations = constraints.checkConstraints( value ); - if( !violations.isEmpty() ) - { - Iterable<Class<?>> empty = empty(); - throw new ConstraintViolationException( "", empty, (Member) accessor, violations ); - } - } - } - - public void checkAssociationConstraints( Association<?> association ) - throws ConstraintViolationException - { - if( associationConstraints != null ) - { - List<ConstraintViolation> violations = associationConstraints.checkConstraints( association ); - if( !violations.isEmpty() ) - { - throw new ConstraintViolationException( (Composite) association.get(), (Member) accessor, violations ); - } - } - } - - @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 = first( resolution.model().types() ); - 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; - - if( !accessor.equals( that.accessor ) ) - { - return false; - } - - return true; - } - - @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/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationsModel.java deleted file mode 100644 index 310632d..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationsModel.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2008-2011, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.runtime.association; - -import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Member; -import java.util.LinkedHashMap; -import java.util.Map; -import org.qi4j.api.association.Association; -import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.AssociationStateHolder; -import org.qi4j.api.common.QualifiedName; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; - -/** - * Model for Associations. - */ -public final class AssociationsModel - implements VisitableHierarchy<AssociationsModel, AssociationModel> -{ - private final Map<AccessibleObject, AssociationModel> mapAccessorAssociationModel = new LinkedHashMap<>(); - - public AssociationsModel() - { - } - - public Iterable<AssociationModel> associations() - { - return mapAccessorAssociationModel.values(); - } - - public void addAssociation( AssociationModel associationModel ) - { - mapAccessorAssociationModel.put( associationModel.accessor(), associationModel ); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super AssociationsModel, ? super AssociationModel, ThrowableType> visitor ) - throws ThrowableType - { - if( visitor.visitEnter( this ) ) - { - for( AssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( !associationModel.accept( visitor ) ) - { - break; - } - } - } - return visitor.visitLeave( this ); - } - - public AssociationModel getAssociation( AccessibleObject accessor ) - throws IllegalArgumentException - { - AssociationModel associationModel = mapAccessorAssociationModel.get( accessor ); - if( associationModel == null ) - { - throw new IllegalArgumentException( "No association found with name:" + ( (Member) accessor ).getName() ); - } - return associationModel; - } - - public AssociationDescriptor getAssociationByName( String name ) - throws IllegalArgumentException - { - for( AssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( associationModel.qualifiedName().name().equals( name ) ) - { - return associationModel; - } - } - throw new IllegalArgumentException( "No association found with name:" + name ); - } - - public AssociationDescriptor getAssociationByQualifiedName( QualifiedName name ) - throws IllegalArgumentException - { - for( AssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( associationModel.qualifiedName().equals( name ) ) - { - return associationModel; - } - } - throw new IllegalArgumentException( "No association found with qualified name:" + name ); - } - - public void checkConstraints( AssociationStateHolder state ) - { - for( AssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - Association<Object> association = state.<Object>associationFor( associationModel.accessor() ); - associationModel.checkAssociationConstraints( association ); - associationModel.checkConstraints( association.get() ); - } - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java deleted file mode 100644 index 5c8b4b8..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.qi4j.runtime.association; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.ManyAssociation; -import org.qi4j.api.association.ManyAssociationWrapper; -import org.qi4j.api.entity.EntityReference; -import org.qi4j.api.entity.Identity; -import org.qi4j.api.util.NullArgumentException; -import org.qi4j.functional.Function2; -import org.qi4j.functional.Iterables; -import org.qi4j.spi.entity.ManyAssociationState; - -/** - * JAVADOC - */ -public class ManyAssociationInstance<T> - extends AbstractAssociationInstance<T> - implements ManyAssociation<T> -{ - private ManyAssociationState manyAssociationState; - - public ManyAssociationInstance( AssociationInfo associationInfo, - Function2<EntityReference, Type, Object> associationFunction, - ManyAssociationState manyAssociationState - ) - { - super( associationInfo, associationFunction ); - this.manyAssociationState = manyAssociationState; - } - - @Override - public int count() - { - return manyAssociationState.count(); - } - - @Override - public boolean contains( T entity ) - { - return manyAssociationState.contains( getEntityReference( entity ) ); - } - - @Override - public boolean add( int i, T entity ) - { - NullArgumentException.validateNotNull( "entity", entity ); - checkImmutable(); - checkType( entity ); - associationInfo.checkConstraints( entity ); - return manyAssociationState.add( i, new EntityReference( ( (Identity) entity ).identity().get() ) ); - } - - @Override - public boolean add( T entity ) - { - return add( manyAssociationState.count(), entity ); - } - - @Override - public boolean remove( T entity ) - { - NullArgumentException.validateNotNull( "entity", entity ); - checkImmutable(); - checkType( entity ); - - return manyAssociationState.remove( new EntityReference( ( (Identity) entity ).identity().get() ) ); - } - - @Override - public T get( int i ) - { - return getEntity( manyAssociationState.get( i ) ); - } - - @Override - public List<T> toList() - { - ArrayList<T> list = new ArrayList<>(); - for( EntityReference entityReference : manyAssociationState ) - { - list.add( getEntity( entityReference ) ); - } - - return list; - } - - @Override - public Set<T> toSet() - { - Set<T> set = new HashSet<>(); - for( EntityReference entityReference : manyAssociationState ) - { - set.add( getEntity( entityReference ) ); - } - - return set; - } - - @Override - public Iterable<EntityReference> references() - { - return Iterables.toList( manyAssociationState ); - } - - @Override - public String toString() - { - return manyAssociationState.toString(); - } - - @Override - public Iterator<T> iterator() - { - return new ManyAssociationIterator( manyAssociationState.iterator() ); - } - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - ManyAssociation<?> that = (ManyAssociation) o; - // Unwrap if needed - while( that instanceof ManyAssociationWrapper ) - { - that = ( (ManyAssociationWrapper) that ).next(); - } - // Descriptor equality - ManyAssociationInstance<?> thatInstance = (ManyAssociationInstance) that; - AssociationDescriptor thatDescriptor = (AssociationDescriptor) thatInstance.associationInfo(); - if( !associationInfo.equals( thatDescriptor ) ) - { - return false; - } - // State equality - if( manyAssociationState.count() != thatInstance.manyAssociationState.count() ) - { - return false; - } - for( EntityReference ref : manyAssociationState ) - { - if( !thatInstance.manyAssociationState.contains( ref ) ) - { - return false; - } - } - return true; - } - - @Override - public int hashCode() - { - int hash = associationInfo.hashCode() * 31; // Descriptor - for( EntityReference ref : manyAssociationState ) - { - hash += ref.hashCode() * 7; // State - } - return hash; - } - - public ManyAssociationState getManyAssociationState() - { - return manyAssociationState; - } - - protected class ManyAssociationIterator - implements Iterator<T> - { - private final Iterator<EntityReference> idIterator; - - public ManyAssociationIterator( Iterator<EntityReference> idIterator ) - { - this.idIterator = idIterator; - } - - @Override - public boolean hasNext() - { - return idIterator.hasNext(); - } - - @Override - public T next() - { - return getEntity( idIterator.next() ); - } - - @Override - public void remove() - { - checkImmutable(); - idIterator.remove(); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationModel.java deleted file mode 100644 index 3cc5d81..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationModel.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (c) 2008-2011, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.runtime.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 org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.GenericAssociationInfo; -import org.qi4j.api.association.ManyAssociation; -import org.qi4j.api.common.MetaInfo; -import org.qi4j.api.common.QualifiedName; -import org.qi4j.api.constraint.ConstraintViolation; -import org.qi4j.api.constraint.ConstraintViolationException; -import org.qi4j.api.entity.Aggregated; -import org.qi4j.api.entity.EntityReference; -import org.qi4j.api.entity.Queryable; -import org.qi4j.api.property.Immutable; -import org.qi4j.api.util.Classes; -import org.qi4j.bootstrap.BindingException; -import org.qi4j.functional.Function2; -import org.qi4j.functional.Visitable; -import org.qi4j.functional.Visitor; -import org.qi4j.runtime.composite.ValueConstraintsInstance; -import org.qi4j.runtime.model.Binder; -import org.qi4j.runtime.model.Resolution; -import org.qi4j.runtime.structure.ModuleUnitOfWork; -import org.qi4j.runtime.unitofwork.BuilderEntityState; -import org.qi4j.spi.entity.EntityState; - -import static org.qi4j.functional.Iterables.empty; -import static org.qi4j.functional.Iterables.first; - -/** - * Model for a ManyAssociation. - * - * <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> -{ - 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; - } - - public <T> ManyAssociation<T> newInstance( final ModuleUnitOfWork uow, EntityState state ) - { - return new ManyAssociationInstance<>( state instanceof BuilderEntityState ? builderInfo : this, new Function2<EntityReference, Type, Object>() - { - @Override - public Object map( EntityReference entityReference, Type type ) - { - return uow.get( Classes.RAW_CLASS.map( 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() ) - { - Iterable<Class<?>> empty = 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() ) - { - Iterable<Class<?>> empty = 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 = first( resolution.model().types() ); - 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(); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationsModel.java deleted file mode 100644 index 40c5653..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationsModel.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2008-2011, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.runtime.association; - -import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Member; -import java.util.LinkedHashMap; -import java.util.Map; -import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.ManyAssociation; -import org.qi4j.api.common.QualifiedName; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.structure.ModuleUnitOfWork; -import org.qi4j.runtime.value.ValueStateInstance; -import org.qi4j.spi.entity.EntityState; - -/** - * Model for ManyAssociations. - */ -public final class ManyAssociationsModel - implements VisitableHierarchy<ManyAssociationsModel, ManyAssociationModel> -{ - private final Map<AccessibleObject, ManyAssociationModel> mapAccessorAssociationModel = new LinkedHashMap<>(); - - public ManyAssociationsModel() - { - } - - public Iterable<ManyAssociationModel> manyAssociations() - { - return mapAccessorAssociationModel.values(); - } - - public void addManyAssociation( ManyAssociationModel model ) - { - mapAccessorAssociationModel.put( model.accessor(), model ); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super ManyAssociationsModel, ? super ManyAssociationModel, ThrowableType> visitor ) - throws ThrowableType - { - if( visitor.visitEnter( this ) ) - { - for( ManyAssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( !associationModel.accept( visitor ) ) - { - break; - } - } - } - return visitor.visitLeave( this ); - } - - public <T> ManyAssociation<T> newInstance( AccessibleObject accessor, - EntityState entityState, - ModuleUnitOfWork uow ) - { - return mapAccessorAssociationModel.get( accessor ).newInstance( uow, entityState ); - } - - public ManyAssociationModel getManyAssociation( AccessibleObject accessor ) - throws IllegalArgumentException - { - ManyAssociationModel manyAssociationModel = mapAccessorAssociationModel.get( accessor ); - if( manyAssociationModel == null ) - { - throw new IllegalArgumentException( "No many-association found with name:" + ( (Member) accessor ).getName() ); - } - return manyAssociationModel; - } - - public AssociationDescriptor getManyAssociationByName( String name ) - throws IllegalArgumentException - { - for( ManyAssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( associationModel.qualifiedName().name().equals( name ) ) - { - return associationModel; - } - } - throw new IllegalArgumentException( "No many-association found with name:" + name ); - } - - public AssociationDescriptor getManyAssociationByQualifiedName( QualifiedName name ) - throws IllegalArgumentException - { - for( ManyAssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( associationModel.qualifiedName().equals( name ) ) - { - return associationModel; - } - } - throw new IllegalArgumentException( "No many-association found with qualified name:" + name ); - } - - public void checkConstraints( ValueStateInstance state ) - { - for( ManyAssociationModel manyAssociationModel : mapAccessorAssociationModel.values() ) - { - manyAssociationModel.checkAssociationConstraints( state.manyAssociationFor( manyAssociationModel.accessor() ) ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java deleted file mode 100644 index c38ef1a..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (c) 2011-2013, Niclas Hedhman. All Rights Reserved. - * Copyright (c) 2014, Paul Merlin. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.runtime.association; - -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.ManyAssociation; -import org.qi4j.api.association.ManyAssociationWrapper; -import org.qi4j.api.association.NamedAssociation; -import org.qi4j.api.association.NamedAssociationWrapper; -import org.qi4j.api.entity.EntityReference; -import org.qi4j.api.entity.Identity; -import org.qi4j.api.util.NullArgumentException; -import org.qi4j.functional.Function; -import org.qi4j.functional.Function2; -import org.qi4j.functional.Iterables; -import org.qi4j.spi.entity.NamedAssociationState; - -import static org.qi4j.functional.Iterables.map; - -public class NamedAssociationInstance<T> - extends AbstractAssociationInstance<T> - implements NamedAssociation<T> -{ - - private final NamedAssociationState namedAssociationState; - - public NamedAssociationInstance( AssociationInfo associationInfo, - Function2<EntityReference, Type, Object> associationFunction, - NamedAssociationState namedAssociationState - ) - { - super( associationInfo, associationFunction ); - this.namedAssociationState = namedAssociationState; - } - - @Override - public Iterator<String> iterator() - { - return namedAssociationState.iterator(); - } - - @Override - public int count() - { - return namedAssociationState.count(); - } - - @Override - public boolean containsName( String name ) - { - return namedAssociationState.containsName( name ); - } - - @Override - public boolean put( String name, T entity ) - { - NullArgumentException.validateNotNull( "entity", entity ); - checkImmutable(); - checkType( entity ); - associationInfo.checkConstraints( entity ); - return namedAssociationState.put( name, new EntityReference( ( (Identity) entity ).identity().get() ) ); - } - - @Override - public boolean remove( String name ) - { - checkImmutable(); - return namedAssociationState.remove( name ); - } - - @Override - public T get( String name ) - { - return getEntity( namedAssociationState.get( name ) ); - } - - @Override - public String nameOf( T entity ) - { - return namedAssociationState.nameOf( getEntityReference( entity ) ); - } - - @Override - public Map<String, T> toMap() - { - Map<String, T> map = new HashMap<>(); - for( String name : namedAssociationState ) - { - map.put( name, getEntity( namedAssociationState.get( name ) ) ); - } - return map; - } - - @Override - public Iterable<EntityReference> references() - { - return map( new Function<String, EntityReference>() - { - @Override - public EntityReference map( String name ) - { - return namedAssociationState.get( name ); - } - }, namedAssociationState ); - } - - @Override - public EntityReference referenceOf( String name ) - { - return namedAssociationState.get( name ); - } - - public Iterable<Map.Entry<String, EntityReference>> getEntityReferences() - { - return map( new Function<String, Map.Entry<String, EntityReference>>() - { - @Override - public Map.Entry<String, EntityReference> map( final String key ) - { - final EntityReference value = namedAssociationState.get( key ); - return new Map.Entry<String, EntityReference>() - { - @Override - public String getKey() - { - return key; - } - - @Override - public EntityReference getValue() - { - return value; - } - - @Override - public EntityReference setValue( EntityReference value ) - { - throw new UnsupportedOperationException( "Immutable Map" ); - } - - @Override - public boolean equals( Object o ) - { - if( o instanceof Map.Entry ) - { - Map.Entry other = (Map.Entry) o; - return key.equals( other.getKey() ); - } - return false; - } - - @Override - public int hashCode() - { - return 997 * key.hashCode() + 981813497; - } - }; - } - }, namedAssociationState ); - } - - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - NamedAssociation<?> that = (NamedAssociation) o; - // Unwrap if needed - while( that instanceof NamedAssociationWrapper ) - { - that = ( (NamedAssociationWrapper) that ).next(); - } - // Descriptor equality - NamedAssociationInstance<?> thatInstance = (NamedAssociationInstance) that; - AssociationDescriptor thatDescriptor = (AssociationDescriptor) thatInstance.associationInfo(); - if( !associationInfo.equals( thatDescriptor ) ) - { - return false; - } - // State equality - if( namedAssociationState.count() != thatInstance.namedAssociationState.count() ) - { - return false; - } - for( String name : namedAssociationState ) - { - if( !thatInstance.namedAssociationState.containsName( name ) ) - { - return false; - } - EntityReference thisReference = namedAssociationState.get( name ); - EntityReference thatReference = thatInstance.namedAssociationState.get( name ); - if( !thisReference.equals( thatReference ) ) - { - return false; - } - } - return true; - } - - @Override - public int hashCode() - { - int hash = associationInfo.hashCode() * 31; // Descriptor - for( String name : namedAssociationState ) - { - hash += name.hashCode(); - hash += namedAssociationState.get( name ).hashCode() * 7; // State - } - return hash; - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationModel.java deleted file mode 100644 index 7c144d0..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationModel.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2011-2013, Niclas Hedhman. All Rights Reserved. - * Copyright (c) 2014, Paul Merlin. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.runtime.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 org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.GenericAssociationInfo; -import org.qi4j.api.association.NamedAssociation; -import org.qi4j.api.common.MetaInfo; -import org.qi4j.api.common.QualifiedName; -import org.qi4j.api.constraint.ConstraintViolation; -import org.qi4j.api.constraint.ConstraintViolationException; -import org.qi4j.api.entity.Aggregated; -import org.qi4j.api.entity.EntityReference; -import org.qi4j.api.entity.Queryable; -import org.qi4j.api.property.Immutable; -import org.qi4j.api.util.Classes; -import org.qi4j.bootstrap.BindingException; -import org.qi4j.functional.Function2; -import org.qi4j.functional.Visitable; -import org.qi4j.functional.Visitor; -import org.qi4j.runtime.composite.ValueConstraintsInstance; -import org.qi4j.runtime.model.Binder; -import org.qi4j.runtime.model.Resolution; -import org.qi4j.runtime.structure.ModuleUnitOfWork; -import org.qi4j.runtime.unitofwork.BuilderEntityState; -import org.qi4j.spi.entity.EntityState; - -import static org.qi4j.functional.Iterables.empty; -import static org.qi4j.functional.Iterables.first; - -/** - * Model for a NamedAssociation. - * - * <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> -{ - 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; - } - - public <T> NamedAssociation<T> newInstance( final ModuleUnitOfWork uow, EntityState state ) - { - return new NamedAssociationInstance<>( state instanceof BuilderEntityState ? builderInfo : this, new Function2<EntityReference, Type, Object>() - { - @Override - public Object map( EntityReference entityReference, Type type ) - { - return uow.get( Classes.RAW_CLASS.map( 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() ) - { - Iterable<Class<?>> empty = 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() ) - { - Iterable<Class<?>> empty = 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 = first( resolution.model().types() ); - 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(); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java deleted file mode 100644 index 4f3fac5..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2011-2013, Niclas Hedhman. All Rights Reserved. - * Copyright (c) 2014, Paul Merlin. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.runtime.association; - -import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Member; -import java.util.LinkedHashMap; -import java.util.Map; -import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.NamedAssociation; -import org.qi4j.api.common.QualifiedName; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.structure.ModuleUnitOfWork; -import org.qi4j.runtime.value.ValueStateInstance; -import org.qi4j.spi.entity.EntityState; - -/** - * Model for NamedAssociations. - */ -public final class NamedAssociationsModel - implements VisitableHierarchy<NamedAssociationsModel, NamedAssociationModel> -{ - private final Map<AccessibleObject, NamedAssociationModel> mapAccessorAssociationModel = new LinkedHashMap<>(); - - public NamedAssociationsModel() - { - } - - public Iterable<NamedAssociationModel> namedAssociations() - { - return mapAccessorAssociationModel.values(); - } - - public void addNamedAssociation( NamedAssociationModel model ) - { - mapAccessorAssociationModel.put( model.accessor(), model ); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super NamedAssociationsModel, ? super NamedAssociationModel, ThrowableType> visitor ) - throws ThrowableType - { - if( visitor.visitEnter( this ) ) - { - for( NamedAssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( !associationModel.accept( visitor ) ) - { - break; - } - } - } - return visitor.visitLeave( this ); - } - - public <T> NamedAssociation<T> newInstance( AccessibleObject accessor, - EntityState entityState, - ModuleUnitOfWork uow ) - { - return mapAccessorAssociationModel.get( accessor ).newInstance( uow, entityState ); - } - - public NamedAssociationModel getNamedAssociation( AccessibleObject accessor ) - throws IllegalArgumentException - { - if( false ) - { - return (NamedAssociationModel) getNamedAssociationByName( QualifiedName.fromAccessor( accessor ).name() ); - } - NamedAssociationModel namedAssociationModel = mapAccessorAssociationModel.get( accessor ); - if( namedAssociationModel == null ) - { - throw new IllegalArgumentException( "No named-association found with name:" + ( (Member) accessor ).getName() ); - } - return namedAssociationModel; - } - - public AssociationDescriptor getNamedAssociationByName( String name ) - throws IllegalArgumentException - { - for( NamedAssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( associationModel.qualifiedName().name().equals( name ) ) - { - return associationModel; - } - } - throw new IllegalArgumentException( "No named-association found with name:" + name ); - } - - public AssociationDescriptor getNamedAssociationByQualifiedName( QualifiedName name ) - throws IllegalArgumentException - { - for( NamedAssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - if( associationModel.qualifiedName().equals( name ) ) - { - return associationModel; - } - } - throw new IllegalArgumentException( "No named-association found with qualified name:" + name ); - } - - public void checkConstraints( ValueStateInstance state ) - { - for( NamedAssociationModel associationModel : mapAccessorAssociationModel.values() ) - { - associationModel.checkAssociationConstraints( state.namedAssociationFor( associationModel.accessor() ) ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AndAppliesToFilter.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AndAppliesToFilter.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AndAppliesToFilter.java deleted file mode 100644 index fafc6b7..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AndAppliesToFilter.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2008, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.qi4j.runtime.bootstrap; - -import java.lang.reflect.Method; -import org.qi4j.api.common.AppliesToFilter; - -/** - * JAVADOC - */ -final class AndAppliesToFilter - implements AppliesToFilter -{ - private final AppliesToFilter left; - private final AppliesToFilter right; - - AndAppliesToFilter( AppliesToFilter left, AppliesToFilter right ) - { - this.left = left; - this.right = right; - } - - @Override - public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> fragmentClass ) - { - return left.appliesTo( method, mixin, compositeType, fragmentClass ) && - right.appliesTo( method, mixin, compositeType, fragmentClass ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AnnotationAppliesToFilter.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AnnotationAppliesToFilter.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AnnotationAppliesToFilter.java deleted file mode 100644 index 54cf2ad..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/AnnotationAppliesToFilter.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2008, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.qi4j.runtime.bootstrap; - -import java.lang.reflect.Method; -import org.qi4j.api.common.AppliesToFilter; - -/** - * JAVADOC - */ -final class AnnotationAppliesToFilter - implements AppliesToFilter -{ - @SuppressWarnings( "raw" ) - private final Class annotationType; - - @SuppressWarnings( "raw" ) - AnnotationAppliesToFilter( Class type ) - { - this.annotationType = type; - } - - @Override - @SuppressWarnings( "unchecked" ) - public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> fragmentClass ) - { - return method.getAnnotation( annotationType ) != null; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java deleted file mode 100644 index 7a25eed..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2007, Rickard Ãberg. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.qi4j.runtime.bootstrap; - -import org.qi4j.bootstrap.ApplicationAssembly; -import org.qi4j.bootstrap.ApplicationAssemblyFactory; -import org.qi4j.bootstrap.Assembler; -import org.qi4j.bootstrap.AssemblyException; -import org.qi4j.bootstrap.LayerAssembly; -import org.qi4j.bootstrap.ModuleAssembly; - -/** - * Factory for ApplicationAssembly. - */ -public final class ApplicationAssemblyFactoryImpl - implements ApplicationAssemblyFactory -{ - @Override - public ApplicationAssembly newApplicationAssembly( Assembler assembler ) - throws AssemblyException - { - return newApplicationAssembly( new Assembler[][][]{ { { assembler } } } ); - } - - @Override - public ApplicationAssembly newApplicationAssembly( Assembler[][][] assemblers ) - throws AssemblyException - { - ApplicationAssembly applicationAssembly = newApplicationAssembly(); - - // Build all layers bottom-up - LayerAssembly below = null; - for( int layer = assemblers.length - 1; layer >= 0; layer-- ) - { - // Create Layer - LayerAssembly layerAssembly = applicationAssembly.layer( "Layer " + ( layer + 1 ) ); - for( int module = 0; module < assemblers[ layer ].length; module++ ) - { - // Create Module - ModuleAssembly moduleAssembly = layerAssembly.module( "Module " + ( module + 1 ) ); - for( Assembler assembler : assemblers[ layer ][ module ] ) - { - // Register Assembler - assembler.assemble( moduleAssembly ); - } - } - if( below != null ) - { - layerAssembly.uses( below ); // Link layers - } - below = layerAssembly; - } - return applicationAssembly; - } - - @Override - public ApplicationAssembly newApplicationAssembly() - { - return new ApplicationAssemblyImpl(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyImpl.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyImpl.java deleted file mode 100644 index 48438e1..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationAssemblyImpl.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2007, Rickard Ãberg. All Rights Reserved. - * Copyright (c) 2012, Paul Merlin. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.qi4j.runtime.bootstrap; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.qi4j.api.activation.Activator; -import org.qi4j.api.common.MetaInfo; -import org.qi4j.api.structure.Application; -import org.qi4j.bootstrap.ApplicationAssembly; -import org.qi4j.bootstrap.AssemblyVisitor; -import org.qi4j.bootstrap.LayerAssembly; -import org.qi4j.bootstrap.ModuleAssembly; - -/** - * The representation of an entire application. From - * this you can set information about the application - * and create LayerAssemblies. - */ -public final class ApplicationAssemblyImpl - implements ApplicationAssembly -{ - private final Map<String, LayerAssemblyImpl> layerAssemblies = new LinkedHashMap<>(); - private String name = "Application"; - private String version = "1.0"; // Default version - private Application.Mode mode; - private final MetaInfo metaInfo = new MetaInfo(); - private final List<Class<? extends Activator<Application>>> activators = new ArrayList<>(); - - public ApplicationAssemblyImpl() - { - mode = Application.Mode.valueOf( System.getProperty( "mode", "production" ) ); - } - - @Override - public LayerAssembly layer( String name ) - { - if( name != null ) - { - LayerAssemblyImpl existing = layerAssemblies.get( name ); - if( existing != null ) - { - return existing; - } - } - LayerAssemblyImpl layerAssembly = new LayerAssemblyImpl( this, name ); - layerAssemblies.put( name, layerAssembly ); - return layerAssembly; - } - - @Override - public ModuleAssembly module( String layerName, String moduleName ) - { - return layer( layerName ).module( moduleName ); - } - - @Override - public ApplicationAssembly setName( String name ) - { - this.name = name; - return this; - } - - @Override - public ApplicationAssembly setVersion( String version ) - { - this.version = version; - return this; - } - - @Override - public ApplicationAssembly setMode( Application.Mode mode ) - { - this.mode = mode; - return this; - } - - @Override - public ApplicationAssembly setMetaInfo( Object info ) - { - metaInfo.set( info ); - return this; - } - - @Override - @SafeVarargs - public final ApplicationAssembly withActivators( Class<? extends Activator<Application>>... activators ) - { - this.activators.addAll( Arrays.asList( activators ) ); - return this; - } - - @Override - public <ThrowableType extends Throwable> void visit( AssemblyVisitor<ThrowableType> visitor ) - throws ThrowableType - { - visitor.visitApplication( this ); - for( LayerAssemblyImpl layerAssembly : layerAssemblies.values() ) - { - layerAssembly.visit( visitor ); - } - } - - public Collection<LayerAssemblyImpl> layerAssemblies() - { - return layerAssemblies.values(); - } - - public List<Class<? extends Activator<Application>>> activators() - { - return activators; - } - - public MetaInfo metaInfo() - { - return metaInfo; - } - - @Override - public String name() - { - return name; - } - - public String version() - { - return version; - } - - @Override - public Application.Mode mode() - { - return mode; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/061ddaa0/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationModelFactoryImpl.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationModelFactoryImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationModelFactoryImpl.java deleted file mode 100644 index 8669ed7..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ApplicationModelFactoryImpl.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2007, Rickard Ãberg. All Rights Reserved. - * Copyright (c) 2012, Paul Merlin. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.qi4j.runtime.bootstrap; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.qi4j.api.composite.ModelDescriptor; -import org.qi4j.api.structure.Application; -import org.qi4j.api.structure.ApplicationDescriptor; -import org.qi4j.api.structure.Layer; -import org.qi4j.bootstrap.ApplicationAssembly; -import org.qi4j.bootstrap.ApplicationModelFactory; -import org.qi4j.bootstrap.AssemblyException; -import org.qi4j.bootstrap.BindingException; -import org.qi4j.bootstrap.LayerAssembly; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.runtime.activation.ActivatorsModel; -import org.qi4j.runtime.composite.CompositeMethodModel; -import org.qi4j.runtime.injection.InjectedFieldModel; -import org.qi4j.runtime.model.Binder; -import org.qi4j.runtime.model.Resolution; -import org.qi4j.runtime.structure.ApplicationModel; -import org.qi4j.runtime.structure.LayerModel; -import org.qi4j.runtime.structure.ModuleModel; -import org.qi4j.runtime.structure.UsedLayersModel; - -/** - * Factory for Applications. - */ -public final class ApplicationModelFactoryImpl - implements ApplicationModelFactory -{ - @Override - public ApplicationDescriptor newApplicationModel( ApplicationAssembly assembly ) - throws AssemblyException - { - AssemblyHelper helper = new AssemblyHelper(); - - ApplicationAssemblyImpl applicationAssembly = (ApplicationAssemblyImpl) assembly; - ActivatorsModel<Application> applicationActivators = new ActivatorsModel<>( applicationAssembly.activators() ); - List<LayerModel> layerModels = new ArrayList<>(); - final ApplicationModel applicationModel = new ApplicationModel( applicationAssembly.name(), - applicationAssembly.version(), - applicationAssembly.mode(), - applicationAssembly.metaInfo(), - applicationActivators, - layerModels ); - Map<LayerAssembly, LayerModel> mapAssemblyModel = new HashMap<>(); - Map<LayerAssembly, List<LayerModel>> mapUsedLayers = new HashMap<>(); - - // Build all layers - List<LayerAssemblyImpl> layerAssemblies = new ArrayList<>( applicationAssembly.layerAssemblies() ); - for( LayerAssemblyImpl layerAssembly : layerAssemblies ) - { - List<LayerModel> usedLayers = new ArrayList<>(); - mapUsedLayers.put( layerAssembly, usedLayers ); - - UsedLayersModel usedLayersModel = new UsedLayersModel( usedLayers ); - List<ModuleModel> moduleModels = new ArrayList<>(); - String name = layerAssembly.name(); - if( name == null ) - { - throw new AssemblyException( "Layer must have name set" ); - } - ActivatorsModel<Layer> layerActivators = new ActivatorsModel<>( layerAssembly.activators() ); - LayerModel layerModel = new LayerModel( name, layerAssembly.metaInfo(), usedLayersModel, layerActivators, moduleModels ); - - for( ModuleAssemblyImpl moduleAssembly : layerAssembly.moduleAssemblies() ) - { - moduleModels.add( moduleAssembly.assembleModule( helper ) ); - } - mapAssemblyModel.put( layerAssembly, layerModel ); - layerModels.add( layerModel ); - } - - // Populate used layer lists - for( LayerAssemblyImpl layerAssembly : layerAssemblies ) - { - Set<LayerAssembly> usesLayers = layerAssembly.uses(); - List<LayerModel> usedLayers = mapUsedLayers.get( layerAssembly ); - for( LayerAssembly usesLayer : usesLayers ) - { - LayerModel layerModel = mapAssemblyModel.get( usesLayer ); - usedLayers.add( layerModel ); - } - } - - // Bind model - // This will resolve all dependencies - try - { -// applicationModel.bind(); - applicationModel.accept( new BindingVisitor( applicationModel ) ); - } - catch( BindingException e ) - { - throw new AssemblyException( "Unable to bind: " + applicationModel, e ); - } - - return applicationModel; - } - - private static class BindingVisitor - implements HierarchicalVisitor<Object, Object, BindingException> - { - private LayerModel layer; - private ModuleModel module; - private ModelDescriptor objectDescriptor; - private CompositeMethodModel compositeMethodModel; - - private Resolution resolution; - private final ApplicationModel applicationModel; - - private BindingVisitor( ApplicationModel applicationModel ) - { - this.applicationModel = applicationModel; - } - - @Override - public boolean visitEnter( Object visited ) - throws BindingException - { - if( visited instanceof Binder ) - { - Binder binder = (Binder) visited; - binder.bind( resolution ); - - return false; - } - else if( visited instanceof CompositeMethodModel ) - { - compositeMethodModel = (CompositeMethodModel) visited; - resolution = new Resolution( applicationModel, layer, module, objectDescriptor, compositeMethodModel, null ); - } - else if( visited instanceof ModelDescriptor ) - { - objectDescriptor = (ModelDescriptor) visited; - resolution = new Resolution( applicationModel, layer, module, objectDescriptor, null, null ); - } - else if( visited instanceof InjectedFieldModel ) - { - InjectedFieldModel fieldModel = (InjectedFieldModel) visited; - fieldModel.bind( new Resolution( applicationModel, layer, module, - objectDescriptor, compositeMethodModel, fieldModel.field() ) ); - } - else if( visited instanceof ModuleModel ) - { - module = (ModuleModel) visited; - } - else if( visited instanceof LayerModel ) - { - layer = (LayerModel) visited; - } - - return true; - } - - @Override - public boolean visitLeave( Object visited ) - throws BindingException - { - return true; - } - - @Override - public boolean visit( Object visited ) - throws BindingException - { - if( visited instanceof Binder ) - { - ( (Binder) visited ).bind( resolution ); - } - return true; - } - } -} \ No newline at end of file
