import org.aspectj.lang.*;

aspect GetTiming {

//   static final void println(String s){ System.out.println(s); }

//   pointcut allExecs(): !within(GetTiming) && cflow(this(com.realm.arch.proxy.PageProxyServlet)) && execution(* *(..));

  pointcut allExecs():

//       !within(GetTiming)
     !withincode(void org.apache.jcs.utils.log.Logger.*(..))
     && !withincode(void org.apache.jcs.utils.log.Logger.*(..))
   && (cflow(this(org.apache.jcs.engine.control.Cache))
//    || cflow(this(org.apache.jcs.engine.group.GroupCache))
    )
//    && !withincode(* *.getValueObj(..))
//
//    && execution(* *(..));

      && execution(* *(..));


   Object around(): allExecs() {
      long start = System.currentTimeMillis();
      String s = thisJoinPointStaticPart.getSignature().getName()
        + " in class: "
        + thisJoinPointStaticPart.getSignature().getDeclaringType().getName();
      	//+ printParameters(thisJoinPoint);
      Object result = proceed();
      long delta = System.currentTimeMillis() - start;
      if (delta >= 0) {
        System.out.println(delta+ " ms: "+s);
      }
      return result;
   }

/*
   static private void printParameters(JoinPoint jp) {
      System.out.println("Arguments: " );
      Object[] args = jp.getArgs();
      String[] names = ((CodeSignature)jp.getSignature()).getParameterNames();
      Class[] types = ((CodeSignature)jp.getSignature()).getParameterTypes();
      for (int i = 0; i < args.length; i++) {
	      System.out.println("  "  + i + ". " + names[i] +
	     " : " +            types[i].getName() +
	     " = " +            args[i]);
      }
   }
*/

}
