package org.ovirt.engine.api.restapi.resource; import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Permit; import org.ovirt.engine.api.model.Permits; import org.ovirt.engine.api.model.Role; import org.ovirt.engine.api.resource.PermitResource; import org.ovirt.engine.api.resource.PermitsResource; import org.ovirt.engine.core.common.action.ActionGroupsToRoleParameter; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendPermitsResource extends AbstractBackendCollectionResource<Permit, ActionGroup> implements PermitsResource { protected Guid roleId; public BackendPermitsResource(Guid roleId) { super(Permit.class, ActionGroup.class); this.roleId = roleId; } @Override public Permits list() { return mapCollection(getBackendCollection(VdcQueryType.GetRoleActionGroupsByRoleId, new IdQueryParameters(roleId))); } @Override public Response add(Permit permit) { validateParameters(permit, "name|id"); ArrayList<ActionGroup> actionGroups = new ArrayList<>(); addIfNotExists(actionGroups, map(permit)); return performCreate(VdcActionType.AttachActionGroupsToRole, new ActionGroupsToRoleParameter(roleId, actionGroups), new PermitIdResolver(actionGroups.get(0))); } private void addIfNotExists(List<ActionGroup> list, ActionGroup item) { if (!list.contains(item)) { list.add(item); } } @Override public PermitResource getPermitResource(String id) { return inject(new BackendPermitResource(id, this)); } public ActionGroup lookupId(String id) { try { return ActionGroup.forValue(Integer.parseInt(id)); } catch (NumberFormatException exception) { return null; } } protected Permits mapCollection(List<ActionGroup> entities) { Permits collection = new Permits(); for (ActionGroup entity : entities) { collection.getPermits().add(addLinks(map(entity))); } return collection; } @Override public Permit addParents(Permit permit) { permit.setRole(new Role()); permit.getRole().setId(roleId.toString()); return permit; } protected class PermitIdResolver extends EntityIdResolver<Guid> { private ActionGroup actionGroup; PermitIdResolver(ActionGroup actionGroup) { this.actionGroup = actionGroup; } @Override public ActionGroup lookupEntity(Guid id) { return actionGroup; } } }