package org.ovirt.engine.ui.webadmin.section.main.view.tab;
import java.util.LinkedList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType;
import org.ovirt.engine.core.searchbackend.DiskConditionFieldAutoCompleter;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.uicommon.model.MainModelProvider;
import org.ovirt.engine.ui.common.widget.action.ActionButtonDefinition;
import org.ovirt.engine.ui.common.widget.action.CommandLocation;
import org.ovirt.engine.ui.common.widget.table.column.AbstractColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractDiskSizeColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn;
import org.ovirt.engine.ui.common.widget.table.header.ImageResourceHeader;
import org.ovirt.engine.ui.common.widget.uicommon.disks.DisksViewColumns;
import org.ovirt.engine.ui.common.widget.uicommon.disks.DisksViewRadioGroup;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.CommonModel;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemType;
import org.ovirt.engine.ui.uicommonweb.models.disks.DiskListModel;
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.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.MainTabDiskPresenter;
import org.ovirt.engine.ui.webadmin.section.main.view.AbstractMainTabWithDetailsTableView;
import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition;
import org.ovirt.engine.ui.webadmin.widget.action.WebAdminMenuBarButtonDefinition;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class MainTabDiskView extends AbstractMainTabWithDetailsTableView<Disk, DiskListModel> implements MainTabDiskPresenter.ViewDef {
interface ViewIdHandler extends ElementIdHandler<MainTabDiskView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
@UiField
SimplePanel tablePanel;
private DisksViewRadioGroup disksViewRadioGroup;
private boolean isQuotaVisible;
private static AbstractTextColumn<Disk> aliasColumn;
private static AbstractTextColumn<Disk> idColumn;
private static AbstractDiskSizeColumn sizeColumn;
private static AbstractTextColumn<Disk> allocationColumn;
private static AbstractTextColumn<Disk> dateCreatedColumn;
private static AbstractColumn<Disk, Disk> statusColumn;
private static AbstractTextColumn<Disk> lunIdColumn;
private static AbstractTextColumn<Disk> lunSerialColumn;
private static AbstractTextColumn<Disk> lunVendorIdColumn;
private static AbstractTextColumn<Disk> lunProductIdColumn;
private static AbstractTextColumn<Disk> qoutaColumn;
private static AbstractTextColumn<Disk> diskStorageTypeColumn;
private static AbstractTextColumn<Disk> cinderVolumeTypeColumn;
private static AbstractTextColumn<Disk> descriptionColumn;
@Inject
Provider<CommonModel> commonModelProvider;
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public MainTabDiskView(MainModelProvider<Disk, DiskListModel> modelProvider) {
super(modelProvider);
ViewIdHandler.idHandler.generateAndSetIds(this);
initTableColumns();
initTableButtons();
initTableOverhead();
initWidget(getTable());
}
final ClickHandler clickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (((RadioButton) event.getSource()).getValue()) {
getMainModel().getDiskViewType().setEntity(disksViewRadioGroup.getDiskStorageType());
}
}
};
final IEventListener<EventArgs> diskTypeChangedEventListener = new IEventListener<EventArgs>() {
@Override
public void eventRaised(Event<? extends EventArgs> ev, Object sender, EventArgs args) {
EntityModel diskViewType = (EntityModel) sender;
disksViewRadioGroup.setDiskStorageType((DiskStorageType) diskViewType.getEntity());
if (commonModelProvider.get().getSelectedItem() instanceof DiskListModel) {
onDiskViewTypeChanged();
}
}
};
@Override
public IEventListener<EventArgs> getDiskTypeChangedEventListener() {
return diskTypeChangedEventListener;
}
@Override
public void handleQuotaColumnVisibility() {
isQuotaVisible = false;
SystemTreeItemModel treeItem =
commonModelProvider.get().getSystemTree().getSelectedItem();
if (treeItem != null
&& SystemTreeItemType.DataCenter == treeItem.getType()) {
StoragePool storagePool = (StoragePool) treeItem.getEntity();
if (QuotaEnforcementTypeEnum.DISABLED != storagePool.getQuotaEnforcementType()) {
isQuotaVisible = true;
}
}
onDiskViewTypeChanged();
}
void onDiskViewTypeChanged() {
boolean all = disksViewRadioGroup.getAllButton().getValue();
boolean images = disksViewRadioGroup.getImagesButton().getValue();
boolean luns = disksViewRadioGroup.getLunsButton().getValue();
boolean cinder = disksViewRadioGroup.getCinderButton().getValue();
searchByDiskViewType(disksViewRadioGroup.getDiskStorageType());
getTable().ensureColumnVisible(
aliasColumn, constants.aliasDisk(), all || images || luns || cinder,
"120px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
idColumn, constants.idDisk(), all || images || luns || cinder,
"120px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
DisksViewColumns.shareableDiskColumn,
new ImageResourceHeader(DisksViewColumns.shareableDiskColumn.getDefaultImage(),
SafeHtmlUtils.fromSafeConstant(constants.shareable())),
all || images || luns || cinder, "30px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
DisksViewColumns.diskContainersIconColumn, "", all || images || luns || cinder, //$NON-NLS-1$
"30px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
DisksViewColumns.diskContainersColumn, constants.attachedToDisk(), all || images || luns || cinder,
"125px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
DisksViewColumns.storageDomainsColumn, constants.storageDomainsDisk(), images || cinder,
"180px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
sizeColumn, constants.provisionedSizeDisk(), all || images || luns || cinder,
"110px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
allocationColumn, constants.allocationDisk(), images,
"130px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
cinderVolumeTypeColumn, constants.cinderVolumeTypeDisk(), cinder, "80px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
dateCreatedColumn, constants.creationDateDisk(), images || cinder,
"130px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
statusColumn, constants.statusDisk(), images || cinder || all,
"80px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
lunIdColumn, constants.lunIdSanStorage(), luns,
"100px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
lunSerialColumn, constants.serialSanStorage(), luns,
"100px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
lunVendorIdColumn, constants.vendorIdSanStorage(), luns,
"100px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
lunProductIdColumn, constants.productIdSanStorage(), luns,
"100px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
qoutaColumn, constants.quotaDisk(), images && isQuotaVisible, "120px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
diskStorageTypeColumn, constants.typeDisk(), all, "80px"); //$NON-NLS-1$
getTable().ensureColumnVisible(
descriptionColumn, constants.descriptionDisk(), all || images || luns || cinder,
"90px"); //$NON-NLS-1$
}
void initTableColumns() {
getTable().enableColumnResizing();
aliasColumn = DisksViewColumns.getAliasColumn(DiskConditionFieldAutoCompleter.ALIAS);
idColumn = DisksViewColumns.getIdColumn(DiskConditionFieldAutoCompleter.ID);
sizeColumn = DisksViewColumns.getSizeColumn(DiskConditionFieldAutoCompleter.PROVISIONED_SIZE);
allocationColumn = DisksViewColumns.getAllocationColumn(constants.empty());
dateCreatedColumn = DisksViewColumns.getDateCreatedColumn(DiskConditionFieldAutoCompleter.CREATION_DATE);
statusColumn = DisksViewColumns.getStatusColumn(DiskConditionFieldAutoCompleter.STATUS);
lunIdColumn = DisksViewColumns.getLunIdColumn(constants.empty());
lunSerialColumn = DisksViewColumns.getLunSerialColumn(constants.empty());
lunVendorIdColumn = DisksViewColumns.getLunVendorIdColumn(constants.empty());
lunProductIdColumn = DisksViewColumns.getLunProductIdColumn(constants.empty());
qoutaColumn = DisksViewColumns.getQoutaColumn(DiskConditionFieldAutoCompleter.QUOTA);
diskStorageTypeColumn = DisksViewColumns.getDiskStorageTypeColumn(DiskConditionFieldAutoCompleter.DISK_TYPE);
cinderVolumeTypeColumn = DisksViewColumns.getCinderVolumeTypeColumn(null);
descriptionColumn = DisksViewColumns.getDescriptionColumn(DiskConditionFieldAutoCompleter.DESCRIPTION);
}
void initTableOverhead() {
disksViewRadioGroup = new DisksViewRadioGroup();
disksViewRadioGroup.setClickHandler(clickHandler);
disksViewRadioGroup.addStyleName("mtdv_radioGroup_pfly_fix"); //$NON-NLS-1$
getTable().setTableOverhead(disksViewRadioGroup);
getTable().setTableTopMargin(20);
}
void initTableButtons() {
getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.newDisk()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getNewCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.removeDisk()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getRemoveCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.moveDisk()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getMoveCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.copyDisk()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getCopyCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.getDiskAlignment(),
CommandLocation.OnlyFromContext) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getScanAlignmentCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.exportDisk()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getExportCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.assignQuota()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getChangeQuotaCommand();
}
});
// Upload operations drop down
List<ActionButtonDefinition<Disk>> uploadActions = new LinkedList<>();
uploadActions.add(new WebAdminButtonDefinition<Disk>(constants.uploadImageStart()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getUploadCommand();
}
});
uploadActions.add(new WebAdminButtonDefinition<Disk>(constants.uploadImageCancel()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getCancelUploadCommand();
}
});
uploadActions.add(new WebAdminButtonDefinition<Disk>(constants.uploadImagePause()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getPauseUploadCommand();
}
});
uploadActions.add(new WebAdminButtonDefinition<Disk>(constants.uploadImageResume()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getResumeUploadCommand();
}
});
getTable().addActionButton(new WebAdminMenuBarButtonDefinition<>(
constants.uploadImage(), uploadActions));
}
void searchByDiskViewType(Object diskViewType) {
final String disksSearchPrefix = "Disks:"; //$NON-NLS-1$
final String diskTypeSearchPrefix = "disk_type = "; //$NON-NLS-1$
final String searchConjunctionAnd = "and "; //$NON-NLS-1$
final String searchRegexDisksSearchPrefix = "^\\s*(disk(s)?\\s*(:)+)+\\s*"; //$NON-NLS-1$
final String searchRegexDiskTypeClause = "\\s*((and|or)\\s+)?disk_type\\s*=\\s*\\S+"; //$NON-NLS-1$
final String searchRegexStartConjunction = "^\\s*(and|or)\\s*"; //$NON-NLS-1$
final String searchRegexFlags = "ig"; //$NON-NLS-1$
final String space = " "; //$NON-NLS-1$
final String empty = ""; //$NON-NLS-1$
final String colon = ":"; //$NON-NLS-1$
RegExp searchPatternDisksSearchPrefix = RegExp.compile(searchRegexDisksSearchPrefix, searchRegexFlags);
RegExp searchPatternDiskTypeClause = RegExp.compile(searchRegexDiskTypeClause, searchRegexFlags);
RegExp searchPatternStartConjunction = RegExp.compile(searchRegexStartConjunction, searchRegexFlags);
String diskTypePostfix = diskViewType != null ?
((DiskStorageType) diskViewType).name().toLowerCase() + space : null;
String diskTypeClause = diskTypePostfix != null ?
diskTypeSearchPrefix + diskTypePostfix : empty;
String inputSearchString = commonModelProvider.get().getSearchString().trim();
String inputSearchStringPrefix = commonModelProvider.get().getSearchStringPrefix().trim();
if (!inputSearchString.isEmpty() && inputSearchStringPrefix.isEmpty()) {
int indexOfColon = inputSearchString.indexOf(colon);
inputSearchStringPrefix = inputSearchString.substring(0, indexOfColon + 1).trim();
inputSearchString = inputSearchString.substring(indexOfColon + 1).trim();
}
if (inputSearchStringPrefix.isEmpty()) {
inputSearchStringPrefix = disksSearchPrefix;
inputSearchString = empty;
}
String searchStringPrefixRaw = searchPatternDiskTypeClause
.replace(inputSearchStringPrefix, empty).trim();
String searchStringPrefix;
if (diskTypeClause.equals(empty)) {
searchStringPrefix = searchStringPrefixRaw + space;
}
else {
searchStringPrefix = searchStringPrefixRaw + space
+ (searchPatternDisksSearchPrefix.test(searchStringPrefixRaw) ? empty : searchConjunctionAnd)
+ diskTypeClause;
}
inputSearchString = searchPatternDiskTypeClause
.replace(inputSearchString, empty);
inputSearchString = searchPatternStartConjunction
.replace(inputSearchString, empty);
String searchString;
if (searchPatternDisksSearchPrefix.test(searchStringPrefix) || inputSearchString.isEmpty()) {
searchString = inputSearchString;
}
else {
searchString = searchConjunctionAnd + inputSearchString;
}
commonModelProvider.get().setSearchStringPrefix(searchStringPrefix);
commonModelProvider.get().setSearchString(searchString);
getTable().getSelectionModel().clear();
getMainModel().setItems(null);
getMainModel().setSearchString(commonModelProvider.get().getEffectiveSearchString());
getMainModel().search();
}
}