/**
* Copyright (C) 2015 Born Informatik AG (www.born.ch)
*
* 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 org.wte4j.examples.showcase.client.management;
import org.wte4j.ui.client.Application;
import org.wte4j.ui.client.templates.mapping.MappingDisplay;
import org.wte4j.ui.client.templates.mapping.MappingPresenter;
import org.wte4j.ui.client.templates.upload.TemplateUploadDisplay;
import org.wte4j.ui.client.templates.upload.TemplateUploadPresenter;
import org.wte4j.ui.shared.InvalidTemplateServiceException;
import org.wte4j.ui.shared.TemplateDto;
import org.wte4j.ui.shared.TemplateServiceAsync;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.IsWidget;
public class NewTemplateWizard {
private static final String UPLOAD_URL = Application.REST_SERVICE_BASE_URL + "templates/temp";
private TemplateServiceAsync templateService = TemplateServiceAsync.Util.getInstance();
private TemplateUploadDisplay templateUploadDisplay;
private TemplateUploadPresenter templateUploadPresenter;
private NewTemplateStepPresenter newTemplatePresenter;
private NewTemplateDisplay newTemplateDisplay;
private MappingStepPresenter mappingPresenter;
private MappingDisplay mappingDisplay;
private WizardContainer parent;
private TemplateDto template;
private String uploadedFile;
public NewTemplateWizard() {
super();
templateUploadPresenter = new TemplateUploadStepPresenter();
newTemplatePresenter = new NewTemplateStepPresenter();
mappingPresenter = new MappingStepPresenter();
}
public void bind(TemplateUploadDisplay aTemplateUploadDisplay) {
templateUploadPresenter.bindTo(aTemplateUploadDisplay);
this.templateUploadDisplay = aTemplateUploadDisplay;
}
public void bind(NewTemplateDisplay aNewTemplateDisplay) {
newTemplatePresenter.bind(aNewTemplateDisplay);
this.newTemplateDisplay = aNewTemplateDisplay;
}
public void bind(MappingDisplay aMappingDisplay) {
mappingPresenter.bind(aMappingDisplay);
this.mappingDisplay = aMappingDisplay;
}
public void startWihtFileUpload(WizardContainer aContainer) {
parent = aContainer;
initForNewTemplate();
startFileUpload();
parent.onWizardStarted();
}
public void startWithModel(WizardContainer aContainer) {
parent = aContainer;
initForNewTemplate();
startNameAndModelSelection();
parent.onWizardStarted();
}
protected void startFileUpload() {
templateUploadPresenter.startUpload(template, UPLOAD_URL);
parent.displayWizardContent(templateUploadDisplay);
}
private void initForNewTemplate() {
template = new TemplateDto();
template.setDocumentName("new");
template.setLanguage("en");
uploadedFile = null;
}
protected void onFileUploadCompleted(String fileUpdateResponse) {
uploadedFile = fileUpdateResponse;
startNameAndModelSelection();
}
protected void startNameAndModelSelection() {
newTemplatePresenter.present(template);
parent.displayWizardContent(newTemplateDisplay);
}
protected void onNameAndModelSelectionComplete() {
if (uploadedFile == null || uploadedFile.isEmpty()) {
persistTemplate(new AsyncCallback<TemplateDto>() {
@Override
public void onFailure(Throwable caught) {
parent.showErrorMessage(caught.getMessage());
startNameAndModelSelection();
}
@Override
public void onSuccess(TemplateDto newTemplate) {
onTemplateCreated(newTemplate);
}
});
}
else {
startMapping();
}
}
public void persistTemplate(AsyncCallback<TemplateDto> callback) {
templateService.createTemplate(template, uploadedFile, callback);
}
protected void startMapping() {
mappingPresenter.startEditMapping(template, uploadedFile);
parent.displayWizardContent(mappingDisplay);
}
protected void onTemplateCreated(TemplateDto created) {
parent.onWizardCompleted(created);
}
protected void onWizardCanceled() {
parent.onWizardCanceled();
parent = null;
}
private class TemplateUploadStepPresenter extends TemplateUploadPresenter {
public TemplateUploadStepPresenter() {
this.addFileUploadedHandler(new FileUploadedHandler() {
@Override
public void onSuccess(String fileUpdateResponse) {
onFileUploadCompleted(fileUpdateResponse);
}
@Override
public void onFailure(String errorMessage) {
parent.showErrorMessage(errorMessage);
}
});
}
@Override
protected void cancelFileUpload() {
super.cancelFileUpload();
onWizardCanceled();
}
}
private class NewTemplateStepPresenter extends NewTemplatePresenter {
@Override
void onSubmitClicked() {
onNameAndModelSelectionComplete();
}
@Override
void onCancelClicked() {
onWizardCanceled();
}
@Override
void onFailedLoadDataModels(Throwable cause) {
parent.showErrorMessage(cause.getMessage());
onWizardCanceled();
}
}
private class MappingStepPresenter extends MappingPresenter {
@Override
protected void submit() {
persistTemplate(new AsyncCallback<TemplateDto>() {
@Override
public void onSuccess(TemplateDto updated) {
template = updated;
onSubmitSuccess(updated);
onTemplateCreated(updated);
}
@Override
public void onFailure(Throwable caught) {
if (caught instanceof InvalidTemplateServiceException) {
displayInvalidTemplateMessage((InvalidTemplateServiceException) caught);
}
else {
parent.showErrorMessage(caught.getMessage());
}
}
});
}
@Override
protected void onInitMappingDataFailed(Throwable caught) {
parent.showErrorMessage(caught.getMessage());
cancelEditMapping();
}
@Override
public void cancelEditMapping() {
super.cancelEditMapping();
onWizardCanceled();
}
}
public interface WizardContainer {
public void displayWizardContent(IsWidget wiget);
public void showErrorMessage(String message);
public void onWizardStarted();
public void onWizardCanceled();
public void onWizardCompleted(TemplateDto created);
}
}