package org.ovirt.engine.ui.uicommonweb.models.configure;
import java.util.ArrayList;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.PermissionsOperationsParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.MacPool;
import org.ovirt.engine.core.common.businessentities.Permission;
import org.ovirt.engine.core.common.businessentities.Quota;
import org.ovirt.engine.core.common.businessentities.Role;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmPool;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.aaa.DbGroup;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.VnicProfile;
import org.ovirt.engine.core.common.businessentities.profiles.CpuProfile;
import org.ovirt.engine.core.common.businessentities.profiles.DiskProfile;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.auth.ApplicationGuids;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModel;
import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModel.AdSearchType;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class PermissionListModel<E> extends SearchableListModel<E, Permission> {
private UICommand privateAddCommand;
public UICommand getAddCommand() {
return privateAddCommand;
}
private void setAddCommand(UICommand value) {
privateAddCommand = value;
}
private UICommand privateRemoveCommand;
public UICommand getRemoveCommand() {
return privateRemoveCommand;
}
private void setRemoveCommand(UICommand value) {
privateRemoveCommand = value;
}
private final Provider<AdElementListModel> adElementListModelProvider;
@Inject
public PermissionListModel(Provider<AdElementListModel> adElementListModelProvider) {
this.adElementListModelProvider = adElementListModelProvider;
setTitle(ConstantsManager.getInstance().getConstants().permissionsTitle());
setHelpTag(HelpTag.permissions);
setHashName("permissions"); //$NON-NLS-1$
setAddCommand(new UICommand("New", this)); //$NON-NLS-1$
setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
updateActionAvailability();
}
@Override
protected void onEntityChanged() {
super.onEntityChanged();
getSearchCommand().execute();
updateActionAvailability();
}
@Override
public void search() {
if (getEntity() != null) {
super.search();
}
}
@Override
protected void syncSearch() {
VdcObjectType objType = getObjectType();
GetPermissionsForObjectParameters tempVar = new GetPermissionsForObjectParameters();
tempVar.setObjectId(getEntityGuid());
tempVar.setVdcObjectType(objType);
tempVar.setDirectOnly(false);
tempVar.setRefresh(getIsQueryFirstTime());
tempVar.setAllUsersWithPermission(getAllUsersWithPermission());
super.syncSearch(VdcQueryType.GetPermissionsForObject, tempVar);
}
public boolean getAllUsersWithPermission() {
return false;
}
private void add() {
if (getWindow() != null) {
return;
}
AdElementListModel model = adElementListModelProvider.get();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().addPermissionToUserTitle());
model.setHelpTag(HelpTag.add_permission_to_user);
model.setHashName("add_permission_to_user"); //$NON-NLS-1$
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnAdd", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
private void remove() {
if (getWindow() != null) {
return;
}
ConfirmationModel model = new ConfirmationModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().removePermissionTitle());
model.setHelpTag(HelpTag.remove_permission);
model.setHashName("remove_permission"); //$NON-NLS-1$
model.setItems(getSelectedItems());
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnRemove", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
private void onRemove() {
if (getSelectedItems() != null && getSelectedItems().size() > 0) {
ConfirmationModel model = (ConfirmationModel) getWindow();
if (model.getProgress() != null) {
return;
}
ArrayList<VdcActionParametersBase> list = new ArrayList<>();
for (Object perm : getSelectedItems()) {
PermissionsOperationsParameters tempVar = new PermissionsOperationsParameters();
tempVar.setPermission((Permission) perm);
list.add(tempVar);
}
model.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.RemovePermission, list,
result -> {
ConfirmationModel localModel = (ConfirmationModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
}
}
private void onAdd() {
AdElementListModel model = (AdElementListModel) getWindow();
if (model.getProgress() != null) {
return;
}
if (model.getSearchType() != AdSearchType.EVERYONE && model.getSelectedItems() == null) {
cancel();
return;
}
ArrayList<DbUser> items = new ArrayList<>();
if (model.getSearchType() == AdSearchType.EVERYONE) {
DbUser tempVar = new DbUser();
tempVar.setId(ApplicationGuids.everyone.asGuid());
items.add(tempVar);
}
else {
for (Object item : model.getItems()) {
EntityModel entityModel = (EntityModel) item;
if (entityModel.getIsSelected()) {
items.add((DbUser) entityModel.getEntity());
}
}
}
Role role = model.getRole().getSelectedItem();
// adGroup/user
ArrayList<VdcActionParametersBase> list = new ArrayList<>();
for (DbUser user : items) {
Permission perm = new Permission(user.getId(), role.getId(), getEntityGuid(), getObjectType());
if (user.isGroup()) {
DbGroup group = new DbGroup();
group.setId(user.getId());
group.setExternalId(user.getExternalId());
group.setName(user.getFirstName());
group.setDomain(user.getDomain());
group.setNamespace(user.getNamespace());
PermissionsOperationsParameters tempVar3 = new PermissionsOperationsParameters();
tempVar3.setPermission(perm);
tempVar3.setGroup(group);
list.add(tempVar3);
}
else {
PermissionsOperationsParameters tempVar4 = new PermissionsOperationsParameters();
tempVar4.setPermission(perm);
tempVar4.setUser(user);
list.add(tempVar4);
}
}
model.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.AddPermission, list,
result -> {
AdElementListModel localModel = (AdElementListModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
}
private void cancel() {
setWindow(null);
}
@Override
protected void onSelectedItemChanged() {
super.onSelectedItemChanged();
updateActionAvailability();
}
@Override
protected void selectedItemsChanged() {
super.selectedItemsChanged();
updateActionAvailability();
}
@Override
protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) {
super.entityPropertyChanged(sender, e);
if (e.propertyName.equals("status")) { //$NON-NLS-1$
updateActionAvailability();
}
}
private void updateActionAvailability() {
getRemoveCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() > 0);
if (!getRemoveCommand().getIsExecutionAllowed()) {
return;
}
Guid entityGuid = getEntityGuid();
for (Object p : getSelectedItems()) {
if (!entityGuid.equals(((Permission) p).getObjectId())) {
getRemoveCommand().setIsExecutionAllowed(false);
return;
}
}
}
protected Guid getEntityGuid() {
return AsyncDataProvider.getInstance().getEntityGuid(getEntity());
}
protected VdcObjectType getObjectType() {
if (getEntity() instanceof VM) {
return VdcObjectType.VM;
}
if (getEntity() instanceof StoragePool) {
return VdcObjectType.StoragePool;
}
if (getEntity() instanceof Cluster) {
return VdcObjectType.Cluster;
}
if (getEntity() instanceof VDS) {
return VdcObjectType.VDS;
}
if (getEntity() instanceof StorageDomain) {
return VdcObjectType.Storage;
}
if (getEntity() instanceof VmTemplate) {
return VdcObjectType.VmTemplate;
}
if (getEntity() instanceof VmPool) {
return VdcObjectType.VmPool;
}
if (getEntity() instanceof Quota) {
return VdcObjectType.Quota;
}
if (getEntity() instanceof GlusterVolumeEntity) {
return VdcObjectType.GlusterVolume;
}
if (getEntity() instanceof Disk) {
return VdcObjectType.Disk;
}
if (getEntity() instanceof Network) {
return VdcObjectType.Network;
}
if (getEntity() instanceof VnicProfile){
return VdcObjectType.VnicProfile;
}
if (getEntity() instanceof DiskProfile) {
return VdcObjectType.DiskProfile;
}
if (getEntity() instanceof CpuProfile) {
return VdcObjectType.CpuProfile;
}
if (getEntity() instanceof MacPool) {
return VdcObjectType.MacPool;
}
return VdcObjectType.Unknown;
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == getAddCommand()) {
add();
}
else if (command == getRemoveCommand()) {
remove();
}
else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$
onRemove();
}
else if ("OnAdd".equals(command.getName())) { //$NON-NLS-1$
onAdd();
}
else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$
cancel();
}
}
@Override
protected String getListName() {
return "PermissionListModel"; //$NON-NLS-1$
}
}