Tomas Jelinek has uploaded a new change for review.

Change subject: webadmin: Changes in disk popup needed to reuse in VM popup
......................................................................

webadmin: Changes in disk popup needed to reuse in VM popup

Change-Id: I52c5d5c7b83dd53cea3a9419656015e6a51bd179
Bug-Url: https://bugzilla.redhat.com/1117489
Signed-off-by: Tomas Jelinek <tjeli...@redhat.com>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java
14 files changed, 301 insertions(+), 99 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/36061/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java
index f1f64e7..232ea97 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskAttachPopupWidget.java
@@ -44,6 +44,8 @@
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.VerticalPanel;
 
+import java.util.List;
+
 public class VmDiskAttachPopupWidget extends 
AbstractModelBoundPopupWidget<AttachDiskModel> {
 
     interface Driver extends SimpleBeanEditorDriver<AttachDiskModel, 
VmDiskAttachPopupWidget> {
@@ -92,9 +94,10 @@
     public VmDiskAttachPopupWidget(CommonApplicationConstants constants,
                                    CommonApplicationResources resources,
                                    CommonApplicationTemplates templates,
-                                   boolean isLunDiskEnabled) {
+                                   boolean isLunDiskEnabled,
+                                   boolean allowMultipleSelection) {
         this.isNewLunDiskEnabled = isLunDiskEnabled;
-        initManualWidgets();
+        initManualWidgets(allowMultipleSelection);
         initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
         localize(constants);
         ViewIdHandler.idHandler.generateAndSetIds(this);
@@ -109,10 +112,10 @@
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    private void initManualWidgets() {
+    private void initManualWidgets(boolean allowMultipleSelection) {
         isPluggedEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
-        imageDiskTable = new EntityModelCellTable<ListModel>(true);
-        lunDiskTable = new EntityModelCellTable<ListModel>(true);
+        imageDiskTable = new EntityModelCellTable<>(allowMultipleSelection);
+        lunDiskTable = new EntityModelCellTable<>(allowMultipleSelection);
     }
 
     private void initAttachPanelWidget() {
@@ -421,7 +424,22 @@
         }
 
         diskTable.setVisible(true);
-        
diskTable.asEditor().edit(disk.getAttachableDisksMap().get(disk.getDiskStorageType().getEntity()));
+        ListModel<EntityModel<DiskModel>> disksListModel = 
disk.getAttachableDisksMap().get(disk.getDiskStorageType().getEntity());
+
+        // The setting of null and setting back the original value is done to 
force rendering the selected items.
+        // The reason it does not work is that the 
HasDataListModelEditorAdapter.edit() only renders it after the
+        // change events are fired
+        EntityModel<DiskModel> selectedModel = 
disksListModel.getSelectedItem();
+        List<EntityModel<DiskModel>> selectedModels = 
disksListModel.getSelectedItems();
+
+        disksListModel.setSelectedItem(null);
+        disksListModel.setSelectedItems(null);
+
+        diskTable.asEditor().edit(disksListModel);
+
+        disksListModel.setSelectedItem(selectedModel);
+        disksListModel.setSelectedItems(selectedModels);
+
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java
index 48f265f..077cf03 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmDiskPopupWidget.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.ui.common.widget.uicommon.popup.vm;
 
 import java.util.ArrayList;
+import java.util.Collection;
 
 import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType;
 import org.ovirt.engine.core.common.businessentities.DiskInterface;
@@ -329,7 +330,7 @@
 
         diskTypePanel.addRadioButton(
                 constants.internalDisk(),
-                disk.getIsNew() || disk.getDisk().getDiskStorageType() == 
DiskStorageType.IMAGE,
+                disk.getDisk() == null || disk.getDisk().getDiskStorageType() 
== DiskStorageType.IMAGE,
                 disk.getIsNew(),
                 new ClickHandler() {
                 @Override
@@ -341,7 +342,7 @@
 
         diskTypePanel.addRadioButton(
                 constants.externalDisk(),
-                !disk.getIsNew() && disk.getDisk().getDiskStorageType() == 
DiskStorageType.LUN,
+                disk.getDisk() != null  && disk.getDisk().getDiskStorageType() 
== DiskStorageType.LUN,
                 disk.getIsNew(),
                 new ClickHandler() {
                     @Override
@@ -352,33 +353,47 @@
                     }
                 });
 
-        storageModel = new StorageModel(new NewEditStorageModelBehavior());
+        if (disk.getStorageModel() == null) {
+            storageModel = new StorageModel(new NewEditStorageModelBehavior());
 
-        // Create IscsiStorageModel
-        iscsiStorageModel = new IscsiStorageModel();
-        iscsiStorageModel.setContainer(storageModel);
+            // Create IscsiStorageModel
+            iscsiStorageModel = new IscsiStorageModel();
+            iscsiStorageModel.setContainer(storageModel);
+            iscsiStorageModel.setIsGrouppedByTarget(true);
+            iscsiStorageModel.setIgnoreGrayedOut(true);
+
+            // Create FcpStorageModel
+            fcpStorageModel = new FcpStorageModel();
+            fcpStorageModel.setContainer(storageModel);
+            fcpStorageModel.setIsGrouppedByTarget(false);
+            fcpStorageModel.setIgnoreGrayedOut(true);
+
+            // Set 'StorageModel' items
+            ArrayList<IStorageModel> items = new ArrayList<IStorageModel>();
+            items.add(iscsiStorageModel);
+            items.add(fcpStorageModel);
+            storageModel.setItems(items);
+            storageModel.setHost(disk.getHost());
+
+            disk.setStorageModel(storageModel);
+        } else {
+            storageModel = disk.getStorageModel();
+
+            iscsiStorageModel = byType(storageModel.getItems(), 
IscsiStorageModel.class);
+            iscsiStorageModel.getPropertyChangedEvent().clearListeners();
+
+            fcpStorageModel = byType(storageModel.getItems(), 
FcpStorageModel.class);
+            fcpStorageModel.getPropertyChangedEvent().clearListeners();
+        }
+
         
iscsiStorageModel.getPropertyChangedEvent().addListener(progressEventHandler);
-        iscsiStorageModel.setIsGrouppedByTarget(true);
-        iscsiStorageModel.setIgnoreGrayedOut(true);
+        
fcpStorageModel.getPropertyChangedEvent().addListener(progressEventHandler);
 
         iscsiStorageView = new IscsiStorageView(false, 115, 214, 244, 275, 
142, 55, -67);
         iscsiStorageView.edit(iscsiStorageModel);
 
-        // Create FcpStorageModel
-        fcpStorageModel = new FcpStorageModel();
-        fcpStorageModel.setContainer(storageModel);
-        
fcpStorageModel.getPropertyChangedEvent().addListener(progressEventHandler);
-        fcpStorageModel.setIsGrouppedByTarget(false);
-        fcpStorageModel.setIgnoreGrayedOut(true);
         fcpStorageView = new FcpStorageView(false, 278, 240);
         fcpStorageView.edit(fcpStorageModel);
-
-        // Set 'StorageModel' items
-        ArrayList<IStorageModel> items = new ArrayList<IStorageModel>();
-        items.add(iscsiStorageModel);
-        items.add(fcpStorageModel);
-        storageModel.setItems(items);
-        storageModel.setHost(disk.getHost());
 
         // SelectedItemChangedEvent handlers
         disk.getStorageType().getSelectedItemChangedEvent().addListener(new 
IEventListener<EventArgs>() {
@@ -395,9 +410,20 @@
             }
         });
 
+        revealStorageView(disk);
         revealDiskPanel(disk);
     }
 
+    private <T extends IStorageModel> T byType(Collection<IStorageModel> 
models, Class<T> specific) {
+        for (IStorageModel model : models) {
+            if (model.getClass().equals(specific)) {
+                return (T) model;
+            }
+        }
+
+        return null;
+    }
+
     private void revealDiskPanel(final AbstractDiskModel disk) {
         boolean isInVm = disk.getVm() != null;
 
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
index a72377c..0bea50a 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
@@ -126,6 +126,8 @@
 
                 if (!lunModel.getIsSelected()) {
                     table.getSelectionModel().setSelected(lunModel, false);
+                } else {
+                    table.getSelectionModel().setSelected(lunModel, true);
                 }
                 table.redraw();
             }
@@ -159,6 +161,7 @@
         // Update table
         table.setRowData(items);
         table.asEditor().edit(listModel);
+
         table.setWidth("100%", true); //$NON-NLS-1$
 
         
rootModel.getPropertyChangedEvent().removeListener(lunModelSelectedItemListener);
@@ -281,7 +284,12 @@
         }
 
         table.setRowData(items);
+
+        Object selectedItem = leafModel.getSelectedItem();
+        leafModel.setSelectedItem(null);
         table.asEditor().edit(leafModel);
+        leafModel.setSelectedItem(selectedItem);
+
         table.setWidth("100%", true); //$NON-NLS-1$
 
         ScrollPanel panel = new ScrollPanel();
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java
index 8eac84d..db1b14e 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageTargetToLunList.java
@@ -242,7 +242,11 @@
         }, constants.serialSanStorage(), "120px"); //$NON-NLS-1$
 
         table.setRowData(items);
