/************************************************************************************** * 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 org.codehaus.aspectwerkz.transform.inlining.deployer.Deployer; import org.codehaus.aspectwerkz.transform.inlining.deployer.DeploymentHandle; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.Set; /** * 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) { ClassLoader loader = EWorldUtil.class.getClassLoader(); DeploymentScope scope = SystemDefinitionContainer.getDefinitionFor(loader, uuid).getDeploymentScope("demo"); try { Class aspect = Class.forName(aspectName, false, loader); Deployer.deploy(aspect, "<aspect class=\""+aspectName+"\">" + "<advice name=\""+adviceName+"\" type=\"around\" bind-to=\""+expression+"\"/>" + "</aspect>", scope); setStatus(uuid, aspectName, Boolean.TRUE); } catch (Throwable t) { t.printStackTrace(); } // 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.getAroundAdviceDefinitions().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 // CflowStack as = SystemLoader.getCflowStack(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) { ClassLoader loader = EWorldUtil.class.getClassLoader(); DeploymentScope scope = SystemDefinitionContainer.getDefinitionFor(loader, uuid).getDeploymentScope("demo"); try { Class aspect = Class.forName(aspectName, false, loader); Deployer.undeploy(aspect); setStatus(uuid, aspectName, Boolean.FALSE); } catch (Throwable t) { t.printStackTrace(); } // // 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.getAroundAdviceDefinitions().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 // CflowStack as = SystemLoader.getCflowStack(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) { ClassLoader loader = EWorldUtil.class.getClassLoader(); DeploymentScope scope = SystemDefinitionContainer.getDefinitionFor(loader, "eworld/wlw/aop").getDeploymentScope("demo"); //throw new UnsupportedOperationException("not supported in AW 2.0"); } public static void dumpSystemDefinitions(ClassLoader loader) { java.io.PrintStream out = System.out; out.println("dumpSystemDefinitions [ " + loader + " ]"); Set defs = SystemDefinitionContainer.getDefinitionsFor(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.getAroundAdviceDefinitions().iterator(); arounds.hasNext();) { AdviceDefinition around = (AdviceDefinition) arounds.next(); out.print(" [AroundAdvice] " + around.getName()); out.print(" "); out.print(around.getExpressionInfo().toString()); 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); } }