/************************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package org.codehaus.aspectwerkz.cflow; import java.util.Stack; /** * An abstraction for the JIT gen cflow aspects. * <p/> * A concrete JIT gen cflow aspect *class* will be generated per * cflow sub expression with a consistent naming scheme aka cflowID. * <p/> * The concrete cflow class will extends this one and implements two static methods. * See the sample nested class. * <p/> * Note: the Cflow implements a real aspectOf singleton scheme and is not visible to Aspects.aspectOf * * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> */ public abstract class AbstractCflowSystemAspect { //TODO do we really need a stack ? I think that an int increment wrapped in a ThreadLocal // will be ok. The stack might only be needed for perCflow deployments public ThreadLocal m_cflowStackLocal = new ThreadLocal() { protected Object initialValue() { return new Stack(); } }; /** * before advice when entering this cflow */ public void enter() { ((Stack)m_cflowStackLocal.get()).push(Boolean.TRUE); } /** * after finally advice when exiting this cflow */ public void exit() { ((Stack)m_cflowStackLocal.get()).pop(); } /** * @return true if in the cflow */ public boolean inCflow() { return ((Stack)m_cflowStackLocal.get()).size() > 0; } /** * Sample jit cflow aspect that will gets generated. * Note that we need to test the INSTANCE in case the cflow subexpression * was out of the scope of the weaver (else we gets NullPointerExceptions) * * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> */ private static class Cflow_sample extends AbstractCflowSystemAspect { private static Cflow_sample INSTANCE = null; private Cflow_sample() { super(); } /** * this method will be invoked by the JIT joinpoint */ public static boolean isInCflow() { if (INSTANCE == null) { return false; } return INSTANCE.inCflow(); } /** * Real aspectOf as a singleton */ public static Cflow_sample aspectOf() { if (INSTANCE == null) { INSTANCE = new Cflow_sample(); } return INSTANCE; } } }