package org.openslx.dozmod.gui.wizard;
import java.awt.Window;
import javax.swing.JOptionPane;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
import org.openslx.bwlp.thrift.iface.ImageBaseWrite;
import org.openslx.bwlp.thrift.iface.ImageVersionWrite;
import org.openslx.bwlp.thrift.iface.TAuthorizationException;
import org.openslx.bwlp.thrift.iface.TInternalServerError;
import org.openslx.bwlp.thrift.iface.TNotFoundException;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.UiFeedback;
import org.openslx.dozmod.gui.wizard.page.ImageCustomPermissionPage;
import org.openslx.dozmod.gui.wizard.page.ImageMetaDataPage;
import org.openslx.dozmod.gui.wizard.page.ImageUploadPage;
import org.openslx.dozmod.state.UploadWizardState;
import org.openslx.dozmod.thrift.Session;
import org.openslx.dozmod.thrift.ThriftActions;
import org.openslx.dozmod.thrift.ThriftError;
import org.openslx.thrifthelper.ThriftManager;
@SuppressWarnings("serial")
public class ImageWizard extends Wizard implements UiFeedback {
private final static Logger LOGGER = Logger.getLogger(ImageWizard.class);
private final UploadWizardState uploadWizardState = new UploadWizardState();
protected ImageUploadPage imageUploadPage;
protected ImageMetaDataPage imageMetaDataPage;
protected ImageCustomPermissionPage imageCustomPermissionPage;
/**
* Wizard for creating or editing an image
*
* @param editExistingImage whether to create new or edit existing image
*/
public ImageWizard(Window parent) {
super(parent);
imageUploadPage = new ImageUploadPage(this, uploadWizardState, null);
imageMetaDataPage = new ImageMetaDataPage(this, uploadWizardState);
imageCustomPermissionPage = new ImageCustomPermissionPage(this, uploadWizardState);
addPage(imageUploadPage);
addPage(imageMetaDataPage);
addPage(imageCustomPermissionPage);
}
@Override
public String getWindowTitle() {
return "Neues Image erzeugen";
}
@Override
public boolean wantFinish() {
// since we only started the upload and created a "blank" image entry
// we can here do all the sanity checks on the fields of UploadWizardState
// and react accordingly.
// check state
return isStateValid();
}
@Override
public void performFinish() {
// TODO check status of each step and stop if something goes wrong
// push image base to satellite
ThriftActions.updateImageBase(JOptionPane.getFrameForComponent(this),
uploadWizardState.uuid, imageBaseWriteFromState());
// push permissions to satellite if we have custom permissions
if (uploadWizardState.permissionMap != null) {
ThriftActions.writeImagePermissions(JOptionPane.getFrameForComponent(this),
uploadWizardState.uuid, uploadWizardState.permissionMap);
}
// push version metadata to satellite
ThriftActions.updateImageVersion(JOptionPane.getFrameForComponent(this),
uploadWizardState.transferInformation.getToken(),
new ImageVersionWrite(uploadWizardState.isRestricted));
}
private boolean isStateValid() {
// debug purposes
if (uploadWizardState.name == null || uploadWizardState.name.isEmpty()) {
LOGGER.error("No name set in state!");
return false;
}
if (uploadWizardState.description == null || uploadWizardState.description.isEmpty()) {
LOGGER.error("No description set in state!");
return false;
}
if (uploadWizardState.descriptionFile == null) {
LOGGER.error("No description file set in state!");
return false;
} else {
if (!uploadWizardState.descriptionFile.canRead()) {
LOGGER.error(uploadWizardState.descriptionFile.getAbsolutePath() + " cannot be read!");
return false;
}
}
if (uploadWizardState.diskFile == null) {
LOGGER.error("No disk file set in state!");
return false;
} else {
if (!uploadWizardState.diskFile.canRead()) {
LOGGER.error(uploadWizardState.diskFile.getAbsolutePath() + " cannot be read!");
return false;
}
}
if (uploadWizardState.selectedOs == null) {
LOGGER.error("No OS set in state!");
return false;
} else {
if (!(uploadWizardState.selectedOs.isSetArchitecture()
&& uploadWizardState.selectedOs.isSetOsId() && uploadWizardState.selectedOs.isSetOsName() && uploadWizardState.selectedOs.isSetVirtualizerOsId())) {
LOGGER.error("OS has missing fields: " + uploadWizardState.selectedOs.toString());
return false;
}
}
if (uploadWizardState.meta == null) {
LOGGER.error("No vm meta data set in state!");
return false;
}
if (uploadWizardState.defaultPermissions == null) {
LOGGER.error("No permissions set in state!");
return false;
}
if (uploadWizardState.shareMode == null) {
LOGGER.error("No share mode set in state!");
return false;
}
if (uploadWizardState.uuid == null) {
LOGGER.error("No uuid set in state!");
return false;
}
return true;
}
private ImageBaseWrite imageBaseWriteFromState() {
// build imageBaseWrite
return new ImageBaseWrite(uploadWizardState.name, uploadWizardState.description,
uploadWizardState.selectedOs.getOsId(), uploadWizardState.meta.getVirtualizer().getVirtId(),
uploadWizardState.isTemplate, uploadWizardState.defaultPermissions, uploadWizardState.shareMode);
}
@Override
protected boolean onCancelRequest() {
boolean confirmed = Gui.showMessageBox(this, "Möchten Sie den Vorgang wirklich abbrechen?",
MessageType.QUESTION_YESNO, null, null);
if (confirmed) {
try {
if (uploadWizardState.uuid != null) {
ThriftManager.getSatClient().deleteImageBase(Session.getSatelliteToken(), uploadWizardState.uuid);
if (uploadWizardState.transferInformation != null)
ThriftManager.getSatClient().deleteImageVersion(Session.getSatelliteToken(), uploadWizardState.transferInformation.getToken());
}
} catch (TException e) {
ThriftError.showMessage(this, LOGGER, e, "Fehler beim Abbruch!");
return false;
}
if (uploadWizardState.uploadTask != null) {
uploadWizardState.uploadTask.cancel();
// TODO how to cancel AsyncGen?
// Maybe: save the ref in uploadTask to be able to get it here?
}
}
return confirmed;
}
@Override
public boolean wantConfirmQuit() {
return uploadWizardState.uuid != null;
}
@Override
public void escapePressed() {
doCancel();
}
}