+        Object selectedItem = leafModel.getSelectedItem();
+        leafModel.setSelectedItem(null);
         table.asEditor().edit(leafModel);
+        leafModel.setSelectedItem(selectedItem);
+
         table.setWidth("100%", true); //$NON-NLS-1$
 
         if (!multiSelection) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
index 0799a70..53c785e 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
@@ -841,7 +841,7 @@
         return diskModel;
     }
 
-    public static ArrayList<DiskModel> disksToDiskModelList(ArrayList<Disk> 
disks) {
+    public static ArrayList<DiskModel> disksToDiskModelList(List<Disk> disks) {
         ArrayList<DiskModel> diskModels = new ArrayList<DiskModel>();
 
         for (Disk disk : disks) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
index ee962cd..742940f 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
@@ -2479,7 +2479,7 @@
                 aQuery);
     }
 
-    public void getAllAttachableDisks(AsyncQuery aQuery, Guid storagePoolId, 
Guid vmId) {
+    public void getAllAttachableDisks(AsyncQuery aQuery, Guid storagePoolId, 
Guid vmId, boolean filterByExplicitValues, int os, Version 
compatibilityVersion) {
         aQuery.converterCallback = new IAsyncConverter() {
             @Override
             public Object Convert(Object source, AsyncQuery _asyncQuery)
@@ -2489,9 +2489,16 @@
         };
         GetAllAttachableDisks params = new 
GetAllAttachableDisks(storagePoolId);
         params.setVmId(vmId);
+        params.setFilterByExplicitValues(filterByExplicitValues);
+        params.setOs(os);
+        params.setVdsGroupCompatibilityVersion(compatibilityVersion);
         Frontend.getInstance().runQuery(VdcQueryType.GetAllAttachableDisks, 
params, aQuery);
     }
 
+    public void getAllAttachableDisks(AsyncQuery aQuery, Guid storagePoolId, 
Guid vmId) {
+        getAllAttachableDisks(aQuery, storagePoolId, vmId, false, 0, null);
+    }
+
     public void getPermittedStorageDomainsByStoragePoolId(AsyncQuery aQuery,
             Guid dataCenterId,
             ActionGroup actionGroup) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
index 4076cb0..ddc9f4e 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.ui.uicommonweb.models.storage;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.ovirt.engine.core.common.businessentities.LUNs;
@@ -17,6 +18,7 @@
 import org.ovirt.engine.ui.frontend.Frontend;
 import org.ovirt.engine.ui.frontend.INewAsyncCallback;
 import org.ovirt.engine.ui.uicommonweb.Linq;
+import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
 import org.ovirt.engine.ui.uicommonweb.models.Model;
 import org.ovirt.engine.ui.uicompat.ConstantsManager;
 import org.ovirt.engine.ui.uicompat.Event;
@@ -133,6 +135,7 @@
             return;
         }
 
