1 package org
.argeo
.slc
.detached
;
4 import java
.util
.Vector
;
6 import org
.apache
.commons
.logging
.Log
;
7 import org
.apache
.commons
.logging
.LogFactory
;
8 import org
.argeo
.slc
.detached
.admin
.CloseSession
;
9 import org
.argeo
.slc
.detached
.admin
.OpenSession
;
10 import org
.osgi
.framework
.BundleContext
;
11 import org
.osgi
.framework
.ServiceReference
;
13 public class DetachedExecutionServerImpl
implements DetachedExecutionServer
{
14 private final static Log log
= LogFactory
15 .getLog(DetachedExecutionServerImpl
.class);
17 private final DetachedContextImpl detachedContext
;
18 private final List sessions
;
20 private int skipCount
= 0;
22 private BundleContext bundleContext
;
23 //private DetachedDriver driver;
25 //private boolean active = false;
27 // public void setDriver(DetachedDriver driver) {
28 // this.driver = driver;
31 public DetachedExecutionServerImpl() {
32 detachedContext
= new DetachedContextImpl();
33 sessions
= new Vector();
36 public synchronized DetachedAnswer
executeStep(DetachedRequest request
) {
37 DetachedAnswer answer
= null;
39 DetachedStep step
= null;
42 ServiceReference
[] refs
= bundleContext
.getAllServiceReferences(
43 StaticRefProvider
.class.getName(), null);
45 for (int i
= 0; i
< refs
.length
; i
++) {
46 StaticRefProvider provider
= (StaticRefProvider
) bundleContext
48 obj
= provider
.getStaticRef(request
.getRef());
55 throw new DetachedException("Could not find action with ref "
59 if (obj
instanceof DetachedStep
) {
60 if (getCurrentSession() == null)
61 throw new DetachedException("No open session.");
63 StringBuffer skippedLog
= new StringBuffer();
64 boolean execute
= true;
65 if (getPreviousSession() != null
66 && !getPreviousSession().isClosed()) {
67 if (getCurrentSession().getDoItAgainPolicy().equals(
68 DetachedSession
.SKIP_UNTIL_ERROR
)) {
69 // Skip execution of already successful steps
70 if (getPreviousSession().getAnswers().size() > skipCount
) {
71 DetachedAnswer previousAnswer
= (DetachedAnswer
) getPreviousSession()
72 .getAnswers().get(skipCount
);
73 DetachedRequest previousRequest
= (DetachedRequest
) getPreviousSession()
74 .getRequests().get(skipCount
);
76 if (!previousRequest
.getPath().equals(
78 String msg
= "New request is not consistent with previous path. previousPath="
79 + previousRequest
.getPath()
83 skippedLog
.append(msg
);
87 if (previousAnswer
.getStatus() != DetachedAnswer
.ERROR
) {
91 // went further as skip count, doing nothing.
97 step
= (DetachedStep
) obj
;
98 answer
= step
.execute(detachedContext
, request
);
100 skippedLog
.append("Skipped path " + request
.getPath()
101 + " (skipCount=" + skipCount
+ ")");
102 answer
= new DetachedAnswer(request
);
103 answer
.setStatus(DetachedAnswer
.SKIPPED
);
104 answer
.setLog(skippedLog
.toString());
107 } else if (obj
instanceof DetachedAdminCommand
) {
108 if (obj
instanceof OpenSession
) {
109 if (getCurrentSession() != null)
110 throw new DetachedException(
111 "There is already an open session #"
112 + getCurrentSession().getUuid());
113 sessions
.add(((OpenSession
) obj
).execute(request
,
115 answer
= new DetachedAnswer(request
, "Session #"
116 + getCurrentSession().getUuid() + " open.");
117 } else if (obj
instanceof CloseSession
) {
118 if (getCurrentSession() == null)
119 throw new DetachedException(
120 "There is no open session to close");
121 answer
= new DetachedAnswer(request
, "Session #"
122 + getCurrentSession().getUuid() + " closed.");
123 answer
.setStatus(DetachedAnswer
.CLOSED_SESSION
);
128 throw new DetachedException("Unknown action type "
129 + obj
.getClass() + " for action with ref "
132 } catch (DetachedException e
) {
133 answer
= new DetachedAnswer(request
);
134 answer
.setStatus(DetachedAnswer
.ERROR
);
135 answer
.setLog(e
.getMessage());
136 } catch (Exception e
) {
138 throw new DetachedException(
139 "Unexpected exception while executing request " + request
,
142 getCurrentSession().getRequests().add(request
);
143 getCurrentSession().getAnswers().add(answer
);
147 protected final DetachedSession
getCurrentSession() {
148 if (sessions
.size() == 0) {
151 DetachedSession session
= (DetachedSession
) sessions
.get(sessions
153 List answers
= session
.getAnswers();
154 if (answers
.size() > 0) {
155 DetachedAnswer lastAnswer
= (DetachedAnswer
) answers
156 .get(answers
.size() - 1);
157 if (lastAnswer
.getStatus() == DetachedAnswer
.ERROR
158 || lastAnswer
.getStatus() == DetachedAnswer
.CLOSED_SESSION
)
165 protected final DetachedSession
getPreviousSession() {
166 if (sessions
.size() < 2)
169 return (DetachedSession
) sessions
.get(sessions
.size() - 2);
172 public void init(BundleContext bundleContext
) {
173 this.bundleContext
= bundleContext
;
174 // Thread driverThread = new Thread(new Runnable() {
176 // public void run() {
179 // DetachedRequest request = driver.receiveRequest();
180 // DetachedAnswer answer = executeStep(request);
181 // driver.sendAnswer(answer);
182 // } catch (Exception e) {
183 // if (e instanceof RuntimeException)
184 // throw (RuntimeException) e;
186 // e.printStackTrace();
191 // }, "driverThread");
195 // driverThread.start();