Merge "Add a class for grouping together related callbacks"
This commit is contained in:
@@ -18,6 +18,7 @@ import com.google.gerrit.client.Gerrit;
|
|||||||
import com.google.gerrit.client.patches.AbstractPatchContentTable;
|
import com.google.gerrit.client.patches.AbstractPatchContentTable;
|
||||||
import com.google.gerrit.client.patches.CommentEditorContainer;
|
import com.google.gerrit.client.patches.CommentEditorContainer;
|
||||||
import com.google.gerrit.client.patches.CommentEditorPanel;
|
import com.google.gerrit.client.patches.CommentEditorPanel;
|
||||||
|
import com.google.gerrit.client.rpc.CallbackGroup;
|
||||||
import com.google.gerrit.client.rpc.GerritCallback;
|
import com.google.gerrit.client.rpc.GerritCallback;
|
||||||
import com.google.gerrit.client.rpc.RestApi;
|
import com.google.gerrit.client.rpc.RestApi;
|
||||||
import com.google.gerrit.client.rpc.ScreenLoadCallback;
|
import com.google.gerrit.client.rpc.ScreenLoadCallback;
|
||||||
@@ -145,7 +146,9 @@ public class PublishCommentScreen extends AccountScreen implements
|
|||||||
@Override
|
@Override
|
||||||
protected void onLoad() {
|
protected void onLoad() {
|
||||||
super.onLoad();
|
super.onLoad();
|
||||||
Util.DETAIL_SVC.patchSetPublishDetail(patchSetId,
|
|
||||||
|
CallbackGroup cbs = new CallbackGroup();
|
||||||
|
Util.DETAIL_SVC.patchSetPublishDetail(patchSetId, cbs.addGwtjsonrpc(
|
||||||
new ScreenLoadCallback<PatchSetPublishDetail>(this) {
|
new ScreenLoadCallback<PatchSetPublishDetail>(this) {
|
||||||
@Override
|
@Override
|
||||||
protected void preDisplay(final PatchSetPublishDetail result) {
|
protected void preDisplay(final PatchSetPublishDetail result) {
|
||||||
@@ -157,7 +160,7 @@ public class PublishCommentScreen extends AccountScreen implements
|
|||||||
protected void postDisplay() {
|
protected void postDisplay() {
|
||||||
message.setFocus(true);
|
message.setFocus(true);
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,121 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.client.rpc;
|
||||||
|
|
||||||
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for grouping together callbacks and calling them in order.
|
||||||
|
* <p>
|
||||||
|
* Callbacks are added to the group with {@link #add(AsyncCallback)}, which
|
||||||
|
* returns a wrapped callback suitable for passing to an asynchronous RPC call.
|
||||||
|
* The enclosing group buffers returned results and ensures that
|
||||||
|
* {@code onSuccess} is called exactly once for each callback in the group, in
|
||||||
|
* the same order that callbacks were added. This allows callers to, for
|
||||||
|
* example, use a {@link ScreenLoadCallback} as the last callback in the list
|
||||||
|
* and only display the screen once all callbacks have succeeded.
|
||||||
|
* <p>
|
||||||
|
* In the event of a failure, the <em>first</em> caught exception is sent to
|
||||||
|
* <em>all</em> callbacks' {@code onFailure} methods, in order; subsequent
|
||||||
|
* successes or failures are all ignored. Note that this means
|
||||||
|
* {@code onFailure} may be called with an exception unrelated to the callback
|
||||||
|
* processing it.
|
||||||
|
*/
|
||||||
|
public class CallbackGroup {
|
||||||
|
private final List<Object> callbacks;
|
||||||
|
private final Map<Object, Object> results;
|
||||||
|
private boolean failed;
|
||||||
|
|
||||||
|
public CallbackGroup() {
|
||||||
|
callbacks = new ArrayList<Object>();
|
||||||
|
results = new HashMap<Object, Object>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> AsyncCallback<T> add(final AsyncCallback<T> cb) {
|
||||||
|
callbacks.add(cb);
|
||||||
|
return new AsyncCallback<T>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(T result) {
|
||||||
|
results.put(cb, result);
|
||||||
|
CallbackGroup.this.onSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable caught) {
|
||||||
|
CallbackGroup.this.onFailure(caught);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> com.google.gwtjsonrpc.common.AsyncCallback<T> addGwtjsonrpc(
|
||||||
|
final com.google.gwtjsonrpc.common.AsyncCallback<T> cb) {
|
||||||
|
callbacks.add(cb);
|
||||||
|
return new com.google.gwtjsonrpc.common.AsyncCallback<T>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(T result) {
|
||||||
|
results.put(cb, result);
|
||||||
|
CallbackGroup.this.onSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable caught) {
|
||||||
|
CallbackGroup.this.onFailure(caught);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onSuccess() {
|
||||||
|
if (results.size() < callbacks.size()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (Object o : callbacks) {
|
||||||
|
Object result = results.get(o);
|
||||||
|
if (o instanceof AsyncCallback) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
AsyncCallback<Object> cb = (AsyncCallback<Object>) o;
|
||||||
|
cb.onSuccess(result);
|
||||||
|
} else {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
com.google.gwtjsonrpc.common.AsyncCallback<Object> cb =
|
||||||
|
(com.google.gwtjsonrpc.common.AsyncCallback<Object>) o;
|
||||||
|
cb.onSuccess(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onFailure(Throwable caught) {
|
||||||
|
if (failed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
failed = true;
|
||||||
|
for (Object o : callbacks) {
|
||||||
|
if (o instanceof AsyncCallback) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
AsyncCallback<Object> cb = (AsyncCallback<Object>) o;
|
||||||
|
cb.onFailure(caught);
|
||||||
|
} else {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
com.google.gwtjsonrpc.common.AsyncCallback<Object> cb =
|
||||||
|
(com.google.gwtjsonrpc.common.AsyncCallback<Object>) o;
|
||||||
|
cb.onFailure(caught);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user