Federico Simoncelli has uploaded a new change for review.

Change subject: [wip] frontend: add the import glance image support
......................................................................

[wip] frontend: add the import glance image support

Change-Id: I084dadfd208255738140f093ffc8ec136f83d7f6
Signed-off-by: Federico Simoncelli <fsimo...@redhat.com>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java
11 files changed, 630 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/83/16083/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
index dedf766..f5527d7 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
@@ -642,6 +642,9 @@
     @DefaultStringValue("Scan Alignment")
     String getDiskAlignment();
 
+    @DefaultStringValue("Data Center")
+    String dataCenter();
+
     @DefaultStringValue("Name")
     String nameDisk();
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java
new file mode 100644
index 0000000..d2dfe3a
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/ImportExportImageModel.java
@@ -0,0 +1,303 @@
+package org.ovirt.engine.ui.uicommonweb.models.storage;
+
+import org.ovirt.engine.core.common.action.ImportRepoImageParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.Quota;
+import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum;
+import org.ovirt.engine.core.common.businessentities.RepoImage;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.ui.frontend.AsyncQuery;
+import org.ovirt.engine.ui.frontend.Frontend;
+import org.ovirt.engine.ui.frontend.INewAsyncCallback;
+import org.ovirt.engine.ui.uicommonweb.ICommandTarget;
+import org.ovirt.engine.ui.uicommonweb.Linq;
+import org.ovirt.engine.ui.uicommonweb.UICommand;
+import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
+import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+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.EventDefinition;
+import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult;
+import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback;
+import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
+import org.ovirt.engine.ui.uicompat.UIConstants;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+public class ImportExportImageModel extends EntityModel implements 
ICommandTarget {
+
+    protected static EventDefinition selectedItemChangedEventDefinition;
+
+    static {
+        selectedItemChangedEventDefinition = new 
EventDefinition("SelectedItemChanged", ListModel.class); //$NON-NLS-1$
+    }
+
+    protected static UIConstants constants = 
ConstantsManager.getInstance().getConstants();
+
+    protected List<RepoImage> repoImages;
+    protected StorageDomain sourceStorageDomain;
+
+    private ListModel dataCenter;
+    private ListModel storageDomain;
+    private ListModel quota;
+
+    private UICommand okCommand;
+    private UICommand cancelCommand;
+
+    public List<RepoImage> getRepoImages() {
+        return repoImages;
+    }
+
+    public void setRepoImages(List<RepoImage> repoImages) {
+        if (repoImages == this.repoImages) {
+            return;
+        }
+        this.repoImages = repoImages;
+        onPropertyChanged(new PropertyChangedEventArgs("RepoImages")); 
//$NON-NLS-1$
+    }
+
+    public ListModel getDataCenter()
+    {
+        return dataCenter;
+    }
+
+    public void setDataCenter(ListModel value)
+    {
+       dataCenter = value;
+    }
+
+    public ListModel getStorageDomain() {
+        return storageDomain;
+    }
+
+    public void setStorageDomain(ListModel storageDomain) {
+        this.storageDomain = storageDomain;
+    }
+
+    public ListModel getQuota() {
+        return quota;
+    }
+
+    public void setQuota(ListModel quota) {
+        this.quota = quota;
+    }
+
+
+    public UICommand getOkCommand() {
+        return okCommand;
+    }
+
+    public void setOkCommand(UICommand okCommand) {
+        this.okCommand = okCommand;
+    }
+
+    public UICommand getCancelCommand() {
+        return cancelCommand;
+    }
+
+    public void setCancelCommand(UICommand cancelCommand) {
+        this.cancelCommand = cancelCommand;
+    }
+
+    public ImportExportImageModel() {
+        setDataCenter(new ListModel());
+        getDataCenter().getSelectedItemChangedEvent().addListener(this);
+
+        setStorageDomain(new ListModel());
+        getStorageDomain().getSelectedItemChangedEvent().addListener(this);
+
+        setQuota(new ListModel());
+
+        setOkCommand(new UICommand("OnExecute", this));  //$NON-NLS-1$
+        getOkCommand().setTitle(constants.ok());
+        getOkCommand().setIsDefault(true);
+        getOkCommand().setIsExecutionAllowed(false);
+
+        setCancelCommand(new UICommand("Cancel", this)); //$NON-NLS-1$
+        getCancelCommand().setTitle(constants.cancel());
+        getCancelCommand().setIsCancel(true);
+
+        getCommands().add(getOkCommand());
+        getCommands().add(getCancelCommand());
+    }
+
+    public void init(StorageDomain sourceStorageDomain, List<RepoImage> 
repoImages) {
+        this.sourceStorageDomain = sourceStorageDomain;
+        setRepoImages(repoImages);
+        updateDataCenters();
+    }
+
+    protected void updateDataCenters() {
+        INewAsyncCallback callback = new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object target, Object returnValue) {
+                ImportExportImageModel model = (ImportExportImageModel) target;
+                List<StoragePool> dataCenters = (List<StoragePool>) 
returnValue;
+
+                // Sorting by name
+                Collections.sort(dataCenters, new 
Linq.StoragePoolByNameComparer());
+
+                model.getDataCenter().setItems(dataCenters);
+                stopProgress();
+            }
+        };
+
+        startProgress(null);
+        AsyncDataProvider.getDataCenterList(new AsyncQuery(this, callback));
+    }
+
+    protected void updateControlsAvailability() {
+        String warningMessage = null;
+
+        if (getStorageDomain().getIsEmpty()) {
+            getStorageDomain().setIsChangable(false);
+            getQuota().setItems(null);
+            getQuota().setIsChangable(false);
+            getOkCommand().setIsExecutionAllowed(false);
+            warningMessage = constants.noStorageDomainAvailableMsg();
+        } else {
+            getStorageDomain().setIsChangable(true);
+            getOkCommand().setIsExecutionAllowed(true);
+        }
+
+        setMessage(warningMessage);
+    }
+
+    protected void updateStorageDomains() {
+        INewAsyncCallback callback = new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object target, Object returnValue) {
+                ImportExportImageModel model = (ImportExportImageModel) target;
+                List<StorageDomain> storageDomains = new 
ArrayList<StorageDomain>();
+
+                // Filtering out domains that are not active
+                for (StorageDomain storageDomainItem : (List<StorageDomain>) 
returnValue) {
+                    if (Linq.isDataActiveStorageDomain(storageDomainItem)) {
+                        storageDomains.add(storageDomainItem);
+                    }
+                }
+
+                // Sorting by name
+                Collections.sort(storageDomains, new 
Linq.StorageDomainByNameComparer());
+
+                model.getStorageDomain().setItems(storageDomains);
+                model.getStorageDomain().setIsEmpty(storageDomains.isEmpty());
+
+                model.updateControlsAvailability();
+                stopProgress();
+            }
+        };
+
+        startProgress(null);
+        AsyncDataProvider.getStorageDomainList(new AsyncQuery(this, callback),
+                ((StoragePool) getDataCenter().getSelectedItem()).getId());
+    }
+
+    protected QuotaEnforcementTypeEnum getDataCenterQuotaEnforcementType() {
+        StoragePool dataCenter = (StoragePool) 
getDataCenter().getSelectedItem();
+        return (dataCenter == null) ? null : 
dataCenter.getQuotaEnforcementType();
+    }
+
+    private void updateQuotas() {
+        StorageDomain storageDomain = (StorageDomain) 
getStorageDomain().getSelectedItem();
+
+        if (getDataCenterQuotaEnforcementType() == 
QuotaEnforcementTypeEnum.DISABLED || storageDomain == null) {
+            getQuota().setItems(null);
+            getQuota().setIsChangable(false);
+            return;
+        }
+
+        INewAsyncCallback callback = new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object target, Object returnValue) {
+                ImportExportImageModel model = (ImportExportImageModel) target;
+                model.getQuota().setItems((List<Quota>) ((VdcQueryReturnValue) 
returnValue).getReturnValue());
+                getQuota().setIsChangable(true);
+                stopProgress();
+            }
+        };
+
+        startProgress(null);
+        Frontend.RunQuery(VdcQueryType.GetAllRelevantQuotasForStorage,
+                new IdQueryParameters(storageDomain.getId()),
+                new AsyncQuery(this, callback));
+    }
+
+    protected void cancel() {
+        stopProgress();
+        ((ListModel) getEntity()).setWindow(null);
+    }
+
+    @Override
+    public void executeCommand(UICommand command)
+    {
+        super.executeCommand(command);
+
+        startProgress(null);
+
+        ArrayList<VdcActionParametersBase> actionParameters = new 
ArrayList<VdcActionParametersBase>();
+
+        for (RepoImage repoImage : repoImages) {
+            ImportRepoImageParameters importParameters = new 
ImportRepoImageParameters();
+
+            // source
+            importParameters.setSourceRepoImageId(repoImage.getRepoImageId());
+            
importParameters.setSourceStorageDomainId(sourceStorageDomain.getId());
+
+            // destination
+            importParameters.setStoragePoolId(((StoragePool) 
getDataCenter().getSelectedItem()).getId());
+            importParameters.setStorageDomainId(((StorageDomain) 
getStorageDomain().getSelectedItem()).getId());
+
+            Quota selectedQuota = (Quota) getQuota().getSelectedItem();
+
+            if (selectedQuota != null) {
+                importParameters.setQuotaId(selectedQuota.getId());
+            }
+
+            actionParameters.add(importParameters);
+        }
+
+        Frontend.RunMultipleAction(VdcActionType.ImportRepoImage, 
actionParameters,
+                new IFrontendMultipleActionAsyncCallback() {
+                    @Override
+                    public void executed(FrontendMultipleActionAsyncResult 
result) {
+                        ImportExportImageModel model = 
(ImportExportImageModel) result.getState();
+                        model.stopProgress();
+                        model.cancel();
+                    }
+                }, this);
+    }
+
+    protected void dataCenter_SelectedItemChanged() {
+        updateStorageDomains();
+    }
+
+    protected void storageDomain_SelectedItemChanged() {
+        updateQuotas();
+    }
+
+    @Override
+    public void eventRaised(Event ev, Object sender, EventArgs args)
+    {
+        super.eventRaised(ev, sender, args);
+
+        if (ev.matchesDefinition(selectedItemChangedEventDefinition)) {
+            if (sender == getDataCenter()) {
+                dataCenter_SelectedItemChanged();
+            }
+            if (sender == getStorageDomain()) {
+                storageDomain_SelectedItemChanged();
+            }
+        }
+    }
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java
index 0a9f43b..50d3de3 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageIsoListModel.java
@@ -7,12 +7,14 @@
 import org.ovirt.engine.core.common.businessentities.ImageFileType;
 import org.ovirt.engine.core.common.businessentities.RepoImage;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StorageType;
 import org.ovirt.engine.core.common.queries.GetImagesListParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.ui.frontend.AsyncQuery;
 import org.ovirt.engine.ui.frontend.Frontend;
 import org.ovirt.engine.ui.frontend.INewAsyncCallback;
