/************************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package org.codehaus.aspectwerkz.aspect; import java.lang.reflect.Constructor; import org.codehaus.aspectwerkz.exception.DefinitionException; import org.codehaus.aspectwerkz.DeploymentModel; /** * Abstract base class for the mixin container implementations. * * @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a> */ public abstract class AbstractMixinFactory implements MixinFactory { protected final Class m_mixinClass; protected final DeploymentModel m_deploymentModel; protected Constructor m_defaultConstructor; protected Constructor m_perClassConstructor; protected Constructor m_perInstanceConstructor; /** * Creates a new mixin factory. * * @param mixinClass * @param deploymentModel */ public AbstractMixinFactory(final Class mixinClass, final DeploymentModel deploymentModel) { m_mixinClass = mixinClass; m_deploymentModel = deploymentModel; try { if (m_deploymentModel.equals(DeploymentModel.PER_CLASS)) { m_perClassConstructor = m_mixinClass.getConstructor(new Class[]{Class.class}); } else if (m_deploymentModel.equals(DeploymentModel.PER_INSTANCE)) { m_perInstanceConstructor = m_mixinClass.getConstructor(new Class[]{Object.class}); } else if (m_deploymentModel.equals(DeploymentModel.PER_JVM)) { m_defaultConstructor = m_mixinClass.getConstructor(new Class[]{}); } else { throw new DefinitionException( "deployment model for [" + m_mixinClass.getName() + "] is not supported [" + m_deploymentModel + "]" ); } } catch (NoSuchMethodException e1) { try { m_defaultConstructor = m_mixinClass.getConstructor(new Class[]{}); } catch (NoSuchMethodException e2) { throw new DefinitionException( "mixin [" + m_mixinClass.getName() + "] does not have a constructor that matches with its deployment model or a non-argument default constructor" ); } } } /** * Creates a new perJVM mixin instance. * * @return the mixin instance */ public abstract Object mixinOf(); /** * Creates a new perClass mixin instance. * * @param klass * @return the mixin instance */ public abstract Object mixinOf(Class klass); /** * Creates a new perInstance mixin instance. * * @param instance * @return the mixin instance */ public abstract Object mixinOf(Object instance); }