simplify — get rid of RequestWithResponse

continue firefox rdp — set thread state to RUNNING on attach, set breakpoint after init (we must pause thread to set breakpoint)
This commit is contained in:
Vladimir Krivosheev
2015-01-02 11:23:59 +01:00
parent 88ba687888
commit dc2ec22efb
13 changed files with 35 additions and 149 deletions
@@ -1,40 +0,0 @@
package org.jetbrains.rpc;
import com.intellij.openapi.util.ActionCallback;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
abstract class AsyncResultCallbackBase<SUCCESS_RESPONSE, C extends ActionCallback, ERROR_DETAILS> implements AsyncResultCallback<SUCCESS_RESPONSE, ERROR_DETAILS> {
protected final C callback;
private final ErrorConsumer<C, ERROR_DETAILS> errorConsumer;
protected AsyncResultCallbackBase(C callback, @Nullable ErrorConsumer<C, ERROR_DETAILS> errorConsumer) {
this.callback = callback;
this.errorConsumer = errorConsumer;
}
@Override
public final void onError(@NotNull String errorMessage, ERROR_DETAILS errorDetails) {
try {
if (errorConsumer == null) {
callback.reject(errorMessage);
}
else {
try {
errorConsumer.consume(errorMessage, errorDetails, callback);
}
catch (Throwable e) {
try {
callback.reject(e.getMessage());
}
finally {
CommandProcessor.LOG.error(e);
}
}
}
}
catch (Throwable e) {
CommandProcessor.LOG.error(e);
}
}
}
@@ -1,44 +0,0 @@
package org.jetbrains.rpc;
import com.intellij.openapi.util.AsyncResult;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
final class CommandCallbackWithResponse<SUCCESS_RESPONSE, RESULT, TRANSFORMED_RESULT, ERROR_DETAILS>
extends AsyncResultCallbackBase<SUCCESS_RESPONSE,AsyncResult<TRANSFORMED_RESULT>,ERROR_DETAILS> {
private final Function<RESULT, TRANSFORMED_RESULT> transform;
private final String methodName;
public CommandCallbackWithResponse(String methodName, Function<RESULT, TRANSFORMED_RESULT> transform, @Nullable ErrorConsumer<AsyncResult<TRANSFORMED_RESULT>, ERROR_DETAILS> errorConsumer) {
this(new AsyncResult<TRANSFORMED_RESULT>(), methodName, transform, errorConsumer);
}
public CommandCallbackWithResponse(AsyncResult<TRANSFORMED_RESULT> asyncResult, String methodName, Function<RESULT, TRANSFORMED_RESULT> transform, @Nullable ErrorConsumer<AsyncResult<TRANSFORMED_RESULT>, ERROR_DETAILS> errorConsumer) {
super(asyncResult, errorConsumer);
this.methodName = methodName;
this.transform = transform;
}
private void onSuccess(RESULT result) {
try {
callback.setDone(transform.fun(result));
}
catch (Throwable e) {
CommandProcessor.LOG.error(e);
}
}
@Override
public final void onSuccess(SUCCESS_RESPONSE response, @NotNull ResultReader<SUCCESS_RESPONSE> resultReader) {
try {
onSuccess(resultReader.<RESULT>readResult(methodName, response));
}
catch (Throwable e) {
CommandProcessor.LOG.error(e);
callback.reject(e.getMessage());
}
}
}
@@ -38,7 +38,7 @@ public abstract class CommandProcessor<INCOMING, INCOMING_WITH_SEQ, SUCCESS_RESP
}
@Override
protected void send(@NotNull Request message, @NotNull AsyncResultCallback<SUCCESS_RESPONSE, ERROR_DETAILS> callback) {
protected <RESULT> void send(@NotNull Request message, @NotNull RequestPromise<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS> callback) {
messageManager.send(message, callback);
}
}
@@ -1,20 +1,10 @@
package org.jetbrains.rpc;
import com.intellij.openapi.util.AsyncResult;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.concurrency.Promise;
import org.jetbrains.jsonProtocol.Request;
import org.jetbrains.jsonProtocol.RequestWithResponse;
public interface CommandSender<ERROR_DETAILS> {
public interface CommandSender {
@NotNull
Promise<Void> send(@NotNull Request message);
<RESULT> Promise<RESULT> send(@NotNull RequestWithResponse<RESULT> message);
<RESULT, TRANSFORMED_RESULT> AsyncResult<TRANSFORMED_RESULT> send(@NotNull RequestWithResponse message,
@NotNull Function<RESULT, TRANSFORMED_RESULT> transform,
@Nullable ErrorConsumer<AsyncResult<TRANSFORMED_RESULT>, ERROR_DETAILS> errorConsumer);
<RESULT> Promise<RESULT> send(@NotNull Request<RESULT> message);
}
@@ -1,45 +1,39 @@
package org.jetbrains.rpc;
import com.intellij.openapi.util.AsyncResult;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.concurrency.AsyncPromise;
import org.jetbrains.concurrency.Promise;
import org.jetbrains.jsonProtocol.Request;
import org.jetbrains.jsonProtocol.RequestWithResponse;
public abstract class CommandSenderBase<SUCCESS_RESPONSE, ERROR_DETAILS> implements CommandSender<ERROR_DETAILS> {
protected abstract void send(@NotNull Request message, @NotNull AsyncResultCallback<SUCCESS_RESPONSE, ERROR_DETAILS> callback);
public abstract class CommandSenderBase<SUCCESS_RESPONSE, ERROR_DETAILS> implements CommandSender {
protected abstract <RESULT> void send(@NotNull Request message, @NotNull RequestPromise<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS> callback);
@Override
@NotNull
@Override
public final Promise<Void> send(@NotNull Request message) {
PromiseWrapper<SUCCESS_RESPONSE, Void, ERROR_DETAILS> callback = new PromiseWrapper<SUCCESS_RESPONSE, Void, ERROR_DETAILS>(null);
send(message, callback);
return callback;
}
@Override
public final <RESULT> Promise<RESULT> send(@NotNull RequestWithResponse<RESULT> request) {
PromiseWrapper<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS> callback = new PromiseWrapper<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS>(request.getMethodName());
public final <RESULT> Promise<RESULT> send(@NotNull Request<RESULT> request) {
RequestPromise<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS> callback = new RequestPromise<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS>(request.getMethodName());
send(request, callback);
return callback;
}
protected static final class PromiseWrapper<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS> extends AsyncPromise<RESULT> implements AsyncResultCallback<SUCCESS_RESPONSE, ERROR_DETAILS> {
protected static final class RequestPromise<SUCCESS_RESPONSE, RESULT, ERROR_DETAILS> extends AsyncPromise<RESULT> implements RequestCallback<SUCCESS_RESPONSE, ERROR_DETAILS> {
private final String methodName;
public PromiseWrapper(@Nullable String methodName) {
public RequestPromise(@Nullable String methodName) {
this.methodName = methodName;
}
@Override
public void onSuccess(SUCCESS_RESPONSE response, @NotNull ResultReader<SUCCESS_RESPONSE> resultReader) {
public void onSuccess(SUCCESS_RESPONSE response, @Nullable ResultReader<SUCCESS_RESPONSE> resultReader) {
try {
setResult(methodName == null ? null : resultReader.<RESULT>readResult(methodName, response));
if (resultReader == null) {
//noinspection unchecked
setResult((RESULT)response);
}
else {
setResult(methodName == null ? null : resultReader.<RESULT>readResult(methodName, response));
}
}
catch (Throwable e) {
CommandProcessor.LOG.error(e);
@@ -52,14 +46,4 @@ public abstract class CommandSenderBase<SUCCESS_RESPONSE, ERROR_DETAILS> impleme
setError(errorMessage);
}
}
@Override
public final <RESULT, TRANSFORMED_RESULT> AsyncResult<TRANSFORMED_RESULT> send(@NotNull RequestWithResponse message,
@NotNull Function<RESULT, TRANSFORMED_RESULT> transform,
@Nullable ErrorConsumer<AsyncResult<TRANSFORMED_RESULT>, ERROR_DETAILS> errorConsumer) {
CommandCallbackWithResponse<SUCCESS_RESPONSE, RESULT, TRANSFORMED_RESULT, ERROR_DETAILS> callback =
new CommandCallbackWithResponse<SUCCESS_RESPONSE, RESULT, TRANSFORMED_RESULT, ERROR_DETAILS>(message.getMethodName(), transform, errorConsumer);
send(message, callback);
return callback.callback;
}
}
@@ -28,7 +28,7 @@ import java.util.Arrays;
* @param <INCOMING_WITH_SEQ> type of incoming message that is a command (has sequence number)
*/
public final class MessageManager<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS, ERROR_DETAILS> extends MessageManagerBase {
private final ConcurrentIntObjectMap<AsyncResultCallback<SUCCESS, ERROR_DETAILS>> callbackMap = ContainerUtil.createConcurrentIntObjectMap();
private final ConcurrentIntObjectMap<RequestCallback<SUCCESS, ERROR_DETAILS>> callbackMap = ContainerUtil.createConcurrentIntObjectMap();
private final Handler<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS, ERROR_DETAILS> handler;
public MessageManager(Handler<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS, ERROR_DETAILS> handler) {
@@ -46,10 +46,10 @@ public final class MessageManager<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS,
void acceptNonSequence(INCOMING incoming);
void call(INCOMING_WITH_SEQ response, AsyncResultCallback<SUCCESS, ERROR_DETAILS> callback);
void call(INCOMING_WITH_SEQ response, RequestCallback<SUCCESS, ERROR_DETAILS> callback);
}
public void send(@NotNull REQUEST message, @NotNull AsyncResultCallback<SUCCESS, ERROR_DETAILS> callback) {
public void send(@NotNull REQUEST message, @NotNull RequestCallback<SUCCESS, ERROR_DETAILS> callback) {
if (rejectIfClosed(callback)) {
return;
}
@@ -77,7 +77,7 @@ public final class MessageManager<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS,
}
private void failedToSend(int sequence) {
AsyncResultCallback<SUCCESS, ERROR_DETAILS> callback = callbackMap.remove(sequence);
RequestCallback<SUCCESS, ERROR_DETAILS> callback = callbackMap.remove(sequence);
if (callback != null) {
callback.onError("Failed to send", null);
}
@@ -96,7 +96,7 @@ public final class MessageManager<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS,
return;
}
AsyncResultCallback<SUCCESS, ERROR_DETAILS> callback = getCallbackAndRemove(handler.getSequence(commandResponse));
RequestCallback<SUCCESS, ERROR_DETAILS> callback = getCallbackAndRemove(handler.getSequence(commandResponse));
if (rejectIfClosed(callback)) {
return;
}
@@ -110,8 +110,8 @@ public final class MessageManager<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS,
}
}
public AsyncResultCallback<SUCCESS, ERROR_DETAILS> getCallbackAndRemove(int id) {
AsyncResultCallback<SUCCESS, ERROR_DETAILS> callback = callbackMap.remove(id);
public RequestCallback<SUCCESS, ERROR_DETAILS> getCallbackAndRemove(int id) {
RequestCallback<SUCCESS, ERROR_DETAILS> callback = callbackMap.remove(id);
if (callback == null) {
throw new IllegalArgumentException("Cannot find callback with id " + id);
}
@@ -120,11 +120,11 @@ public final class MessageManager<REQUEST, INCOMING, INCOMING_WITH_SEQ, SUCCESS,
public void cancelWaitingRequests() {
// we should call them in the order they have been submitted
ConcurrentIntObjectMap<AsyncResultCallback<SUCCESS, ERROR_DETAILS>> map = callbackMap;
ConcurrentIntObjectMap<RequestCallback<SUCCESS, ERROR_DETAILS>> map = callbackMap;
int[] keys = map.keys();
Arrays.sort(keys);
for (int key : keys) {
AsyncResultCallback<SUCCESS, ERROR_DETAILS> callback = map.get(key);
RequestCallback<SUCCESS, ERROR_DETAILS> callback = map.get(key);
if (callback != null) {
rejectCallback(callback);
}
@@ -5,7 +5,7 @@ import org.jetbrains.annotations.NotNull;
public abstract class MessageManagerBase {
protected volatile boolean closed;
protected final boolean rejectIfClosed(AsyncResultCallback<?, ?> callback) {
protected final boolean rejectIfClosed(RequestCallback<?, ?> callback) {
if (closed) {
callback.onError("Connection closed", null);
return true;
@@ -17,7 +17,7 @@ public abstract class MessageManagerBase {
closed = true;
}
protected static void rejectCallback(@NotNull AsyncResultCallback<?, ?> callback) {
protected static void rejectCallback(@NotNull RequestCallback<?, ?> callback) {
callback.onError("Connection closed", null);
}
}
@@ -10,5 +10,5 @@ public interface MessageProcessor {
void closed();
@NotNull
Promise<Void> send(@NotNull Request message);
<T> Promise<T> send(@NotNull Request<T> message);
}
@@ -3,8 +3,8 @@ package org.jetbrains.rpc;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface AsyncResultCallback<SUCCESS_RESPONSE, ERROR_DETAILS> {
void onSuccess(SUCCESS_RESPONSE successResponse, @NotNull ResultReader<SUCCESS_RESPONSE> resultReader);
public interface RequestCallback<SUCCESS_RESPONSE, ERROR_DETAILS> {
void onSuccess(SUCCESS_RESPONSE successResponse, @Nullable ResultReader<SUCCESS_RESPONSE> resultReader);
void onError(@NotNull String errorMessage, @Nullable ERROR_DETAILS errorDetails);
}
@@ -56,7 +56,7 @@ class DomainGenerator {
public void append(TextOutput out) {
out.space().append("extends ").append(generator.getNaming().requestClassName);
if (hasResponse) {
out.space().append("implements org.jetbrains.jsonProtocol.RequestWithResponse");
out.space().append("implements org.jetbrains.jsonProtocol.Request");
}
}
};
@@ -2,7 +2,7 @@ package org.jetbrains.jsonProtocol;
import org.jetbrains.annotations.NotNull;
public interface Request {
public interface Request<RESULT> {
@NotNull
CharSequence toJson();
@@ -2,7 +2,7 @@ package org.jetbrains.jsonProtocol;
import java.io.IOException;
public abstract class RequestImpl extends OutMessage implements Request {
public abstract class RequestImpl<T> extends OutMessage implements Request<T> {
protected boolean argumentsObjectStarted;
protected abstract String getIdKeyName();
@@ -1,4 +0,0 @@
package org.jetbrains.jsonProtocol;
public interface RequestWithResponse<RESULT> extends Request {
}