+import org.ovirt.engine.ui.uicommonweb.UICommand;
 import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
 import org.ovirt.engine.ui.uicompat.ConstantsManager;
 
@@ -23,9 +25,22 @@
     public StorageIsoListModel()
     {
         setTitle(ConstantsManager.getInstance().getConstants().imagesTitle());
-        setHashName("images"); // $//$NON-NLS-1$
+        setHashName("images"); //$NON-NLS-1$
+
+        setDownloadImagesCommand(new UICommand("Download", this)); 
//$NON-NLS-1$
+        updateActionAvailability();
 
         setIsTimerDisabled(true);
+    }
+
+    private UICommand downloadImagesCommand;
+
+    public UICommand getDownloadImagesCommand() {
+        return downloadImagesCommand;
+    }
+
+    public void setDownloadImagesCommand(UICommand downloadImagesCommand) {
+        this.downloadImagesCommand = downloadImagesCommand;
     }
 
     @Override
@@ -97,18 +112,18 @@
                     return;
                 }
 
-                ArrayList<RepoImage> repoFileList = (ArrayList<RepoImage>)
-                        returnValue.getReturnValue();
+                @SuppressWarnings("unchecked")
+                ArrayList<RepoImage> repoImageList = (ArrayList<RepoImage>) 
returnValue.getReturnValue();
 
