Package org.codehaus.aspectwerkz.extension.hotswap

Source Code of org.codehaus.aspectwerkz.extension.hotswap.EWorldUtil

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

* 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.extension.hotswap;



import org.codehaus.aspectwerkz.definition.*;

import org.codehaus.aspectwerkz.hook.impl.ClassPreProcessorHelper;

import org.codehaus.aspectwerkz.transform.AspectWerkzPreProcessor;

import org.codehaus.aspectwerkz.transform.ClassCacheTuple;



import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.HashMap;



/**

* eworld/wlw/aop

*

* @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a>

*/

public class EWorldUtil {



    private static final Map s_weaveStatus = new HashMap();



    public static boolean isWeaved(final String uuid, final String aspectName) {

        Map aspects = (Map) s_weaveStatus.get(uuid);

        if (aspects == null || aspects.keySet().size() == 0) {

            return false;

        } else {

            Boolean status = (Boolean) aspects.get(aspectName);

            if (status == null) {

                return false;

            } else {

                return status.booleanValue();

            }

        }

    }



    public static void activate(

        final String uuid,

        final String aspectName,

        final String adviceName,

        final String expression,

        final String pointcutName) {

        //        System.out.println(

        //                "activate = " + uuid + "," + aspectName + "." + adviceName + " @ " + expression + "," +

        // pointcutName

        //        );

        //        SystemDefinition sysDef = SystemDefinitionContainer.getSystemDefinition(

        //                ClassLoader.getSystemClassLoader(), uuid

        //        );

        //        if (sysDef == null) {

        //            return;

        //        }

        //        AspectDefinition aspectDef = sysDef.getAspectDefinition(aspectName);

        //

        //        Expression pcExpression =

        // ExpressionNamespace.getExpressionNamespace(aspectDef).createExpression(

        //                expression,

        //                "",

        //                pointcutName

        //        );

        //

        //        AdviceDefinition newDef = null;

        //        boolean found = false;

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

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

        //            if (around.getName().equals(aspectName + "." + adviceName)) {

        //                // copy the logMethod advice

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

        //                newDef = around.copyAt(pcExpression);

        //

        //                // take care of the runtime Pointcut mirror if any

        //                AspectSystem as = SystemLoader.getSystem(ClassLoader.getSystemClassLoader());

        //                AspectManager am = as.getAspectManager(uuid);

        //                Pointcut pc =

        // am.getPointcutManager(aspectDef.getName()).getPointcut(newDef.getExpression().getExpression());

        //                if (pc!=null) {

        //                    pc.addAroundAdvice(aspectDef.getName() + "/" + around.getName());

        //                }

        //

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

        //                found = true;

        //                break;

        //            }

        //        }

        //        if (!found) {

        //            System.err.println(" advice not found");

        //        }

        //        else {

        //            aspectDef.addAroundAdvice(newDef);

        //            StartupManager.reinitializeSystem(ClassLoader.getSystemClassLoader(), sysDef);

        //        }

        //        setStatus(uuid, aspectName, Boolean.TRUE);

    }



    public static void deactivate(

        final String uuid,

        final String aspectName,

        final String adviceName,

        final String pointcutName) {

        //

        //        System.out.println("deactivate = " + uuid + "," + aspectName + "." + adviceName + " @ " +

        // pointcutName);

        //        SystemDefinition sysDef = SystemDefinitionContainer.getSystemDefinition(

        //                ClassLoader.getSystemClassLoader(), uuid

        //        );

        //        if (sysDef == null) {

        //            return;

        //        }

        //        AspectDefinition aspectDef = sysDef.getAspectDefinition(aspectName);

        //

        //        List removedAdviceDefs = new ArrayList();

        //        boolean found = false;

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

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

        //            if (around.getName().equals(aspectName + "." + adviceName)) {

        //                found = true;

        //                if (pointcutName.equals(around.getExpression().getName()) ||

        //                    pointcutName.equals(around.getExpression().getExpression())) {

        //

        //                    // take care of the runtime Pointcut mirror if any

        //                    AspectSystem as = SystemLoader.getSystem(ClassLoader.getSystemClassLoader());

        //                    AspectManager am = as.getAspectManager(uuid);

        //                    Pointcut pc =

        // am.getPointcutManager(aspectDef.getName()).getPointcut(around.getExpression().getExpression());

        //                    pc.removeAroundAdvice(aspectDef.getName() + "/" + around.getName());

        //

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

        //                    removedAdviceDefs.add(around);

        //                }

        //            }

        //        }

        //        if (!found) {

        //            System.err.println(" advice not found");

        //        }

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

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

        //        }

        //        StartupManager.reinitializeSystem(ClassLoader.getSystemClassLoader(), sysDef);

        //

        //        setStatus(uuid, aspectName, Boolean.FALSE);

    }



