package org.ovirt.engine.ui.webadmin.section.main.view.tab;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterTaskSupport;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType;
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.AbstractEnumColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn;
import org.ovirt.engine.ui.frontend.utils.GlusterVolumeUtils;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.volumes.VolumeListModel;
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.MainTabVolumePresenter;
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 org.ovirt.engine.ui.webadmin.widget.table.cell.MenuCell;
import org.ovirt.engine.ui.webadmin.widget.table.cell.VolumeActivityCompositeCell;
import org.ovirt.engine.ui.webadmin.widget.table.cell.VolumeActivitySeperatorCell;
import org.ovirt.engine.ui.webadmin.widget.table.cell.VolumeCapacityCell;
import org.ovirt.engine.ui.webadmin.widget.table.cell.VolumeTaskWaitingCell;
import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityStatusColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeBrickStatusColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeInfoColumn;
import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeStatusColumn;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.cellview.client.Column;
import com.google.inject.Inject;
public class MainTabVolumeView extends AbstractMainTabWithDetailsTableView<GlusterVolumeEntity, VolumeListModel> implements MainTabVolumePresenter.ViewDef {
interface ViewIdHandler extends ElementIdHandler<MainTabVolumeView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public MainTabVolumeView(MainModelProvider<GlusterVolumeEntity, VolumeListModel> modelProvider) {
super(modelProvider);
ViewIdHandler.idHandler.generateAndSetIds(this);
initTable(modelProvider.getModel());
initWidget(getTable());
}
void initTable(VolumeListModel model) {
getTable().enableColumnResizing();
VolumeStatusColumn statusColumn = new VolumeStatusColumn(model.getStartCommand());
statusColumn.setContextMenuTitle(constants.statusVolume());
statusColumn.makeSortable(Comparator.comparingInt(g -> GlusterVolumeUtils.getVolumeStatus(g).ordinal()));
getTable().addColumn(statusColumn, constants.empty(), "30px"); //$NON-NLS-1$
AbstractTextColumn<GlusterVolumeEntity> nameColumn = new AbstractTextColumn<GlusterVolumeEntity>() {
@Override
public String getValue(GlusterVolumeEntity object) {
return object.getName();
}
};
nameColumn.makeSortable();
getTable().addColumn(nameColumn, constants.nameVolume(), "150px"); //$NON-NLS-1$
AbstractTextColumn<GlusterVolumeEntity> clusterColumn = new AbstractTextColumn<GlusterVolumeEntity>() {
@Override
public String getValue(GlusterVolumeEntity object) {
return object.getClusterName();
}
};
clusterColumn.makeSortable();
getTable().addColumn(clusterColumn, constants.clusterVolume(), "150px"); //$NON-NLS-1$
AbstractTextColumn<GlusterVolumeEntity> volumeTypeColumn =
new AbstractEnumColumn<GlusterVolumeEntity, GlusterVolumeType>() {
@Override
protected GlusterVolumeType getRawValue(GlusterVolumeEntity object) {
return object.getVolumeType();
}
};
volumeTypeColumn.makeSortable();
getTable().addColumn(volumeTypeColumn, constants.volumeTypeVolume(), "150px"); //$NON-NLS-1$
getTable().addColumn(new VolumeBrickStatusColumn(), constants.bricksStatusVolume(), "150px"); //$NON-NLS-1$
getTable().addColumn(new VolumeInfoColumn(), constants.volumeInfoVolume(), "100px"); //$NON-NLS-1$
MenuCell<GlusterTaskSupport> rebalanceMenuCell = getRebalanceActivityMenu();
MenuCell<GlusterTaskSupport> removeBricksMenuCell = getRemoveBrickActivityMenu();
List<HasCell<GlusterTaskSupport, ?>> list = new ArrayList<>();
list.add(new VolumeActivityStatusColumn<>());
list.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(new VolumeActivitySeperatorCell<GlusterTaskSupport>()) {
@Override
public GlusterTaskSupport getValue(GlusterTaskSupport object) {
return object;
}
});
list.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(rebalanceMenuCell) {
@Override
public GlusterTaskSupport getValue(GlusterTaskSupport object) {
return object;
}
});
list.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(removeBricksMenuCell) {
@Override
public GlusterTaskSupport getValue(GlusterTaskSupport object) {
return object;
}
});
List<HasCell<GlusterTaskSupport, ?>> compositeList = new ArrayList<>();
compositeList.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(new VolumeTaskWaitingCell<>()) {
@Override
public GlusterTaskSupport getValue(GlusterTaskSupport object) {
return object;
}
});
compositeList.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(new VolumeActivityCompositeCell<>(list)) {
@Override
public GlusterTaskSupport getValue(GlusterTaskSupport object) {
return object;
}
});
Column<GlusterVolumeEntity, GlusterVolumeEntity> capacityColumn = new Column<GlusterVolumeEntity, GlusterVolumeEntity>(new VolumeCapacityCell()) {
@Override
public GlusterVolumeEntity getValue(GlusterVolumeEntity object) {
return object;
}
};
getTable().addColumn(capacityColumn, constants.volumeCapacity(), "100px");//$NON-NLS-1$
getTable().addColumn(new VolumeActivityColumn<GlusterVolumeEntity>(
new VolumeActivityCompositeCell<GlusterTaskSupport>(compositeList)),
constants.activitiesOnVolume(),
"100px"); //$NON-NLS-1$
AbstractTextColumn<GlusterVolumeEntity> snapshotCountColumn =
new AbstractTextColumn<GlusterVolumeEntity>() {
@Override
public String getValue(GlusterVolumeEntity object) {
return object.getSnapshotsCount().toString();
}
};
snapshotCountColumn.makeSortable();
getTable().addColumn(snapshotCountColumn, constants.noOfSnapshotsLabel(), "100px"); //$NON-NLS-1$
getTable().addActionButton(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.newVolume()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getNewVolumeCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.removeVolume()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getRemoveVolumeCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.startVolume()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStartCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.stopVolume()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStopCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.rebalanceVolume()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStartRebalanceCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.optimizeForVirtStore()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getOptimizeForVirtStoreCommand();
}
});
List<ActionButtonDefinition<GlusterVolumeEntity>> volumeProfilingActions = new LinkedList<>();
volumeProfilingActions.add(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.startVolumeProfiling()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStartVolumeProfilingCommand();
}
});
volumeProfilingActions.add(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.volumeProfileDetails()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getShowVolumeProfileDetailsCommand();
}
});
volumeProfilingActions.add(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.stopVolumeProfiling()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStopVolumeProfilingCommand();
}
});
getTable().addActionButton(new WebAdminMenuBarButtonDefinition<>(constants.volumeProfilingAction(),
volumeProfilingActions,
CommandLocation.ContextAndToolBar));
getTable().addActionButton(new WebAdminMenuBarButtonDefinition<>(constants.volumeSnapshotMainTabTitle(),
getVolumeSnapshotMenu(),
CommandLocation.ContextAndToolBar));
getTable().addActionButton(new WebAdminMenuBarButtonDefinition<>(constants.geoReplicationMainTabTitle(),
getGeoRepCreateMenu(constants),
CommandLocation.ContextAndToolBar));
}
private List<ActionButtonDefinition<GlusterVolumeEntity>> getGeoRepCreateMenu(ApplicationConstants constants) {
List<ActionButtonDefinition<GlusterVolumeEntity>> geoRepMenu = new ArrayList<>();
WebAdminButtonDefinition<GlusterVolumeEntity> geoRepButton =
new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.newGeoRepSession()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getNewGeoRepSessionCommand();
}
};
geoRepMenu.add(geoRepButton);
return geoRepMenu;
}
private List<ActionButtonDefinition<GlusterVolumeEntity>> getVolumeSnapshotMenu() {
List<ActionButtonDefinition<GlusterVolumeEntity>> snapshotMenu = new ArrayList<>();
WebAdminButtonDefinition<GlusterVolumeEntity> newSnapshotButton =
new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.newVolumeSnapshot()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getCreateSnapshotCommand();
}
};
snapshotMenu.add(newSnapshotButton);
WebAdminButtonDefinition<GlusterVolumeEntity> editSnapshotScheduleButton =
new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.editVolumeSnapshotSchedule()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getEditSnapshotScheduleCommand();
}
};
snapshotMenu.add(editSnapshotScheduleButton);
WebAdminButtonDefinition<GlusterVolumeEntity> configureClusterSnapshotOptionsButton = new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.configureClusterSnapshotOptions()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getConfigureClusterSnapshotOptionsCommand();
}
};
WebAdminButtonDefinition<GlusterVolumeEntity> configureVolumeSnapshotOptionsButton = new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.configureVolumeSnapshotOptions()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getConfigureVolumeSnapshotOptionsCommand();
}
};
snapshotMenu.add(configureClusterSnapshotOptionsButton);
snapshotMenu.add(configureVolumeSnapshotOptionsButton);
return snapshotMenu;
}
private MenuCell<GlusterTaskSupport> getRebalanceActivityMenu() {
MenuCell<GlusterTaskSupport> menuCell = new MenuCell<GlusterTaskSupport>() {
@Override
protected boolean isVisible(GlusterTaskSupport value) {
return value.getAsyncTask() != null && value.getAsyncTask().getType() == GlusterTaskType.REBALANCE;
}
};
menuCell.addMenuItem(new WebAdminButtonDefinition<GlusterTaskSupport>(constants.statusRebalance()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStatusRebalanceCommand();
}
});
menuCell.addMenuItem(new WebAdminButtonDefinition<GlusterTaskSupport>(constants.stopRebalance()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getStopRebalanceCommand();
}
});
return menuCell;
}
private MenuCell<GlusterTaskSupport> getRemoveBrickActivityMenu() {
MenuCell<GlusterTaskSupport> menuCell = new MenuCell<GlusterTaskSupport>() {
@Override
protected boolean isVisible(GlusterTaskSupport value) {
return value.getAsyncTask() != null && value.getAsyncTask().getType() == GlusterTaskType.REMOVE_BRICK;
}
};
menuCell.addMenuItem(new WebAdminButtonDefinition<GlusterTaskSupport>(constants.removeBricksStatus()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getBrickListModel()
.getStatusRemoveBricksCommand();
}
});
menuCell.addMenuItem(new WebAdminButtonDefinition<GlusterTaskSupport>(constants.removeBricksStop()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getBrickListModel()
.getStopRemoveBricksCommand();
}
});
menuCell.addMenuItem(new WebAdminButtonDefinition<GlusterTaskSupport>(constants.removeBricksCommit()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getBrickListModel()
.getCommitRemoveBricksCommand();
}
});
menuCell.addMenuItem(new WebAdminButtonDefinition<GlusterTaskSupport>(constants.retainBricks()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getBrickListModel()
.getRetainBricksCommand();
}
});
return menuCell;
}
}