/**************************************************************************************
* 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 eworld.service;
import org.codehaus.aspectwerkz.extension.hotswap.EWorldUtil;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
import org.codehaus.aspectwerkz.joinpoint.MethodRtti;
import org.codehaus.aspectwerkz.joinpoint.MemberSignature;
import org.codehaus.aspectwerkz.exception.WrappedRuntimeException;
import java.util.Map;
import java.util.HashMap;
/**
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public class ComputationStandalone {
private static final int WEAVING_FREQUENCY = new Integer(
System
.getProperty("weaving.frequency")
).intValue();
private static final boolean USE_CACHE = System.getProperty("cache").equals("true");
private static final boolean USE_TRACE = System.getProperty("trace").equals("true");
private static final String EXPRESSION = "execution(int eworld.service.ComputationStandalone.fib(int))";
private static final String SYSTEM_ID = "eworld/wlw/aop";
private static final String CACHE_POINTCUT = "cache";
private static final String TRACE_POINTCUT = "trace";
private static final String CACHE_ADVICE = "cache";
private static final String TRACE_ADVICE = "trace";
public static int fib(int n) {
if (n < 2) {
System.err.println(n + ".");
return 1;
} else {
System.err.print(n + ",");
return fib(n - 1) + fib(n - 2);
}
}
private static void weave() {
if (USE_CACHE) {
System.err.println("weaving in cache support");
EWorldUtil.activate(
SYSTEM_ID,
CacheAspect.class.getName(),
CACHE_ADVICE,
EXPRESSION,
CACHE_POINTCUT
);
}
if (USE_TRACE) {
System.err.println("weaving in trace support");
EWorldUtil.activate(
SYSTEM_ID,
TraceAspect.class.getName(),
TRACE_ADVICE,
EXPRESSION,
TRACE_POINTCUT
);
}
}
private static void unWeave() {
if (USE_CACHE) {
System.err.println("un-weaving cache support");
EWorldUtil.deactivate(
SYSTEM_ID,
CacheAspect.class.getName(),
CACHE_ADVICE,
CACHE_POINTCUT
);
// flush the cache... as if we have a "onUndeploy callback.."
System.err.println("** Flushing the cache...");
CacheAspect.s_cache.clear();
}
if (USE_TRACE) {
System.err.println("un-weaving trace support");
EWorldUtil.deactivate(
SYSTEM_ID,
TraceAspect.class.getName(),
TRACE_ADVICE,
TRACE_POINTCUT
);
}
}
public static void main(String[] args) {
// if (args.length != 2) {
// System.err.println("fib(" + 3 + ") = " + fib(3));
//
// System.err.println("weaving in trace support");
// EWorldUtil.activate(SYSTEM_ID, TraceAspect.class.getName(), TRACE_ADVICE, EXPRESSION,
// TRACE_POINTCUT);
// EWorldUtil.hotswap("eworld.service");
// System.err.println("fib(" + 3 + ") = " + fib(3));
//
// System.err.println("weaving in cache support");
// EWorldUtil.activate(SYSTEM_ID, CacheAspect.class.getName(), CACHE_ADVICE, EXPRESSION,
// CACHE_POINTCUT);
// EWorldUtil.hotswap("eworld.service");
// System.err.println("fib(" + 3 + ") = " + fib(3));
// System.err.println("fib(" + 3 + ") = " + fib(3));
//
// System.err.println("un-weaving trace support");
// EWorldUtil.deactivate(SYSTEM_ID, TraceAspect.class.getName(), TRACE_ADVICE,
// TRACE_POINTCUT);
// EWorldUtil.hotswap("eworld.service");
// System.err.println("fib(" + 4 + ") = " + fib(4));
//
// System.err.println("un-weaving cache support");
// EWorldUtil.deactivate(SYSTEM_ID, CacheAspect.class.getName(), CACHE_ADVICE,
// CACHE_POINTCUT);
// EWorldUtil.hotswap("eworld.service");
// System.err.println("fib(" + 3 + ") = " + fib(3));
//
// System.err.println("weaving in trace support");
// EWorldUtil.activate(SYSTEM_ID, TraceAspect.class.getName(), TRACE_ADVICE, EXPRESSION,
// TRACE_POINTCUT);
// EWorldUtil.hotswap("eworld.service");
// System.err.println("fib(" + 3 + ") = " + fib(3));
//
// System.err.println("un-weaving trace support");
// EWorldUtil.deactivate(SYSTEM_ID, TraceAspect.class.getName(), TRACE_ADVICE,
// TRACE_POINTCUT);
// EWorldUtil.hotswap("eworld.service");
// System.err.println("fib(" + 4 + ") = " + fib(4));
//
// System.exit(0);
// //throw new IllegalArgumentException("number of iterations and sleep time must be
// specified");
// }
try {
int iterations = new Integer(args[0]).intValue();
long sleep = new Long(args[1]).longValue();
int counter = 0;
boolean isWeaved = false;
while (true) {
System.out.println(
"TraceAspect weave status = "
+ EWorldUtil.isWeaved(SYSTEM_ID, TraceAspect.class.getName())
);
System.out.println(
"CacheAspect weave status = "
+ EWorldUtil.isWeaved(SYSTEM_ID, CacheAspect.class.getName())
);
counter++;
Thread.sleep(sleep);
System.err.println("fib(" + iterations + ") = " + fib(iterations));
if (USE_CACHE || USE_TRACE) {
if ((counter %= WEAVING_FREQUENCY) == 0) {
if (isWeaved) {
unWeave();
isWeaved = false;
} else {
weave();
isWeaved = true;
}
EWorldUtil.hotswap("eworld.service");
}
}
}
} catch (InterruptedException e) {
throw new WrappedRuntimeException(e);
}
}
/**
* Cache aspect.
*/
public static class CacheAspect {
/** a static cache to flush it from the outside for demo purpose. Safe since aspect is singleton */
public static Map s_cache = new HashMap();
public Object cache(final JoinPoint joinPoint) throws Throwable {
MethodRtti mrtti = (MethodRtti) joinPoint.getRtti();
Integer parameter = (Integer) mrtti.getParameterValues()[0];
Integer cachedValue = (Integer) s_cache.get(parameter);
if (cachedValue == null) {
System.err.println("not in cache");
Object newValue = joinPoint.proceed(); // not found => calculate
s_cache.put(parameter, newValue);
return newValue;
} else {
System.err.println("using cache: " + cachedValue);
return cachedValue; // return cached value
}
}
}
/**
* Trace aspect.
*/
public static class TraceAspect {
private int m_level = 0;
public Object trace(final JoinPoint joinPoint) throws Throwable {
MemberSignature signature = (MemberSignature) joinPoint.getSignature();
indent();
System.out.println(
"--> "
+ signature.getDeclaringType().getName()
+ "::"
+ signature.getName()
);
m_level++;
final Object result = joinPoint.proceed();
m_level--;
indent();
System.out.println(
"<-- "
+ signature.getDeclaringType().getName()
+ "::"
+ signature.getName()
);
return result;
}
private void indent() {
for (int i = 0; i < m_level; i++) {
System.out.print(" ");
}
}
}
}