/* * RHQ Management Platform * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.bundle.create; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.form.events.FormSubmitFailedEvent; import com.smartgwt.client.widgets.form.events.FormSubmitFailedHandler; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.components.HeaderLabel; import org.rhq.coregui.client.components.upload.BundleFileUploadForm; import org.rhq.coregui.client.components.upload.DynamicFormHandler; import org.rhq.coregui.client.components.upload.DynamicFormSubmitCompleteEvent; import org.rhq.coregui.client.components.wizard.AbstractWizardStep; import org.rhq.coregui.client.gwt.GWTServiceLookup; import org.rhq.coregui.client.util.enhanced.EnhancedVLayout; import org.rhq.coregui.client.util.message.Message; import org.rhq.coregui.client.util.message.Message.Severity; public class BundleUploadDataStep extends AbstractWizardStep { private final AbstractBundleCreateWizard wizard; private ArrayList<BundleFileUploadForm> uploadForms; private Boolean noFilesNeedToBeUploaded = null; // will be non-null when we know the answer public BundleUploadDataStep(AbstractBundleCreateWizard bundleCreationWizard) { this.wizard = bundleCreationWizard; } public Canvas getCanvas() { final EnhancedVLayout mainLayout = new EnhancedVLayout(); mainLayout.setMargin(20); mainLayout.setWidth100(); mainLayout.setHeight(10); GWTServiceLookup.getBundleService().getAllBundleVersionFilenames(this.wizard.getBundleVersion().getId(), new AsyncCallback<HashMap<String, Boolean>>() { public void onSuccess(HashMap<String, Boolean> result) { wizard.setAllBundleFilesStatus(result); prepareForm(mainLayout); // If no files need to be uploaded, we could skip immediately to the next step. // I commented this out because if we do this, it prohibits someone // going from the summary step back (via previous button) to here // without it immediately going forward again to summary. I think its // OK for the user to see a page that says, "no more files need to be uploaded" // and have to hit the Next button to see the summary. /* if (noFilesNeedToBeUploaded) { wizard.getView().incrementStep(); } */ } public void onFailure(Throwable caught) { wizard.setAllBundleFilesStatus(null); CoreGUI.getErrorHandler().handleError(MSG.view_bundle_createWizard_loadBundleFileFailure(), caught); } }); return mainLayout; } public boolean nextPage() { wizard.getView().hideMessage(); return isFinished(); } public boolean previousPage() { wizard.getView().hideMessage(); if (this.uploadForms != null) { for (BundleFileUploadForm uploadForm : this.uploadForms) { if (uploadForm.isUploadInProgress()) { handleUploadError( "[" + uploadForm.getName() + "] " + MSG.view_bundle_createWizard_uploadInProgress(), false); return false; } } } return true; } public String getName() { return MSG.view_bundle_createWizard_uploadStepName(); } private boolean isFinished() { if (noFilesNeedToBeUploaded != null && noFilesNeedToBeUploaded.booleanValue()) { return true; } if (wizard.getAllBundleFilesStatus() == null) { return false; } boolean needToUpload = false; for (BundleFileUploadForm uploadForm : this.uploadForms) { if (uploadForm.isUploadInProgress()) { handleUploadError("[" + uploadForm.getName() + "] " + MSG.view_bundle_createWizard_uploadInProgress(), false); needToUpload = true; } else if (uploadForm.getUploadResult() == null) { needToUpload = true; uploadForm.submitForm(); // on certain errors the form may never be submitted, report these errors outside submit handlers handleUploadError(uploadForm.getUploadError(), false); } } if (needToUpload) { return false; } if (wizard.getAllBundleFilesStatus().containsValue(Boolean.FALSE)) { return false; } return true; } private void prepareForm(VLayout mainLayout) { final HashMap<String, Boolean> allFilesStatus = wizard.getAllBundleFilesStatus(); noFilesNeedToBeUploaded = Boolean.TRUE; if (null != allFilesStatus && !allFilesStatus.isEmpty()) { for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) { if (!entry.getValue()) { noFilesNeedToBeUploaded = Boolean.FALSE; break; } } } if (noFilesNeedToBeUploaded) { HeaderLabel label = new HeaderLabel(MSG.view_bundle_createWizard_noAdditionalFilesNeeded()); label.setWidth100(); mainLayout.addMember(label); uploadForms = null; return; } noFilesNeedToBeUploaded = Boolean.FALSE; uploadForms = new ArrayList<BundleFileUploadForm>(); for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) { String fileToBeUploaded = entry.getKey(); Boolean isAlreadyUploaded = entry.getValue(); HLayout indivLayout = new HLayout(); indivLayout.setWidth100(); indivLayout.setAutoHeight(); Label nameLabel = new Label(fileToBeUploaded + ": "); nameLabel.setWidth("*"); nameLabel.setAlign(Alignment.RIGHT); nameLabel.setLayoutAlign(VerticalAlignment.CENTER); indivLayout.addMember(nameLabel); final BundleFileUploadForm uploadForm = new BundleFileUploadForm(this.wizard.getBundleVersion(), fileToBeUploaded, false, (isAlreadyUploaded) ? Boolean.TRUE : null); uploadForm.setWidth("75%"); indivLayout.addMember(uploadForm); uploadForm.addFormHandler(new DynamicFormHandler() { public void onSubmitComplete(DynamicFormSubmitCompleteEvent event) { String results = event.getResults(); if (!results.contains("Failed to upload bundle file")) { // this is looking for an error message coming from the server, its not i18n'ed allFilesStatus.put(uploadForm.getName(), Boolean.TRUE); } else { allFilesStatus.put(uploadForm.getName(), Boolean.FALSE); String errorMessage = uploadForm.getUploadError(); handleUploadError(errorMessage, true); } } }); uploadForm.addFormSubmitFailedHandler(new FormSubmitFailedHandler() { public void onFormSubmitFailed(FormSubmitFailedEvent event) { allFilesStatus.put(uploadForm.getName(), Boolean.FALSE); CoreGUI.getMessageCenter().notify( new Message(MSG.view_bundle_createWizard_failedToUploadFile(), Message.Severity.Error)); } }); uploadForms.add(uploadForm); mainLayout.addMember(indivLayout); } return; } private void handleUploadError(String errorMessage, boolean sendToMessageCenter) { if (null != errorMessage) { wizard.getView().showMessage(errorMessage); } else { errorMessage = ""; } if (sendToMessageCenter) { CoreGUI.getMessageCenter().notify( new Message(MSG.view_bundle_createWizard_failedToUploadDistroFile(), errorMessage, Severity.Error)); } } }