package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.backup; import java.util.ArrayList; import java.util.Date; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.IVdcQueryable; import org.ovirt.engine.core.common.businessentities.OriginType; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmInterfaceType; import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.VolumeType; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.EventArgs; import org.ovirt.engine.core.compat.IEventListener; import org.ovirt.engine.core.compat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmAppListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmGeneralModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmImportDiskListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmImportInterfaceListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmListModel; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationResources; import org.ovirt.engine.ui.webadmin.gin.ClientGinjector; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.backup.ImportVmPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.view.popup.AbstractModelBoundPopupView; import org.ovirt.engine.ui.webadmin.uicommon.model.DetailModelProvider; import org.ovirt.engine.ui.webadmin.widget.dialog.SimpleDialogPanel; import org.ovirt.engine.ui.webadmin.widget.editor.EntityModelCheckBoxEditor; import org.ovirt.engine.ui.webadmin.widget.editor.IVdcQueryableCellTable; import org.ovirt.engine.ui.webadmin.widget.editor.ListModelListBoxEditor; import org.ovirt.engine.ui.webadmin.widget.renderer.EnumRenderer; import org.ovirt.engine.ui.webadmin.widget.renderer.NullSafeRenderer; import org.ovirt.engine.ui.webadmin.widget.table.column.CustomSelectionCell; import org.ovirt.engine.ui.webadmin.widget.table.column.DiskSizeColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.EnumColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.FullDateTimeColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.IsProblematicImportVmColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.TextColumnWithTooltip; import org.ovirt.engine.ui.webadmin.widget.table.column.VmTypeColumn; import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.editor.client.SimpleBeanEditorDriver; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.EventBus; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.SplitLayoutPanel; import com.google.gwt.user.client.ui.TabLayoutPanel; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SingleSelectionModel; import com.google.inject.Inject; public class ImportVmPopupView extends AbstractModelBoundPopupView<ImportVmModel> implements ImportVmPopupPresenterWidget.ViewDef { private static final String ALLOCATION_MODIFIED_SINGLE_VM = "Allocation can be modified only when importing a single VM"; private static final String PREALLOCATED = "Preallocated"; private static final String THIN_PROVISION = "Thin Provision"; private static final String MODIFIED_COLLAPSE_MGS = "Allocation can be modified only when 'Collapse All Snapshots' is check"; interface Driver extends SimpleBeanEditorDriver<ImportVmModel, ImportVmPopupView> { Driver driver = GWT.create(Driver.class); } interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ImportVmPopupView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } @UiField WidgetStyle style; @UiField(provided = true) @Path(value = "cluster.selectedItem") ListModelListBoxEditor<Object> destClusterEditor; @UiField(provided = true) @Path(value = "destinationStorage.selectedItem") ListModelListBoxEditor<Object> destStorageEditor; @UiField @Path(value = "collapseSnapshots.entity") EntityModelCheckBoxEditor collapseSnapshotEditor; @UiField SplitLayoutPanel splitLayoutPanel; @UiField @Ignore Label message; @UiField Image image; @Ignore private IVdcQueryableCellTable<VM, ImportVmModel> table; @Ignore private IVdcQueryableCellTable<DiskImage, VmImportDiskListModel> diskTable; @Ignore private IVdcQueryableCellTable<VmNetworkInterface, VmImportInterfaceListModel> nicTable; private IVdcQueryableCellTable<String, VmAppListModel> appTable; @Ignore TabLayoutPanel subTabLayoutpanel = null; private ImportVmModel object; private ImportVmGeneralSubTabView generalView; boolean firstSelection = false; private CustomSelectionCell customSelectionCell; private boolean numOfVmsGreaterThan1; @Inject public ImportVmPopupView(ClientGinjector ginjector, EventBus eventBus, ApplicationResources resources, ApplicationConstants constants) { super(eventBus, resources); initListBoxEditors(); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); localize(constants); Driver.driver.initialize(this); initTables(); initSubTabLayoutPanel(); setContentWidth(); } private void setContentWidth() { collapseSnapshotEditor.addContentWidgetStyleName(style.contentWidth()); } private void initSubTabLayoutPanel() { if (subTabLayoutpanel == null) { subTabLayoutpanel = new TabLayoutPanel(20, Unit.PX); subTabLayoutpanel.addSelectionHandler(new SelectionHandler<Integer>() { @Override public void onSelection(SelectionEvent<Integer> event) { if (object != null) { object.setActiveDetailModel(object.getDetailModels().get(event.getSelectedItem())); if (event.getSelectedItem() == 0) { generalView.setMainTabSelectedItem((VM) object.getSelectedItem()); } } } }); ScrollPanel generalPanel = new ScrollPanel(); DetailModelProvider<VmListModel, VmGeneralModel> modelProvider = new DetailModelProvider<VmListModel, VmGeneralModel>() { @Override public void setEntity(Object value) { } @Override public VmGeneralModel getModel() { return (VmGeneralModel) object.getDetailModels().get(0); } @Override public void onSubTabSelected() { } }; generalView = new ImportVmGeneralSubTabView(modelProvider); generalPanel.add(generalView); subTabLayoutpanel.add(generalPanel, "General"); ScrollPanel nicPanel = new ScrollPanel(); nicPanel.add(nicTable); subTabLayoutpanel.add(nicPanel, "Network Interfaces"); ScrollPanel diskPanel = new ScrollPanel(); diskPanel.add(diskTable); subTabLayoutpanel.add(diskPanel, "Virtual Disks"); ScrollPanel appPanel = new ScrollPanel(); appPanel.add(appTable); subTabLayoutpanel.add(appPanel, "Applications"); } } private void initTables() { initMainTable(); initNicsTable(); initDiskTable(); initAppTable(); } private void initAppTable() { appTable = new IVdcQueryableCellTable<String, VmAppListModel>(); appTable.addColumn(new TextColumnWithTooltip<String>() { @Override public String getValue(String object) { return object; } }, "Installed Applications"); appTable.getElement().getStyle().setPosition(Position.RELATIVE); } private void initMainTable() { this.table = new IVdcQueryableCellTable<VM, ImportVmModel>(); TextColumnWithTooltip<VM> nameColumn = new TextColumnWithTooltip<VM>() { @Override public String getValue(VM object) { return object.getvm_name(); } }; table.addColumn(nameColumn, "Name", "150px"); TextColumnWithTooltip<VM> originColumn = new EnumColumn<VM, OriginType>() { @Override protected OriginType getRawValue(VM object) { return object.getorigin(); } }; table.addColumn(originColumn, "Origin", "100px"); table.addColumn(new VmTypeColumn(), "", "30px"); TextColumnWithTooltip<VM> memoryColumn = new TextColumnWithTooltip<VM>() { @Override public String getValue(VM object) { return String.valueOf(object.getvm_mem_size_mb()) + " MB"; } }; table.addColumn(memoryColumn, "Memory", "100px"); TextColumnWithTooltip<VM> cpuColumn = new TextColumnWithTooltip<VM>() { @Override public String getValue(VM object) { return String.valueOf(object.getnum_of_cpus()); } }; table.addColumn(cpuColumn, "CPUs", "50px"); TextColumnWithTooltip<VM> diskColumn = new TextColumnWithTooltip<VM>() { @Override public String getValue(VM object) { return String.valueOf(object.getDiskMap().size()); } }; table.addColumn(diskColumn, "Disks", "50px"); ScrollPanel sp = new ScrollPanel(); sp.add(table); splitLayoutPanel.add(sp); table.getElement().getStyle().setPosition(Position.RELATIVE); } private void initNicsTable() { nicTable = new IVdcQueryableCellTable<VmNetworkInterface, VmImportInterfaceListModel>(); TextColumnWithTooltip<VmNetworkInterface> nameColumn = new TextColumnWithTooltip<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getName(); } }; nicTable.addColumn(nameColumn, "Name", "150px"); TextColumnWithTooltip<VmNetworkInterface> networkColumn = new TextColumnWithTooltip<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getNetworkName(); } }; nicTable.addColumn(networkColumn, "Network Name", "150px"); TextColumnWithTooltip<VmNetworkInterface> typeColumn = new EnumColumn<VmNetworkInterface, VmInterfaceType>() { @Override protected VmInterfaceType getRawValue(VmNetworkInterface object) { return VmInterfaceType.forValue(object.getType()); } }; nicTable.addColumn(typeColumn, "Type", "150px"); TextColumnWithTooltip<VmNetworkInterface> macColumn = new TextColumnWithTooltip<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getMacAddress(); } }; nicTable.addColumn(macColumn, "MAC", "150px"); nicTable.getElement().getStyle().setPosition(Position.RELATIVE); } private void initDiskTable() { diskTable = new IVdcQueryableCellTable<DiskImage, VmImportDiskListModel>(); TextColumnWithTooltip<DiskImage> nameColumn = new TextColumnWithTooltip<DiskImage>() { @Override public String getValue(DiskImage object) { return "Disk " + object.getinternal_drive_mapping(); } }; diskTable.addColumn(nameColumn, "Name", "100px"); DiskSizeColumn<DiskImage> sizeColumn = new DiskSizeColumn<DiskImage>() { @Override protected Long getRawValue(DiskImage object) { return object.getsize(); } }; diskTable.addColumn(sizeColumn, "Size", "100px"); DiskSizeColumn<DiskImage> actualSizeColumn = new DiskSizeColumn<DiskImage>() { @Override protected Long getRawValue(DiskImage object) { return object.getactual_size(); } }; diskTable.addColumn(actualSizeColumn, "Actual Size", "100px"); TextColumnWithTooltip<DiskImage> typeColumn = new TextColumnWithTooltip<DiskImage>() { @Override public String getValue(DiskImage object) { return object.getdisk_type().toString(); } }; diskTable.addColumn(typeColumn, "Type", "60px"); TextColumnWithTooltip<DiskImage> formatColumn = new TextColumnWithTooltip<DiskImage>() { @Override public String getValue(DiskImage object) { return object.getvolume_format().toString(); } }; diskTable.addColumn(formatColumn, "Format", "60px"); TextColumnWithTooltip<DiskImage> dateCreatedColumn = new FullDateTimeColumn<DiskImage>() { @Override protected Date getRawValue(DiskImage object) { return object.getcreation_date(); } }; diskTable.addColumn(dateCreatedColumn, "Date Created", "100px"); ArrayList<String> allocationTypes = new ArrayList<String>(); allocationTypes.add(THIN_PROVISION); allocationTypes.add(PREALLOCATED); customSelectionCell = new CustomSelectionCell(allocationTypes); customSelectionCell.setEnabledWithToolTip(false, MODIFIED_COLLAPSE_MGS); Column<DiskImage, String> allocationColumn = new Column<DiskImage, String>( customSelectionCell) { @Override public String getValue(DiskImage object) { return new EnumRenderer<VolumeType>().render(VolumeType.forValue(object.getvolume_type().getValue())); } }; allocationColumn.setFieldUpdater(new FieldUpdater<DiskImage, String>() { @Override public void update(int index, DiskImage disk, String value) { VolumeType tempVolumeType = VolumeType.Sparse; if (value.equals(THIN_PROVISION)) { tempVolumeType = VolumeType.Sparse; } else if (value.equals(PREALLOCATED)) { tempVolumeType = VolumeType.Preallocated; } object.VolumeType_SelectedItemChanged(disk, tempVolumeType); } }); diskTable.addColumn(allocationColumn, "Allocation", "60px"); diskTable.getElement().getStyle().setPosition(Position.RELATIVE); } private void initListBoxEditors() { destClusterEditor = new ListModelListBoxEditor<Object>(new NullSafeRenderer<Object>() { @Override public String renderNullSafe(Object object) { return ((VDSGroup) object).getname(); } }); destStorageEditor = new ListModelListBoxEditor<Object>(new NullSafeRenderer<Object>() { @Override public String renderNullSafe(Object object) { return ((storage_domains) object).getstorage_name(); } }); } private void localize(ApplicationConstants constants) { destClusterEditor.setLabel(constants.importVm_destCluster()); destStorageEditor.setLabel(constants.importVm_destStorage()); collapseSnapshotEditor.setLabel(constants.importVm_collapseSnapshots()); } @Override public void edit(final ImportVmModel object) { this.object = object; image.setVisible(false); object.getCollapseSnapshots().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if ("Message".equals(((PropertyChangedEventArgs) args).PropertyName)) { message.setText(object.getCollapseSnapshots().getMessage()); if (object.getCollapseSnapshots().getMessage() != null) { image.setVisible(true); } else { image.setVisible(false); } table.flush(); table.edit(object); } if (!numOfVmsGreaterThan1 && ((ArrayList<IVdcQueryable>) object.getItems()).size() > 1) { customSelectionCell.setEnabledWithToolTip(false, ALLOCATION_MODIFIED_SINGLE_VM); numOfVmsGreaterThan1 = true; } if (!numOfVmsGreaterThan1) { if ((Boolean) object.getCollapseSnapshots().getEntity()) { customSelectionCell.setEnabledWithToolTip(true, ""); diskTable.flush(); diskTable.edit((VmImportDiskListModel) object.getDetailModels().get(2)); } else { customSelectionCell.setEnabledWithToolTip(false, MODIFIED_COLLAPSE_MGS); diskTable.flush(); diskTable.edit((VmImportDiskListModel) object.getDetailModels().get(2)); } } } }); table.addColumnAt(new IsProblematicImportVmColumn(object.getProblematicItems()), "", "30px", 0); table.edit(object); // object.setActiveDetailModel(object.getDetailModels().get(0)); SingleSelectionModel<IVdcQueryable> selectionModel = (SingleSelectionModel<IVdcQueryable>) table.getSelectionModel(); selectionModel.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { if (!firstSelection) { object.setActiveDetailModel(object.getDetailModels().get(0)); generalView.setMainTabSelectedItem((VM) object.getSelectedItem()); firstSelection = true; } splitLayoutPanel.clear(); splitLayoutPanel.addSouth(subTabLayoutpanel, 230); ScrollPanel sp = new ScrollPanel(); sp.add(table); splitLayoutPanel.add(sp); table.getElement().getStyle().setPosition(Position.RELATIVE); } }); nicTable.edit((VmImportInterfaceListModel) object.getDetailModels().get(1)); diskTable.edit((VmImportDiskListModel) object.getDetailModels().get(2)); appTable.edit((VmAppListModel) object.getDetailModels().get(3)); Driver.driver.edit(object); } @Override public ImportVmModel flush() { table.flush(); nicTable.flush(); diskTable.flush(); appTable.flush(); return Driver.driver.flush(); } interface WidgetStyle extends CssResource { String contentWidth(); } }