+        final List<EntityModel<?>> prevSelected = findSelectedItems();
         clearItems();
         initializeItems(null, null);
 
@@ -142,7 +145,7 @@
                 SanStorageModel model = (SanStorageModel) target;
                 VdcQueryReturnValue response = (VdcQueryReturnValue) 
returnValue;
                 if (response.getSucceeded()) {
-                    model.applyData((ArrayList<LUNs>) 
response.getReturnValue(), false);
+                    model.applyData((ArrayList<LUNs>) 
response.getReturnValue(), false, prevSelected);
                     model.setGetLUNsFailure(""); //$NON-NLS-1$
                 }
                 else {
@@ -155,6 +158,18 @@
         Frontend.getInstance().runQuery(VdcQueryType.GetDeviceList,
                 new GetDeviceListQueryParameters(host.getId(), getType()),
                 asyncQuery);
+    }
+
+    private List<EntityModel<?>> findSelectedItems() {
+        List<EntityModel<?>> res = new ArrayList<>();
+
+        for (EntityModel<?> item : (Collection<EntityModel<?>>) getItems()) {
+            if (item.getIsSelected()) {
+                res.add(item);
+            }
+        }
+
+        return res;
     }
 
     private void clearItems()
@@ -216,7 +231,7 @@
     /**
      * Creates model items from the provided list of business entities.
      */
