Editor persist throws "A request is already in progress "

992 views
Skip to first unread message

jmbz84

unread,
May 28, 2012, 8:02:07 PM5/28/12
to Google Web Toolkit
Hello,

I'm trying to set up a basic editor in gwt. Everything works fine, the
editor displays the data and saves but when I try to save again (i.e.
press the save button 2 times) it throws me the error "A request is
already in progress " in the second save, but the first time the
editor saves the data correctly.

How can I solve this, perhaps creating a new Request?

//
//Methods that edit and save the editor, locate in
ComposerEditorContainer class
//
public void edit(RequestContext requestContext) {

editorDriver = GWT.create(Driver.class);
editorDriver.initialize(requestFactory, composerEditor);
editorDriver.edit(composer, requestContext);
}

public void save() {

ComposerRequest composerRequest = (ComposerRequest) editorDriver
.flush();
ComposerProxy newProxy = composerRequest.edit(composer);
composerRequest.persist(newProxy).fire();
}

//
//Events in a presenter that save and initialize the editor
//
eventBus.addHandler(SaveButtonClickedEvent.TYPE,
new SaveButtonClickedEventHandler() {
@Override
public void onSaveButtonClicked(SaveButtonClickedEvent event) {

((ComposerEditorContainer) composerEditorContainer)
.save();
}

});

//this method gets the ComposerProxy from the event and initializes
the editor
//
eventBus.addHandler(BrowserItemClickedEvent.TYPE,
new BrowserItemClickedEventHandler() {
@Override
public void onBrowserItemClicked(
BrowserItemClickedEvent event) {


requestFactory = GWT.create(AppRequestFactory.class);
requestFactory.initialize(new SimpleEventBus());

ComposerRequest request = requestFactory
.getComposerRequest();

Request<ComposerProxy> req = request.findComposer(event
.getclickedItem().getValue());

req.fire(new Receiver<ComposerProxy>() {

public void onSuccess(ComposerProxy arg0) {

ComposerEditorContainer editorContainer = new
ComposerEditorContainer(
requestFactory, arg0);
editorContainer.edit(requestFactory
.getComposerRequest());
view.clear();
view.addWidget(editorContainer);

composerEditorContainer = editorContainer;
}
});

}
});


//Error that appears when saving for the second time
Caused by: java.lang.IllegalStateException: A request is already in
progress
at
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.checkLocked(AbstractRequestContext.java:
960)
at
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.editProxy(AbstractRequestContext.java:
510)
at
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.edit(AbstractRequestContext.java:
502)
at
com.google.test.client.editor.ComposerEditorContainer.save(ComposerEditorContainer.java:
58)
at com.google.test.client.presenter.BrowserDetailPresenter
$1.onSaveButtonClicked(BrowserDetailPresenter.java:48)
at
com.google.test.client.event.SaveButtonClickedEvent.dispatch(SaveButtonClickedEvent.java:
17)

Thomas Broyer

unread,
May 29, 2012, 3:25:47 AM5/29/12
to google-we...@googlegroups.com
A RequestContext is a "builder"; you queue things into it and then fire(). Once fire()d, it's no longer usable; you have to create a new one and start over.

jmbz84

unread,
May 29, 2012, 1:09:39 PM5/29/12
to Google Web Toolkit
Thanks for the reply,

In order to create a new RequestContext what I must do is call the :

editorContainer.edit(requestFactory.getComposerRequest());

before I save for the second time?

It means that I have to re-initialize the editor once I save it.

Thomas Broyer

unread,
May 29, 2012, 4:20:09 PM5/29/12
to google-we...@googlegroups.com

On Tuesday, May 29, 2012 7:09:39 PM UTC+2, jmbz84 wrote:
Thanks for the reply,

In order to create a new RequestContext what I must do is call the :

  editorContainer.edit(requestFactory.getComposerRequest());

before I save for the second time?

It means that I have to re-initialize the editor once I save it.

Absolutely. In general, you'd have the save() method return the modified proxy (in case another user modified it too, particularly if he modified fields that the current user didn't touch) and edit() it from the Receiver's onSuccess. 

jmbz84

unread,
May 29, 2012, 8:44:06 PM5/29/12
to Google Web Toolkit
Modified the code , it is working now. Thanks for the help

//
//Method in the ComposerEditorContainer class
//
public ComposerProxy save() {
ComposerRequest composerRequest = (ComposerRequest) editorDriver
.flush();
final ComposerProxy newProxy = composerRequest.edit(composer);
composerRequest.persist(newProxy).fire(new Receiver<Boolean>() {
public void onSuccess(Boolean arg0) {
if (arg0)
presenter.updateEditor();
}});
return newProxy;
}
//
//Method in the presenter
//
public void updateEditor() {
requestFactory = GWT.create(AppRequestFactory.class);
requestFactory.initialize(new SimpleEventBus());
ComposerRequest request = requestFactory.getComposerRequest();
Request<ComposerProxy> req = request.findComposer(selectedComposer
.getId());
req.fire(new Receiver<ComposerProxy>() {
public void onSuccess(ComposerProxy arg0) {
selectedComposer = arg0;
editorContainer.setComposer(selectedComposer);
editorContainer.edit(requestFactory.getComposerRequest());
view.clear();
view.addWidget(editorContainer);
}});
}




public void registerEvents() {
eventBus.addHandler(SaveButtonClickedEvent.TYPE,
new SaveButtonClickedEventHandler() {
@Override
public void onSaveButtonClicked(SaveButtonClickedEvent event) {
selectedComposer = ((ComposerEditorContainer)
editorContainer).save();
}
});

eventBus.addHandler(BrowserItemClickedEvent.TYPE,
new BrowserItemClickedEventHandler() {
@Override
public void onBrowserItemClicked(
BrowserItemClickedEvent event) {
requestFactory = GWT.create(AppRequestFactory.class);
requestFactory.initialize(new SimpleEventBus());
ComposerRequest request = requestFactory
.getComposerRequest();
Request<ComposerProxy> req = request.findComposer(event
.getclickedItem().getValue());
req.fire(new Receiver<ComposerProxy>() {
public void onSuccess(ComposerProxy arg0) {
selectedComposer = arg0;
editorContainer.setComposer(selectedComposer);
editorContainer.edit(requestFactory
.getComposerRequest());
view.clear();
view.addWidget(editorContainer);
}
});
}});
Reply all
Reply to author
Forward
0 new messages