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.BaseResource; import org.ovirt.engine.api.model.User; import org.ovirt.engine.api.model.Users; import org.ovirt.engine.api.resource.UserResource; import org.ovirt.engine.api.resource.UsersResource; 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.AdUser; import org.ovirt.engine.core.common.businessentities.DbUser; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.users.VdcUser; import org.ovirt.engine.core.common.queries.GetDbUserByUserIdParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.NGuid; import org.ovirt.engine.core.compat.StringHelper; public class BackendUsersResource extends AbstractBackendCollectionResource<User, DbUser> implements UsersResource { static final String[] SUB_COLLECTIONS = { "permissions", "roles", "tags" }; protected static final String AD_SEARCH_TEMPLATE = "ADUSER@{0}: "; private static final String USERS_SEARCH_PATTERN = "usrname != \"\""; private static final String AND_SEARCH_PATTERN = " and "; private BackendDomainResource parent; public BackendUsersResource() { super(User.class, DbUser.class, SUB_COLLECTIONS); } public BackendUsersResource(String id, BackendDomainResource parent) { super(User.class, DbUser.class, SUB_COLLECTIONS); this.parent = parent; } @Override public Users list() { if(parent==null) return mapDbUserCollection(getBackendCollection(SearchType.DBUser, getSearchPattern())); return mapDomainUserCollection(getUsersFromDomain()); } private String getSearchPattern() { String user_defined_pattern = QueryHelper.getConstraint(getUriInfo(), "", modelType); return user_defined_pattern.equals("Users : ") ? user_defined_pattern + USERS_SEARCH_PATTERN : user_defined_pattern + AND_SEARCH_PATTERN + USERS_SEARCH_PATTERN; } @Override public Response add(User user) { validateParameters(user, "userName"); String domain = getDomain(user); AdUser adUser = getEntity(AdUser.class, SearchType.AdUser, getSearchPattern(user.getUserName(), domain)); AddUserParameters newUser = new AddUserParameters(); newUser.setVdcUser(map(adUser)); return performCreation(VdcActionType.AddUser, newUser, new UserIdResolver(adUser.getUserId())); } private String getDomain(User user) { if (user.isSetDomain() && user.getDomain().isSetName()) { return user.getDomain().getName(); } else if (user.isSetDomain() && user.getDomain().isSetId()) { List<String> domains = getBackendCollection( String.class, VdcQueryType.GetDomainList, new VdcQueryParametersBase()); for (String domain :domains) { NGuid domainId = new NGuid(domain.getBytes(), true); if (domainId.toString().equals(user.getDomain().getId())) { return domain; } } } else if (user.isSetUserName() && user.getUserName().contains("@")) { return user.getUserName().substring(user.getUserName().indexOf("@")+1); } return getCurrentDomain(); } protected String getCurrentDomain() { return getCurrent().get(Principal.class).getDomain(); } protected String getSearchPattern(String username, String domain) { String constraint = QueryHelper.getConstraint(getUriInfo(), DbUser.class, false); StringBuffer sb = new StringBuffer(); sb.append(MessageFormat.format(AD_SEARCH_TEMPLATE, parent!=null? parent.getDirectory().getName() : domain)); sb.append(StringHelper.isNullOrEmpty(constraint)? "allnames=" + username : constraint); return sb.toString(); } protected List<AdUser> getUsersFromDomain() { return asCollection(AdUser.class, getEntity(ArrayList.class, SearchType.AdUser, getSearchPattern("*", getCurrentDomain()))); } @Override public Response performRemove(String id) { return performAction(VdcActionType.RemoveUser, new AdElementParametersBase(asGuid(id))); } @Override @SingleEntityResource public UserResource getUserSubResource(String id) { return inject(new BackendUserResource(id, this)); } protected Users mapDbUserCollection(List<DbUser> entities) { Users collection = new Users(); for (DbUser entity : entities) { collection.getUsers().add(addLinks(modifyDomain(map(entity)), BaseResource.class)); } return collection; } @Override protected User addParents(User user) { if(parent!=null){ assignChildModel(user, User.class).setId(parent.get().getId()); } return user; } protected Users mapDomainUserCollection(List<AdUser> entities) { Users collection = new Users(); for (AdUser entity : entities) { collection.getUsers().add(addLinks(modifyDomain(mapAdUser(entity)), true)); } return collection; } private User modifyDomain(User user) { if(user.getDomain()!=null) user.getDomain().setName(null); return user; } protected VdcUser map(AdUser adUser) { return getMapper(AdUser.class, VdcUser.class).map(adUser, null); } protected User mapAdUser(AdUser adUser) { return getMapper(AdUser.class, User.class).map(adUser, null); } public DbUser lookupUserById(Guid id) { return getEntity(DbUser.class, VdcQueryType.GetDbUserByUserId, new GetDbUserByUserIdParameters(id), id.toString()); } protected class UserIdResolver extends EntityIdResolver { private Guid id; UserIdResolver(Guid id) { this.id = id; } @Override public DbUser lookupEntity(Guid nullId) { return lookupUserById(id); } } }