-    public void applyData(List<LUNs> source, boolean isIncluded)
+    public void applyData(List<LUNs> source, boolean isIncluded, 
List<EntityModel<?>> selectedItems)
     {
         ArrayList<LunModel> newItems = new ArrayList<LunModel>();
 
@@ -237,7 +252,7 @@
                 lunModel.setIsAccessible(a.getAccessible());
                 lunModel.setStatus(a.getStatus());
                 lunModel.setIsIncluded(isIncluded);
-                lunModel.setIsSelected(isIncluded);
+                lunModel.setIsSelected(containsLun(lunModel, selectedItems, 
isIncluded));
                 lunModel.setEntity(a);
 
                 // Add LunModel
@@ -258,6 +273,22 @@
         proposeDiscover();
     }
 
+    private boolean containsLun(LunModel lunModel, List<EntityModel<?>> 
models, boolean isIncluded) {
+        if (models == null) {
+            return isIncluded;
+        }
+
+        for (EntityModel<?> model : models) {
+            if (model instanceof LunModel) {
+                if (((LunModel) model).getLunId().equals(lunModel.getLunId())) 
{
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
     private ArrayList<SanTargetModel> createTargetModelList(LUNs a) {
         ArrayList<SanTargetModel> targetModelList = new 
ArrayList<SanTargetModel>();
         if (a.getLunConnections() != null)
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
index fcb785a..16b747e 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
@@ -594,7 +594,7 @@
             public void onSuccess(Object target, Object returnValue) {
                 SanStorageModel sanStorageModel = (SanStorageModel) target;
                 ArrayList<LUNs> lunList = (ArrayList<LUNs>) returnValue;
-                sanStorageModel.applyData(lunList, true);
+                sanStorageModel.applyData(lunList, true, null);
             }
         }, storageModel.getHash()), storage.getStorage(), hostId);
     }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java
index 9e03180..ad15a19 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java
@@ -46,6 +46,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.ListModel;
 import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel;
 import org.ovirt.engine.ui.uicommonweb.models.storage.SanStorageModel;
+import org.ovirt.engine.ui.uicommonweb.models.storage.StorageModel;
 import org.ovirt.engine.ui.uicommonweb.validation.I18NNameValidation;
 import org.ovirt.engine.ui.uicommonweb.validation.IValidation;
 import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyQuotaValidation;
@@ -54,6 +55,7 @@
 import org.ovirt.engine.ui.uicompat.ConstantsManager;
 import org.ovirt.engine.ui.uicompat.Event;
 import org.ovirt.engine.ui.uicompat.EventArgs;
+import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback;
 import org.ovirt.engine.ui.uicompat.UIConstants;
 
 public abstract class AbstractDiskModel extends DiskModel
@@ -84,6 +86,8 @@
     private String hash;
     private UICommand cancelCommand;
     private int queryCounter;
+
+    private StorageModel storageModel;
 
     public EntityModel<Boolean> getIsWipeAfterDelete() {
         return isWipeAfterDelete;
@@ -319,6 +323,18 @@
 
     @Override
     public void initialize() {
+        commonInitialize();
+        if (getVm() != null) {
+            updateBootableDiskAvailable();
+        }
+    }
+
+    public void initialize(List<Disk> currentDisks) {
+        commonInitialize();
+        updateBootableFrom(currentDisks != null ? currentDisks : new 
ArrayList<Disk>());
+    }
+
+    private void commonInitialize() {
         super.initialize();
         setHash(getHashName() + new Date());
 
@@ -338,11 +354,6 @@
         onSaveCommand.setIsDefault(true);
         getCommands().add(onSaveCommand);
         getCommands().add(getCancelCommand());
-
-        // Update data
-        if (getVm() != null) {
-            updateBootableDiskAvailable();
-        }
         updateDatacenters();
     }
 
@@ -354,10 +365,8 @@
                 ArrayList<StorageDomain> storageDomains = 
(ArrayList<StorageDomain>) returnValue;
 
                 ArrayList<StorageDomain> filteredStorageDomains = new 
ArrayList<StorageDomain>();
-                for (StorageDomain a : storageDomains)
-                {
-                    if (!a.getStorageDomainType().isIsoOrImportExportDomain() 
&& a.getStatus() == StorageDomainStatus.Active)
-                    {
+                for (StorageDomain a : storageDomains) {
+                    if (!a.getStorageDomainType().isIsoOrImportExportDomain() 
&& a.getStatus() == StorageDomainStatus.Active) {
                         filteredStorageDomains.add(a);
                     }
                 }
@@ -409,7 +418,7 @@
                         dataCenters.add(dataCenter);
                     }
 
-                    diskModel.getDataCenter().setItems(dataCenters);
+                    diskModel.getDataCenter().setItems(dataCenters, 
Linq.firstOrDefault(dataCenters));
 
                     if (dataCenters.isEmpty()) {
                         diskModel.setMessage(CONSTANTS.relevantDCnotActive());
@@ -445,28 +454,31 @@
         AsyncDataProvider.getInstance().getVmDiskList(new AsyncQuery(this, new 
INewAsyncCallback() {
             @Override
             public void onSuccess(Object target, Object returnValue) {
-                AbstractDiskModel diskModel = (AbstractDiskModel) target;
                 ArrayList<Disk> disks = (ArrayList<Disk>) returnValue;
-
-                diskModel.getIsBootable().setEntity(true);
-                if (getDisk() == null || !getDisk().isDiskSnapshot()) {
-                    for (Disk disk : disks) {
-                        if (disk.isBoot() && !disk.equals(getDisk())) {
-                            diskModel.getIsBootable().setEntity(false);
-                            if (!disk.isDiskSnapshot()) {
-                                
diskModel.getIsBootable().setChangeProhibitionReason(CONSTANTS.onlyOneBootableDisk());
-                                
diskModel.getIsBootable().setIsChangable(false);
-                                break;
-                            }
-                        }
-                 }
-                }
-
-                if (!getIsNew()) {
-                    getIsBootable().setEntity(getDisk().isBoot());
-                }
+                updateBootableFrom(disks);
             }
         }, getHash()), getVm().getId());
+    }
+
+    public void updateBootableFrom(List<Disk> vmDisks) {
+        getIsBootable().setEntity(true);
+        getIsBootable().setIsChangable(true);
+        if (getDisk() == null || !getDisk().isDiskSnapshot()) {
+            for (Disk disk : vmDisks) {
+                if (disk.isBoot() && !disk.equals(getDisk())) {
+                    getIsBootable().setEntity(false);
+                    if (!disk.isDiskSnapshot()) {
+                        
getIsBootable().setChangeProhibitionReason(CONSTANTS.onlyOneBootableDisk());
+                        getIsBootable().setIsChangable(false);
+                        break;
+                    }
+                }
+         }
+        }
+
+        if (!getIsNew()) {
+            getIsBootable().setEntity(getDisk().isBoot());
+        }
     }
 
     private void updateShareableDiskEnabled(StoragePool datacenter) {
@@ -563,7 +575,7 @@
         }
         // handle disk profile selected item
         Guid defaultProfileId =
-                getDisk() != null ? ((DiskImage) getDisk()).getDiskProfileId() 
: null;
+                (getDisk() != null && getDisk().getDiskStorageType() == 
DiskStorageType.IMAGE)? ((DiskImage) getDisk()).getDiskProfileId() : null;
         if (defaultProfileId != null) {
             for (DiskProfile profile : diskProfiles) {
                 if (profile.getId().equals(defaultProfileId)) {
@@ -754,7 +766,7 @@
         return vm.getStatus() == VMStatus.Up || vm.getStatus() == 
VMStatus.Down || vm.getStatus() == VMStatus.Paused;
     }
 
-    private void datacenter_SelectedItemChanged() {
+    protected void datacenter_SelectedItemChanged() {
         StoragePool datacenter = getDataCenter().getSelectedItem();
         boolean isInVm = getVm() != null;
 
@@ -847,6 +859,11 @@
     }
 
     public void onSave() {
+        flush();
+        store(null);
+    }
+
+    public void flush() {
         if (getDiskStorageType().getEntity() == DiskStorageType.IMAGE) {
             DiskImage diskImage = getDiskImage();
             if (getQuota().getIsAvailable() && getQuota().getSelectedItem() != 
null) {
@@ -887,6 +904,8 @@
         getDisk().setPropagateErrors(PropagateErrors.Off);
         getDisk().setReadOnly(getIsReadOnly().getIsAvailable() ? 
getIsReadOnly().getEntity() : null);
     }
+
+    public abstract void store(IFrontendActionAsyncCallback callback);
 
     @Override
     public void executeCommand(UICommand command) {
@@ -953,4 +972,12 @@
             stopProgress();
         }
     }
+
+    public StorageModel getStorageModel() {
+        return storageModel;
+    }
+
+    public void setStorageModel(StorageModel storageModel) {
+        this.storageModel = storageModel;
+    }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java
index 06a13c1..024ff38 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AttachDiskModel.java
@@ -11,6 +11,7 @@
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType;
+import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.ui.frontend.AsyncQuery;
 import org.ovirt.engine.ui.frontend.Frontend;
 import org.ovirt.engine.ui.frontend.INewAsyncCallback;
@@ -39,36 +40,91 @@
     }
 
     @Override
+    public void flush() {
+        // no need to do any flush
+    }
+
+    @Override
     public void initialize() {
         super.initialize();
 
         getIsPlugged().setIsAvailable(true);
 
+        if (getVm().getId() != null) {
+            loadAttachableDisks(false, 0, null, null);
+        }
+    }
+
+    public void loadAttachableDisks(boolean filterByExplicitValues, int os, 
Version compatibilityVersion, final Disk prevSelectedDisk) {
         // Get internal attachable disks
         AsyncDataProvider.getInstance().getAllAttachableDisks(new 
AsyncQuery(this, new INewAsyncCallback() {
             @Override
             public void onSuccess(Object target, Object returnValue) {
-                ArrayList<Disk> disks = (ArrayList<Disk>) returnValue;
+                List<Disk> disks = replaceIfSelected((List<Disk>) returnValue, 
prevSelectedDisk, DiskStorageType.IMAGE);
+
                 Collections.sort(disks, new Linq.DiskByAliasComparer());
                 ArrayList<DiskModel> diskModels = 
Linq.disksToDiskModelList(disks);
 
-                
getAttachableDisksMap().get(DiskStorageType.IMAGE).setItems(Linq.toEntityModelList(
-                        Linq.filterDisksByType(diskModels, 
Disk.DiskStorageType.IMAGE)));
+                List<EntityModel<DiskModel>> entities = Linq.toEntityModelList(
+                        Linq.filterDisksByType(diskModels, 
DiskStorageType.IMAGE));
+
+                
getAttachableDisksMap().get(DiskStorageType.IMAGE).setItems(entities, 
selectedOrNull(entities, prevSelectedDisk, DiskStorageType.IMAGE));
             }
-        }, getHash()), getVm().getStoragePoolId(), getVm().getId());
+        }, getHash()), getVm().getStoragePoolId(), getVm().getId(), 
filterByExplicitValues, os, compatibilityVersion);
 
         // Get external attachable disks
         AsyncDataProvider.getInstance().getAllAttachableDisks(new 
AsyncQuery(this, new INewAsyncCallback() {
             @Override
             public void onSuccess(Object target, Object returnValue) {
-                ArrayList<Disk> disks = (ArrayList<Disk>) returnValue;
+                List<Disk> disks = replaceIfSelected((List<Disk>) returnValue, 
prevSelectedDisk, DiskStorageType.LUN);
                 Collections.sort(disks, new Linq.DiskByAliasComparer());
                 ArrayList<DiskModel> diskModels = 
Linq.disksToDiskModelList(disks);
 
-                
getAttachableDisksMap().get(DiskStorageType.LUN).setItems(Linq.toEntityModelList(
-                        Linq.filterDisksByType(diskModels, 
Disk.DiskStorageType.LUN)));
+                ArrayList<EntityModel<DiskModel>> entities = 
Linq.toEntityModelList(
+                        Linq.filterDisksByType(diskModels, 
DiskStorageType.LUN));
+                
getAttachableDisksMap().get(DiskStorageType.LUN).setItems(entities, 
selectedOrNull(entities, prevSelectedDisk, DiskStorageType.LUN));
             }
-        }, getHash()), null, getVm().getId());
+        }, getHash()), null, getVm().getId(), filterByExplicitValues, os, 
compatibilityVersion);
+    }
+
+    private EntityModel<DiskModel> selectedOrNull(List<EntityModel<DiskModel>> 
list, Disk prevSelected, DiskStorageType diskStorageType) {
+        if (prevSelected == null) {
+            return null;
+        }
+
+        if (prevSelected.getDiskStorageType() != diskStorageType) {
+            return null;
+        }
+
+        for (EntityModel<DiskModel> item : list) {
+            if 
(item.getEntity().getDisk().getId().equals(prevSelected.getId())) {
+                return item;
+            }
+        }
+
+        return null;
+    }
+
+    private List<Disk> replaceIfSelected(List<Disk> disksFromServer, Disk 
prevSelected, DiskStorageType diskStorageType) {
+        if (prevSelected == null) {
+            return disksFromServer;
+        }
+
+        if (prevSelected.getDiskStorageType() != diskStorageType) {
+            return disksFromServer;
+        }
+
+        List<Disk> res = new ArrayList<>();
+
+        for (Disk diskFromServer : disksFromServer) {
+            if (!diskFromServer.getId().equals(prevSelected.getId())) {
+                res.add(diskFromServer);
+            } else {
+                res.add(prevSelected);
+            }
+        }
+
+        return res;
     }
 
     @Override
