package org.codefaces.httpclient.internal.ajax;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.ReentrantLock;
import org.codefaces.core.connectors.SCMResponseException;
import org.eclipse.swt.widgets.Display;
public class AjaxClient {
private final AjaxClientWidget ajaxClientWidget;
protected ConcurrentLinkedQueue<JsonGet> requestQueue = new ConcurrentLinkedQueue<JsonGet>();
protected ConcurrentHashMap<String, JsonResponse> responseMap = new ConcurrentHashMap<String, JsonResponse>();
private ReentrantLock lock = new ReentrantLock();
public AjaxClient(AjaxClientWidget ajaxClientWidget) {
this.ajaxClientWidget = ajaxClientWidget;
}
private Display getDisplay() {
return ajaxClientWidget.getDisplay();
}
public JsonResponse execute(JsonGet jsonGet) {
requestQueue.add(jsonGet);
final String requestId = jsonGet.getRequestId();
runOnUIThread(new Runnable() {
@Override
public void run() {
waitForResponse(requestId);
}
});
return responseMap.remove(requestId);
}
protected void runOnUIThread(Runnable runnable) {
getDisplay().syncExec(runnable);
}
protected void waitForResponse(final String requestId) {
while (!responseMap.containsKey(requestId)) {
runEventLoop();
}
}
protected void runEventLoop() {
if (!getDisplay().readAndDispatch()) {
getDisplay().sleep();
}
}
public void setJsonResponse(final JsonResponse response) {
responseMap.put(response.getRequestId(), response);
}
public JsonGet nextRequest() {
return requestQueue.poll();
}
public String getResponseBody(String url) throws SCMResponseException {
try {
lock.lock();
JsonResponse resp = execute(new JsonGet(url));
if (resp.getStatus() != JsonResponse.Status.SUCCESS) {
throw new SCMResponseException("Errors loading " + url + ".");
}
return resp.getContent();
} finally {
lock.unlock();
}
}
}