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