mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
-44
@@ -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);
|
||||
}
|
||||
+2
-2
@@ -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);
|
||||
}
|
||||
+1
-1
@@ -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");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ package org.jetbrains.jsonProtocol;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public interface Request {
|
||||
public interface Request<RESULT> {
|
||||
@NotNull
|
||||
CharSequence toJson();
|
||||
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
package org.jetbrains.jsonProtocol;
|
||||
|
||||
public interface RequestWithResponse<RESULT> extends Request {
|
||||
}
|
||||
Reference in New Issue
Block a user