Package examples.logging

Source Code of examples.logging.JavaLoggingAspect

/**************************************************************************************

* 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 examples.logging;



import org.codehaus.aspectwerkz.joinpoint.JoinPoint;

import org.codehaus.aspectwerkz.joinpoint.MemberSignature;

import org.codehaus.aspectwerkz.definition.SystemDefinition;

import org.codehaus.aspectwerkz.definition.DefinitionLoader;

import org.codehaus.aspectwerkz.definition.AspectDefinition;

import org.codehaus.aspectwerkz.definition.AdviceDefinition;

import org.codehaus.aspectwerkz.definition.StartupManager;

import org.codehaus.aspectwerkz.expression.ExpressionNamespace;

import org.codehaus.aspectwerkz.expression.ExpressionVisitor;

import org.codehaus.aspectwerkz.expression.ExpressionInfo;



import java.util.Iterator;

import java.util.List;

import java.util.ArrayList;



/**

*/

public class JavaLoggingAspect {



    private int m_level = 0;



    /**

     */

    public Object logMethod(final JoinPoint joinPoint) throws Throwable {

        MemberSignature signature = (MemberSignature) joinPoint.getSignature();

        indent();

        System.out.println(joinPoint.getType()

            + "--> "

            + joinPoint.getTargetClass().getName()

            + "::"

            + signature.getName());

        m_level++;

        final Object result = joinPoint.proceed();

        m_level--;

        indent();

        System.out.println(joinPoint.getType()

            + "<-- "

            + joinPoint.getTargetClass().getName()

            + "::"

            + signature.getName());

        return result;

    }



    /**

     */

    public void logEntry(final JoinPoint joinPoint) throws Throwable {

        MemberSignature signature = (MemberSignature) joinPoint.getSignature();

        System.out.println("ENTER: "

            + joinPoint.getTargetClass().getName()

            + "::"

            + signature.getName());

    }



    /**

     */

    public void logExit(final JoinPoint joinPoint) throws Throwable {

        MemberSignature signature = (MemberSignature) joinPoint.getSignature();

        System.out.println("EXIT: "

            + joinPoint.getTargetClass().getName()

            + "::"

            + signature.getName());

    }



    private void indent() {

        for (int i = 0; i < m_level; i++) {

            System.out.print("  ");

        }

    }



    /**

     * A damned complicated API to - alter the def so that new weaving can be done - alter the

     * internal aspect repr. so that runtime management can occur <p/>Note: seems to have a

     * redundancy on the pointcut somewhere. CRAP

     *

     * @param pointcut

     * @param pointcutName

     */

    public static void addPointcutForLoggingAdvice(String pointcut, String pointcutName) {

        //if (true) return;



        final String aspectName = "examples.logging.JavaLoggingAspect";

        SystemDefinition sysDef = DefinitionLoader.getDefinition(HotSwapTarget.class

                .getClassLoader(), "hotdeployed");

        AspectDefinition aspectDef = sysDef.getAspectDefinition(aspectName);

        ExpressionNamespace namespace = ExpressionNamespace.getNamespace(aspectDef

                .getFullQualifiedName());

        ExpressionInfo expressionInfo = new ExpressionInfo(pointcut, aspectDef

                .getFullQualifiedName());

        namespace.addExpressionInfo(pointcutName, expressionInfo);

        AdviceDefinition newDef = null;

        for (Iterator arounds = aspectDef.getAroundAdvices().iterator(); arounds.hasNext();) {

            AdviceDefinition around = (AdviceDefinition) arounds.next();

            if (around.getName().equals(aspectName + ".logMethod")) {

                // copy the logMethod advice

                // note: we could add a totally new advice as well

                newDef = around.copyAt(expressionInfo);

                break;

            }

        }

        aspectDef.addAroundAdvice(newDef);



        //TODO: experimental API

        StartupManager.reinitializeSystem(HotSwapTarget.class.getClassLoader(), sysDef);

        System.out.println("sysDef = " + sysDef.getClass().getClassLoader());



        /*

         * ExecutionPointcut pointcutInstance = new ExecutionPointcut("samples",

         * newDef.getExpression()); PointcutManager pointcutManager =

         * SystemLoader.getSystem("samples"). getAspectManager().getPointcutManager(aspectName);

         * //pointcutManager.addExecutionPointcut(pointcutInstance);//needed only after

         * initialization pointcutInstance.addAroundAdvice(aspectName+".logMethod");

         */

    }



    /**

     * A damned complicated API to - alter the def so that pc is removed - alter the internal aspect

     * repr. so that pointcut struct is released (TODO)

     *

     * @param pointcut

     * @param pointcutName

     */

    public static void removePointcutForLoggingAdvice(String pointcut, String pointcutName) {

        //if (true) return;



        final String aspectName = "examples.logging.JavaLoggingAspect";

        SystemDefinition sysDef = DefinitionLoader.getDefinition(HotSwapTarget.class

                .getClassLoader(), "hotdeployed");

        AspectDefinition aspectDef = sysDef.getAspectDefinition(aspectName);

        List removedAdviceDefs = new ArrayList();

        for (Iterator arounds = aspectDef.getAroundAdvices().iterator(); arounds.hasNext();) {

            AdviceDefinition around = (AdviceDefinition) arounds.next();

            if (pointcutName.equals(around.getExpressionInfo().getExpressionAsString())) {

                System.out.println("<removing> " + around.getName() + " at " + pointcutName);

                removedAdviceDefs.add(around);

            } else {

                //System.out.println("around = " + around.getExpression().getName());

            }

        }

        for (Iterator arounds = removedAdviceDefs.iterator(); arounds.hasNext();) {

            aspectDef.removeAroundAdvice((AdviceDefinition) arounds.next());

        }

        //TODO remove from PointcutManager as well for mem safety ?

    }



}
TOP

Related Classes of examples.logging.JavaLoggingAspect

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.