package net.whydah.admin.user.uib;
import net.whydah.admin.AuthenticationFailedException;
import net.whydah.admin.config.AppConfig;
import net.whydah.admin.user.ConflictExeption;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
/**
* Created by baardl on 17.04.14.
*/
@Component
public class UibUserConnection {
private static final Logger log = LoggerFactory.getLogger(UibUserConnection.class);
private static final int STATUS_BAD_REQUEST = 400; //Response.Status.BAD_REQUEST.getStatusCode();
private static final int STATUS_OK = 200; //Response.Status.OK.getStatusCode();
private static final int STATUS_FORBIDDEN = 403;
private static final int STATUS_CREATED = 201;
private static final int STATUS_CONFLICT = 409;
private static final int STATUS_NO_CONTENT = 204;
private final WebTarget uib;
@Autowired
public UibUserConnection(AppConfig appConfig) {
Client client = ClientBuilder.newClient();
// URI useridbackendUri = URI.create(appConfig.getProperty("userIdentityBackendUri"));
// uib = client.target(userIdentityBackendUri);
String uibUrl = appConfig.getProperty("useridentitybackend");
log.info("Connection to UserIdentityBackend on {}" , uibUrl);
uib = client.target(uibUrl);
}
public UserAggregate addUserAgregate(String userAdminServiceTokenId, String userTokenId, String userAggregateJson) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + userTokenId + "/user");
UserAggregate userAggregate = null;
UserAggregateRepresentation userAggregateRepresentation = null;
Response response = webResource.request(MediaType.APPLICATION_JSON).post(Entity.entity(userAggregateJson, MediaType.APPLICATION_JSON));
int statusCode = response.getStatus();
switch (statusCode) {
case STATUS_OK:
log.trace("Response from UIB {}", response.readEntity(String.class));
userAggregateRepresentation = UserAggregateRepresentation.fromJson(userAggregateJson);
break;
case STATUS_BAD_REQUEST:
log.error("Response from UIB: {}: {}", response.getStatus(), response.readEntity(String.class));
throw new BadRequestException("BadRequest for Json " + userAggregateJson + ", Status code " + response.getStatus());
default:
log.error("Response from UIB: {}: {}", response.getStatus(), response.readEntity(String.class));
throw new AuthenticationFailedException("Authentication failed. Status code " + response.getStatus());
}
userAggregate = userAggregateRepresentation.getUserAggregate();
return userAggregate;
}
public UserIdentity createUser(String userAdminServiceTokenId, String userTokenId, String userIdentityJson) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + userTokenId + "/user");
UserIdentity userIdentity = null;
UserAggregateRepresentation userAggregateRepresentation = null;
// userIdentityJson = "{\"username\":\"per\",\"firstName\":\"per\",\"lastName\":\"per\",\"email\":\"per.per@example.com\",\"cellPhone\":\"123456789\",\"personRef\":\"ref\"}";
Response response = webResource.request(MediaType.APPLICATION_JSON).post(Entity.entity(userIdentityJson, MediaType.APPLICATION_JSON));
int statusCode = response.getStatus();
String userJson = response.readEntity(String.class);
switch (statusCode) {
case STATUS_OK:
log.trace("createUser-Response from UIB {}", userJson);
userIdentity = UserIdentity.fromJson(userJson);
break;
case STATUS_CREATED:
log.trace("createUser-userCreated {}", userJson);
userIdentity = UserIdentity.fromJson(userJson);
break;
case STATUS_CONFLICT:
log.info("Duplicate creation of user attempted on {}", userIdentityJson);
throw new ConflictExeption("DuplicateCreateAttempted on " + userIdentityJson);
case STATUS_BAD_REQUEST:
log.error("createUser-Response from UIB: {}: {}", response.getStatus(), userJson);
throw new BadRequestException("BadRequest for Json " + userIdentityJson + ", Status code " + response.getStatus());
default:
log.error("createUser-Response from UIB: {}: {}", response.getStatus(), userJson);
throw new AuthenticationFailedException("Authentication failed. Status code " + response.getStatus());
}
return userIdentity;
}
public boolean changePassword(String userAdminServiceTokenId, String adminUserTokenId, String userName, String password) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + adminUserTokenId + "/user").path(userName).path("changepassword");
boolean updatedOk = false;
Response response = webResource.request(MediaType.APPLICATION_JSON).post(Entity.entity(password, MediaType.APPLICATION_JSON));
int statusCode = response.getStatus();
String passwordJson = response.readEntity(String.class);
switch (statusCode) {
case STATUS_OK:
log.trace("changePassword-Response from UIB {}", passwordJson);
updatedOk = true;
break;
case STATUS_FORBIDDEN:
log.error("changePassword-Not allowed from UIB: {}: {} Using adminUserTokenId {}, userName {}", response.getStatus(), passwordJson);
break;
default:
log.error("changePassword-Response from UIB: {}: {}", response.getStatus(), passwordJson);
throw new AuthenticationFailedException("Authentication failed. Status code " + response.getStatus());
}
return updatedOk;
}
public RoleRepresentation addRole(String userAdminServiceTokenId, String adminUserTokenId, String uid, RoleRepresentationRequest roleRequest) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + adminUserTokenId + "/user").path(uid).path("role");
Response response = webResource.request(MediaType.APPLICATION_JSON).post(Entity.entity(roleRequest.toJson(), MediaType.APPLICATION_JSON));
String roleJson = response.readEntity(String.class);
RoleRepresentation role = null;
int statusCode = response.getStatus();
switch (statusCode) {
case STATUS_OK:
log.trace("addRole-Response from UIB {}", roleJson);
role = RoleRepresentation.fromJson(roleJson);
break;
case STATUS_CREATED:
log.trace("addRole-roleCreated {}", roleJson);
role = RoleRepresentation.fromJson(roleJson);
break;
case STATUS_CONFLICT:
log.info("Duplicate creation of role attempted on {}", roleJson);
throw new ConflictExeption("DuplicateCreateAttempted on " + roleJson);
case STATUS_BAD_REQUEST:
log.error("addRole-Response from UIB: {}: {}",statusCode, roleJson);
throw new BadRequestException("BadRequest for Json " + roleJson + ", Status code " + statusCode);
default:
log.error("addRole-Response from UIB: {}: {}", statusCode, roleJson);
throw new AuthenticationFailedException("Authentication failed. Status code " + statusCode);
}
return role;
}
public void deleteUserRole(String userAdminServiceTokenId, String adminUserTokenId, String uid, String userRoleId) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + adminUserTokenId + "/user").path(uid).path("role").path(userRoleId);
Response response = webResource.request(MediaType.APPLICATION_JSON).delete();
int statusCode = response.getStatus();
switch (statusCode) {
case STATUS_NO_CONTENT:
log.trace("deleteUserRole-Response from UIB {}", userRoleId);
break;
case STATUS_BAD_REQUEST:
log.error("deleteUserRole-Response from UIB: {}: {}",statusCode, userRoleId);
throw new BadRequestException("deleteUserRole for userRoleId " + userRoleId + ", Status code " + statusCode);
default:
log.error("deleteUserRole-Response from UIB: {}: {}", statusCode, userRoleId);
throw new RuntimeException("DeleteUserRole failed. Status code " + statusCode);
}
}
public UserAggregate addPropertyOrRole(String userAdminServiceTokenId, String adminUserTokenId, String uid, UserPropertyAndRole userPropertyAndRole) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + adminUserTokenId + "/user").path(uid).path("role");
UserAggregate updatedUser = null;
UserAggregateRepresentation userAggregateRepresentation = null;
Response response = webResource.request(MediaType.APPLICATION_JSON).post(Entity.entity(userPropertyAndRole.toJson(), MediaType.APPLICATION_JSON));
int statusCode = response.getStatus();
switch (statusCode) {
case STATUS_OK:
log.trace("addPropertyOrRole-Response from UIB {}", response.readEntity(String.class));
userAggregateRepresentation = UserAggregateRepresentation.fromJson(response.readEntity(String.class));
if (userAggregateRepresentation != null) {
updatedUser = userAggregateRepresentation.getUserAggregate();
}
break;
case STATUS_FORBIDDEN:
log.error("addPropertyOrRole-Not allowed from UIB: {}: {} Using adminUserTokenId {}, userName {}", response.getStatus(), response.readEntity(String.class));
break;
default:
log.error("addPropertyOrRole-Response from UIB: {}: {}", response.getStatus(), response.readEntity(String.class));
throw new AuthenticationFailedException("addPropertyOrRole failed. Status code " + response.getStatus());
}
return updatedUser;
}
//TODO Clean up exception/failure handling
public UserIdentity getUserIdentity(String userAdminServiceTokenId, String adminUserTokenId, String uid) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + adminUserTokenId + "/user").path(uid);
Response response = webResource.request(MediaType.APPLICATION_JSON).get();
String responseBody = response.readEntity(String.class);
switch (response.getStatus()) {
case STATUS_OK:
log.trace("getUserIdentity-Response from Uib {}", responseBody);
UserIdentity userIdentity = UserIdentity.fromJson(responseBody);
return userIdentity;
case STATUS_FORBIDDEN:
log.error("getUserIdentity-Not allowed from UIB: {}: {} Using adminUserTokenId {}, userName {}", response.getStatus(), responseBody);
return null;
default:
log.error("getUserIdentity-Response from UIB: {}: {}", response.getStatus(), responseBody);
throw new AuthenticationFailedException("getUserIdentity failed. Status code " + response.getStatus());
}
/*
UserAggregate userAggregate = null;
UserAggregateRepresentation userAggregateRepresentation;
switch (statusCode) {
case STATUS_OK:
log.trace("getUserIdentity-Response from Uib {}", responseBody);
userAggregateRepresentation = UserAggregateRepresentation.fromJson(responseBody);
if (userAggregateRepresentation != null) {
userAggregate = userAggregateRepresentation.getUserAggregate();
}
break;
case STATUS_FORBIDDEN:
log.error("getUserIdentity-Not allowed from UIB: {}: {} Using adminUserTokenId {}, userName {}", response.getStatus(), responseBody);
break;
default:
log.error("getUserIdentity-Response from UIB: {}: {}", response.getStatus(), responseBody);
throw new AuthenticationFailedException("getUserIdentity failed. Status code " + response.getStatus());
}
return userAggregate;
*/
}
public UserAggregate getUserAggregateByUid(String userAdminServiceTokenId, String adminUserTokenId, String uid) {
WebTarget webResource = uib.path(userAdminServiceTokenId).path(adminUserTokenId).path("useraggregate").path(uid);
UserAggregate userAggregate = null;
UserAggregateRepresentation userAggregateRepresentation;
Response response = webResource.request(MediaType.APPLICATION_JSON).get();
int statusCode = response.getStatus();
String responseBody = response.readEntity(String.class);
switch (statusCode) {
case STATUS_OK:
log.trace("getUserAggregateByUid-Response from Uib {}", responseBody);
userAggregateRepresentation = UserAggregateRepresentation.fromJson(responseBody);
if (userAggregateRepresentation != null) {
userAggregate = userAggregateRepresentation.getUserAggregate();
}
break;
case STATUS_FORBIDDEN:
log.error("getUserAggregateByUid-Not allowed from UIB: {}: {} Using adminUserTokenId {}, userName {}", response.getStatus(), responseBody);
break;
default:
log.error("getUserAggregateByUid-Response from UIB: {}: {}", response.getStatus(), responseBody);
throw new AuthenticationFailedException("getUserIdentity failed. Status code " + response.getStatus());
}
return userAggregate;
}
public String getRolesAsJson(String userAdminServiceTokenId, String userTokenId, String uid) {
WebTarget webResource = uib.path(userAdminServiceTokenId).path(userTokenId).path("/user").path(uid).path("roles");
Response response = webResource.request(MediaType.APPLICATION_JSON).get();
return findResponseBody("getRolesAsJson", response);
}
private String findResponseBody(String methodName, Response response) {
String responseBody = null;
int statusCode = response.getStatus();
responseBody = response.readEntity(String.class);
switch (statusCode) {
case STATUS_OK:
log.trace("{}-Response from UIB {}", methodName,responseBody);
break;
case STATUS_FORBIDDEN:
log.error("{}-Not allowed from UIB: {}: {} ", methodName,response.getStatus(), responseBody);
responseBody = null;
break;
default:
log.error("{}-Response from UIB: {}: {}", methodName,response.getStatus(), responseBody);
throw new AuthenticationFailedException("getUserIdentity failed. Status code " + response.getStatus());
}
return responseBody;
}
public void deleteUser(String userAdminServiceTokenId, String adminUserTokenId, String uid) {
WebTarget webResource = uib.path("/" + userAdminServiceTokenId + "/" + adminUserTokenId + "/user").path(uid);
Response response = webResource.request(MediaType.APPLICATION_JSON).delete();
int statusCode = response.getStatus();
switch (statusCode) {
case STATUS_NO_CONTENT:
log.trace("deleteUser-Response from UIB uid={}", uid);
break;
case STATUS_BAD_REQUEST:
log.error("deleteUser-Response from UIB: {}: uid={}", statusCode, uid);
throw new BadRequestException("deleteUserRole for uid=" + uid + ", Status code " + statusCode);
default:
log.error("deleteUser-Response from UIB: {}, uid=", statusCode, uid);
throw new RuntimeException("DeleteUser failed. Status code " + statusCode);
}
}
}