View Javadoc

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;
14  import java.lang.reflect.InvocationTargetException;
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 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 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(
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 e) {
60              e.printStackTrace();
61              throw new WrappedRuntimeException(e.getTargetException());
62          } catch (Exception 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 findConstructor() {
73          Constructor aspectConstructor = null;
74          Class aspectClass = m_aspectContext.getAspectClass();
75          Constructor[] constructors = aspectClass.getDeclaredConstructors();
76          for (int i = 0; i < constructors.length; i++) {
77              Constructor constructor = constructors[i];
78              Class[] 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(
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  }