http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java deleted file mode 100644 index b457f1d..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java +++ /dev/null @@ -1,177 +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.composite; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import org.qi4j.api.common.ConstructionException; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.injection.Dependencies; -import org.qi4j.runtime.injection.DependencyModel; -import org.qi4j.runtime.injection.InjectedFieldsModel; -import org.qi4j.runtime.injection.InjectedMethodsModel; -import org.qi4j.runtime.injection.InjectionContext; -import org.qi4j.spi.module.ModuleSpi; - -import static org.qi4j.api.util.Classes.RAW_CLASS; -import static org.qi4j.api.util.Classes.interfacesOf; -import static org.qi4j.functional.Iterables.flattenIterables; -import static org.qi4j.functional.Iterables.iterable; -import static org.qi4j.functional.Iterables.map; -import static org.qi4j.functional.Iterables.toArray; -import static org.qi4j.functional.Iterables.unique; - -/** - * JAVADOC - */ -public abstract class AbstractModifierModel - implements Dependencies, VisitableHierarchy<Object, Object> -{ - private final Class<?> modifierClass; - - private final ConstructorsModel constructorsModel; - private final InjectedFieldsModel injectedFieldsModel; - private final InjectedMethodsModel injectedMethodsModel; - - private final Class<?>[] nextInterfaces; - - @SuppressWarnings( "unchecked" ) - public AbstractModifierModel( Class<?> declaredModifierClass, Class<?> instantiationClass ) - { - this.modifierClass = instantiationClass; - constructorsModel = new ConstructorsModel( modifierClass ); - injectedFieldsModel = new InjectedFieldsModel( declaredModifierClass ); - injectedMethodsModel = new InjectedMethodsModel( declaredModifierClass ); - Class<Class<?>> componentType = (Class<Class<?>>) Class.class.cast( Class.class ); - nextInterfaces = toArray( componentType, unique( map( RAW_CLASS, interfacesOf( declaredModifierClass ) ) ) ); - } - - public Class<?> modifierClass() - { - return modifierClass; - } - - @Override - @SuppressWarnings( "unchecked" ) - public Iterable<DependencyModel> dependencies() - { - return flattenIterables( map( DEPENDENCIES_FUNCTION, iterable( constructorsModel, injectedFieldsModel, injectedMethodsModel ) ) ); - } - - public boolean isGeneric() - { - return InvocationHandler.class.isAssignableFrom( modifierClass ); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> visitor ) - throws ThrowableType - { - if( visitor.visitEnter( this ) ) - { - if( constructorsModel.accept( visitor ) ) - { - if( injectedFieldsModel.accept( visitor ) ) - { - injectedMethodsModel.accept( visitor ); - } - } - } - - return visitor.visitLeave( this ); - } - - // Context - public InvocationHandler newInstance( ModuleSpi moduleInstance, - InvocationHandler next, - ProxyReferenceInvocationHandler proxyHandler, - Method method - ) - { - InjectionContext injectionContext = new InjectionContext( moduleInstance, wrapNext( next ), proxyHandler ); - - Object modifier = constructorsModel.newInstance( injectionContext ); - - try - { - if( FragmentClassLoader.isGenerated( modifier ) ) - { - modifier.getClass().getField( "_instance" ).set( modifier, proxyHandler ); - } - } - catch( IllegalAccessException | NoSuchFieldException e ) - { - e.printStackTrace(); - } - - injectedFieldsModel.inject( injectionContext, modifier ); - injectedMethodsModel.inject( injectionContext, modifier ); - - if( isGeneric() ) - { - return (InvocationHandler) modifier; - } - else - { - try - { - Method invocationMethod = modifierClass.getMethod( "_" + method.getName(), method.getParameterTypes() ); - TypedModifierInvocationHandler handler = new TypedModifierInvocationHandler(); - handler.setFragment( modifier ); - handler.setMethod( invocationMethod ); - return handler; - } - catch( NoSuchMethodException e ) - { - throw new ConstructionException( "Could not find modifier method", e ); - } - } - } - - private Object wrapNext( InvocationHandler next ) - { - if( isGeneric() ) - { - return next; - } - else - { - return Proxy.newProxyInstance( modifierClass.getClassLoader(), nextInterfaces, next ); - } - } - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - AbstractModifierModel that = (AbstractModifierModel) o; - return modifierClass.equals( that.modifierClass ); - } - - @Override - public int hashCode() - { - return modifierClass.hashCode(); - } -} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/AtomicInstancePool.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/AtomicInstancePool.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/AtomicInstancePool.java deleted file mode 100644 index 656b3f8..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/AtomicInstancePool.java +++ /dev/null @@ -1,53 +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.composite; - -import java.util.concurrent.atomic.AtomicReference; - -/** - * Method instance pool that keeps a linked list. Uses atomic reference - * to ensure that instances are acquired and returned in a thread-safe - * manner. - */ -public final class AtomicInstancePool - implements InstancePool<CompositeMethodInstance> -{ - private final AtomicReference<CompositeMethodInstance> first = new AtomicReference<CompositeMethodInstance>(); - - @Override - public CompositeMethodInstance obtainInstance() - { - CompositeMethodInstance firstInstance; - do - { - firstInstance = first.get(); - } - while( firstInstance != null && !first.compareAndSet( firstInstance, firstInstance.getNext() ) ); - - return firstInstance; - } - - @Override - public void releaseInstance( CompositeMethodInstance compositeMethodInstance ) - { - CompositeMethodInstance firstInstance; - do - { - firstInstance = first.get(); - compositeMethodInstance.setNext( firstInstance ); - } - while( !first.compareAndSet( firstInstance, compositeMethodInstance ) ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java deleted file mode 100644 index 199fd4f..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2007, Rickard Ãberg. All Rights Reserved. - * Copyright (c) 2007, Niclas Hedhman. 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.composite; - -/** - * Compaction Level of the StackTrace clenaup operation. - * - * <pre> - * <b>off</b> = Do not modify the stack trace. - * <b>proxy</b> = Remove all Zest internal classes and all JDK internal classes from - * the originating method call. - * <b>semi</b> = Remove all JDK internal classes on the entire stack. - * <b>extensive</b> = Remove all Zest internal and JDK internal classes from the entire stack. - * </pre> - * - * <p> - * The Compaction is set through the System Property "<code><b>qi4j.compacttrace</b></code>" to - * any of the above values. - * </p> - */ -enum CompactLevel -{ - off, proxy, semi, extensive -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeConstraintModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeConstraintModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeConstraintModel.java deleted file mode 100644 index 54a7131..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeConstraintModel.java +++ /dev/null @@ -1,68 +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.composite; - -import java.lang.annotation.Annotation; -import org.qi4j.api.common.ConstructionException; -import org.qi4j.api.constraint.Constraint; - -/** - * JAVADOC - */ -public final class CompositeConstraintModel - extends AbstractConstraintModel -{ - private final ValueConstraintsModel constraintsModel; - - public CompositeConstraintModel( Annotation annotation, ValueConstraintsModel constraintsModel ) - { - super( annotation ); - this.constraintsModel = constraintsModel; - } - - @Override - @SuppressWarnings( {"raw", "unchecked"} ) - public ConstraintInstance<?, ?> newInstance() - { - try - { - ValueConstraintsInstance compositeConstraintsInstance = constraintsModel.newInstance(); - Constraint<?, ?> constraint = new CompositeConstraintInstance( compositeConstraintsInstance ); - return new ConstraintInstance( constraint, annotation ); - } - catch( Exception e ) - { - throw new ConstructionException( "Could not instantiate constraint implementation", e ); - } - } - - private static class CompositeConstraintInstance - implements Constraint<Annotation, Object> - { - private final ValueConstraintsInstance valueConstraintsInstance; - - private CompositeConstraintInstance( ValueConstraintsInstance valueConstraintsInstance ) - { - this.valueConstraintsInstance = valueConstraintsInstance; - } - - @Override - public boolean isValid( Annotation annotation, Object value ) - throws NullPointerException - { - return valueConstraintsInstance.checkConstraints( value ).isEmpty(); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodInstance.java deleted file mode 100644 index c3a4ad2..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodInstance.java +++ /dev/null @@ -1,77 +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.composite; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; - -/** - * JAVADOC - */ -public final class CompositeMethodInstance -{ - private final InvocationHandler invoker; - private final FragmentInvocationHandler mixinInvoker; - private final Method method; - private final int methodIdx; - - private CompositeMethodInstance next; - - public CompositeMethodInstance( InvocationHandler invoker, - FragmentInvocationHandler mixinInvoker, - Method method, int methodIdx - ) - { - this.invoker = invoker; - this.method = method; - this.mixinInvoker = mixinInvoker; - this.methodIdx = methodIdx; - } - - public Method method() - { - return method; - } - - public Object getMixinFrom( Object[] mixins ) - { - return mixins[ methodIdx ]; - } - - public Object invoke( Object composite, Object[] params, Object mixin ) - throws Throwable - { - mixinInvoker.setFragment( mixin ); - - try - { - return invoker.invoke( composite, method, params ); - } - finally - { - mixinInvoker.setFragment( null ); - } - } - - public CompositeMethodInstance getNext() - { - return next; - } - - public void setNext( CompositeMethodInstance next ) - { - this.next = next; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java deleted file mode 100644 index 3162130..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java +++ /dev/null @@ -1,321 +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.composite; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Array; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.qi4j.api.common.ConstructionException; -import org.qi4j.api.composite.MethodDescriptor; -import org.qi4j.api.util.NullArgumentException; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.injection.Dependencies; -import org.qi4j.runtime.injection.DependencyModel; -import org.qi4j.spi.module.ModuleSpi; - -import static org.qi4j.functional.Iterables.filter; -import static org.qi4j.functional.Iterables.flattenIterables; -import static org.qi4j.functional.Iterables.iterable; -import static org.qi4j.functional.Specifications.notNull; - -/** - * JAVADOC - */ -public final class CompositeMethodModel - implements MethodDescriptor, Dependencies, VisitableHierarchy<Object, Object> -{ - // Model - private final Method method; - private Method invocationMethod; // This will be the _ prefixed method on typed mixins - private final ConstraintsModel constraints; - private final ConcernsModel concerns; - private final SideEffectsModel sideEffects; - private final MixinsModel mixins; - private AnnotatedElement annotations; - - // Context -// private final SynchronizedCompositeMethodInstancePool instancePool = new SynchronizedCompositeMethodInstancePool(); - private final AtomicInstancePool instancePool = new AtomicInstancePool(); - private final ConstraintsInstance constraintsInstance; - - public CompositeMethodModel( Method method, - ConstraintsModel constraintsModel, - ConcernsModel concernsModel, - SideEffectsModel sideEffectsModel, - MixinsModel mixinsModel - ) - { - this.method = method; - mixins = mixinsModel; - concerns = concernsModel; - sideEffects = sideEffectsModel; - constraints = constraintsModel; - constraintsInstance = constraints.newInstance(); - initialize(); - } - - private void initialize() - { - annotations = new CompositeMethodAnnotatedElement(); - this.method.setAccessible( true ); -// instancePool = new SynchronizedCompositeMethodInstancePool(); - } - - // Model - - @Override - public Method method() - { - return method; - } - - public MixinModel mixin() - { - return mixins.mixinFor( method ); - } - - @Override - @SuppressWarnings( "unchecked" ) - public Iterable<DependencyModel> dependencies() - { - return flattenIterables( filter( notNull(), iterable( concerns != null ? concerns.dependencies() : null, - sideEffects != null ? sideEffects.dependencies() : null ) ) ); - } - - // Context - public Object invoke( Object composite, Object[] params, MixinsInstance mixins, ModuleSpi moduleInstance ) - throws Throwable - { - constraintsInstance.checkValid( composite, method, params ); - - CompositeMethodInstance methodInstance = getInstance( moduleInstance ); - try - { - return mixins.invoke( composite, params, methodInstance ); - } - finally - { - instancePool.releaseInstance( methodInstance ); - } - } - - private CompositeMethodInstance getInstance( ModuleSpi moduleInstance ) - { - CompositeMethodInstance methodInstance = instancePool.obtainInstance(); - if( methodInstance == null ) - { - methodInstance = newCompositeMethodInstance( moduleInstance ); - } - - return methodInstance; - } - - private CompositeMethodInstance newCompositeMethodInstance( ModuleSpi moduleInstance ) - throws ConstructionException - { - FragmentInvocationHandler mixinInvocationHandler = mixins.newInvocationHandler( method ); - InvocationHandler invoker = mixinInvocationHandler; - if( concerns != ConcernsModel.EMPTY_CONCERNS ) - { - ConcernsInstance concernsInstance = concerns.newInstance( method, moduleInstance, mixinInvocationHandler ); - invoker = concernsInstance; - } - if( sideEffects != SideEffectsModel.EMPTY_SIDEEFFECTS ) - { - SideEffectsInstance sideEffectsInstance = sideEffects.newInstance( method, moduleInstance, invoker ); - invoker = sideEffectsInstance; - } - - if( invocationMethod == null ) - { - MixinModel model = mixins.mixinFor( method ); - if( !InvocationHandler.class.isAssignableFrom( model.mixinClass() ) ) - { - try - { - invocationMethod = model.instantiationClass() - .getMethod( "_" + method.getName(), method.getParameterTypes() ); - } - catch( NoSuchMethodException e ) - { - invocationMethod = method; -// throw new ConstructionException( "Could not find the subclass method", e ); - } - } - else - { - invocationMethod = method; - } - } - - mixinInvocationHandler.setMethod( invocationMethod ); - - return new CompositeMethodInstance( invoker, mixinInvocationHandler, method, mixins.methodIndex.get( method ) ); - } - - public AnnotatedElement annotatedElement() - { - return annotations; - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - if( modelVisitor.visitEnter( this ) ) - { - constraints.accept( modelVisitor ); - concerns.accept( modelVisitor ); - sideEffects.accept( modelVisitor ); - } - return modelVisitor.visitLeave( this ); - } - - @Override - public String toString() - { - return method.toGenericString(); - } - - public Iterable<Method> invocationsFor( Class<?> mixinClass ) - { - return mixins.invocationsFor( mixinClass ); - } - - public class CompositeMethodAnnotatedElement - implements AnnotatedElement - { - @Override - public boolean isAnnotationPresent( Class<? extends Annotation> annotationClass ) - { - // Check method - if( method.isAnnotationPresent( annotationClass ) ) - { - return true; - } - - // Check mixin - try - { - MixinModel model = mixins.mixinFor( method ); - if( GenericSpecification.INSTANCE.satisfiedBy( model.mixinClass() ) ) - { - return false; - } - return ( model.mixinClass() - .getMethod( method.getName(), method.getParameterTypes() ) - .isAnnotationPresent( annotationClass ) ); - } - catch( NoSuchMethodException e ) - { - return false; - } - } - - @Override - public <T extends Annotation> T getAnnotation( Class<T> annotationClass ) - { - // Check mixin - try - { - MixinModel model = mixins.mixinFor( method ); - if( !GenericSpecification.INSTANCE.satisfiedBy( model.mixinClass() ) ) - { - T annotation = annotationClass.cast( model.mixinClass() - .getMethod( method.getName(), method.getParameterTypes() ) - .getAnnotation( annotationClass ) ); - if( annotation != null ) - { - return annotation; - } - } - } - catch( NoSuchMethodException e ) - { - // Ignore - } - - // Check method - return method.getAnnotation( annotationClass ); - } - - @Override - public Annotation[] getAnnotations() - { - // Add mixin annotations - List<Annotation> annotations = new ArrayList<Annotation>(); - MixinModel model = mixins.mixinFor( method ); - Annotation[] mixinAnnotations = new Annotation[ 0 ]; - if( !GenericSpecification.INSTANCE.satisfiedBy( model.mixinClass() ) ) - { - mixinAnnotations = model.mixinClass().getAnnotations(); - annotations.addAll( Arrays.asList( mixinAnnotations ) ); - } - - // Add method annotations, but don't include duplicates - Annotation[] methodAnnotations = method.getAnnotations(); - next: - for( Annotation methodAnnotation : methodAnnotations ) - { - for( int i = 0; i < mixinAnnotations.length; i++ ) - { - if( annotations.get( i ).annotationType().equals( methodAnnotation.annotationType() ) ) - { - continue next; - } - } - - annotations.add( methodAnnotation ); - } - - return annotations.toArray( new Annotation[ annotations.size() ] ); - } - - @Override - public Annotation[] getDeclaredAnnotations() - { - return new Annotation[ 0 ]; - } - - // @Override (Since JDK 8) - @SuppressWarnings( "unchecked" ) - public <T extends Annotation> T[] getAnnotationsByType( Class<T> annotationClass ) - { - NullArgumentException.validateNotNull( "annotationClass", annotationClass ); - return (T[]) Array.newInstance( annotationClass, 0 ); - } - - // @Override (Since JDK 8) - public <T extends Annotation> T getDeclaredAnnotation( Class<T> annotationClass ) - { - NullArgumentException.validateNotNull( "annotationClass", annotationClass ); - return null; - } - - // @Override (Since JDK 8) - @SuppressWarnings( "unchecked" ) - public <T extends Annotation> T[] getDeclaredAnnotationsByType( Class<T> annotationClass ) - { - NullArgumentException.validateNotNull( "annotationClass", annotationClass ); - return (T[]) Array.newInstance( annotationClass, 0 ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java deleted file mode 100644 index bf0c113..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java +++ /dev/null @@ -1,132 +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.composite; - -import java.lang.reflect.Method; -import java.util.LinkedHashMap; -import org.qi4j.api.composite.MissingMethodException; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.Iterables; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.injection.Dependencies; -import org.qi4j.runtime.injection.DependencyModel; -import org.qi4j.spi.module.ModuleSpi; - -import static org.qi4j.functional.Iterables.map; - -/** - * Model for Composite methods. This includes both private and public methods. - */ -public final class CompositeMethodsModel - implements VisitableHierarchy<Object, Object> -{ - private final LinkedHashMap<Method, CompositeMethodModel> methods; - private final MixinsModel mixinsModel; - - public CompositeMethodsModel( MixinsModel mixinsModel ) - { - methods = new LinkedHashMap<>(); - this.mixinsModel = mixinsModel; - } - - public Iterable<DependencyModel> dependencies() - { - return Iterables.flattenIterables( map( Dependencies.DEPENDENCIES_FUNCTION, methods.values() ) ); - } - - // Context - public Object invoke( MixinsInstance mixins, - Object proxy, - Method method, - Object[] args, - ModuleSpi moduleInstance - ) - throws Throwable - { - CompositeMethodModel compositeMethod = methods.get( method ); - - if( compositeMethod == null ) - { - if( method.getDeclaringClass().equals( Object.class ) ) - { - return mixins.invokeObject( proxy, args, method ); - } - - if( !method.getDeclaringClass().isInterface() ) - { - Iterable<Class<?>> types = mixinsModel.mixinTypes(); - for( Class<?> aClass : types ) - { - try - { - Method realMethod = aClass.getMethod( method.getName(), method.getParameterTypes() ); - compositeMethod = methods.get( realMethod ); - break; - } - catch( NoSuchMethodException e ) - { - } - catch( SecurityException e ) - { - } - } - } -// return mixins.invokeObject( proxy, args, method ); - throw new MissingMethodException( "Method '" + method + "' is not implemented" ); - } - else - { - return compositeMethod.invoke( proxy, args, mixins, moduleInstance ); - } - } - - public void addMethod( CompositeMethodModel methodModel ) - { - methods.put( methodModel.method(), methodModel ); - } - - public boolean isImplemented( Method method ) - { - return methods.containsKey( method ); - } - - public Iterable<Method> methods() - { - return methods.keySet(); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - if( modelVisitor.visitEnter( this ) ) - { - for( CompositeMethodModel compositeMethodModel : methods.values() ) - { - if( !compositeMethodModel.accept( modelVisitor ) ) - { - break; - } - } - } - return modelVisitor.visitLeave( this ); - } - - @Override - public String toString() - { - return methods().toString(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java deleted file mode 100644 index a6ea122..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java +++ /dev/null @@ -1,269 +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.composite; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.LinkedHashSet; -import java.util.Set; -import org.qi4j.api.common.ConstructionException; -import org.qi4j.api.common.MetaInfo; -import org.qi4j.api.common.Visibility; -import org.qi4j.api.composite.Composite; -import org.qi4j.api.composite.CompositeDescriptor; -import org.qi4j.api.composite.InvalidCompositeException; -import org.qi4j.api.structure.Module; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.Iterables; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.injection.Dependencies; -import org.qi4j.runtime.injection.DependencyModel; -import org.qi4j.runtime.structure.ModuleInstance; -import org.qi4j.spi.module.ModuleSpi; - -import static java.lang.reflect.Proxy.newProxyInstance; -import static org.qi4j.functional.Iterables.first; -import static org.qi4j.functional.Iterables.toList; - -/** - * JAVADOC - */ -public abstract class CompositeModel - implements VisitableHierarchy<Object, Object>, Dependencies, CompositeDescriptor -{ - protected final MixinsModel mixinsModel; - protected final CompositeMethodsModel compositeMethodsModel; - private final Set<Class<?>> types; - private final Visibility visibility; - private final MetaInfo metaInfo; - protected final StateModel stateModel; - protected Class<? extends Composite> proxyClass; - protected Constructor<? extends Composite> proxyConstructor; - - protected CompositeModel( final Iterable<Class<?>> types, - final Visibility visibility, - final MetaInfo metaInfo, - final MixinsModel mixinsModel, - final StateModel stateModel, - final CompositeMethodsModel compositeMethodsModel - ) - { - this.types = Iterables.addAll( new LinkedHashSet<Class<?>>(), types ); - this.visibility = visibility; - this.metaInfo = metaInfo; - this.stateModel = stateModel; - this.compositeMethodsModel = compositeMethodsModel; - this.mixinsModel = mixinsModel; - - // Create proxy class - createProxyClass(); - } - - // Model - @Override - public Iterable<Class<?>> types() - { - return types; - } - - public StateModel state() - { - return stateModel; - } - - @Override - public <T> T metaInfo( Class<T> infoType ) - { - return metaInfo.get( infoType ); - } - - @Override - public Visibility visibility() - { - return visibility; - } - - @Override - public boolean isAssignableTo( Class<?> type ) - { - for( Class<?> aClass : types ) - { - if( type.isAssignableFrom( aClass ) ) - { - return true; - } - } - return false; - } - - public MixinsModel mixinsModel() - { - return mixinsModel; - } - - @Override - @SuppressWarnings( { "raw", "unchecked" } ) - public Class<?> primaryType() - { - Class primaryType = null; - for( Class type : mixinTypes() ) - { - if( type.getName().equals( "scala.ScalaObject" ) ) - { - continue; - } - if( primaryType == null ) - { - primaryType = type; - } - else if( primaryType.isAssignableFrom( type ) ) - { - primaryType = type; - } - } - return primaryType; - } - - @Override - public Iterable<Class<?>> mixinTypes() - { - return mixinsModel.mixinTypes(); - } - - @Override - public Iterable<DependencyModel> dependencies() - { - return Iterables.flatten( mixinsModel.dependencies(), compositeMethodsModel.dependencies() ); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> visitor ) - throws ThrowableType - { - if( visitor.visitEnter( this ) ) - { - if( compositeMethodsModel.accept( visitor ) ) - { - if( stateModel.accept( visitor ) ) - { - mixinsModel.accept( visitor ); - } - } - } - return visitor.visitLeave( this ); - } - - @SuppressWarnings( { "raw", "unchecked" } ) - private void createProxyClass() - { - Class<?> mainType = first( types ); - if( mainType.isInterface() ) - { - ClassLoader proxyClassloader = mainType.getClassLoader(); - - Class<?>[] interfaces = Iterables.toArray( Class.class, Iterables.<Class>cast( types ) ); - proxyClass = (Class<? extends Composite>) ProxyGenerator.createProxyClass( proxyClassloader, interfaces ); - - try - { - proxyConstructor = proxyClass.getConstructor( InvocationHandler.class ); - } - catch( NoSuchMethodException e ) - { - throw (InvalidCompositeException) new InvalidCompositeException( "Could not get proxy constructor" ).initCause( e ); - } - proxyConstructor.setAccessible( true ); - } - else - { - try - { - proxyClass = new TransientClassLoader( getClass().getClassLoader() ).loadFragmentClass( mainType ); - proxyConstructor = (Constructor<? extends Composite>) proxyClass.getConstructors()[ 0 ]; - } - catch( ClassNotFoundException e ) - { - throw (InvalidCompositeException) new InvalidCompositeException( "Could not get proxy constructor" ).initCause( e ); - } - } - } - - // Context - public final Object invoke( MixinsInstance mixins, - Object proxy, - Method method, - Object[] args, - ModuleSpi moduleInstance - ) - throws Throwable - { - return compositeMethodsModel.invoke( mixins, proxy, method, args, moduleInstance ); - } - - public Composite newProxy( InvocationHandler invocationHandler ) - throws ConstructionException - { - Class<?> mainType = first( types() ); - if( mainType.isInterface() ) - { - - try - { - return Composite.class.cast( proxyConstructor.newInstance( invocationHandler ) ); - } - catch( Exception e ) - { - throw new ConstructionException( e ); - } - } - else - { - try - { - Object[] args = new Object[ proxyConstructor.getParameterTypes().length ]; - Composite composite = Composite.class.cast( proxyConstructor.newInstance( args ) ); - proxyClass.getField( "_instance" ).set( composite, invocationHandler ); - return composite; - } - catch( Exception e ) - { - throw new ConstructionException( e ); - } - } - } - - @SuppressWarnings( "raw" ) - public <T> T newProxy( InvocationHandler invocationHandler, Class<T> mixinType ) - throws IllegalArgumentException - { - -// if (!matchesAny( isAssignableFrom( mixinType ), types )) - if( !mixinsModel.isImplemented( mixinType ) ) - { - String message = "Composite " + primaryType().getName() + " does not implement type " + mixinType.getName(); - throw new IllegalArgumentException( message ); - } - - // Instantiate proxy for given mixin interface - return mixinType.cast( newProxyInstance( mixinType.getClassLoader(), new Class[]{ mixinType }, invocationHandler ) ); - } - - @Override - public String toString() - { - return toList( types ).toString(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernModel.java deleted file mode 100644 index 893737c..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernModel.java +++ /dev/null @@ -1,29 +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.composite; - -import org.qi4j.api.concern.ConcernDescriptor; - -/** - * JAVADOC - */ -public final class ConcernModel extends AbstractModifierModel - implements ConcernDescriptor -{ - public ConcernModel( Class concernClass, Class instantiationClass ) - { - super( concernClass, instantiationClass ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsInstance.java deleted file mode 100644 index b65d52d..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsInstance.java +++ /dev/null @@ -1,64 +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.composite; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * JAVADOC - */ -public final class ConcernsInstance - implements InvocationHandler -{ - private final InvocationHandler firstConcern; - private final FragmentInvocationHandler mixinInvocationHandler; - private final ProxyReferenceInvocationHandler proxyHandler; - - public ConcernsInstance( InvocationHandler firstConcern, - FragmentInvocationHandler mixinInvocationHandler, - ProxyReferenceInvocationHandler proxyHandler - ) - { - this.firstConcern = firstConcern; - this.mixinInvocationHandler = mixinInvocationHandler; - this.proxyHandler = proxyHandler; - } - - public boolean isEmpty() - { - return firstConcern == mixinInvocationHandler; - } - - @Override - public Object invoke( Object proxy, Method method, Object[] params ) - throws Throwable - { - proxyHandler.setProxy( proxy ); - try - { - return firstConcern.invoke( proxy, method, params ); - } - catch( InvocationTargetException e ) - { - throw e.getTargetException(); - } - finally - { - proxyHandler.clearProxy(); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java deleted file mode 100644 index 74882f7..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java +++ /dev/null @@ -1,83 +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.composite; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.Collections; -import java.util.List; -import org.qi4j.api.concern.ConcernsDescriptor; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.Iterables; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.injection.Dependencies; -import org.qi4j.runtime.injection.DependencyModel; -import org.qi4j.spi.module.ModuleSpi; - -/** - * JAVADOC - */ -public final class ConcernsModel - implements ConcernsDescriptor, Dependencies, VisitableHierarchy<Object, Object> -{ - public static final ConcernsModel EMPTY_CONCERNS = new ConcernsModel( Collections.<ConcernModel>emptyList() ); - - private List<ConcernModel> concernsFor; - - public ConcernsModel( List<ConcernModel> concernsFor ) - { - this.concernsFor = concernsFor; - } - - @Override - public Iterable<DependencyModel> dependencies() - { - return Iterables.flattenIterables( Iterables.map( Dependencies.DEPENDENCIES_FUNCTION, concernsFor ) ); - } - - // Context - public ConcernsInstance newInstance( Method method, ModuleSpi moduleInstance, - FragmentInvocationHandler mixinInvocationHandler - ) - { - ProxyReferenceInvocationHandler proxyHandler = new ProxyReferenceInvocationHandler(); - InvocationHandler nextConcern = mixinInvocationHandler; - for( int i = concernsFor.size() - 1; i >= 0; i-- ) - { - ConcernModel concernModel = concernsFor.get( i ); - - nextConcern = concernModel.newInstance( moduleInstance, nextConcern, proxyHandler, method ); - } - - return new ConcernsInstance( nextConcern, mixinInvocationHandler, proxyHandler ); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - if( modelVisitor.visitEnter( this ) ) - { - for( ConcernModel concernModel : concernsFor ) - { - if( !concernModel.accept( modelVisitor ) ) - { - break; - } - } - } - return modelVisitor.visitLeave( this ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintDeclaration.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintDeclaration.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintDeclaration.java deleted file mode 100644 index 048c4ed..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintDeclaration.java +++ /dev/null @@ -1,69 +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.composite; - -import java.lang.annotation.Annotation; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import org.qi4j.api.constraint.Constraint; -import org.qi4j.api.util.Classes; - -/** - * JAVADOC - */ -public final class ConstraintDeclaration -{ - private final Class<? extends Constraint<?, ?>> constraintClass; - @SuppressWarnings( "raw" ) - private final Class constraintAnnotationType; - private final Type constraintValueType; - - @SuppressWarnings( "unchecked" ) - public ConstraintDeclaration( Class<? extends Constraint<?, ?>> constraintClass ) - { - this.constraintClass = constraintClass; - - constraintAnnotationType = (Class<? extends Annotation>) ( (ParameterizedType) constraintClass.getGenericInterfaces()[ 0 ] ) - .getActualTypeArguments()[ 0 ]; - constraintValueType = ( (ParameterizedType) constraintClass.getGenericInterfaces()[ 0 ] ).getActualTypeArguments()[ 1 ]; - } - - public Class<? extends Constraint<?, ?>> constraintClass() - { - return constraintClass; - } - - @SuppressWarnings( {"raw", "unchecked"} ) - public boolean appliesTo( Class annotationType, Type valueType ) - { - if( constraintValueType instanceof Class ) - { - Class constraintValueClass = (Class) constraintValueType; - Class valueClass = Classes.RAW_CLASS.map( valueType ); - return constraintAnnotationType.equals( annotationType ) && constraintValueClass.isAssignableFrom( valueClass ); - } - else if( constraintValueType instanceof ParameterizedType ) - { - // TODO Handle nested generics - Class constraintValueClass = Classes.RAW_CLASS.map( constraintValueType ); - Class valueClass = Classes.RAW_CLASS.map( valueType ); - return constraintAnnotationType.equals( annotationType ) && constraintValueClass.isAssignableFrom( valueClass ); - } - else - { - return false; // TODO Handles more cases. What are they? - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintInstance.java deleted file mode 100644 index fc563e1..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintInstance.java +++ /dev/null @@ -1,43 +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.composite; - -import java.lang.annotation.Annotation; -import org.qi4j.api.constraint.Constraint; - -/** - * JAVADOC - */ -public final class ConstraintInstance<A extends Annotation, T> -{ - private final Constraint<A, T> constraint; - private final A annotation; - - public ConstraintInstance( Constraint<A, T> constraint, A annotation ) - { - this.constraint = constraint; - this.annotation = annotation; - } - - public A annotation() - { - return annotation; - } - - public boolean isValid( T value ) - { - return constraint.isValid( annotation, value ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintModel.java deleted file mode 100644 index df891d8..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintModel.java +++ /dev/null @@ -1,49 +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.composite; - -import java.lang.annotation.Annotation; -import org.qi4j.api.common.ConstructionException; -import org.qi4j.api.constraint.Constraint; - -/** - * JAVADOC - */ -public final class ConstraintModel - extends AbstractConstraintModel -{ - private final Class<? extends Constraint<?, ?>> constraintClass; - - public ConstraintModel( Annotation annotation, Class<? extends Constraint<?, ?>> constraintClass ) - { - super( annotation ); - this.constraintClass = constraintClass; - } - - @Override - @SuppressWarnings( "unchecked" ) - public ConstraintInstance<?, ?> newInstance() - { - try - { - Constraint<?, ?> constraint = constraintClass.newInstance(); - return new ConstraintInstance( constraint, annotation ); - } - catch( Exception e ) - { - throw new ConstructionException( "Could not instantiate constraint implementation", e ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsCheck.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsCheck.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsCheck.java deleted file mode 100644 index 59737d0..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsCheck.java +++ /dev/null @@ -1,26 +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.composite; - -import org.qi4j.api.constraint.ConstraintViolationException; - -/** - * Call this to perform a value constraint check - */ -public interface ConstraintsCheck -{ - public void checkConstraints( Object value ) - throws ConstraintViolationException; -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsInstance.java deleted file mode 100644 index 35fc533..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsInstance.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2008, Rickard Ãberg. All Rights Reserved. - * Copyright (c) 2009, Niclas Hedhman. 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.composite; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import org.qi4j.api.composite.Composite; -import org.qi4j.api.composite.CompositeInstance; -import org.qi4j.api.constraint.ConstraintViolation; -import org.qi4j.api.constraint.ConstraintViolationException; - -import static org.qi4j.functional.Iterables.iterable; - -/** - * JAVADOC - */ -public final class ConstraintsInstance -{ - private final List<ValueConstraintsInstance> valueConstraintsInstances; - - public ConstraintsInstance( List<ValueConstraintsInstance> parameterConstraints ) - { - valueConstraintsInstances = parameterConstraints; - } - - @SuppressWarnings( "unchecked" ) - public void checkValid( Object instance, Method method, Object[] params ) - throws ConstraintViolationException - { - if( valueConstraintsInstances.isEmpty() ) - { - return; // No constraints to check - } - - // Check constraints - List<ConstraintViolation> violations = null; - for( int i = 0; i < params.length; i++ ) - { - Object param = params[ i ]; - List<ConstraintViolation> paramViolations = valueConstraintsInstances.get( i ).checkConstraints( param ); - if( !paramViolations.isEmpty() ) - { - if( violations == null ) - { - violations = new ArrayList<>(); - } - violations.addAll( paramViolations ); - } - } - - // Check if any constraint failed - if( violations != null ) - { - if( instance instanceof Composite ) - { - throw new ConstraintViolationException( (Composite) instance, method, violations ); - } - if( instance instanceof CompositeInstance ) - { - throw new ConstraintViolationException( (Composite) ( (CompositeInstance) instance ).proxy(), method, violations ); - } - Iterable<? extends Class<?>> types = iterable( instance.getClass() ); - throw new ConstraintViolationException( instance.toString(), (Iterable<Class<?>>) types, method, violations ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsModel.java deleted file mode 100644 index a71d05d..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstraintsModel.java +++ /dev/null @@ -1,76 +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.composite; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.qi4j.api.constraint.ConstraintsDescriptor; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; - -/** - * JAVADOC - */ -public final class ConstraintsModel - implements ConstraintsDescriptor, VisitableHierarchy<Object, Object> -{ - private List<ValueConstraintsModel> parameterConstraintModels; - - private static ConstraintsInstance EMPTY_CONSTRAINTS = new ConstraintsInstance( Collections.<ValueConstraintsInstance>emptyList() ); - - public ConstraintsModel( List<ValueConstraintsModel> parameterConstraintModels ) - { - this.parameterConstraintModels = parameterConstraintModels; - } - - public ConstraintsInstance newInstance() - { - if( parameterConstraintModels.isEmpty() ) - { - return EMPTY_CONSTRAINTS; - } - else - { - List<ValueConstraintsInstance> parameterConstraintsInstances = new ArrayList<ValueConstraintsInstance>( parameterConstraintModels - .size() ); - for( ValueConstraintsModel parameterConstraintModel : parameterConstraintModels ) - { - parameterConstraintsInstances.add( parameterConstraintModel.newInstance() ); - } - return new ConstraintsInstance( parameterConstraintsInstances ); - } - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - if( modelVisitor.visitEnter( this ) ) - { - if( parameterConstraintModels != null ) - { - for( ValueConstraintsModel parameterConstraintModel : parameterConstraintModels ) - { - if( !parameterConstraintModel.accept( modelVisitor ) ) - { - break; - } - } - } - } - return modelVisitor.visitLeave( this ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorModel.java deleted file mode 100644 index 072168e..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorModel.java +++ /dev/null @@ -1,105 +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.composite; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; -import org.qi4j.api.common.ConstructionException; -import org.qi4j.api.composite.ConstructorDescriptor; -import org.qi4j.api.composite.InvalidCompositeException; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.injection.DependencyModel; -import org.qi4j.runtime.injection.InjectedParametersModel; -import org.qi4j.runtime.injection.InjectionContext; - -/** - * JAVADOC - */ -public final class ConstructorModel - implements ConstructorDescriptor, VisitableHierarchy<Object, Object> -{ - private Constructor<?> constructor; - - private InjectedParametersModel parameters; - - public ConstructorModel( Constructor<?> constructor, InjectedParametersModel parameters ) - { - this.constructor = constructor; - this.parameters = parameters; - this.constructor.setAccessible( true ); - } - - @Override - public Constructor<?> constructor() - { - return constructor; - } - - public Iterable<DependencyModel> dependencies() - { - return parameters.dependencies(); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - if( modelVisitor.visitEnter( this ) ) - { - parameters.accept( modelVisitor ); - } - - return modelVisitor.visitLeave( this ); - } - - // Context - - public Object newInstance( InjectionContext context ) - throws ConstructionException - { - // Create parameters - Object[] parametersInstance = parameters.newParametersInstance( context ); - // Invoke constructor - try - { - return constructor.newInstance( parametersInstance ); - } - catch( InvocationTargetException e ) - { - Throwable targetException = e.getTargetException(); - if( targetException instanceof InvalidCompositeException ) - { - throw (InvalidCompositeException) targetException; - } - String message = "Could not instantiate \n " + constructor.getDeclaringClass() + "\nusing constructor:\n " + constructor - .toGenericString(); - throw new ConstructionException( message, targetException ); - } - catch( Throwable e ) - { - System.err.println( constructor.toGenericString() ); - System.err.println( Arrays.asList( parametersInstance ) ); - throw new ConstructionException( "Could not instantiate " + constructor.getDeclaringClass(), e ); - } - } - - @Override - public String toString() - { - return constructor.toGenericString(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorsModel.java deleted file mode 100644 index f482d3b..0000000 --- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConstructorsModel.java +++ /dev/null @@ -1,301 +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.composite; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Constructor; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.lang.reflect.TypeVariable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.qi4j.api.common.ConstructionException; -import org.qi4j.api.composite.CompositeDescriptor; -import org.qi4j.api.composite.InvalidCompositeException; -import org.qi4j.api.injection.InjectionScope; -import org.qi4j.api.injection.scope.Uses; -import org.qi4j.api.util.Annotations; -import org.qi4j.api.util.Classes; -import org.qi4j.bootstrap.BindingException; -import org.qi4j.functional.Function; -import org.qi4j.functional.HierarchicalVisitor; -import org.qi4j.functional.HierarchicalVisitorAdapter; -import org.qi4j.functional.Iterables; -import org.qi4j.functional.Specifications; -import org.qi4j.functional.VisitableHierarchy; -import org.qi4j.runtime.injection.Dependencies; -import org.qi4j.runtime.injection.DependencyModel; -import org.qi4j.runtime.injection.InjectedParametersModel; -import org.qi4j.runtime.injection.InjectionContext; -import org.qi4j.runtime.injection.ParameterizedTypeInstance; -import org.qi4j.runtime.model.Binder; -import org.qi4j.runtime.model.Resolution; - -import static org.qi4j.functional.Iterables.filter; -import static org.qi4j.functional.Iterables.first; -import static org.qi4j.functional.Iterables.iterable; - -/** - * JAVADOC - */ -public final class ConstructorsModel - implements Binder, Dependencies, VisitableHierarchy<Object, Object> -{ - @SuppressWarnings( "raw" ) - private final Class fragmentClass; - private final List<ConstructorModel> constructorModels; - private List<ConstructorModel> boundConstructors; - - @SuppressWarnings( { "raw", "unchecked" } ) - public ConstructorsModel( Class fragmentClass ) - { - this.fragmentClass = fragmentClass; - validate( fragmentClass ); - constructorModels = new ArrayList<>(); - Constructor[] realConstructors = this.fragmentClass.getDeclaredConstructors(); - Class injectionClass = FragmentClassLoader.getSourceClass( fragmentClass ); - for( Constructor constructor : realConstructors ) - { - constructor.setAccessible( true ); - try - { - Constructor injectionConstructor = injectionClass.getDeclaredConstructor( constructor.getParameterTypes() ); - injectionConstructor.setAccessible( true ); - ConstructorModel constructorModel = newConstructorModel( this.fragmentClass, constructor, - injectionConstructor ); - if( constructorModel != null ) - { - constructorModels.add( constructorModel ); - } - } - catch( NoSuchMethodException e ) - { - // Ignore and continue - e.printStackTrace(); - } - } - } - - @SuppressWarnings( "raw" ) - private void validate( Class fragmentClass ) - { - // Ensure that the fragment class is not an inner class, in which case we should give a reasonable exception - if( fragmentClass.getDeclaringClass() == null ) - { - return; - } - if( Modifier.isStatic( fragmentClass.getModifiers() ) ) - { - return; - } - throw new InvalidCompositeException( "Inner classes can not be used. Use static nested classes instead: " + fragmentClass ); - } - - @Override - public Iterable<DependencyModel> dependencies() - { - Function<ConstructorModel, Iterable<DependencyModel>> constructorDependencies = new Function<ConstructorModel, Iterable<DependencyModel>>() - { - @Override - public Iterable<DependencyModel> map( ConstructorModel constructorModel ) - { - return constructorModel.dependencies(); - } - }; - - return Iterables.flattenIterables( Iterables.map( constructorDependencies, boundConstructors == null ? constructorModels : boundConstructors ) ); - } - - @SuppressWarnings( "raw" ) - private ConstructorModel newConstructorModel( Class fragmentClass, - Constructor realConstructor, - Constructor injectedConstructor - ) - { - int idx = 0; - InjectedParametersModel parameters = new InjectedParametersModel(); - Annotation[][] parameterAnnotations = injectedConstructor.getParameterAnnotations(); - for( Type type : injectedConstructor.getGenericParameterTypes() ) - { - Annotation injectionAnnotation = first( - filter( Specifications.translate( Annotations.type(), Annotations.hasAnnotation( InjectionScope.class ) ), iterable( parameterAnnotations[ idx ] ) ) ); - - if( injectionAnnotation == null ) - { - if( fragmentClass.getSuperclass().isMemberClass() ) - { - injectionAnnotation = new Uses() - { - @Override - public Class<? extends Annotation> annotationType() - { - return Uses.class; - } - }; - } - else - { - return null; // invalid constructor parameter - } - } - - boolean optional = DependencyModel.isOptional( injectionAnnotation, parameterAnnotations[ idx ] ); - - Type genericType = type; - if( genericType instanceof ParameterizedType ) - { - genericType = new ParameterizedTypeInstance( ( (ParameterizedType) genericType ).getActualTypeArguments(), ( (ParameterizedType) genericType ) - .getRawType(), ( (ParameterizedType) genericType ).getOwnerType() ); - - for( int i = 0; i < ( (ParameterizedType) genericType ).getActualTypeArguments().length; i++ ) - { - Type typeArg = ( (ParameterizedType) genericType ).getActualTypeArguments()[ i ]; - if( typeArg instanceof TypeVariable ) - { - typeArg = Classes.resolveTypeVariable( (TypeVariable) typeArg, realConstructor.getDeclaringClass(), fragmentClass ); - ( (ParameterizedType) genericType ).getActualTypeArguments()[ i ] = typeArg; - } - } - } - - DependencyModel dependencyModel = new DependencyModel( injectionAnnotation, genericType, fragmentClass, optional, - parameterAnnotations[ idx ] ); - parameters.addDependency( dependencyModel ); - idx++; - } - return new ConstructorModel( realConstructor, parameters ); - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> visitor ) - throws ThrowableType - { - if( visitor.visitEnter( this ) ) - { - if( boundConstructors != null ) - { - for( ConstructorModel constructorModel : boundConstructors ) - { - if( !constructorModel.accept( visitor ) ) - { - break; - } - } - } - else - { - for( ConstructorModel constructorModel : constructorModels ) - { - if( !constructorModel.accept( visitor ) ) - { - break; - } - } - } - } - return visitor.visitLeave( this ); - } - - // Binding - @Override - public void bind( final Resolution resolution ) - throws BindingException - { - boundConstructors = new ArrayList<>(); - for( ConstructorModel constructorModel : constructorModels ) - { - try - { - constructorModel.accept( new HierarchicalVisitorAdapter<Object, Object, BindingException>() - { - @Override - public boolean visit( Object visitor ) - throws BindingException - { - if( visitor instanceof Binder ) - { - ( (Binder) visitor ).bind( resolution ); - } - return true; - } - } ); - boundConstructors.add( constructorModel ); - } - catch( Exception e ) - { - // Ignore - e.printStackTrace(); - } - } - - if( boundConstructors.isEmpty() ) - { - StringBuilder messageBuilder = new StringBuilder( "Found no constructor that could be bound: " ); - if( resolution.model() instanceof CompositeDescriptor ) - { - messageBuilder.append( fragmentClass.getName() ) - .append( " in " ) - .append( resolution.model().toString() ); - } - else - { - messageBuilder.append( resolution.model().toString() ); - } - - if( messageBuilder.indexOf( "$" ) >= 0 ) - { - // This could be ok if instance is created manually - return; -// messageBuilder.append( "\nInner classes can not be used." ); - } - String message = messageBuilder.toString(); - throw new BindingException( message ); - } - - // Sort based on parameter count - Collections.sort( boundConstructors, new Comparator<ConstructorModel>() - { - @Override - public int compare( ConstructorModel o1, ConstructorModel o2 ) - { - Integer model2ParametersCount = o2.constructor().getParameterTypes().length; - int model1ParametersCount = o1.constructor().getParameterTypes().length; - return model2ParametersCount.compareTo( model1ParametersCount ); - } - } ); - } - - public Object newInstance( InjectionContext injectionContext ) - { - // Try all bound constructors, in order - ConstructionException exception = null; - for( ConstructorModel constructorModel : boundConstructors ) - { - try - { - return constructorModel.newInstance( injectionContext ); - } - catch( ConstructionException e ) - { - exception = e; - } - } - - throw exception; - } -}
