+ if (log.isDebugEnabled())
+ log.debug("Processed '" + request.getRef() + "' (status="
+ + answer.getStatusAsString() + ", path="
+ + request.getPath() + ")");
+ return answer;
+ }
+
+ protected DetachedAnswer processStep(DetachedStep obj,
+ DetachedRequest request) {
+ DetachedAnswer answer;
+ if (getCurrentSession() == null)
+ throw new DetachedException("No open session.");
+
+ StringBuffer skippedLog = new StringBuffer();
+ boolean execute = true;
+ if (getPreviousSession() != null && !getPreviousSession().isClosed()) {
+ if (getCurrentSession().getDoItAgainPolicy().equals(
+ DetachedSession.SKIP_UNTIL_ERROR)) {
+ // Skip execution of already successful steps
+ if (getPreviousSession().getAnswers().size() > skipCount) {
+ DetachedAnswer previousAnswer = (DetachedAnswer) getPreviousSession()
+ .getAnswers().get(skipCount);
+ DetachedRequest previousRequest = (DetachedRequest) getPreviousSession()
+ .getRequests().get(skipCount);
+ // Check paths
+ if (!previousRequest.getPath().equals(request.getPath())) {
+ String msg = "New request is not consistent with previous path. previousPath="
+ + previousRequest.getPath()
+ + ", newPath="
+ + request.getPath() + "\n";
+ skippedLog.append(msg);
+ log.warn(msg);
+ }
+
+ if (previousAnswer.getStatus() != DetachedAnswer.ERROR) {
+ execute = false;
+ String msg = "Skipped path " + request.getPath()
+ + " (skipCount=" + skipCount + ")";
+ skippedLog.append(msg);
+ log.info(msg);
+ skipCount++;
+ } else {
+ log
+ .info("Path "
+ + request.getPath()
+ + " was previously in error, executing it again."
+ + " (skipCount=" + skipCount
+ + "). Reset skip count to 1");
+ skipCount = 1;
+ }
+ } else {
+ // went further as skip count, doing nothing.
+ }
+ }
+ }
+
+ if (execute) {
+ DetachedStep step = (DetachedStep) obj;
+ answer = step.execute(detachedContext, request);
+ } else {
+ answer = new DetachedAnswer(request);
+ answer.setStatus(DetachedAnswer.SKIPPED);
+ answer.setLog(skippedLog.toString());
+ }
+ return answer;
+ }
+
+ protected DetachedAnswer processAdminCommand(DetachedAdminCommand obj,
+ DetachedRequest request) {
+ DetachedAnswer answer;
+ if (obj instanceof OpenSession) {
+ if (getCurrentSession() != null)
+ throw new DetachedException(
+ "There is already an open session #"
+ + getCurrentSession().getUuid());
+ sessions.add(((OpenSession) obj).execute(request, bundleContext));
+ answer = new DetachedAnswer(request, "Session #"
+ + getCurrentSession().getUuid() + " open.");
+ } else if (obj instanceof CloseSession) {
+ if (getCurrentSession() == null)
+ throw new DetachedException("There is no open session to close");
+ answer = new DetachedAnswer(request, "Session #"
+ + getCurrentSession().getUuid() + " closed.");
+ answer.setStatus(DetachedAnswer.CLOSED_SESSION);
+ } else {
+ answer = null;
+ }