+/*
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.argeo.slc.core.execution;
import org.apache.commons.logging.Log;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
+/** Aspect intercepting calls on execution flows and contexts. */
public class ExecutionAspect {
private final static Log log = LogFactory.getLog(ExecutionAspect.class);
@Around("flowExecution()")
public void aroundFlow(ProceedingJoinPoint pjp) throws Throwable {
- // IMPORTANT: Make sure that the execution context is called before the execution stack
+ // IMPORTANT: Make sure that the execution context is called before the
+ // execution stack
executionContext.getUuid();
-
+
ExecutionFlow executionFlow = (ExecutionFlow) pjp.getTarget();
executionStack.enterFlow(executionFlow);
executionContext.setVariable(ExecutionContext.VAR_FLOW_ID,
if (log.isDebugEnabled())
logStackEvent("=> ", executionFlow);
- // Actually execute the flow
- pjp.proceed();
- if (log.isDebugEnabled())
- logStackEvent("<= ", executionFlow);
- executionStack.leaveFlow(executionFlow);
+ try {
+ // Actually execute the flow
+ pjp.proceed();
+ } finally {
+ if (log.isDebugEnabled())
+ logStackEvent("<= ", executionFlow);
+
+ executionStack.leaveFlow(executionFlow);
+ }
}
@Around("getVariable()")
protected void logStackEvent(String symbol, ExecutionFlow executionFlow) {
Integer stackSize = executionStack.getStackSize();
- log.debug(depthSpaces(stackSize) + symbol + executionFlow + " #"
- + executionStack.getCurrentStackLevelUuid() + ", depth="
- + stackSize);
+ if (log.isTraceEnabled())
+ log.debug(depthSpaces(stackSize) + symbol + executionFlow + " #"
+ + executionStack.getCurrentStackLevelUuid() + ", depth="
+ + stackSize);
+ else if (log.isDebugEnabled())
+ log.debug(depthSpaces(stackSize) + symbol + executionFlow);
+ }
+
+ protected void logRunnableExecution(ExecutionFlow executionFlow,
+ Runnable runnable) {
+ Integer stackSize = executionStack.getStackSize();
+ if (log.isDebugEnabled())
+ log.debug(depthSpaces(stackSize + 1)
+ + runnable.getClass().getSimpleName() + " in "
+ + executionFlow);
}
private String depthSpaces(int depth) {