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.CrossCuttingInfo;
11  import org.codehaus.aspectwerkz.exception.WrappedRuntimeException;
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 crossCuttingInfo the cross-cutting info
31       */
32      public DefaultAspectContainerStrategy(final CrossCuttingInfo crossCuttingInfo) {
33          super(crossCuttingInfo);
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_CROSS_CUTTING_INFO:
50                      return m_aspectConstructor.newInstance(arrayWithSingleCrossCuttingInfo);
51                  default:
52                      throw new RuntimeException(
53                          "aspect ["
54                              + m_aspectPrototype.getClass().getName()
55                              + "] does not have a valid constructor (either default no-arg or one that takes a CrossCuttingInfo type as its only parameter)");
56              }
57          } catch (InvocationTargetException e) {
58              e.printStackTrace();
59              throw new WrappedRuntimeException(e.getTargetException());
60          } catch (Exception e) {
61              throw new WrappedRuntimeException(e);
62          }
63      }
64  
65      /***
66       * Grabs the correct constructor for the aspect.
67       * 
68       * @return the constructor for the aspect
69       */
70      protected Constructor findConstructor() {
71          Constructor aspectConstructor = null;
72          Class aspectClass = m_infoPrototype.getAspectClass();
73          Constructor[] constructors = aspectClass.getDeclaredConstructors();
74          for (int i = 0; i < constructors.length; i++) {
75              Constructor constructor = constructors[i];
76              Class[] parameterTypes = constructor.getParameterTypes();
77              if (parameterTypes.length == 0) {
78                  m_constructionType = ASPECT_CONSTRUCTION_TYPE_DEFAULT;
79                  aspectConstructor = constructor;
80              } else if ((parameterTypes.length == 1) && parameterTypes[0].equals(CrossCuttingInfo.class)) {
81                  m_constructionType = ASPECT_CONSTRUCTION_TYPE_CROSS_CUTTING_INFO;
82                  aspectConstructor = constructor;
83                  break;
84              }
85          }
86          if (m_constructionType == ASPECT_CONSTRUCTION_TYPE_UNKNOWN) {
87              throw new RuntimeException(
88                  "aspect ["
89                      + aspectClass.getName()
90                      + "] does not have a valid constructor (either default no-arg or one that takes a CrossCuttingInfo type as its only parameter)");
91          }
92          return aspectConstructor;
93      }
94  }