001: /*
002: * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
003: */
004: package com.tc.aspectwerkz.aspect;
005:
006: import com.tc.aspectwerkz.AspectContext;
007: import com.tc.aspectwerkz.exception.WrappedRuntimeException;
008:
009: import java.lang.reflect.Constructor;
010: import java.lang.reflect.InvocationTargetException;
011: import java.util.Map;
012:
013: /**
014: * Implements a sample aspect container strategy.
015: * </p>
016: * Use container="com.tc.aspectwerkz.aspect.DefaultAspectContainerStrategy" in the aop.xml
017: * The aspect must then have a no-arg constructor or a single arg constructor with param "AspectContext".
018: *
019: * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
020: */
021: public class DefaultAspectContainerStrategy extends
022: AbstractAspectContainer {
023:
024: //FIXME - needs to have data structures for the aspects to handle cycle - current impl is old and BOGUS
025:
026: /**
027: * The constructor for the aspect.
028: */
029: protected Constructor m_aspectConstructor = null;
030:
031: /**
032: * Creates a new aspect container strategy.
033: */
034: public DefaultAspectContainerStrategy(Class aspectClass,
035: ClassLoader aopSystemClassLoader, String uuid,
036: String qualifiedName, Map parameters) {
037: super (aspectClass, aopSystemClassLoader, uuid, qualifiedName,
038: parameters);
039: }
040:
041: /**
042: * Creates a new aspect instance.
043: *
044: * @return the new aspect instance
045: */
046: protected Object createAspect(AspectContext aspectContext) {
047: if (m_aspectConstructor == null) {
048: m_aspectConstructor = findConstructor();
049: }
050: try {
051: switch (m_constructionType) {
052: case ASPECT_CONSTRUCTION_TYPE_DEFAULT:
053: return m_aspectConstructor
054: .newInstance(EMPTY_OBJECT_ARRAY);
055: case ASPECT_CONSTRUCTION_TYPE_ASPECT_CONTEXT:
056: return m_aspectConstructor
057: .newInstance(new Object[] { aspectContext });
058: default:
059: throw new Error("should not happen");
060: }
061: } catch (InvocationTargetException e) {
062: e.printStackTrace();
063: throw new WrappedRuntimeException(e.getTargetException());
064: } catch (Exception e) {
065: throw new WrappedRuntimeException(e);
066: }
067: }
068:
069: /**
070: * Grabs the correct constructor for the aspect.
071: *
072: * @return the constructor for the aspect
073: */
074: protected Constructor findConstructor() {
075: Constructor aspectConstructor = null;
076: Class aspectClass = getAspectClass();
077: Constructor[] constructors = aspectClass
078: .getDeclaredConstructors();
079: for (int i = 0; i < constructors.length; i++) {
080: Constructor constructor = constructors[i];
081: Class[] parameterTypes = constructor.getParameterTypes();
082: if (parameterTypes.length == 0) {
083: m_constructionType = ASPECT_CONSTRUCTION_TYPE_DEFAULT;
084: aspectConstructor = constructor;
085: } else if ((parameterTypes.length == 1)
086: && parameterTypes[0].equals(AspectContext.class)) {
087: m_constructionType = ASPECT_CONSTRUCTION_TYPE_ASPECT_CONTEXT;
088: aspectConstructor = constructor;
089: break;
090: }
091: }
092: if (m_constructionType == ASPECT_CONSTRUCTION_TYPE_UNKNOWN) {
093: throw new RuntimeException(
094: "aspect ["
095: + aspectClass.getName()
096: + "] does not have a valid constructor (either default no-arg or one that takes a AspectContext type as its only parameter)"
097: + " to be used with container=\"com.tc.aspectwerkz.aspect.DefaultAspectContainerStrategy\"");
098: }
099: return aspectConstructor;
100: }
101: }
|