/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC
* LICENSE as published by the Free Software Foundation under
* version 3 of the License
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package com.abiquo.api.resources;
import java.util.LinkedList;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import org.apache.wink.common.annotations.Parent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.abiquo.api.exceptions.APIError;
import com.abiquo.api.exceptions.NotFoundException;
import com.abiquo.api.resources.cloud.VirtualMachinesResource;
import com.abiquo.api.services.EnterpriseService;
import com.abiquo.api.services.UserService;
import com.abiquo.api.services.cloud.VirtualMachineService;
import com.abiquo.api.spring.security.SecurityService;
import com.abiquo.api.util.IRESTBuilder;
import com.abiquo.model.enumerator.Privileges;
import com.abiquo.server.core.cloud.NodeVirtualImage;
import com.abiquo.server.core.cloud.VirtualDatacenter;
import com.abiquo.server.core.cloud.VirtualMachine;
import com.abiquo.server.core.cloud.VirtualMachinesDto;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.enterprise.EnterpriseDto;
import com.abiquo.server.core.enterprise.User;
import com.abiquo.server.core.enterprise.UserDto;
import com.abiquo.server.core.enterprise.UserWithRoleDto;
@Parent(UsersResource.class)
@Path(UserResource.USER_PARAM)
@Controller
public class UserResource extends AbstractResource
{
public static final String USER = "user";
public static final String NAME = "name";
public static final String USER_PARAM = "{" + USER + "}";
public static final String USER_ACTION_GET_VIRTUALMACHINES_PATH = "action/virtualmachines";
@Autowired
private UserService service;
@Autowired
private EnterpriseService enterpriseService;
@Autowired
private VirtualMachineService vmService;
@Autowired
private SecurityService securityService;
/**
* Returns a user from an enterprise
*
* @title Retrieve a user
* @param enterpriseIdOrWildcard identifier of the enterprise or the '_' wildcard if enterprise
* is unknown
* @param userId identifier of the user
* @param restBuilder a Context-injected object to create the links of the Dto
* @return a {userDto} object with the requested user
* @throws Exception
*/
@GET
@Produces(UserDto.MEDIA_TYPE)
public UserDto getUser(
@PathParam(EnterpriseResource.ENTERPRISE) final String enterpriseIdOrWildcard,
@PathParam(USER) final Integer userId,
@QueryParam(NAME) @DefaultValue("false") final Boolean userName,
@Context final IRESTBuilder restBuilder) throws Exception
{
// ABICLOUDPREMIUM-3179
// We just need the user name. In case user has just the
// PHYS_DC_RETRIEVE_DETAILS privilege, we don't return too much information
if (userName && securityService.hasPrivilege(Privileges.PHYS_DC_RETRIEVE_DETAILS))
{
User user = service.getUser(userId, true);
UserDto u = new UserDto();
u.setName(user.getName());
u.setSurname(user.getSurname());
return u;
}
if (!securityService.hasPrivilege(Privileges.USERS_VIEW))
{
User currentUser = service.getCurrentUser();
if (currentUser.getId().equals(userId))
{
User user = service.getUser(userId);
return createTransferObject(user, restBuilder);
}
else
{
// throws access denied exception
securityService.requirePrivilege(Privileges.USERS_VIEW);
}
}
if (!enterpriseIdOrWildcard.equals("_"))
{
validatePathParameters(Integer.valueOf(enterpriseIdOrWildcard), userId);
}
User user = service.getUser(userId);
return createTransferObject(user, restBuilder);
}
/**
* Updates a user with the given data
*
* @title Updates an existing user
* @wiki When updating an existing user, the password field can be omitted if you do not want to
* change it.
* @param enterpriseIdOrWildcard identifier of the enterprise or the '_' wildcard if enterprise
* is unknown
* @param userId identifier of the user
* @param user user to modify
* @param restBuilder a Context-injected object to create the links of the Dto
* @return a {userDto} object with the modified user
* @throws Exception
*/
@PUT
@Consumes(UserDto.MEDIA_TYPE)
@Produces(UserDto.MEDIA_TYPE)
public UserDto modifyUser(
@PathParam(EnterpriseResource.ENTERPRISE) final String enterpriseIdOrWildcard,
@PathParam(USER) final Integer userId, final UserDto user,
@Context final IRESTBuilder restBuilder) throws Exception
{
if (!enterpriseIdOrWildcard.equals("_"))
{
validatePathParameters(Integer.valueOf(enterpriseIdOrWildcard), userId);
}
User u = service.modifyUser(userId, user);
return createTransferObject(u, restBuilder);
}
/**
* Deletes a user from an enterprise.
*
* @title Detele an existing user
* @param enterpriseId indentifier of the enterprise
* @param userId identifier of the user to delete
*/
@DELETE
public void deleteUser(@PathParam(EnterpriseResource.ENTERPRISE) final Integer enterpriseId,
@PathParam(USER) final Integer userId)
{
validatePathParameters(enterpriseId, userId);
service.removeUser(userId);
}
/**
* Returns the virtual machines of a user
*
* @title Retrieve the list of virtual machines by user
* @param enterpriseId identifier of the enterprise
* @param userId identifier of the user
* @param restBuilder a Context-injected object to create the links of the Dto
* @return a {VirtualMachinesDto} object with all virtual machines of the user
* @throws Exception
*/
@GET
@Path(UserResource.USER_ACTION_GET_VIRTUALMACHINES_PATH)
@Produces(VirtualMachinesDto.MEDIA_TYPE)
public VirtualMachinesDto getVirtualMachines(
@PathParam(EnterpriseResource.ENTERPRISE) final Integer enterpriseId,
@PathParam(UserResource.USER) final Integer userId, @Context final IRESTBuilder restBuilder)
throws Exception
{
Enterprise enterprise = enterpriseService.getEnterprise(enterpriseId);
User user = service.findUserByEnterprise(userId, enterprise);
List<VirtualMachine> vms = vmService.findVirtualMachinesByUser(enterprise, user);
List<VirtualDatacenter> vdcs = new LinkedList<VirtualDatacenter>();
for (VirtualMachine vm : vms)
{
NodeVirtualImage nvi = vmService.findNodeVirtualImage(vm);
vdcs.add(nvi.getVirtualAppliance().getVirtualDatacenter());
}
return VirtualMachinesResource.createTransferObjects(vms, vdcs, restBuilder);
}
private static UserDto addLinks(final IRESTBuilder restBuilder, final UserDto user,
final Integer enterpriseId, final Integer roleId)
{
user.setLinks(restBuilder.buildUserLinks(enterpriseId, roleId, user));
return user;
}
private static UserWithRoleDto addLinks(final IRESTBuilder restBuilder,
final UserWithRoleDto user, final Integer enterpriseId, final Integer roleId)
{
user.setLinks(restBuilder.buildUserLinks(enterpriseId, roleId, user));
return user;
}
public static UserWithRoleDto createTransferObjectWithRole(final User user,
final IRESTBuilder restBuilder) throws Exception
{
UserWithRoleDto u = createTransferObjectWithRole(user);
u = addLinks(restBuilder, u, user.getEnterprise().getId(), user.getRole().getId());
return u;
}
public static UserWithRoleDto createUsersTransferObjectWithRole(final User user,
final IRESTBuilder restBuilder) throws Exception
{
UserWithRoleDto u = createUserTransferObjectWithRole(user, restBuilder);
u = addLinks(restBuilder, u, user.getEnterprise().getId(), user.getRole().getId());
return u;
}
public static UserDto createTransferObject(final User user, final IRESTBuilder restBuilder)
throws Exception
{
UserDto u = createTransferObject(user);
u = addLinks(restBuilder, u, user.getEnterprise().getId(), user.getRole().getId());
return u;
}
public static UserDto createTransferObject(final User user)
{
UserDto u = new UserDto();
u.setId(user.getId());
u.setActive(user.getActive());
u.setEmail(user.getEmail());
u.setLocale(user.getLocale());
u.setName(user.getName());
u.setPassword(user.getPassword());
u.setSurname(user.getSurname());
u.setNick(user.getNick());
u.setDescription(user.getDescription());
u.setAvailableVirtualDatacenters(user.getAvailableVirtualDatacenters());
u.setAuthType(user.getAuthType().name());
return u;
}
public static UserWithRoleDto createUserTransferObjectWithRole(final User user,
final IRESTBuilder restBuilder) throws Exception
{
UserWithRoleDto u = new UserWithRoleDto();
u.setId(user.getId());
u.setActive(user.getActive());
u.setEmail(user.getEmail());
u.setLocale(user.getLocale());
u.setName(user.getName());
u.setPassword(user.getPassword());
u.setSurname(user.getSurname());
u.setNick(user.getNick());
u.setDescription(user.getDescription());
u.setAvailableVirtualDatacenters(user.getAvailableVirtualDatacenters());
u.setAuthType(user.getAuthType().name());
EnterpriseDto e =
EnterpriseResource.createTransferObject(user.getEnterprise(), restBuilder);
u.setEnterprise(e);
return u;
}
public static UserWithRoleDto createTransferObjectWithRole(final User user)
{
UserWithRoleDto u = new UserWithRoleDto();
u.setId(user.getId());
u.setActive(user.getActive());
u.setEmail(user.getEmail());
u.setLocale(user.getLocale());
u.setName(user.getName());
u.setPassword(user.getPassword());
u.setSurname(user.getSurname());
u.setNick(user.getNick());
u.setDescription(user.getDescription());
u.setAvailableVirtualDatacenters(user.getAvailableVirtualDatacenters());
u.setAuthType(user.getAuthType().name());
return u;
}
private void validatePathParameters(final Integer enterpriseId, final Integer userId)
throws NotFoundException
{
if (!service.isAssignedTo(enterpriseId, userId))
{
throw new NotFoundException(APIError.NOT_ASSIGNED_USER_ENTERPRISE);
}
}
}