Arik Hadas has uploaded a new change for review. Change subject: webadmin: change import template model hierarchy ......................................................................
webadmin: change import template model hierarchy TemplateBackupModel no longer extends VmBackupModel. Now they are both extending ManageBackupModel. Change-Id: I693f8abbf71d333d90a6dcd37feb4afeecb3f56b Signed-off-by: Arik Hadas <[email protected]> --- M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ManageBackupModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/TemplateBackupModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/VmBackupModel.java 3 files changed, 178 insertions(+), 54 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/40447/1 diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ManageBackupModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ManageBackupModel.java index e88edfc..1ccc305 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ManageBackupModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ManageBackupModel.java @@ -1,8 +1,11 @@ package org.ovirt.engine.ui.uicommonweb.models.storage; +import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus; import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.help.HelpTag; +import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; @@ -52,6 +55,8 @@ protected abstract void remove(); protected abstract void restore(); + + protected abstract ArchitectureType getArchitectureFromItem(Object item); protected void cancel() { cancelConfirm(); @@ -143,4 +148,41 @@ break; } } + + protected boolean validateSingleArchitecture() { + // Checks if there are selected VMs of multiple architectures + ArchitectureType firstArch = null; + boolean multipleArchs = false; + + for (Object item : getSelectedItems()) { + ArchitectureType arch = getArchitectureFromItem(item); + + if (firstArch == null) { + firstArch = arch; + } else { + if (!firstArch.equals(arch)) { + multipleArchs = true; + break; + } + } + } + + if (multipleArchs) { + ConfirmationModel confirmModel = new ConfirmationModel(); + setConfirmWindow(confirmModel); + confirmModel.setTitle(ConstantsManager.getInstance().getConstants().invalidImportTitle()); + confirmModel.setHelpTag(HelpTag.multiple_archs_dialog); + confirmModel.setHashName("multiple_archs_dialog"); //$NON-NLS-1$ + confirmModel.setMessage(ConstantsManager.getInstance().getConstants().invalidImportMsg()); + + UICommand command = UICommand.createDefaultOkUiCommand("multipleArchsOK", this); //$NON-NLS-1$ + confirmModel.getCommands().add(command); + + setConfirmWindow(confirmModel); + + return false; + } + + return true; + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/TemplateBackupModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/TemplateBackupModel.java index 6d08d4f..5b2ef86 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/TemplateBackupModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/TemplateBackupModel.java @@ -1,10 +1,13 @@ package org.ovirt.engine.ui.uicommonweb.models.storage; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.ovirt.engine.core.common.action.ImportVmTemplateParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; @@ -36,9 +39,15 @@ import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.templates.ImportTemplateModel; import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateImportDiskListModel; +import org.ovirt.engine.ui.uicommonweb.models.vms.ImportEntityData; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportTemplateData; import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; -import org.ovirt.engine.ui.uicommonweb.models.vms.VmAppListModel; +import org.ovirt.engine.ui.uicommonweb.validation.I18NNameValidation; +import org.ovirt.engine.ui.uicommonweb.validation.IValidation; +import org.ovirt.engine.ui.uicommonweb.validation.LengthValidation; +import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; +import org.ovirt.engine.ui.uicommonweb.validation.NotInCollectionValidation; +import org.ovirt.engine.ui.uicommonweb.validation.ValidationResult; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; @@ -50,24 +59,27 @@ import com.google.inject.Inject; import com.google.inject.Provider; -public class TemplateBackupModel extends VmBackupModel -{ +public class TemplateBackupModel extends ManageBackupModel { private ArrayList<Map.Entry<VmTemplate, List<DiskImage>>> extendedItems; private StoragePool pool; + protected ImportTemplateModel importModel; + protected Provider<? extends ImportTemplateModel> importModelProvider; + + /** used to save the names that were assigned for VMs which are going + * to be created using import in case of choosing multiple VM imports */ + protected Set<String> assignedVmNames = new HashSet<String>(); + protected Map<Guid, Object> cloneObjectMap; + protected List<Object> objectsToClone; private static UIConstants constants = ConstantsManager.getInstance().getConstants(); private static UIMessages messages = ConstantsManager.getInstance().getMessages(); @Inject public TemplateBackupModel(Provider<ImportTemplateModel> importModelProvider) { - setModelProvider(importModelProvider); + this.importModelProvider = importModelProvider; setTitle(constants.templateImportTitle()); setHelpTag(HelpTag.template_import); setHashName("template_import"); //$NON-NLS-1$ - } - - @Override - protected void setAppListModel(VmAppListModel value) { } @Override @@ -195,24 +207,20 @@ cancel(); } - @Override protected ArchitectureType getArchitectureFromItem(Object item) { VmTemplate template = (VmTemplate) item; return template.getClusterArch(); } - @Override protected String getObjectName(Object object) { return ((ImportTemplateData) object).getTemplate().getName(); } - @Override protected void setObjectName(Object object, String name) { ((ImportTemplateData) object).getTemplate().setName(name); } - @Override protected boolean validateSuffix(String suffix, EntityModel entityModel) { for (Object object : objectsToClone) { VmTemplate template = ((ImportTemplateData) object).getTemplate(); @@ -223,22 +231,31 @@ return true; } - @Override + protected boolean validateName(String newVmName, EntityModel entity, IValidation[] validators) { + EntityModel temp = new EntityModel(); + temp.setIsValid(true); + temp.setEntity(newVmName); + temp.validateEntity(validators); + if (!temp.getIsValid()) { + entity.setInvalidityReasons(temp.getInvalidityReasons()); + entity.setIsValid(false); + } + + return temp.getIsValid(); + } + protected int getMaxClonedNameLength(Object object) { return UnitVmModel.VM_TEMPLATE_NAME_MAX_LIMIT; } - @Override protected String getAlreadyAssignedClonedNameMessage() { return messages.alreadyAssignedClonedTemplateName(); } - @Override protected String getSuffixCauseToClonedNameCollisionMessage(String existingName) { return messages.suffixCauseToClonedTemplateNameCollision(existingName); } - @Override protected void executeImport() { ImportTemplateModel model = (ImportTemplateModel) getWindow(); @@ -409,7 +426,29 @@ @Override protected void restore() { - super.restore(); + if (getWindow() != null) { + return; + } + + if (!validateSingleArchitecture()) { + return; + } + + ImportTemplateModel model = importModelProvider.get(); + model.setEntity(getEntity().getId()); + setWindow(model); + model.startProgress(null); + model.getCommands().add(UICommand.createDefaultOkUiCommand("OnRestore", this)); //$NON-NLS-1$ + model.getCommands().add(UICommand.createCancelUiCommand(CANCEL_COMMAND, this)); //$NON-NLS-1$); + model.init(getSelectedItems(), getEntity().getId()); + model.setTargetArchitecture(getArchitectureFromItem(getSelectedItems().get(0))); + + // Add 'Close' command + model.setCloseCommand(new UICommand(CANCEL_COMMAND, this) //$NON-NLS-1$ + .setTitle(ConstantsManager.getInstance().getConstants().close()) + .setIsDefault(true) + .setIsCancel(true) + ); ((TemplateImportDiskListModel) ((ImportTemplateModel) getWindow()).getImportDiskListModel()).setExtendedItems(extendedItems); } @@ -431,14 +470,90 @@ } } + public void onRestore() { + importModel = (ImportTemplateModel) getWindow(); + + if (importModel.getProgress() != null) { + return; + } + + if (!importModel.validate()) { + return; + } + cloneObjectMap = new HashMap<Guid, Object>(); + + objectsToClone = new ArrayList<Object>(); + for (Object object : (ArrayList<Object>) importModel.getItems()) { + ImportEntityData<Object> item = (ImportEntityData<Object>) object; + if (item.getClone().getEntity()) { + objectsToClone.add(object); + } + } + executeImportClone(); + } + @Override protected String getListName() { return "TemplateBackupModel"; //$NON-NLS-1$ } - @Override protected String getImportConflictTitle() { return constants.importTemplateConflictTitle(); } + private void executeImportClone() { + // TODO: support running numbers (for suffix) + if (objectsToClone.size() == 0) { + clearCachedAssignedVmNames(); + executeImport(); + return; + } + ImportCloneModel entity = new ImportCloneModel(); + Object object = objectsToClone.iterator().next(); + entity.setEntity(object); + entity.setTitle(getImportConflictTitle()); + entity.setHelpTag(HelpTag.import_conflict); + entity.setHashName("import_conflict"); //$NON-NLS-1$ + entity.getCommands().add(UICommand.createDefaultOkUiCommand("onClone", this)); //$NON-NLS-1$ + entity.getCommands().add(UICommand.createCancelUiCommand("closeClone", this)); //$NON-NLS-1$ + + setConfirmWindow(entity); + } + + private void clearCachedAssignedVmNames() { + assignedVmNames.clear(); + } + + protected IValidation[] getClonedAppendedNameValidators(Object object) { + final int maxClonedNameLength = getMaxClonedNameLength(object); + return new IValidation[] { + new NotEmptyValidation(), + new LengthValidation(maxClonedNameLength), + new I18NNameValidation() { + @Override + protected String composeMessage() { + return ConstantsManager.getInstance() + .getMessages() + .newNameWithSuffixCannotContainBlankOrSpecialChars(maxClonedNameLength); + }; + }, + new UniqueClonedAppendedNameValidator(assignedVmNames) + }; + } + + private class UniqueClonedAppendedNameValidator extends NotInCollectionValidation { + + public UniqueClonedAppendedNameValidator(Collection<?> collection) { + super(collection); + } + + @Override + public ValidationResult validate(Object value) { + ValidationResult result = super.validate(value); + if (!result.getSuccess()) { + result.getReasons().add(getSuffixCauseToClonedNameCollisionMessage((String) value)); + } + return result; + } + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/VmBackupModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/VmBackupModel.java index 7db71ef..eb6ce81 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/VmBackupModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/VmBackupModel.java @@ -67,10 +67,6 @@ return privateAppListModel; } - protected void setAppListModel(VmAppListModel value) { - privateAppListModel = value; - } - protected void setModelProvider(Provider<? extends ImportVmFromExportDomainModel> importModelProvider) { this.importModelProvider = importModelProvider; } @@ -86,7 +82,7 @@ setHelpTag(HelpTag.vm_import); setHashName("vm_import"); // //$NON-NLS-1$ - setAppListModel(new VmAppListModel()); + privateAppListModel = new VmAppListModel(); setIsTimerDisabled(true); } @@ -184,36 +180,7 @@ return; } - // Checks if there are selected VMs of multiple architectures - ArchitectureType firstArch = null; - boolean multipleArchs = false; - - for (Object item : getSelectedItems()) { - ArchitectureType arch = getArchitectureFromItem(item); - - if (firstArch == null) { - firstArch = arch; - } else { - if (!firstArch.equals(arch)) { - multipleArchs = true; - break; - } - } - } - - if (multipleArchs) { - ConfirmationModel confirmModel = new ConfirmationModel(); - setConfirmWindow(confirmModel); - confirmModel.setTitle(ConstantsManager.getInstance().getConstants().invalidImportTitle()); - confirmModel.setHelpTag(HelpTag.multiple_archs_dialog); - confirmModel.setHashName("multiple_archs_dialog"); //$NON-NLS-1$ - confirmModel.setMessage(ConstantsManager.getInstance().getConstants().invalidImportMsg()); - - UICommand command = UICommand.createDefaultOkUiCommand("multipleArchsOK", this); //$NON-NLS-1$ - confirmModel.getCommands().add(command); - - setConfirmWindow(confirmModel); - + if (!validateSingleArchitecture()) { return; } @@ -224,7 +191,7 @@ model.getCommands().add(UICommand.createDefaultOkUiCommand("OnRestore", this)); //$NON-NLS-1$ model.getCommands().add(UICommand.createCancelUiCommand(CANCEL_COMMAND, this)); //$NON-NLS-1$); model.init(getSelectedItems(), getEntity().getId()); - model.setTargetArchitecture(firstArch); + model.setTargetArchitecture(getArchitectureFromItem(getSelectedItems().get(0))); // Add 'Close' command model.setCloseCommand(new UICommand(CANCEL_COMMAND, this) //$NON-NLS-1$ -- To view, visit https://gerrit.ovirt.org/40447 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I693f8abbf71d333d90a6dcd37feb4afeecb3f56b Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
