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;
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
28
29 public ThreadLocal m_cflowStackLocal = new ThreadLocal() {
30 protected Object initialValue() {
31 return new Stack();
32 }
33 };
34
35 /***
36 * before advice when entering this cflow
37 */
38 public void enter() {
39 ((Stack)m_cflowStackLocal.get()).push(Boolean.TRUE);
40 }
41
42 /***
43 * after finally advice when exiting this cflow
44 */
45 public void exit() {
46 ((Stack)m_cflowStackLocal.get()).pop();
47 }
48
49 /***
50 * @return true if in the cflow
51 */
52 public boolean inCflow() {
53 return ((Stack)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 }