/*
* 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.components.upload;
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.HiddenItem;
import org.rhq.coregui.client.CoreGUI;
/**
* Upload a single file and use it to create a new PackageVersion.
*
* @author Jay Shaughnessy
* @author Lukas Krejci
*/
public class PackageVersionFileUploadForm extends FileUploadForm {
private int packageTypeId;
private Integer archId;
private Integer repoId;
private int packageVersionId;
private int packageId;
public PackageVersionFileUploadForm(int packageTypeId, String packageName, String version, Integer archId,
Integer repoId, boolean showNameLabel, boolean showUploadButton, Boolean isAlreadyUploaded) {
super(packageName, version, showNameLabel, showUploadButton, isAlreadyUploaded);
this.packageTypeId = packageTypeId;
this.archId = archId;
this.repoId = repoId;
setAction(GWT.getModuleBaseURL() + "PackageVersionFileUploadServlet");
}
/**
* If this component successfully uploaded a package version file, this will return
* the new package version's ID. Otherwise, 0 is returned.
*
* @return the new package version ID
*/
public int getPackageVersionId() {
return this.packageVersionId;
}
/**
* If this component successfully upload a package version file, this will return
* the id of the package the uploaded package version was associated with.
* Otherwise, 0 is returned.
*
* @return the package id of the new package version
*/
public int getPackageId() {
return packageId;
}
public int getPackageTypeId() {
return packageTypeId;
}
public void setPackageTypeId(int value) {
packageTypeId = value;
onDraw();
}
public Integer getArchitectureId() {
return archId;
}
public void setArchitectureId(Integer value) {
archId = value;
onDraw();
}
public Integer getRepoId() {
return repoId;
}
public void setRepoId(Integer value) {
repoId = value;
onDraw();
}
@Override
protected List<FormItem> getOnDrawItems() {
List<FormItem> onDrawItems = super.getOnDrawItems();
HiddenItem packageTypeIdField = new HiddenItem("packageTypeId");
packageTypeIdField.setDefaultValue(packageTypeId);
onDrawItems.add(packageTypeIdField);
if (null != archId) {
HiddenItem archIdField = new HiddenItem("archId");
archIdField.setDefaultValue(archId);
onDrawItems.add(archIdField);
}
if (null != repoId) {
HiddenItem repoIdField = new HiddenItem("repoId");
repoIdField.setDefaultValue(repoId);
onDrawItems.add(repoIdField);
}
return onDrawItems;
}
protected boolean processSubmitCompleteResults(String submitCompleteEventResults) {
parseIdsFromResponse(submitCompleteEventResults);
return (packageVersionId > 0);
}
private void parseIdsFromResponse(String results) {
packageVersionId = 0;
packageId = 0;
// the upload servlet will respond with "success [packageVersionId=x,packageId=y]" on success
String successMsgPrefix = "success [";
int startSuccessMsgPrefix = results.indexOf(successMsgPrefix);
if (startSuccessMsgPrefix < 0) {
CoreGUI.getErrorHandler().handleError(MSG.view_upload_error_packageVersionFile());
return; // must mean it wasn't a success - results is probably an error message
}
int endSuccessMsgPrefix = startSuccessMsgPrefix + successMsgPrefix.length();
int startSuccessMsgPostfix = results.indexOf(']', endSuccessMsgPrefix);
if (startSuccessMsgPostfix < 0) {
CoreGUI.getErrorHandler().handleError(MSG.view_upload_error_packageVersionFile());
return; // this should never happen, if we have "success [" we should always have the ending "]" bracket
}
String[] ids = results.substring(endSuccessMsgPrefix, startSuccessMsgPostfix).split(",");
if (ids.length != 2) {
CoreGUI.getErrorHandler().handleError(MSG.view_upload_error_packageVersionFile());
return;
}
String packageVersionIdString = ids[0];
String packageIdString = ids[1];
try {
int equalsIdx = packageVersionIdString.indexOf('=');
if (equalsIdx < 0) {
CoreGUI.getErrorHandler().handleError(MSG.view_upload_error_packageVersionFile());
return;
}
packageVersionId = Integer.parseInt(packageVersionIdString.substring(equalsIdx + 1));
equalsIdx = packageIdString.indexOf('=');
if (equalsIdx < 0) {
packageVersionId = 0;
CoreGUI.getErrorHandler().handleError(MSG.view_upload_error_packageVersionFile());
return;
}
packageId = Integer.parseInt(packageIdString.substring(equalsIdx + 1));
} catch (Exception e) {
CoreGUI.getErrorHandler().handleError(MSG.view_upload_error_packageVersionFile(), e);
}
}
@Override
public void submitForm() {
// reset the name value from the package type name to the path of the actual uploaded file. The
// name portion will be parsed out and used for the package name.
FormItem nameItem = getItem("name");
FormItem fileUploadItem = getItem("fileUploadItem");
String uploadFilePath = (String) fileUploadItem.getValue();
nameItem.setValue(uploadFilePath);
super.submitForm();
}
}