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

Reply via email to