1 /*************************************************************************************** 2 * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. * 3 * http://aspectwerkz.codehaus.org * 4 * ---------------------------------------------------------------------------------- * 5 * The software in this package is published under the terms of the LGPL license * 6 * a copy of which has been included with this distribution in the license.txt file. * 7 **************************************************************************************/ 8 package org.codehaus.aspectwerkz.aspect; 9 10 import java.lang.reflect.Constructor; 11 12 import org.codehaus.aspectwerkz.exception.DefinitionException; 13 import org.codehaus.aspectwerkz.DeploymentModel; 14 15 /*** 16 * Abstract base class for the mixin container implementations. 17 * 18 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a> 19 */ 20 public abstract class AbstractMixinFactory implements MixinFactory { 21 22 protected final Class m_mixinClass; 23 protected final DeploymentModel m_deploymentModel; 24 protected Constructor m_defaultConstructor; 25 protected Constructor m_perClassConstructor; 26 protected Constructor m_perInstanceConstructor; 27 28 /*** 29 * Creates a new mixin factory. 30 * 31 * @param mixinClass 32 * @param deploymentModel 33 */ 34 public AbstractMixinFactory(final Class mixinClass, final DeploymentModel deploymentModel) { 35 m_mixinClass = mixinClass; 36 m_deploymentModel = deploymentModel; 37 try { 38 if (m_deploymentModel.equals(DeploymentModel.PER_CLASS)) { 39 m_perClassConstructor = m_mixinClass.getConstructor(new Class[]{Class.class}); 40 } else if (m_deploymentModel.equals(DeploymentModel.PER_INSTANCE)) { 41 m_perInstanceConstructor = m_mixinClass.getConstructor(new Class[]{Object.class}); 42 } else if (m_deploymentModel.equals(DeploymentModel.PER_JVM)) { 43 m_defaultConstructor = m_mixinClass.getConstructor(new Class[]{}); 44 } else { 45 throw new DefinitionException( 46 "deployment model for [" + m_mixinClass.getName() + "] is not supported [" + 47 m_deploymentModel + "]" 48 ); 49 } 50 } catch (NoSuchMethodException e1) { 51 try { 52 m_defaultConstructor = m_mixinClass.getConstructor(new Class[]{}); 53 } catch (NoSuchMethodException e2) { 54 throw new DefinitionException( 55 "mixin [" + m_mixinClass.getName() + 56 "] does not have a constructor that matches with its deployment model or a non-argument default constructor" 57 ); 58 } 59 } 60 } 61 62 /*** 63 * Creates a new perJVM mixin instance. 64 * 65 * @return the mixin instance 66 */ 67 public abstract Object mixinOf(); 68 69 /*** 70 * Creates a new perClass mixin instance. 71 * 72 * @param klass 73 * @return the mixin instance 74 */ 75 public abstract Object mixinOf(Class klass); 76 77 /*** 78 * Creates a new perInstance mixin instance. 79 * 80 * @param instance 81 * @return the mixin instance 82 */ 83 public abstract Object mixinOf(Object instance); 84 }