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 }