-                Collections.sort(repoFileList, new Comparator<RepoImage>() {
+                Collections.sort(repoImageList, new Comparator<RepoImage>() {
                     @Override
                     public int compare(RepoImage a, RepoImage b) {
                         return 
a.getRepoImageId().compareToIgnoreCase(b.getRepoImageId());
                     }
                 });
 
-                setItems(repoFileList);
-                setIsEmpty(repoFileList.isEmpty());
+                setItems(repoImageList);
+                setIsEmpty(repoImageList.isEmpty());
             }
         };
 
@@ -119,4 +134,52 @@
     protected String getListName() {
         return "StorageIsoListModel"; //$NON-NLS-1$
     }
+
+    private void downloadImages() {
+        @SuppressWarnings("unchecked")
+        ArrayList<RepoImage> repoImages = (ArrayList<RepoImage>) 
getSelectedItems();
+
+        if (repoImages == null || getWindow() != null) {
+            return;
+        }
+
+        ImportExportImageModel model = new ImportExportImageModel();
+        setWindow(model);
+        
model.setTitle(ConstantsManager.getInstance().getConstants().downloadImagesTitle());
+        model.setHashName("download_images"); //$NON-NLS-1$
+        model.setEntity(this);
+        model.init((StorageDomain) getEntity(), repoImages);
+    }
+
+    public void cancel() {
+        setWindow(null);
+        Frontend.Unsubscribe();
+    }
+
+    private void updateActionAvailability() {
+        StorageDomain storageDomain = (StorageDomain) getEntity();
+        @SuppressWarnings("unchecked")
+        ArrayList<RepoImage> selectedImages =
+                getSelectedItems() != null ? (ArrayList<RepoImage>) 
getSelectedItems() : new ArrayList<RepoImage>();
+        getDownloadImagesCommand().setIsExecutionAllowed(storageDomain != null 
&&
+                storageDomain.getStorageType() == StorageType.GLANCE && 
selectedImages.size() > 0);
+    }
+
+    @Override
+    protected void selectedItemsChanged() {
+        super.selectedItemsChanged();
+        updateActionAvailability();
+    }
+
+    @Override
+    public void executeCommand(UICommand command) {
+        super.executeCommand(command);
+
+        if (command == getDownloadImagesCommand()) {
+            downloadImages();
+        }
+        else if (command.getName().equals("Cancel")) { //$NON-NLS-1$
+            cancel();
+        }
+    }
 }
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
index 625084a..9a15cc4 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
@@ -529,6 +529,9 @@
     @DefaultStringValue("Move Disk(s)")
     String moveDisksTitle();
 
