http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/SynchronizedCompositeMethodInstancePool.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/SynchronizedCompositeMethodInstancePool.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/SynchronizedCompositeMethodInstancePool.java deleted file mode 100644 index 2efa326..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/SynchronizedCompositeMethodInstancePool.java +++ /dev/null @@ -1,44 +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.apache.zest.runtime.composite; - -/** - * Method instance pool that keeps a linked list. Uses synchronization - * to ensure that instances are acquired and returned in a thread-safe - * manner. - */ -public final class SynchronizedCompositeMethodInstancePool - implements InstancePool<CompositeMethodInstance> -{ - private CompositeMethodInstance first = null; - - @Override - public synchronized CompositeMethodInstance obtainInstance() - { - CompositeMethodInstance instance = first; - if( instance != null ) - { - first = instance.getNext(); - } - return instance; - } - - @Override - public synchronized void releaseInstance( CompositeMethodInstance instance ) - { - instance.setNext( first ); - first = instance; - } -}
http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java deleted file mode 100644 index e834262..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java +++ /dev/null @@ -1,98 +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.apache.zest.runtime.composite; - -import org.apache.zest.api.common.ConstructionException; -import org.apache.zest.api.composite.CompositeInstance; -import org.apache.zest.api.composite.TransientBuilder; -import org.apache.zest.api.property.PropertyDescriptor; -import org.apache.zest.runtime.property.PropertyInfo; -import org.apache.zest.runtime.property.PropertyInstance; -import org.apache.zest.spi.module.ModelModule; - -/** - * JAVADOC - */ -public final class TransientBuilderInstance<T> - implements TransientBuilder<T> -{ - private ModelModule<TransientModel> model; - - // lazy initialized in accessor - private UsesInstance uses = UsesInstance.EMPTY_USES; - - // lazy initialized in accessor - private CompositeInstance prototypeInstance; - - private TransientStateInstance state; - - public TransientBuilderInstance( ModelModule<TransientModel> model, - TransientStateInstance state, - UsesInstance uses - ) - { - this.model = model; - this.state = state; - this.uses = uses; - } - - @Override - public TransientBuilder<T> use( Object... usedObjects ) - { - uses = uses.use( usedObjects ); - return this; - } - - @Override - public T prototype() - { - // Instantiate given value type - if( prototypeInstance == null ) - { - prototypeInstance = model.model().newInstance( model.module(), uses, state ); - } - - return prototypeInstance.<T>proxy(); - } - - @Override - public <K> K prototypeFor( Class<K> mixinType ) - { - // Instantiate given value type - if( prototypeInstance == null ) - { - prototypeInstance = model.model().newInstance( model.module(), uses, state ); - } - - return prototypeInstance.newProxy( mixinType ); - } - - @Override - public T newInstance() - throws ConstructionException - { - // Set correct info's (immutable) on the state - for( PropertyDescriptor propertyDescriptor : model.model().state().properties() ) - { - ( (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() ) ).setPropertyInfo( (PropertyInfo) propertyDescriptor ); - } - - model.model().checkConstraints( state ); - - CompositeInstance compositeInstance = - model.model().newInstance( model.module(), uses, state ); - return compositeInstance.<T>proxy(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java deleted file mode 100644 index fc38920..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java +++ /dev/null @@ -1,804 +0,0 @@ -/* - * Copyright (c) 2010, 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.apache.zest.runtime.composite; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; -import org.apache.zest.api.entity.Lifecycle; -import org.apache.zest.api.mixin.Initializable; -import org.apache.zest.api.util.Classes; -import org.apache.zest.api.util.Methods; -import org.apache.zest.functional.Iterables; - -import static org.objectweb.asm.Opcodes.AASTORE; -import static org.objectweb.asm.Opcodes.ACC_PRIVATE; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import static org.objectweb.asm.Opcodes.ACC_STATIC; -import static org.objectweb.asm.Opcodes.ACC_SUPER; -import static org.objectweb.asm.Opcodes.ACONST_NULL; -import static org.objectweb.asm.Opcodes.ALOAD; -import static org.objectweb.asm.Opcodes.ANEWARRAY; -import static org.objectweb.asm.Opcodes.ARETURN; -import static org.objectweb.asm.Opcodes.ASTORE; -import static org.objectweb.asm.Opcodes.ATHROW; -import static org.objectweb.asm.Opcodes.BIPUSH; -import static org.objectweb.asm.Opcodes.CHECKCAST; -import static org.objectweb.asm.Opcodes.DLOAD; -import static org.objectweb.asm.Opcodes.DRETURN; -import static org.objectweb.asm.Opcodes.DUP; -import static org.objectweb.asm.Opcodes.FLOAD; -import static org.objectweb.asm.Opcodes.FRETURN; -import static org.objectweb.asm.Opcodes.GETFIELD; -import static org.objectweb.asm.Opcodes.GETSTATIC; -import static org.objectweb.asm.Opcodes.GOTO; -import static org.objectweb.asm.Opcodes.ICONST_0; -import static org.objectweb.asm.Opcodes.ICONST_1; -import static org.objectweb.asm.Opcodes.ICONST_2; -import static org.objectweb.asm.Opcodes.ICONST_3; -import static org.objectweb.asm.Opcodes.ICONST_4; -import static org.objectweb.asm.Opcodes.ICONST_5; -import static org.objectweb.asm.Opcodes.ILOAD; -import static org.objectweb.asm.Opcodes.INVOKEINTERFACE; -import static org.objectweb.asm.Opcodes.INVOKESPECIAL; -import static org.objectweb.asm.Opcodes.INVOKESTATIC; -import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL; -import static org.objectweb.asm.Opcodes.IRETURN; -import static org.objectweb.asm.Opcodes.LLOAD; -import static org.objectweb.asm.Opcodes.LRETURN; -import static org.objectweb.asm.Opcodes.POP; -import static org.objectweb.asm.Opcodes.PUTSTATIC; -import static org.objectweb.asm.Opcodes.RETURN; -import static org.objectweb.asm.Type.getInternalName; -import static org.apache.zest.api.util.Classes.interfacesOf; - -/** - * Generate subclasses of classes used for transients. All methods delegate to CompositeInvoker. - */ -@SuppressWarnings( "raw" ) -/* package */ final class TransientClassLoader - extends ClassLoader -{ - private static final int JDK_VERSION; - public static final String GENERATED_POSTFIX = "_Proxy"; - - static - { - String jdkString = System.getProperty( "java.specification.version" ); - switch( jdkString ) - { - case "1.8": - JDK_VERSION = Opcodes.V1_8; - break; - case "1.7": - default: - JDK_VERSION = Opcodes.V1_7; - break; - } - } - - /* package */ TransientClassLoader( ClassLoader parent ) - { - super( parent ); - } - - @Override - protected Class findClass( String name ) - throws ClassNotFoundException - { - if( name.endsWith( GENERATED_POSTFIX ) ) - { - Class baseClass; - String baseName = name.substring( 0, name.length() - 6 ); - try - { - baseClass = loadClass( baseName ); - } - catch( ClassNotFoundException e ) - { - // Try replacing the last _ with $ - while( true ) - { - int idx = baseName.lastIndexOf( "_" ); - if( idx != -1 ) - { - baseName = baseName.substring( 0, idx ) + "$" + baseName.substring( idx + 1 ); - try - { - baseClass = loadClass( baseName ); - break; - } - catch( ClassNotFoundException e1 ) - { - // Try again - } - } - else - { - throw e; - } - } - } - - byte[] b = generateClass( name, baseClass ); - return defineClass( name, b, 0, b.length, baseClass.getProtectionDomain() ); - } - - // Try the classloader of this classloader -> get classes in Zest such as CompositeInvoker - return getClass().getClassLoader().loadClass( name ); - } - - public static byte[] generateClass( String name, Class baseClass ) - throws ClassNotFoundException - { - String classSlash = name.replace( '.', '/' ); - String baseClassSlash = getInternalName( baseClass ); - - ClassWriter cw = new ClassWriter( ClassWriter.COMPUTE_MAXS ); - FieldVisitor fv; - MethodVisitor mv; - AnnotationVisitor av0; - - // Class definition start - cw.visit( JDK_VERSION, ACC_PUBLIC + ACC_SUPER, classSlash, null, baseClassSlash, null ); - - // Composite reference - { - fv = cw.visitField( ACC_PUBLIC, "_instance", "Lorg/qi4j/api/composite/CompositeInvoker;", null, null ); - fv.visitEnd(); - } - - // Static Method references - { - int idx = 1; - for( Method method : baseClass.getMethods() ) - { - if( isOverloaded( method, baseClass ) ) - { - fv = cw.visitField( ACC_PRIVATE + ACC_STATIC, "m" + idx++, "Ljava/lang/reflect/Method;", null, - null ); - fv.visitEnd(); - } - } - } - - // Constructors - for( Constructor constructor : baseClass.getDeclaredConstructors() ) - { - if( Modifier.isPublic( constructor.getModifiers() ) || Modifier.isProtected( constructor.getModifiers() ) ) - { - String desc = org.objectweb.asm.commons.Method.getMethod( constructor ).getDescriptor(); - mv = cw.visitMethod( ACC_PUBLIC, "<init>", desc, null, null ); - mv.visitCode(); - mv.visitVarInsn( ALOAD, 0 ); - - int idx = 1; - for( Class aClass : constructor.getParameterTypes() ) - { - // TODO Handle other types than objects (?) - mv.visitVarInsn( ALOAD, idx++ ); - } - - mv.visitMethodInsn( INVOKESPECIAL, baseClassSlash, "<init>", desc, false ); - mv.visitInsn( RETURN ); - mv.visitMaxs( idx, idx ); - mv.visitEnd(); - } - } - - // Overloaded and unimplemented methods - Method[] methods = baseClass.getMethods(); - int idx = 0; - List<Label> exceptionLabels = new ArrayList<>(); - for( Method method : methods ) - { - if( isOverloaded( method, baseClass ) ) - { - idx++; - String methodName = method.getName(); - String desc = org.objectweb.asm.commons.Method.getMethod( method ).getDescriptor(); - - String[] exceptions = null; - { - mv = cw.visitMethod( ACC_PUBLIC, methodName, desc, null, exceptions ); - if( isInternalQi4jMethod( method, baseClass ) ) - { - // generate a NoOp method... - mv.visitInsn( RETURN ); - } - else - { - Label endLabel = null; // Use this if return type is void - if( method.getExceptionTypes().length > 0 ) - { - exceptions = new String[ method.getExceptionTypes().length ]; - for( int i = 0; i < method.getExceptionTypes().length; i++ ) - { - Class<?> aClass = method.getExceptionTypes()[ i ]; - exceptions[ i ] = getInternalName( aClass ); - } - } - mv.visitCode(); - Label l0 = new Label(); - Label l1 = new Label(); - - exceptionLabels.clear(); - for( Class<?> declaredException : method.getExceptionTypes() ) - { - Label ld = new Label(); - mv.visitTryCatchBlock( l0, l1, ld, getInternalName( declaredException ) ); - exceptionLabels.add( ld ); // Reuse this further down for the catch - } - - Label lruntime = new Label(); - mv.visitTryCatchBlock( l0, l1, lruntime, "java/lang/RuntimeException" ); - Label lerror = new Label(); - mv.visitTryCatchBlock( l0, l1, lerror, "java/lang/Throwable" ); - - mv.visitLabel( l0 ); - mv.visitVarInsn( ALOAD, 0 ); - mv.visitFieldInsn( GETFIELD, classSlash, "_instance", - "Lorg/qi4j/api/composite/CompositeInvoker;" ); - mv.visitFieldInsn( GETSTATIC, classSlash, "m" + idx, "Ljava/lang/reflect/Method;" ); - - int paramCount = method.getParameterTypes().length; - int stackIdx = 0; - if( paramCount == 0 ) - { - // Send in null as parameter - mv.visitInsn( ACONST_NULL ); - } - else - { - insn( mv, paramCount ); - mv.visitTypeInsn( ANEWARRAY, "java/lang/Object" ); - int pidx = 0; - for( Class<?> aClass : method.getParameterTypes() ) - { - mv.visitInsn( DUP ); - insn( mv, pidx++ ); - stackIdx = wrapParameter( mv, aClass, stackIdx + 1 ); - mv.visitInsn( AASTORE ); - } - } - - // Call method - mv.visitMethodInsn( INVOKEINTERFACE, "org/qi4j/api/composite/CompositeInvoker", - "invokeComposite", - "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true ); - - // Return value - if( !method.getReturnType().equals( Void.TYPE ) ) - { - unwrapResult( mv, method.getReturnType(), l1 ); - } - else - { - mv.visitInsn( POP ); - mv.visitLabel( l1 ); - endLabel = new Label(); - mv.visitJumpInsn( GOTO, endLabel ); - } - - // Increase stack to beyond method args - stackIdx++; - - // Declared exceptions - int exceptionIdx = 0; - for( Class<?> aClass : method.getExceptionTypes() ) - { - mv.visitLabel( exceptionLabels.get( exceptionIdx++ ) ); - mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ getInternalName( aClass ) } ); - mv.visitVarInsn( ASTORE, stackIdx ); - mv.visitVarInsn( ALOAD, stackIdx ); - mv.visitInsn( ATHROW ); - } - - // RuntimeException and Error catch-all - mv.visitLabel( lruntime ); - mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/RuntimeException" } ); - mv.visitVarInsn( ASTORE, stackIdx ); - mv.visitVarInsn( ALOAD, stackIdx ); - mv.visitInsn( ATHROW ); - - mv.visitLabel( lerror ); - mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" } ); - mv.visitVarInsn( ASTORE, stackIdx ); - mv.visitVarInsn( ALOAD, stackIdx ); - mv.visitTypeInsn( CHECKCAST, "java/lang/Error" ); - mv.visitInsn( ATHROW ); - - // Return type = void - if( endLabel != null ) - { - mv.visitLabel( endLabel ); - mv.visitFrame( Opcodes.F_SAME, 0, null, 0, null ); - mv.visitInsn( RETURN ); - } - - mv.visitMaxs( 0, 0 ); - mv.visitEnd(); - } - } - - if( !Modifier.isAbstract( method.getModifiers() ) ) - { - // Add method with _ as prefix - mv = cw.visitMethod( ACC_PUBLIC, "_" + method.getName(), desc, null, exceptions ); - mv.visitCode(); - mv.visitVarInsn( ALOAD, 0 ); - - // Parameters - int stackIdx = 1; - for( Class<?> aClass : method.getParameterTypes() ) - { - stackIdx = loadParameter( mv, aClass, stackIdx ) + 1; - } - - // Call method - mv.visitMethodInsn( INVOKESPECIAL, baseClassSlash, method.getName(), desc, false ); - - // Return value - if( !method.getReturnType().equals( Void.TYPE ) ) - { - returnResult( mv, method.getReturnType() ); - } - else - { - mv.visitInsn( RETURN ); - } - - mv.visitMaxs( 1, 1 ); - mv.visitEnd(); - } - } - } - - // Class initializer - { - mv = cw.visitMethod( ACC_STATIC, "<clinit>", "()V", null, null ); - mv.visitCode(); - Label l0 = new Label(); - Label l1 = new Label(); - Label l2 = new Label(); - mv.visitTryCatchBlock( l0, l1, l2, "java/lang/NoSuchMethodException" ); - mv.visitLabel( l0 ); - - // Lookup methods and store in static variables - int midx = 0; - for( Method method : methods ) - { - if( isOverloaded( method, baseClass ) ) - { - method.setAccessible( true ); - Class methodClass; - methodClass = method.getDeclaringClass(); - - midx++; - - mv.visitLdcInsn( Type.getType( methodClass ) ); - mv.visitLdcInsn( method.getName() ); - insn( mv, method.getParameterTypes().length ); - mv.visitTypeInsn( ANEWARRAY, "java/lang/Class" ); - - int pidx = 0; - for( Class<?> aClass : method.getParameterTypes() ) - { - mv.visitInsn( DUP ); - insn( mv, pidx++ ); - type( mv, aClass ); - mv.visitInsn( AASTORE ); - } - - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Class", "getMethod", - "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false ); - mv.visitFieldInsn( PUTSTATIC, classSlash, "m" + midx, "Ljava/lang/reflect/Method;" ); - } - } - - mv.visitLabel( l1 ); - Label l3 = new Label(); - mv.visitJumpInsn( GOTO, l3 ); - mv.visitLabel( l2 ); - mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/NoSuchMethodException" } ); - mv.visitVarInsn( ASTORE, 0 ); - mv.visitVarInsn( ALOAD, 0 ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V", false ); - mv.visitLabel( l3 ); - mv.visitFrame( Opcodes.F_SAME, 0, null, 0, null ); - mv.visitInsn( RETURN ); - mv.visitMaxs( 6, 1 ); - mv.visitEnd(); - } - - cw.visitEnd(); - - return cw.toByteArray(); - } - - private static boolean isOverloaded( Method method, Class baseClass ) - { - if( Modifier.isFinal( method.getModifiers() ) ) - { - return false; // Cannot override final methods - } - else - { - return true; - } - } - - private static boolean isInternalQi4jMethod( Method method, Class baseClass ) - { - return isDeclaredIn( method, Initializable.class, baseClass ) - || isDeclaredIn( method, Lifecycle.class, baseClass ); - } - - private static boolean isDeclaredIn( Method method, Class<?> clazz, Class<?> baseClass ) - { - if( !clazz.isAssignableFrom( baseClass ) ) - { - return false; - } - - try - { - clazz.getMethod( method.getName(), method.getParameterTypes() ); - return true; - } - catch( NoSuchMethodException e ) - { - return false; - } - } - - private static Class getInterfaceMethodDeclaration( Method method, Class clazz ) - throws NoSuchMethodException - { - Iterable<Class<?>> interfaces = Iterables.map( Classes.RAW_CLASS, interfacesOf( clazz ) ); - for( Class<?> anInterface : interfaces ) - { - try - { - anInterface.getMethod( method.getName(), method.getParameterTypes() ); - return anInterface; - } - catch( NoSuchMethodException e ) - { - // Try next - } - } - - throw new NoSuchMethodException( method.getName() ); - } - - private static boolean isInterfaceMethod( Method method, Class<?> baseClass ) - { - for( Class<?> aClass : Iterables.filter( Methods.HAS_METHODS, Iterables.map( Classes.RAW_CLASS, interfacesOf( baseClass ) ) ) ) - { - try - { - Method m = aClass.getMethod( method.getName(), method.getParameterTypes() ); - m.setAccessible( true ); - return true; - } - catch( NoSuchMethodException e ) - { - // Ignore - } - } - return false; - } - - private static void type( MethodVisitor mv, Class<?> aClass ) - { - if( aClass.equals( Integer.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;" ); - } - else if( aClass.equals( Long.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Long", "TYPE", "Ljava/lang/Class;" ); - } - else if( aClass.equals( Short.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Short", "TYPE", "Ljava/lang/Class;" ); - } - else if( aClass.equals( Byte.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Byte", "TYPE", "Ljava/lang/Class;" ); - } - else if( aClass.equals( Double.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Double", "TYPE", "Ljava/lang/Class;" ); - } - else if( aClass.equals( Float.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Float", "TYPE", "Ljava/lang/Class;" ); - } - else if( aClass.equals( Boolean.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Boolean", "TYPE", "Ljava/lang/Class;" ); - } - else if( aClass.equals( Character.TYPE ) ) - { - mv.visitFieldInsn( GETSTATIC, "java/lang/Character", "TYPE", "Ljava/lang/Class;" ); - } - else - { - mv.visitLdcInsn( Type.getType( aClass ) ); - } - } - - private static int wrapParameter( MethodVisitor mv, Class<?> aClass, int idx ) - { - if( aClass.equals( Integer.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false ); - } - else if( aClass.equals( Long.TYPE ) ) - { - mv.visitVarInsn( LLOAD, idx ); - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false ); - idx++; // Extra jump - } - else if( aClass.equals( Short.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;", false ); - } - else if( aClass.equals( Byte.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;", false ); - } - else if( aClass.equals( Double.TYPE ) ) - { - mv.visitVarInsn( DLOAD, idx ); - idx++; // Extra jump - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;", false ); - } - else if( aClass.equals( Float.TYPE ) ) - { - mv.visitVarInsn( FLOAD, idx ); - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;", false ); - } - else if( aClass.equals( Boolean.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false ); - } - else if( aClass.equals( Character.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - mv.visitMethodInsn( INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;", false ); - } - else - { - mv.visitVarInsn( ALOAD, idx ); - } - - return idx; - } - - private static void unwrapResult( MethodVisitor mv, Class<?> aClass, Label label ) - { - if( aClass.equals( Integer.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Integer" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false ); - mv.visitLabel( label ); - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Long.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Long" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false ); - mv.visitLabel( label ); - mv.visitInsn( LRETURN ); - } - else if( aClass.equals( Short.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Short" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S", false ); - mv.visitLabel( label ); - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Byte.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Byte" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B", false ); - mv.visitLabel( label ); - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Double.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Double" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false ); - mv.visitLabel( label ); - mv.visitInsn( DRETURN ); - } - else if( aClass.equals( Float.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Float" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F", false ); - mv.visitLabel( label ); - mv.visitInsn( FRETURN ); - } - else if( aClass.equals( Boolean.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Boolean" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false ); - mv.visitLabel( label ); - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Character.TYPE ) ) - { - mv.visitTypeInsn( CHECKCAST, "java/lang/Character" ); - mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C", false ); - mv.visitLabel( label ); - mv.visitInsn( IRETURN ); - } - else - { - mv.visitTypeInsn( CHECKCAST, getInternalName( aClass ) ); - mv.visitLabel( label ); - mv.visitInsn( ARETURN ); - } - } - - private static int loadParameter( MethodVisitor mv, Class<?> aClass, int idx ) - { - if( aClass.equals( Integer.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - } - else if( aClass.equals( Long.TYPE ) ) - { - mv.visitVarInsn( LLOAD, idx ); - idx++; // Extra jump - } - else if( aClass.equals( Short.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - } - else if( aClass.equals( Byte.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - } - else if( aClass.equals( Double.TYPE ) ) - { - mv.visitVarInsn( DLOAD, idx ); - idx++; // Extra jump - } - else if( aClass.equals( Float.TYPE ) ) - { - mv.visitVarInsn( FLOAD, idx ); - } - else if( aClass.equals( Boolean.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - } - else if( aClass.equals( Character.TYPE ) ) - { - mv.visitVarInsn( ILOAD, idx ); - } - else - { - mv.visitVarInsn( ALOAD, idx ); - } - - return idx; - } - - private static void returnResult( MethodVisitor mv, Class<?> aClass ) - { - if( aClass.equals( Integer.TYPE ) ) - { - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Long.TYPE ) ) - { - mv.visitInsn( LRETURN ); - } - else if( aClass.equals( Short.TYPE ) ) - { - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Byte.TYPE ) ) - { - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Double.TYPE ) ) - { - mv.visitInsn( DRETURN ); - } - else if( aClass.equals( Float.TYPE ) ) - { - mv.visitInsn( FRETURN ); - } - else if( aClass.equals( Boolean.TYPE ) ) - { - mv.visitInsn( IRETURN ); - } - else if( aClass.equals( Character.TYPE ) ) - { - mv.visitInsn( IRETURN ); - } - else - { - mv.visitTypeInsn( CHECKCAST, getInternalName( aClass ) ); - mv.visitInsn( ARETURN ); - } - } - - private static void insn( MethodVisitor mv, int length ) - { - switch( length ) - { - case 0: - mv.visitInsn( ICONST_0 ); - return; - case 1: - mv.visitInsn( ICONST_1 ); - return; - case 2: - mv.visitInsn( ICONST_2 ); - return; - case 3: - mv.visitInsn( ICONST_3 ); - return; - case 4: - mv.visitInsn( ICONST_4 ); - return; - case 5: - mv.visitInsn( ICONST_5 ); - return; - default: - mv.visitIntInsn( BIPUSH, length ); - } - } - - public static boolean isGenerated( Class clazz ) - { - return clazz.getName().endsWith( GENERATED_POSTFIX ); - } - - public static boolean isGenerated( Object object ) - { - return object.getClass().getName().endsWith( GENERATED_POSTFIX ); - } - - public Class loadFragmentClass( Class fragmentClass ) - throws ClassNotFoundException - { - return loadClass( fragmentClass.getName().replace( '$', '_' ) + GENERATED_POSTFIX ); - } - - public static Class getSourceClass( Class fragmentClass ) - { - return fragmentClass.getName().endsWith( GENERATED_POSTFIX ) ? fragmentClass.getSuperclass() : fragmentClass; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java deleted file mode 100644 index 9d70a62..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2007, Rickard Ãberg. All Rights Reserved. - * Copyright (c) 2007, Niclas Hedhman. All Rights Reserved. - * Copyright (c) 2007, Alin Dreghiciu. 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.apache.zest.runtime.composite; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.Arrays; -import org.apache.zest.api.Qi4j; -import org.apache.zest.api.composite.Composite; -import org.apache.zest.api.composite.CompositeInstance; -import org.apache.zest.api.property.StateHolder; -import org.apache.zest.api.structure.Layer; -import org.apache.zest.api.structure.Module; -import org.apache.zest.runtime.structure.ModuleInstance; -import org.apache.zest.spi.module.ModuleSpi; - -/** - * InvocationHandler for proxy objects. - */ -public class TransientInstance - implements CompositeInstance, MixinsInstance -{ - public static TransientInstance compositeInstanceOf( Composite composite ) - { - InvocationHandler handler = Proxy.getInvocationHandler( composite ); - return (TransientInstance) handler; - } - - private final Composite proxy; - protected final Object[] mixins; - protected StateHolder state; - protected final CompositeModel compositeModel; - private final ModuleSpi moduleInstance; - - public TransientInstance( CompositeModel compositeModel, - ModuleSpi moduleInstance, - Object[] mixins, - StateHolder state - ) - { - this.compositeModel = compositeModel; - this.moduleInstance = moduleInstance; - this.mixins = mixins; - this.state = state; - - proxy = compositeModel.newProxy( this ); - } - - @Override - public Object invoke( Object proxy, Method method, Object[] args ) - throws Throwable - { - return compositeModel.invoke( this, proxy, method, args, moduleInstance ); - } - - @Override - @SuppressWarnings( "unchecked" ) - public <T> T proxy() - { - return (T) proxy; - } - - @Override - public <T> T newProxy( Class<T> mixinType ) - throws IllegalArgumentException - { - return compositeModel.newProxy( this, mixinType ); - } - - @Override - public Object invokeComposite( Method method, Object[] args ) - throws Throwable - { - return compositeModel.invoke( this, proxy, method, args, moduleInstance ); - } - - @Override - public CompositeModel descriptor() - { - return compositeModel; - } - - @Override - public <T> T metaInfo( Class<T> infoType ) - { - return compositeModel.metaInfo( infoType ); - } - - @Override - public Iterable<Class<?>> types() - { - return compositeModel.types(); - } - - @Override - public Module module() - { - return moduleInstance; - } - - public Layer layer() - { - return ( (ModuleInstance) moduleInstance ).layerInstance(); - } - - @Override - public StateHolder state() - { - return state; - } - - @Override - public Object invoke( Object composite, Object[] params, CompositeMethodInstance methodInstance ) - throws Throwable - { - Object mixin = methodInstance.getMixinFrom( mixins ); - return methodInstance.invoke( proxy, params, mixin ); - } - - @Override - public Object invokeObject( Object proxy, Object[] args, Method method ) - throws Throwable - { - return method.invoke( this, args ); - } - - @Override - public boolean equals( Object o ) - { - if( o == null ) - { - return false; - } - if( !Proxy.isProxyClass( o.getClass() ) ) - { - return false; - } - TransientInstance other = (TransientInstance) Qi4j.FUNCTION_COMPOSITE_INSTANCE_OF.map( (Composite) o ); - if( other.mixins.length != mixins.length ) - { - return false; - } - - for( int i = 0; i < mixins.length; i++ ) - { - if( !mixins[ i ].equals( other.mixins[ i ] ) ) - { - return false; - } - } - return true; - } - - @Override - public int hashCode() - { - int hashCode = 0; - for( Object mixin : mixins ) - { - hashCode = hashCode * 31 + mixin.hashCode(); - } - return hashCode; - } - - @Override - public String toString() - { - StringBuilder buffer = new StringBuilder(); - boolean first = true; - for( Object mixin : mixins ) - { - try - { - if( mixin != null ) // Can happen during construction of incorrect composites, during exception creation. - { - Class<?> type = mixin.getClass(); - Method toStringMethod = type.getMethod( "toString" ); - Class<?> declaringClass = toStringMethod.getDeclaringClass(); - if( !declaringClass.equals( Object.class ) ) - { - if( !first ) - { - buffer.append( ", " ); - } - first = false; - buffer.append( mixin.toString() ); - } - } - } - catch( NoSuchMethodException e ) - { - // Can not happen?? - e.printStackTrace(); - } - } - if( first ) - { - String modelTypeName = compositeModel.getClass().getSimpleName(); - String metaTypeModel = modelTypeName.substring( 0, modelTypeName.length() - 5 ); - return metaTypeModel + "Instance{" + - "mixins=" + ( mixins == null ? null : Arrays.asList( mixins ) ) + - ", state=" + state + - ", compositeModel=" + compositeModel + - ", module=" + moduleInstance + - '}'; - } - return buffer.toString(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java deleted file mode 100644 index 0d0ecac..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java +++ /dev/null @@ -1,70 +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.apache.zest.runtime.composite; - -import org.apache.zest.api.common.MetaInfo; -import org.apache.zest.api.common.Visibility; -import org.apache.zest.api.composite.TransientDescriptor; -import org.apache.zest.api.constraint.ConstraintViolationException; -import org.apache.zest.runtime.injection.InjectionContext; -import org.apache.zest.runtime.property.PropertyModel; -import org.apache.zest.spi.module.ModuleSpi; - -/** - * Model for Transient Composites - */ -public class TransientModel - extends CompositeModel - implements TransientDescriptor -{ - public TransientModel( Iterable<Class<?>> types, final Visibility visibility, - final MetaInfo metaInfo, - final MixinsModel mixinsModel, - final StateModel stateModel, - final CompositeMethodsModel compositeMethodsModel - ) - { - super( types, visibility, metaInfo, mixinsModel, stateModel, compositeMethodsModel ); - } - - public TransientInstance newInstance( ModuleSpi moduleInstance, - UsesInstance uses, - TransientStateInstance state - ) - { - Object[] mixins = mixinsModel.newMixinHolder(); - TransientInstance compositeInstance = new TransientInstance( this, moduleInstance, mixins, state ); - - // Instantiate all mixins - int i = 0; - InjectionContext injectionContext = new InjectionContext( compositeInstance, uses, state ); - for( MixinModel mixinModel : mixinsModel.mixinModels() ) - { - mixins[ i++ ] = mixinModel.newInstance( injectionContext ); - } - - // Return - return compositeInstance; - } - - public void checkConstraints( TransientStateInstance instanceState ) - throws ConstraintViolationException - { - for( PropertyModel propertyModel : stateModel.properties() ) - { - propertyModel.checkConstraints( instanceState.<Object>propertyFor( propertyModel.accessor() ).get() ); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java deleted file mode 100644 index 14d0901..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java +++ /dev/null @@ -1,60 +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.apache.zest.runtime.composite; - -import java.lang.reflect.AccessibleObject; -import java.util.Map; -import org.apache.zest.api.property.Property; -import org.apache.zest.api.property.StateHolder; - -/** - * TODO - */ -public final class TransientStateInstance - implements StateHolder -{ - private final Map<AccessibleObject, Property<?>> properties; - - public TransientStateInstance( Map<AccessibleObject, Property<?>> properties - ) - { - this.properties = properties; - } - - @Override - @SuppressWarnings( "unchecked" ) - public <T> Property<T> propertyFor( AccessibleObject accessor ) - throws IllegalArgumentException - { - Property<T> property = (Property<T>) properties.get( accessor ); - - if( property == null ) - { - throw new IllegalArgumentException( "No such property:" + accessor ); - } - - return property; - } - - @Override - public Iterable<Property<?>> properties() - { - return properties.values(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java deleted file mode 100644 index 102719e..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java +++ /dev/null @@ -1,55 +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.apache.zest.runtime.composite; - -import java.util.List; -import org.apache.zest.functional.HierarchicalVisitor; -import org.apache.zest.functional.VisitableHierarchy; - -/** - * JAVADOC - */ -public class TransientsModel - implements VisitableHierarchy<Object, Object> -{ - private final List<TransientModel> transientModels; - - public TransientsModel( List<TransientModel> transientModels ) - { - this.transientModels = transientModels; - } - - public Iterable<TransientModel> models() - { - return transientModels; - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - if( modelVisitor.visitEnter( this ) ) - { - for( TransientModel transientModel : transientModels ) - { - if( !transientModel.accept( modelVisitor ) ) - { - break; - } - } - } - return modelVisitor.visitLeave( this ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/TypedModifierInvocationHandler.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TypedModifierInvocationHandler.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TypedModifierInvocationHandler.java deleted file mode 100644 index 3c5366d..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TypedModifierInvocationHandler.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2007 Rickard Ãberg - * 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.apache.zest.runtime.composite; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import org.apache.zest.api.composite.InvalidCompositeException; - -/** - * JAVADOC - */ -public final class TypedModifierInvocationHandler - extends FragmentInvocationHandler -{ - @Override - public Object invoke( Object proxy, Method method, Object[] args ) - throws Throwable - { - try - { - return this.method.invoke( fragment, args ); - } - catch( InvocationTargetException e ) - { - throw cleanStackTrace( e.getTargetException(), proxy, method ); - } - catch( Throwable e ) - { - if( fragment == null ) - { - throw new InvalidCompositeException( "No fragment available for method " + method.getName() ); - } - throw cleanStackTrace( e, proxy, method ); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java deleted file mode 100644 index 5aa0e74..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java +++ /dev/null @@ -1,44 +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.apache.zest.runtime.composite; - -/** - * Method instance pool that keeps a linked list. Uses synchronization - * to ensure that instances are acquired and returned in a thread-safe - * manner. - */ -public final class UnsynchronizedCompositeMethodInstancePool - implements InstancePool<CompositeMethodInstance> -{ - private CompositeMethodInstance first = null; - - @Override - public CompositeMethodInstance obtainInstance() - { - CompositeMethodInstance instance = first; - if( instance != null ) - { - first = instance.getNext(); - } - return instance; - } - - @Override - public void releaseInstance( CompositeMethodInstance instance ) - { - instance.setNext( first ); - first = instance; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsageGraph.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsageGraph.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsageGraph.java deleted file mode 100644 index 540a886..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsageGraph.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2008 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.apache.zest.runtime.composite; - -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import org.apache.zest.bootstrap.BindingException; - -/** - * This class is NOT thread-safe. - * //TODO: Algorithm need to be optimized. - */ -public final class UsageGraph<K> -{ - private final Collection<K> data; - private final Use<K> use; - private final boolean allowCyclic; - private List<K> resolved; - private HashMap<K, List<K>> transitive; - - public UsageGraph( Collection<K> data, Use<K> use, boolean allowCyclic ) - { - this.data = data; - this.use = use; - this.allowCyclic = allowCyclic; - } - - public boolean transitiveUse( K source, K other ) - throws BindingException - { - if( transitive == null ) - { - buildUsageGraph(); - } - return transitive.containsKey( source ) && transitive.get( source ).contains( other ); - } - - private void checkCyclic( List<K> visited, K sourceItem, K used ) - throws BindingException - { - Collection<K> nextLevel = use.uses( used ); - for( K next : nextLevel ) - { - if( next == sourceItem ) - { - if( !allowCyclic ) - { - visited.add( next ); - throw new BindingException( "Cyclic usage detected: " + sourceItem + " -> " + visited ); - } - } - if( !visited.contains( next ) ) - { - visited.add( next ); - checkCyclic( visited, sourceItem, next ); - } - } - } - - /** - * Must be called if the data set has been modified. - */ - public void invalidate() - { - resolved = null; - transitive = null; - } - - public List<K> resolveOrder() - throws BindingException - { - if( resolved == null ) - { - buildUsageGraph(); - resolved = new LinkedList<K>(); - for( K item : data ) - { - int pos = resolved.size(); - for( K entry : resolved ) - { - if( transitiveUse( entry, item ) ) - { - pos = resolved.indexOf( entry ); - break; - } - } - resolved.add( pos, item ); - } - } - return resolved; - } - - private void buildUsageGraph() - throws BindingException - { - transitive = new HashMap<K, List<K>>(); - for( K sourceItem : data ) - { - LinkedList<K> visited = new LinkedList<K>(); - checkCyclic( visited, sourceItem, sourceItem ); - transitive.put( sourceItem, visited ); - } - } - - public interface Use<K> - { - - /** - * @param source The item to be queried. - * - * @return A list of items it uses. - */ - Collection<K> uses( K source ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsesInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsesInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsesInstance.java deleted file mode 100644 index 14cdf32..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/UsesInstance.java +++ /dev/null @@ -1,107 +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.apache.zest.runtime.composite; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import org.apache.zest.functional.Iterables; - -/** - * JAVADOC - */ -public final class UsesInstance -{ - public static final UsesInstance EMPTY_USES; - private final Set<Object> uses; - - static - { - EMPTY_USES = new UsesInstance( new HashSet<>() ); - } - - private UsesInstance( HashSet<Object> uses ) - { - this.uses = Collections.unmodifiableSet( uses ); - } - - public UsesInstance use( Object... objects ) - { - HashSet<Object> useObjects = new HashSet<>(); - if( !uses.isEmpty() ) - { - useObjects.addAll( uses ); - for( Object object : objects ) - { - Object oldUseForType = useForType( object.getClass() ); - if( oldUseForType != null ) - { - useObjects.remove( oldUseForType ); - } - } - } - useObjects.addAll( Arrays.asList( objects ) ); - return new UsesInstance( useObjects ); - } - - public Object useForType( Class<?> type ) - { - // Check instances first - for( Object use : uses ) - { - if( type.isInstance( use ) ) - { - return use; - } - } - - return null; - } - - public Object[] toArray() - { - return Iterables.toArray( uses ); - } - - @Override - public boolean equals( Object o ) - { - if( this == o ) - { - return true; - } - if( o == null || getClass() != o.getClass() ) - { - return false; - } - UsesInstance that = (UsesInstance) o; - return uses.equals( that.uses ); - } - - @Override - public int hashCode() - { - return uses.hashCode(); - } - - @Override - public String toString() - { - return "UsesInstance{" + - "uses=" + uses + - '}'; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsInstance.java deleted file mode 100644 index 25dddca..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsInstance.java +++ /dev/null @@ -1,125 +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.apache.zest.runtime.composite; - -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.apache.zest.api.common.Optional; -import org.apache.zest.api.constraint.ConstraintViolation; - -/** - * JAVADOC - */ -public final class ValueConstraintsInstance -{ - private static final Optional OPTIONAL; - - static - { - OPTIONAL = new OptionalDummy(); - } - - @SuppressWarnings( "raw" ) - private final List<ConstraintInstance> constraints; - private String name; - private boolean optional; - - public ValueConstraintsInstance( List<AbstractConstraintModel> constraintModels, String name, boolean optional ) - { - this.name = name; - this.optional = optional; - constraints = new ArrayList<>(); - for( AbstractConstraintModel constraintModel : constraintModels ) - { - constraints.add( constraintModel.newInstance() ); - } - } - - @SuppressWarnings( {"raw", "unchecked"} ) - public List<ConstraintViolation> checkConstraints( Object value ) - { - List<ConstraintViolation> violations = null; - - // Check optional first - this avoids NPE's in constraints - if( optional ) - { - if( value == null ) - { - violations = Collections.emptyList(); - } - } - else - { - if( value == null ) - { - violations = new ArrayList<>(); - violations.add( new ConstraintViolation( name, OPTIONAL, null ) ); - } - } - - if( violations == null && value != null ) - { - for( ConstraintInstance constraint : constraints ) - { - boolean valid; - try - { - valid = constraint.isValid( value ); - } - catch( NullPointerException e ) - { - // A NPE is the same as a failing constraint - valid = false; - } - - if( !valid ) - { - if( violations == null ) - { - violations = new ArrayList<>(); - } - ConstraintViolation violation = new ConstraintViolation( name, constraint.annotation(), value ); - violations.add( violation ); - } - } - } - - if( violations == null ) - { - violations = Collections.emptyList(); - } - - return violations; - } - - @SuppressWarnings( "AnnotationAsSuperInterface" ) - private static class OptionalDummy - implements Optional - { - @Override - public Class<? extends Annotation> annotationType() - { - return Optional.class; - } - - @Override - public String toString() - { - return "not optional"; - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsModel.java deleted file mode 100644 index 4eb6007..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/ValueConstraintsModel.java +++ /dev/null @@ -1,66 +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.apache.zest.runtime.composite; - -import java.util.List; -import org.apache.zest.functional.HierarchicalVisitor; -import org.apache.zest.functional.VisitableHierarchy; - -/** - * JAVADOC - */ -public final class ValueConstraintsModel - implements VisitableHierarchy<Object, Object> -{ - private final List<AbstractConstraintModel> constraintModels; - private String name; - private boolean optional; - - public ValueConstraintsModel( List<AbstractConstraintModel> constraintModels, String name, boolean optional ) - { - this.constraintModels = constraintModels; - this.name = name; - this.optional = optional; - } - - public ValueConstraintsInstance newInstance() - { - return new ValueConstraintsInstance( constraintModels, name, optional ); - } - - public boolean isConstrained() - { - if( !constraintModels.isEmpty() ) - { - return true; - } - - return !optional; - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - for( AbstractConstraintModel constraintModel : constraintModels ) - { - if( constraintModel.accept( modelVisitor ) ) - { - return false; - } - } - return true; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java deleted file mode 100644 index 56deeb7..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java +++ /dev/null @@ -1,55 +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.apache.zest.runtime.entity; - -import java.util.List; -import org.apache.zest.functional.HierarchicalVisitor; -import org.apache.zest.functional.VisitableHierarchy; - -/** - * Model of entities in a particular Module. - */ -public class EntitiesModel - implements VisitableHierarchy<Object, Object> -{ - private final List<EntityModel> entityModels; - - public EntitiesModel( List<EntityModel> entityModels ) - { - this.entityModels = entityModels; - } - - public Iterable<EntityModel> models() - { - return entityModels; - } - - @Override - public <ThrowableType extends Throwable> boolean accept( HierarchicalVisitor<? super Object, ? super Object, ThrowableType> modelVisitor ) - throws ThrowableType - { - if( modelVisitor.visitEnter( this ) ) - { - for( EntityModel entityModel : entityModels ) - { - if( !entityModel.accept( modelVisitor ) ) - { - break; - } - } - } - return modelVisitor.visitLeave( this ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java deleted file mode 100644 index 8512a87..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (c) 2008-2009, Rickard Ãberg. All Rights Reserved. - * Copyright (c) 2009-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.apache.zest.runtime.entity; - -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.HashSet; -import java.util.Set; -import org.apache.zest.api.association.Association; -import org.apache.zest.api.association.AssociationDescriptor; -import org.apache.zest.api.association.AssociationStateDescriptor; -import org.apache.zest.api.association.ManyAssociation; -import org.apache.zest.api.association.NamedAssociation; -import org.apache.zest.api.composite.CompositeDescriptor; -import org.apache.zest.api.composite.CompositeInstance; -import org.apache.zest.api.constraint.ConstraintViolationException; -import org.apache.zest.api.entity.EntityComposite; -import org.apache.zest.api.entity.EntityReference; -import org.apache.zest.api.entity.Identity; -import org.apache.zest.api.entity.LifecycleException; -import org.apache.zest.api.unitofwork.NoSuchEntityException; -import org.apache.zest.api.unitofwork.UnitOfWork; -import org.apache.zest.api.unitofwork.UnitOfWorkException; -import org.apache.zest.runtime.composite.CompositeMethodInstance; -import org.apache.zest.runtime.composite.MixinsInstance; -import org.apache.zest.runtime.structure.ModuleUnitOfWork; -import org.apache.zest.spi.entity.EntityState; -import org.apache.zest.spi.entity.EntityStatus; -import org.apache.zest.spi.module.ModuleSpi; - -/** - * Entity instance - */ -public final class EntityInstance - implements CompositeInstance, MixinsInstance -{ - public static EntityInstance entityInstanceOf( EntityComposite composite ) - { - return (EntityInstance) Proxy.getInvocationHandler( composite ); - } - - private final EntityComposite proxy; - private final ModuleUnitOfWork uow; - private final ModuleSpi moduleInstance; - private final EntityModel entityModel; - private final EntityReference identity; - private final EntityState entityState; - - private Object[] mixins; - private EntityStateInstance state; - - public EntityInstance( ModuleUnitOfWork uow, - ModuleSpi moduleInstance, - EntityModel entityModel, - EntityState entityState - ) - { - this.uow = uow; - this.moduleInstance = moduleInstance; - this.entityModel = entityModel; - this.identity = entityState.identity(); - this.entityState = entityState; - - proxy = (EntityComposite) entityModel.newProxy( this ); - } - - @Override - public Object invoke( Object proxy, Method method, Object[] args ) - throws Throwable - { - return entityModel.invoke( this, this.proxy, method, args, moduleInstance ); - } - - public EntityReference identity() - { - return identity; - } - - @Override - @SuppressWarnings( "unchecked" ) - public <T> T proxy() - { - return (T) proxy; - } - - @Override - public CompositeDescriptor descriptor() - { - return entityModel; - } - - @Override - public <T> T newProxy( Class<T> mixinType ) - throws IllegalArgumentException - { - return entityModel.newProxy( this, mixinType ); - } - - @Override - public Object invokeComposite( Method method, Object[] args ) - throws Throwable - { - return entityModel.invoke( this, proxy, method, args, moduleInstance ); - } - - @Override - public <T> T metaInfo( Class<T> infoType ) - { - return entityModel.metaInfo( infoType ); - } - - public EntityModel entityModel() - { - return entityModel; - } - - @Override - public Iterable<Class<?>> types() - { - return entityModel.types(); - } - - @Override - public ModuleSpi module() - { - return moduleInstance; - } - - public UnitOfWork unitOfWork() - { - return uow; - } - - public EntityState entityState() - { - return entityState; - } - - @Override - public EntityStateInstance state() - { - if( state == null ) - { - initState(); - } - - return state; - } - - public EntityStatus status() - { - return entityState.status(); - } - - @Override - public Object invoke( Object composite, Object[] params, CompositeMethodInstance methodInstance ) - throws Throwable - { - if( mixins == null ) - { - initState(); - } - - Object mixin = methodInstance.getMixinFrom( mixins ); - - if( mixin == null ) - { - mixin = entityModel.newMixin( mixins, state, this, methodInstance.method() ); - } - - return methodInstance.invoke( proxy, params, mixin ); - } - - @Override - public Object invokeObject( Object proxy, Object[] args, Method method ) - throws Throwable - { - return method.invoke( this, args ); - } - - private void initState() - { - if( !uow.isOpen() ) - { - throw new UnitOfWorkException( "Unit of work has been closed" ); - } - - if( status() == EntityStatus.REMOVED ) - { - throw new NoSuchEntityException( identity, entityModel.types(), unitOfWork().usecase() ); - } - - mixins = entityModel.newMixinHolder(); - state = new EntityStateInstance( entityModel.state(), uow, entityState ); - } - - @Override - public int hashCode() - { - return identity.hashCode(); - } - - @Override - public boolean equals( Object o ) - { - try - { - Identity other = ( (Identity) o ); - return other != null && other.identity().get().equals( identity.identity() ); - } - catch( ClassCastException e ) - { - return false; - } - } - - @Override - public String toString() - { - return identity.toString(); - } - - public void remove( UnitOfWork unitOfWork ) - throws LifecycleException - { - invokeRemove(); - - removeAggregatedEntities( unitOfWork ); - - entityState.remove(); - mixins = null; - } - - public void invokeCreate() - { - lifecyleInvoke( true ); - } - - private void invokeRemove() - { - lifecyleInvoke( false ); - } - - private void lifecyleInvoke( boolean create ) - { - if( mixins == null ) - { - initState(); - } - - entityModel.invokeLifecycle( create, mixins, this, state ); - } - - private void removeAggregatedEntities( UnitOfWork unitOfWork ) - { - // Calculate aggregated Entities - AssociationStateDescriptor stateDescriptor = entityModel.state(); - Set<Object> aggregatedEntities = new HashSet<>(); - Iterable<? extends AssociationDescriptor> associations = stateDescriptor.associations(); - for( AssociationDescriptor association : associations ) - { - if( association.isAggregated() ) - { - Association<?> assoc = state.associationFor( association.accessor() ); - Object aggregatedEntity = assoc.get(); - if( aggregatedEntity != null ) - { - aggregatedEntities.add( aggregatedEntity ); - } - } - } - Iterable<? extends AssociationDescriptor> manyAssociations = stateDescriptor.manyAssociations(); - for( AssociationDescriptor association : manyAssociations ) - { - if( association.isAggregated() ) - { - ManyAssociation<?> manyAssoc = state.manyAssociationFor( association.accessor() ); - for( Object entity : manyAssoc ) - { - aggregatedEntities.add( entity ); - } - } - } - Iterable<? extends AssociationDescriptor> namedAssociations = stateDescriptor.namedAssociations(); - for( AssociationDescriptor association : namedAssociations ) - { - if( association.isAggregated() ) - { - NamedAssociation<?> namedAssoc = state.namedAssociationFor( association.accessor() ); - for( String name : namedAssoc ) - { - aggregatedEntities.add( namedAssoc.get( name ) ); - } - } - } - - // Remove aggregated Entities - for( Object aggregatedEntity : aggregatedEntities ) - { - unitOfWork.remove( aggregatedEntity ); - } - } - - public void checkConstraints() - { - try - { - state.checkConstraints(); - } - catch( ConstraintViolationException e ) - { - throw new ConstraintViolationException( identity.identity(), entityModel.types(), e.mixinTypeName(), e.methodName(), e - .constraintViolations() ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/a789141d/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityMixinsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityMixinsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityMixinsModel.java deleted file mode 100644 index 2ad5b05..0000000 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityMixinsModel.java +++ /dev/null @@ -1,94 +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.apache.zest.runtime.entity; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import org.apache.zest.api.composite.CompositeInstance; -import org.apache.zest.api.entity.Lifecycle; -import org.apache.zest.api.property.StateHolder; -import org.apache.zest.bootstrap.BindingException; -import org.apache.zest.runtime.composite.MixinModel; -import org.apache.zest.runtime.composite.MixinsModel; -import org.apache.zest.runtime.composite.UsesInstance; -import org.apache.zest.runtime.injection.InjectionContext; -import org.apache.zest.runtime.model.Resolution; - -/** - * JAVADOC - */ -public final class EntityMixinsModel - extends MixinsModel -{ - List<Integer> lifecycleMixins; - - @Override - public void bind( Resolution resolution ) - throws BindingException - { - super.bind( resolution ); - - // Find what mixins implement Lifecycle - for( int i = 0; i < mixinModels.size(); i++ ) - { - MixinModel mixinModel = mixinModels.get( i ); - if( Lifecycle.class.isAssignableFrom( mixinModel.mixinClass() ) ) - { - if( lifecycleMixins == null ) - { - lifecycleMixins = new ArrayList<Integer>(); - } - - lifecycleMixins.add( i ); - } - } - } - - public Object newMixin( EntityInstance entityInstance, StateHolder state, Object[] mixins, Method method ) - { - MixinModel model = methodImplementation.get( method ); - InjectionContext injectionContext = new InjectionContext( entityInstance, UsesInstance.EMPTY_USES, state ); - Object mixin = model.newInstance( injectionContext ); - mixins[ methodIndex.get( method ) ] = mixin; - return mixin; - } - - public void invokeLifecycle( boolean create, Object[] mixins, CompositeInstance instance, StateHolder state ) - { - if( lifecycleMixins != null ) - { - InjectionContext injectionContext = new InjectionContext( instance, UsesInstance.EMPTY_USES, state ); - for( Integer lifecycleMixin : lifecycleMixins ) - { - Lifecycle lifecycle = (Lifecycle) mixins[ lifecycleMixin ]; - - if( lifecycle == null ) - { - lifecycle = (Lifecycle) mixinModels.get( lifecycleMixin ).newInstance( injectionContext ); - } - - if( create ) - { - lifecycle.create(); - } - else - { - lifecycle.remove(); - } - } - } - } -}
