KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > codehaus > aspectwerkz > aspect > DefaultAspectContainerStrategy


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 org.codehaus.aspectwerkz.exception.WrappedRuntimeException;
11 import org.codehaus.aspectwerkz.AspectContext;
12
13 import java.lang.reflect.Constructor JavaDoc;
14 import java.lang.reflect.InvocationTargetException JavaDoc;
15
16 /**
17  * Implements the default aspect container strategy.
18  *
19  * @author <a HREF="mailto:jboner@codehaus.org">Jonas BonŽr </a>
20  */

21 public class DefaultAspectContainerStrategy extends AbstractAspectContainer {
22     /**
23      * The constructor for the aspect.
24      */

25     protected Constructor JavaDoc m_aspectConstructor = null;
26
27     /**
28      * Creates a new aspect container strategy.
29      *
30      * @param aspectContext the cross-cutting info
31      */

32     public DefaultAspectContainerStrategy(final AspectContext aspectContext) {
33         super(aspectContext);
34     }
35
36     /**
37      * Creates a new aspect instance.
38      *
39      * @return the new aspect instance
40      */

41     protected Object JavaDoc createAspect() {
42         if (m_aspectConstructor == null) {
43             m_aspectConstructor = findConstructor();
44         }
45         try {
46             switch (m_constructionType) {
47                 case ASPECT_CONSTRUCTION_TYPE_DEFAULT:
48                     return m_aspectConstructor.newInstance(EMPTY_OBJECT_ARRAY);
49                 case ASPECT_CONSTRUCTION_TYPE_ASPECT_CONTEXT:
50                     return m_aspectConstructor.newInstance(ARRAY_WITH_SINGLE_ASPECT_CONTEXT);
51                 default:
52                     throw new RuntimeException JavaDoc(
53                             "aspect ["
54                             + m_aspectContext.getAspectClass().getName()
55                             +
56                             "] does not have a valid constructor (either default no-arg or one that takes a AspectContext type as its only parameter)"
57                     );
58             }
59         } catch (InvocationTargetException JavaDoc e) {
60             e.printStackTrace();
61             throw new WrappedRuntimeException(e.getTargetException());
62         } catch (Exception JavaDoc e) {
63             throw new WrappedRuntimeException(e);
64         }
65     }
66
67     /**
68      * Grabs the correct constructor for the aspect.
69      *
70      * @return the constructor for the aspect
71      */

72     protected Constructor JavaDoc findConstructor() {
73         Constructor JavaDoc aspectConstructor = null;
74         Class JavaDoc aspectClass = m_aspectContext.getAspectClass();
75         Constructor JavaDoc[] constructors = aspectClass.getDeclaredConstructors();
76         for (int i = 0; i < constructors.length; i++) {
77             Constructor JavaDoc constructor = constructors[i];
78             Class JavaDoc[] parameterTypes = constructor.getParameterTypes();
79             if (parameterTypes.length == 0) {
80                 m_constructionType = ASPECT_CONSTRUCTION_TYPE_DEFAULT;
81                 aspectConstructor = constructor;
82             } else if ((parameterTypes.length == 1) && parameterTypes[0].equals(AspectContext.class)) {
83                 m_constructionType = ASPECT_CONSTRUCTION_TYPE_ASPECT_CONTEXT;
84                 aspectConstructor = constructor;
85                 break;
86             }
87         }
88         if (m_constructionType == ASPECT_CONSTRUCTION_TYPE_UNKNOWN) {
89             throw new RuntimeException JavaDoc(
90                     "aspect ["
91                     + aspectClass.getName()
92                     +
93                     "] does not have a valid constructor (either default no-arg or one that takes a AspectContext type as its only parameter)"
94             );
95         }
96         return aspectConstructor;
97     }
98 }
Popular Tags