/** * Handles beginning execution of {@link MethodInvocation}. * * @param event {@link VMObservableEvent} event for invocation */ private void startMethodInvocation(VMObservableEvent event) { MethodInvocation invocation = (MethodInvocation) event.getObject(); ComponentThread thread = event.getThread(); Object instance = event.getProperties()[1]; UserField field = getUserFieldForInstance(instance); AbstractEventNode<?> parentNode = peekEventNode(getThreadForNode(invocation, thread)); // Add instance and referencing field to parent node if (parentNode instanceof ExpressionStatementEventNode) { ExpressionStatementEventNode statementNode = (ExpressionStatementEventNode) parentNode; if ((instance != null) & (field != null)) { statementNode.setCallerInstance(instance); statementNode.setCallerField(field); } if ((instance != null) & (field != null)) { notifyListenersOfStart(statementNode); // Now that caller has been set, notify listeners } if (invocation.method.getValue() instanceof UserMethod) { UserMethod userMethod = (UserMethod) invocation.method.getValue(); if (!userMethod.isFunction()) { statementNode.setUserMethod(userMethod); } } } else if (parentNode instanceof ExpressionEvaluationEventNode) { if (field != null) { ((ExpressionEvaluationEventNode) parentNode).setValueField(field); } } }
/** * Handles the ending of evaluation of an {@link Expression}. * * @param event VMObservableEvent event for expression */ private void endExpressionEvaluation(VMObservableEvent event) { Expression expression = (Expression) event.getObject(); ComponentThread thread = event.getThread(); double endTime = event.getTime(); Object value = event.getProperties()[0]; AbstractEventNode<?> eventNode = popEventNode(thread, false); if ((eventNode != null) && (eventNode.getAstNode() == expression) && (eventNode.getThread() == thread)) { eventNode.setEndTime(endTime); ((ExpressionEvaluationEventNode) eventNode).setValue(value); UserField field = this.getUserFieldForInstance(value); if (field != null) { ((ExpressionEvaluationEventNode) eventNode).setValueField(field); } } else { throw new ExecutionObserverException("EventNode invalid: " + eventNode.toString(), event); } }