    public static void activateCache(String expression, String pointcutName) {

        activate(

            "eworld/wlw/aop",

            "examples.caching.CachingAspect",

            "cache",

            expression,

            pointcutName);

    }



    public static void deactivateCache(String pointcutName) {

        deactivate("eworld/wlw/aop", "examples.caching.CachingAspect", "cache", pointcutName);

    }



    public static void activateTrace(String expression, String pointcutName) {

        activate(

            "eworld/wlw/aop",

            "examples.logging.LoggingAspect",

            "logMethod",

            expression,

            pointcutName);

    }



    public static void deactivateTrace(String pointcutName) {

        deactivate("eworld/wlw/aop", "examples.logging.LoggingAspect", "logMethod", pointcutName);

    }



    public static void hotswap(String classPattern) {

        AspectWerkzPreProcessor awpp = (AspectWerkzPreProcessor) ClassPreProcessorHelper

                .getClassPreProcessor();

        for (Iterator it = awpp.getClassCacheTuples().iterator(); it.hasNext();) {

            ClassCacheTuple tuple = (ClassCacheTuple) it.next();

            if (tuple.getClassName().startsWith(classPattern)) {

                try {

                    System.out.println("hotswap " + tuple.getClassName());

                    HotSwapClient.hotswap(tuple.getClassLoader().loadClass(tuple.getClassName()));

                } catch (Throwable t) {

                    System.err.println("Unable to hotswap "

                        + tuple.getClassName()

                        + ": "

                        + t.getMessage());

                }

            }

        }

    }



    public static void dumpSystemDefinitions(ClassLoader loader) {

        java.io.PrintStream out = System.out;

        out.println("dumpSystemDefinitions [ " + loader + " ]");

        List defs = SystemDefinitionContainer.getSystemDefinitions(loader);

        for (Iterator sysDefs = defs.iterator(); sysDefs.hasNext();) {

            SystemDefinition sysDef = (SystemDefinition) sysDefs.next();

            out.print(sysDef.getUuid());

            out.println("");

            for (Iterator prepares = sysDef.getPreparePackages().iterator(); prepares.hasNext();) {

                out.print("[Prepare] " + prepares.next());

                out.println("");

            }

            for (Iterator aspectDefs = sysDef.getAspectDefinitions().iterator(); aspectDefs

                    .hasNext();) {

                AspectDefinition aspectDef = (AspectDefinition) aspectDefs.next();

                out.print("[Aspect] " + aspectDef.getName());

                out.println("");

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

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

                    out.print("  [AroundAdvice] " + around.getName());

                    out.print("  ");

                    out.print(around.getExpressionInfo().getExpressionAsString());

                    out.println("");

                }

                out.println("\n-");

            }

            out.println("\n----");

        }

    }



    private static void setStatus(final String uuid, final String aspectName, final Boolean status) {

        Map aspects = (Map) s_weaveStatus.get(uuid);

        if (aspects == null) {

            aspects = new HashMap();

            s_weaveStatus.put(uuid, aspects);

        }

        aspects.put(aspectName, status);

    }

}
TOP

Related Classes of org.codehaus.aspectwerkz.extension.hotswap.EWorldUtil

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.