package org.ovirt.engine.api.restapi.resource;
import static org.ovirt.engine.api.common.util.ReflectionHelper.assignChildModel;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.common.security.auth.Principal;
import org.ovirt.engine.api.common.util.QueryHelper;
import org.ovirt.engine.api.model.Group;
import org.ovirt.engine.api.model.Groups;
import org.ovirt.engine.api.model.User;
import org.ovirt.engine.api.resource.GroupResource;
import org.ovirt.engine.api.resource.GroupsResource;
import org.ovirt.engine.core.common.action.AdElementParametersBase;
import org.ovirt.engine.core.common.action.AddUserParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.DbUser;
import org.ovirt.engine.core.common.businessentities.ad_groups;
import org.ovirt.engine.core.common.interfaces.SearchType;
import org.ovirt.engine.core.common.queries.GetAdGroupByIdParameters;
import org.ovirt.engine.core.common.queries.SearchParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.StringHelper;
public class BackendGroupsResource extends AbstractBackendCollectionResource<Group, ad_groups>
implements GroupsResource {
static final String[] SUB_COLLECTIONS = { "permissions", "roles", "tags" };
protected static final String AD_SEARCH_TEMPLATE = "ADGROUP@{0}: ";
private static final String GROUPS_SEARCH_PATTERN = "usrname = \"\"";
private static final String AND_SEARCH_PATTERN = " and ";
private BackendDomainResource parent;
public BackendGroupsResource() {
super(Group.class, ad_groups.class, SUB_COLLECTIONS);
}
public BackendGroupsResource(String id, BackendDomainResource parent) {
super(Group.class, ad_groups.class, SUB_COLLECTIONS);
this.parent = parent;
}
@Override
public Groups list() {
if(parent==null)
return mapDbGroupsCollection(getGroupsCollection(SearchType.DBUser, getSearchPattern()));
return mapDomainGroupsCollection(getGroupsFromDomain());
}
private String getSearchPattern() {
String user_defined_pattern = QueryHelper.getConstraint(getUriInfo(), "", User.class);
return user_defined_pattern.equals("Users : ") ?
user_defined_pattern + GROUPS_SEARCH_PATTERN
:
user_defined_pattern + AND_SEARCH_PATTERN + GROUPS_SEARCH_PATTERN;
}
@Override
public Response add(Group group) {
validateParameters(group, "name");
// somewhat counter-intuitively, the AddUserCommand is used
// to add groups as well as users
AddUserParameters newGroup = new AddUserParameters();
newGroup.setAdGroup(getAdGroup(group));
return performCreation(VdcActionType.AddUser, newGroup, new GroupIdResolver(newGroup.getAdGroup().getid()));
}
@Override
public Response performRemove(String id) {
return performAction(VdcActionType.RemoveAdGroup, new AdElementParametersBase(asGuid(id)));
}
@Override
@SingleEntityResource
public GroupResource getGroupSubResource(String id) {
return inject(new BackendGroupResource(id, this));
}
protected Groups mapDomainGroupsCollection(List<ad_groups> entities) {
Groups collection = new Groups();
for (ad_groups entity : entities) {
collection.getGroups().add(addLinks(modifyDomain(mapAdGroup(entity)), true));
}
return collection;
}
protected Groups mapDbGroupsCollection(List<DbUser> entities) {
Groups collection = new Groups();
for (DbUser entity : entities) {
collection.getGroups().add(addLinks(modifyDomain(mapDbUser(entity))));
}
return collection;
}
private Group modifyDomain(Group group) {
if(group.getDomain()!=null)
group.getDomain().setName(null);
return group;
}
protected Group mapAdGroup(ad_groups entity) {
return getMapper(ad_groups.class, Group.class).map(entity, null);
}
protected Group mapDbUser(DbUser entity) {
return getMapper(DbUser.class, Group.class).map(entity, null);
}
@Override
protected Group addParents(Group group) {
if(parent!=null){
assignChildModel(group, Group.class).setId(parent.get().getId());
}
return group;
}
protected String getSearchPattern(String param) {
String constraint = QueryHelper.getConstraint(getUriInfo(), ad_groups.class, false);
StringBuffer sb = new StringBuffer();
sb.append(MessageFormat.format(AD_SEARCH_TEMPLATE,
parent!=null?
parent.getDirectory().getName()
:
getCurrent().get(Principal.class).getDomain()));
sb.append(StringHelper.isNullOrEmpty(constraint)?
"name="+param
:
constraint);
return sb.toString();
}
protected ad_groups getAdGroup(Group group) {
List<ad_groups> adGroups = asCollection(getEntity(ArrayList.class,
SearchType.AdGroup,
getSearchPattern("*")));
for (ad_groups adGroup : adGroups) {
if (adGroup.getname().equals(group.getName())) {
return adGroup;
}
}
return handleError(new EntityNotFoundException(group.getName()), true);
}
protected List<ad_groups> getGroupsFromDomain() {
return asCollection(ad_groups.class,
getEntity(ArrayList.class,
SearchType.AdGroup,
getSearchPattern("*")));
}
public ad_groups lookupGroupById(Guid id) {
return getEntity(ad_groups.class,
VdcQueryType.GetAdGroupById,
new GetAdGroupByIdParameters(id),
id.toString());
}
protected class GroupIdResolver extends EntityIdResolver {
private Guid id;
GroupIdResolver(Guid id) {
this.id = id;
}
@Override
public ad_groups lookupEntity(Guid nullId) {
return lookupGroupById(id);
}
}
protected List<DbUser> getGroupsCollection(SearchType searchType, String constraint) {
return getBackendCollection(DbUser.class,
VdcQueryType.Search,
new SearchParameters(constraint,
searchType));
}
}