@@ -82,7 +138,7 @@
     }
 
     @Override
-    public void onSave() {
+    public void store(IFrontendActionAsyncCallback callback) {
         if (getProgress() != null || !validate()) {
             return;
         }
@@ -121,20 +177,27 @@
 
     private boolean isNoSelection() {
         for (ListModel<EntityModel<DiskModel>> listModel : 
attachableDisksMap.values()) {
-            if (listModel.getSelectedItems() != null && 
!listModel.getSelectedItems().isEmpty()) {
+            boolean multipleSelectionSelected = listModel.getSelectedItems() 
!= null && !listModel.getSelectedItems().isEmpty();
+            boolean singleSelectionSelected = listModel.getSelectedItem() != 
null;
+            if (multipleSelectionSelected || singleSelectionSelected) {
                 return false;
             }
         }
         return true;
     }
 
-    private List<EntityModel<DiskModel>> getSelectedDisks() {
+    public List<EntityModel<DiskModel>> getSelectedDisks() {
         List<EntityModel<DiskModel>> selectedDisks = new 
ArrayList<EntityModel<DiskModel>>();
         for (ListModel<EntityModel<DiskModel>> listModel : 
attachableDisksMap.values()) {
             if (listModel.getSelectedItems() != null && 
!listModel.getSelectedItems().isEmpty()) {
                 selectedDisks.addAll(listModel.getSelectedItems());
             }
+
+            if (listModel.getSelectedItem() != null) {
+                selectedDisks.add(listModel.getSelectedItem());
+            }
         }
         return selectedDisks;
     }
+
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java
index fd60a9e..9322dd7 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/EditDiskModel.java
@@ -3,7 +3,7 @@
 import org.ovirt.engine.core.common.VdcActionUtils;
 import org.ovirt.engine.core.common.action.UpdateVmDiskParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
-import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType;
+import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.LunDisk;
 import org.ovirt.engine.core.common.businessentities.ScsiGenericIO;
@@ -43,9 +43,9 @@
         getIsSgIoUnfiltered().setEntity(getDisk().getSgio() == 
ScsiGenericIO.UNFILTERED);
         getIsReadOnly().setEntity(getDisk().getReadOnly());
 
-        if (getDisk().getDiskStorageType() == DiskStorageType.IMAGE) {
+        if (getDisk().getDiskStorageType() == Disk.DiskStorageType.IMAGE) {
             DiskImage diskImage = (DiskImage) getDisk();
-            getDiskStorageType().setEntity(DiskStorageType.IMAGE);
+            getDiskStorageType().setEntity(Disk.DiskStorageType.IMAGE);
             getSize().setEntity((int) diskImage.getSizeInGigabytes());
             getVolumeType().setSelectedItem(diskImage.getVolumeType());
             setVolumeFormat(diskImage.getVolumeFormat());
@@ -53,8 +53,22 @@
             boolean isExtendImageSizeEnabled = getVm() != null && 
!diskImage.isDiskSnapshot() &&
                     VdcActionUtils.canExecute(Arrays.asList(getVm()), 
VM.class, VdcActionType.ExtendImageSize);
             getSizeExtend().setIsChangable(isExtendImageSizeEnabled);
+        } else {
+            LunDisk lunDisk = (LunDisk) getDisk();
+            getDiskStorageType().setEntity(Disk.DiskStorageType.LUN);
+            getSize().setEntity(lunDisk.getLun().getDeviceSize());
+            getSizeExtend().setIsAvailable(false);
+        }
 
-            Guid storageDomainId = diskImage.getStorageIds().get(0);
+        updateReadOnlyChangeability();
+    }
+
+    @Override
+    protected void datacenter_SelectedItemChanged() {
+        super.datacenter_SelectedItemChanged();
+        // this needs to be executed after the data center is loaded because 
the update quota needs both values
+        if (getDisk().getDiskStorageType() == Disk.DiskStorageType.IMAGE) {
+            Guid storageDomainId = ((DiskImage) 
getDisk()).getStorageIds().get(0);
             AsyncDataProvider.getInstance().getStorageDomainById(new 
AsyncQuery(this, new INewAsyncCallback() {
                 @Override
                 public void onSuccess(Object target, Object returnValue) {
@@ -63,14 +77,8 @@
                     
diskModel.getStorageDomain().setSelectedItem(storageDomain);
                 }
             }, getHash()), storageDomainId);
-        } else {
-            LunDisk lunDisk = (LunDisk) getDisk();
-            getDiskStorageType().setEntity(DiskStorageType.LUN);
-            getSize().setEntity(lunDisk.getLun().getDeviceSize());
-            getSizeExtend().setIsAvailable(false);
         }
 
-        updateReadOnlyChangeability();
     }
 
     @Override
@@ -99,22 +107,23 @@
     }
 
     @Override
-    public void onSave() {
+    public void store(IFrontendActionAsyncCallback callback) {
         if (getProgress() != null || !validate()) {
             return;
         }
-        super.onSave();
+
         startProgress(null);
 
         UpdateVmDiskParameters parameters = new 
UpdateVmDiskParameters(getVmId(), getDisk().getId(), getDisk());
-        Frontend.getInstance().runAction(VdcActionType.UpdateVmDisk, 
parameters, new IFrontendActionAsyncCallback() {
+        IFrontendActionAsyncCallback onFinished = callback != null ? callback 
: new IFrontendActionAsyncCallback() {
             @Override
             public void executed(FrontendActionAsyncResult result) {
                 EditDiskModel diskModel = (EditDiskModel) result.getState();
                 diskModel.stopProgress();
                 diskModel.cancel();
             }
-        }, this);
+        };
+        Frontend.getInstance().runAction(VdcActionType.UpdateVmDisk, 
parameters, onFinished, this);
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java
index 3e361e6..f8912fa 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewDiskModel.java
@@ -104,13 +104,8 @@
     }
 
     @Override
-    public void onSave() {
-        if (getProgress() != null || !validate()) {
-            return;
-        }
-
-        super.onSave();
-
+    public void flush() {
+        super.flush();
         if (getDiskStorageType().getEntity() == Disk.DiskStorageType.IMAGE) {
             DiskImage diskImage = (DiskImage) getDisk();
             diskImage.setSizeInGigabytes(getSize().getEntity());
@@ -123,6 +118,13 @@
             luns.setLunType(getStorageType().getSelectedItem());
             lunDisk.setLun(luns);
         }
+    }
+
+    @Override
+    public void store(IFrontendActionAsyncCallback callback) {
+        if (getProgress() != null || !validate()) {
+            return;
+        }
 
         startProgress(null);
 
@@ -133,7 +135,7 @@
             parameters.setStorageDomainId(storageDomain.getId());
         }
 
-        Frontend.getInstance().runAction(VdcActionType.AddDisk, parameters, 
new IFrontendActionAsyncCallback() {
+        IFrontendActionAsyncCallback onFinished = callback != null ? callback 
: new IFrontendActionAsyncCallback() {
             @Override
             public void executed(FrontendActionAsyncResult result) {
                 NewDiskModel diskModel = (NewDiskModel) result.getState();
@@ -141,7 +143,9 @@
                 diskModel.cancel();
                 postSave();
             }
-        }, this);
+        };
+
+        Frontend.getInstance().runAction(VdcActionType.AddDisk, parameters, 
onFinished, this);
     }
 
     protected void postSave() {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
index 94a52f3..565216e 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
@@ -643,7 +643,7 @@
 
         VM selectedVm = (VM) getEntity();
 
-        UnitVmModel model = new UnitVmModel(new 
CloneVmFromSnapshotModelBehavior());
+        UnitVmModel model = new UnitVmModel(new 
CloneVmFromSnapshotModelBehavior(), this);
         model.getVmType().setSelectedItem(selectedVm.getVmType());
         model.setIsAdvancedModeLocalStorageKey("wa_snapshot_dialog");  
//$NON-NLS-1$
         setWindow(model);
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java
index e9a0538..b83d995 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Event.java
@@ -148,6 +148,11 @@
         return listeners;
     }
 
+    public void clearListeners() {
+        listeners.clear();
+        contexts.clear();
+    }
+
     public void setListeners(List<IEventListener<? super T>> listeners) {
         this.listeners = listeners;
     }


-- 
To view, visit http://gerrit.ovirt.org/36061
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I52c5d5c7b83dd53cea3a9419656015e6a51bd179
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Tomas Jelinek <tjeli...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to