KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > codehaus > aspectwerkz > cflow > AbstractCflowSystemAspect


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.cflow;
9
10 import java.util.Stack JavaDoc;
11
12 /**
13  * An abstraction for the JIT gen cflow aspects.
14  * <p/>
15  * A concrete JIT gen cflow aspect *class* will be generated per
16  * cflow sub expression with a consistent naming scheme aka cflowID.
17  * <p/>
18  * The concrete cflow class will extends this one and implements two static methods.
19  * See the sample nested class.
20  * <p/>
21  * Note: the Cflow implements a real aspectOf singleton scheme and is not visible to Aspects.aspectOf
22  *
23  * @author <a HREF="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
24  */

25 public abstract class AbstractCflowSystemAspect {
26
27     //TODO do we really need a stack ? I think that an int increment wrapped in a ThreadLocal
28
// will be ok. The stack might only be needed for perCflow deployments
29
public ThreadLocal JavaDoc m_cflowStackLocal = new ThreadLocal JavaDoc() {
30         protected Object JavaDoc initialValue() {
31             return new Stack JavaDoc();
32         }
33     };
34
35     /**
36      * before advice when entering this cflow
37      */

38     public void enter() {
39         ((Stack JavaDoc)m_cflowStackLocal.get()).push(Boolean.TRUE);
40     }
41
42     /**
43      * after finally advice when exiting this cflow
44      */

45     public void exit() {
46         ((Stack JavaDoc)m_cflowStackLocal.get()).pop();
47     }
48
49     /**
50      * @return true if in the cflow
51      */

52     public boolean inCflow() {
53         return ((Stack JavaDoc)m_cflowStackLocal.get()).size() > 0;
54     }
55
56     /**
57      * Sample jit cflow aspect that will gets generated.
58      * Note that we need to test the INSTANCE in case the cflow subexpression
59      * was out of the scope of the weaver (else we gets NullPointerExceptions)
60      *
61      * @author <a HREF="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
62      */

63     private static class Cflow_sample extends AbstractCflowSystemAspect {
64
65         private static Cflow_sample INSTANCE = null;
66
67         private Cflow_sample() {
68             super();
69         }
70
71         /**
72          * this method will be invoked by the JIT joinpoint
73          */

74         public static boolean isInCflow() {
75             if (INSTANCE == null) {
76                 return false;
77             }
78             return INSTANCE.inCflow();
79         }
80
81         /**
82          * Real aspectOf as a singleton
83          */

84         public static Cflow_sample aspectOf() {
85             if (INSTANCE == null) {
86                 INSTANCE = new Cflow_sample();
87             }
88             return INSTANCE;
89         }
90
91     }
92
93 }
94
Popular Tags