+    @DefaultStringValue("Download Image(s)")
+    String downloadImagesTitle();
+
     @DefaultStringValue("Snapshots")
     String snapshotsTitle();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
index c6b6daf..a761b96 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
@@ -2204,6 +2204,9 @@
     @DefaultStringValue("Type")
     String typeIso();
 
+    @DefaultStringValue("Download")
+    String downloadImage();
+
     // Storage tree
     @DefaultStringValue("Name")
     String nameStorageTree();
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
index c81b03b..9ba04cc 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
@@ -65,6 +65,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.DisksAllocationPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindMultiDcPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindSingleDcPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageDestroyPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageForceCreatePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StoragePopupPresenterWidget;
@@ -257,6 +258,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.DisksAllocationPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.FindMultiDcPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.FindSingleDcPopupView;
+import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.ImportExportImagePopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.StorageDestroyPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.StorageForceCreatePopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.StoragePopupView;
@@ -1032,6 +1034,9 @@
         bindPresenterWidget(ChangeQuotaPopupPresenterWidget.class,
                 ChangeQuotaPopupPresenterWidget.ViewDef.class,
                 ChangeQuotaPopupView.class);
+        bindPresenterWidget(ImportExportImagePopupPresenterWidget.class,
+                ImportExportImagePopupPresenterWidget.ViewDef.class,
+                ImportExportImagePopupView.class);
 
         // Storage Remove
         bindPresenterWidget(StorageRemovePopupPresenterWidget.class,
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java
index 49b7cac..cfdbaac 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java
@@ -38,6 +38,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.event.EventPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindMultiDcPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindSingleDcPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageDestroyPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StorageForceCreatePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.StoragePopupPresenterWidget;
@@ -184,10 +185,21 @@
 
     @Provides
     @Singleton
-    public SearchableDetailModelProvider<RepoImage, StorageListModel, 
StorageIsoListModel> getStorageIsoListProvider(ClientGinjector ginjector) {
+    public SearchableDetailModelProvider<RepoImage, StorageListModel, 
StorageIsoListModel> getStorageIsoListProvider(ClientGinjector ginjector,
+            final Provider<ImportExportImagePopupPresenterWidget> 
importExportPopupProvider) {
         return new SearchableDetailTabModelProvider<RepoImage, 
StorageListModel, StorageIsoListModel>(ginjector,
                 StorageListModel.class,
-                StorageIsoListModel.class);
+                StorageIsoListModel.class) {
+            @Override
+            public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> 
getModelPopup(StorageIsoListModel source,
+                    UICommand lastExecutedCommand, Model windowModel) {
+                if (lastExecutedCommand == 
getModel().getDownloadImagesCommand()) {
+                    return importExportPopupProvider.get();
+                } else {
+                    return super.getModelPopup(source, lastExecutedCommand, 
windowModel);
+                }
+            }
+        };
     }
 
     @Provides
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java
new file mode 100644
index 0000000..5a3d0bd
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/storage/ImportExportImagePopupPresenterWidget.java
@@ -0,0 +1,20 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage;
+
+import 
org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
+import org.ovirt.engine.ui.uicommonweb.models.storage.ImportExportImageModel;
+
+import com.google.gwt.event.shared.EventBus;
+import com.google.inject.Inject;
+
+public class ImportExportImagePopupPresenterWidget extends
+        AbstractModelBoundPopupPresenterWidget<ImportExportImageModel, 
ImportExportImagePopupPresenterWidget.ViewDef> {
+
+    public interface ViewDef extends 
AbstractModelBoundPopupPresenterWidget.ViewDef<ImportExportImageModel> {
+    }
+
+    @Inject
+    public ImportExportImagePopupPresenterWidget(EventBus eventBus, ViewDef 
view) {
+        super(eventBus, view);
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java
new file mode 100644
index 0000000..4d1827b
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java
@@ -0,0 +1,169 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.inject.Inject;
+import org.ovirt.engine.core.common.businessentities.Quota;
+import org.ovirt.engine.core.common.businessentities.RepoImage;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.ui.common.idhandler.WithElementId;
+import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
+import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
+import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable;
+import 
org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable.SelectionMode;
+import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
+import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer;
+import org.ovirt.engine.ui.common.widget.table.column.DiskSizeColumn;
+import org.ovirt.engine.ui.common.widget.table.column.EntityModelTextColumn;
+import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+import org.ovirt.engine.ui.uicommonweb.models.storage.ImportExportImageModel;
+import org.ovirt.engine.ui.uicompat.Event;
+import org.ovirt.engine.ui.uicompat.EventArgs;
+import org.ovirt.engine.ui.uicompat.IEventListener;
+import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
+import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import org.ovirt.engine.ui.webadmin.ApplicationResources;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget;
+
+import java.util.ArrayList;
+
+
+public class ImportExportImagePopupView extends 
AbstractModelBoundPopupView<ImportExportImageModel> implements
+        ImportExportImagePopupPresenterWidget.ViewDef {
+
+    interface Driver extends SimpleBeanEditorDriver<ImportExportImageModel, 
ImportExportImagePopupView> {
+    }
+
+    interface ViewUiBinder extends UiBinder<SimpleDialogPanel, 
ImportExportImagePopupView> {
+        ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
+    }
+
+    @UiField
+    FlowPanel messagePanel;
+
+    @UiField(provided = true)
+    @Path(value = "dataCenter.selectedItem")
+    @WithElementId
+    public ListModelListBoxEditor<Object> dataCenterEditor;
+
+    @UiField(provided = true)
+    @Path(value = "storageDomain.selectedItem")
+    @WithElementId
+    public ListModelListBoxEditor<Object> storageDomainEditor;
+
+    @UiField(provided = true)
+    @Path(value = "quota.selectedItem")
+    @WithElementId
+    public ListModelListBoxEditor<Object> quotaEditor;
+
+    @UiField(provided = true)
+    SimplePanel imageListPanel;
+
+    @Ignore
+    EntityModelCellTable<ListModel> imageList;
+
+    private final Driver driver = GWT.create(Driver.class);
+
+    @Inject
+    public ImportExportImagePopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants) {
+        super(eventBus, resources);
+
+        dataCenterEditor = new ListModelListBoxEditor<Object>(new 
NullSafeRenderer<Object>() {
+            @Override
+            public String renderNullSafe(Object object) {
+                return ((StoragePool) object).getname();
+            }
+        });
+        dataCenterEditor.setLabel(constants.dataCenter());
+
+        storageDomainEditor = new ListModelListBoxEditor<Object>(new 
NullSafeRenderer<Object>() {
+            @Override
+            public String renderNullSafe(Object object) {
+                return ((StorageDomain) object).getStorageName();
+            }
+        });
+        storageDomainEditor.setLabel(constants.domainNameStorage());
+
+        quotaEditor = new ListModelListBoxEditor<Object>(new 
NullSafeRenderer<Object>() {
+            @Override
+            public String renderNullSafe(Object object) {
+                return ((Quota) object).getQuotaName();
+            }
+        });
+        quotaEditor.setLabel(constants.quota());
+
+        imageListPanel = new SimplePanel();
+
+        imageList = new EntityModelCellTable<ListModel>(SelectionMode.NONE, 
true);
+        imageList.addEntityModelColumn(new EntityModelTextColumn<RepoImage>() {
+            @Override
+            public String getText(RepoImage repoImage) {
+                return repoImage.getRepoImageTitle();
+            }
+        }, constants.fileNameIso());
+        imageList.addEntityModelColumn(new EntityModelTextColumn<RepoImage>() {
+            @Override
+            public String getText(RepoImage repoImage) {
+                return repoImage.getFileType().toString();
+            }
+        }, constants.typeIso());
+        imageList.addEntityModelColumn(new DiskSizeColumn<EntityModel>() {
+            @Override
+            protected Long getRawValue(EntityModel object) {
+                return ((RepoImage) (object.getEntity())).getSize();
+            }
+        }, constants.actualSizeTemplate());
+
+        imageList.setWidth("100%", true); //$NON-NLS-1$
+        imageListPanel.setWidget(imageList);
+
+        initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
+        driver.initialize(this);
+    }
+
+    @Override
+    public void edit(final ImportExportImageModel model) {
+        driver.edit(model);
+
+        model.getPropertyChangedEvent().addListener(new IEventListener() {
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                if (args instanceof PropertyChangedEventArgs) {
+                    PropertyChangedEventArgs changedArgs = 
(PropertyChangedEventArgs) args;
+                    if ("RepoImages".equals(changedArgs.PropertyName)) { 
//$NON-NLS-1$
+                        if (model.getRepoImages() != null) {
+                            ArrayList<EntityModel> repoImageModels = new 
ArrayList<EntityModel>();
+                            for (RepoImage i : model.getRepoImages()) {
+                                repoImageModels.add(new EntityModel(i));
+                            }
+                            imageList.setRowData(repoImageModels);
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    @Override
+    public ImportExportImageModel flush() {
+        return driver.flush();
+    }
+
+    @Override
+    public void setMessage(String message) {
+        super.setMessage(message);
+
+        messagePanel.setVisible(message != null && !message.isEmpty());
+        messagePanel.clear();
+        messagePanel.add(new Label(message));
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml
new file mode 100644
index 0000000..d946090
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.ui.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
+       xmlns:g="urn:import:com.google.gwt.user.client.ui" 
xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog"
+       xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor" 
xmlns:w="urn:import:org.ovirt.engine.ui.common.widget.uicommon.storage">
+
+       <ui:style>
+               .messagePanel {
+                       color: #CD2127;
+                       text-align: center;
+                       padding: 10px;
+               }
+               .imageListPanel {
+                       overflow: auto;
+                       position: absolute;
+                       width: 100%;
+               }
+       </ui:style>
+       
+       <d:SimpleDialogPanel width="540px" height="400px">
+               <d:content>
+                       <g:FlowPanel>
+                               <e:ListModelListBoxEditor 
ui:field="dataCenterEditor" />
+                               <e:ListModelListBoxEditor 
ui:field="storageDomainEditor" />
+                               <e:ListModelListBoxEditor 
ui:field="quotaEditor" />
+                               <g:FlowPanel ui:field="messagePanel" 
visible="false" addStyleNames="{style.messagePanel}" />
+                               <g:SimplePanel ui:field="imageListPanel" 
addStyleNames="{style.imageListPanel}" />
+                       </g:FlowPanel>
+               </d:content>
+       </d:SimpleDialogPanel>
+       
+</ui:UiBinder>
\ No newline at end of file
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java
index 4e33f5f..8bc9517 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageIsoView.java
@@ -5,12 +5,14 @@
 import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider;
 import org.ovirt.engine.ui.common.widget.table.column.DiskSizeColumn;
 import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip;
+import org.ovirt.engine.ui.uicommonweb.UICommand;
 import org.ovirt.engine.ui.uicommonweb.models.storage.StorageIsoListModel;
 import org.ovirt.engine.ui.uicommonweb.models.storage.StorageListModel;
 import org.ovirt.engine.ui.webadmin.ApplicationConstants;
 import org.ovirt.engine.ui.webadmin.ApplicationResources;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageIsoPresenter;
 import org.ovirt.engine.ui.webadmin.section.main.view.AbstractSubTabTableView;
+import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition;
 
 import com.google.inject.Inject;
 
@@ -52,6 +54,13 @@
         };
         getTable().addColumn(sizeColumn, constants.actualSizeTemplate(), 
"100px"); //$NON-NLS-1$
 
+        getTable().addActionButton(new 
WebAdminButtonDefinition<RepoImage>(constants.downloadImage()) {
+            @Override
+            protected UICommand resolveCommand() {
+                return getDetailModel().getDownloadImagesCommand();
+            }
+        });
+
         getTable().showRefreshButton();
     }
 }


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

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

Reply via email to