package controllers; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.chemistry.opencmis.client.api.CmisObject; import org.apache.chemistry.opencmis.client.api.Session; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import play.data.DynamicForm; import play.data.Form; import play.libs.Json; import play.mvc.Controller; import play.mvc.Result; import play.mvc.Security.Authenticated; import util.ErrorMessage; import util.Util; import views.html.user.blank; import views.html.user.index; import views.html.user.property; import views.html.user.favorites; import views.html.user.password; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @Authenticated(Secured.class) public class User extends Controller { private static String coreRestUri = Util.buildNemakiCoreUri() + "rest/"; private static Session getCmisSession(String repositoryId){ return CmisSessions.getCmisSession(repositoryId, session()); } public static Result index(String repositoryId){ return search(repositoryId, ""); } public static Result search(String repositoryId, String term){ JsonNode result = Util.getJsonResponse(session(), getEndpoint(repositoryId) + "search?query=" + term); //TODO check status JsonNode users = result.get("result"); List<model.User> list = new ArrayList<model.User>(); if(users == null){ users = Json.parse("[]"); }else{ Iterator<JsonNode>itr = users.elements(); while(itr.hasNext()){ JsonNode node = itr.next(); model.User user = new model.User(); user.id = node.get("userId").asText(); user.name = node.get("userName").asText(); user.firstName = node.get("firstName").asText(); user.lastName = node.get("lastName").asText(); user.email = node.get("email").asText(); user.isAdmin = node.get("isAdmin").asBoolean(); list.add(user); } } //render if(Util.dataTypeIsHtml(request().acceptedTypes())){ return ok(index.render(repositoryId, list)); }else{ return ok(users); } } public static Result showBlank(String repositoryId){ model.User emptyUser = new model.User("", "", "", "", "", "", false, null); return ok(blank.render(repositoryId, emptyUser)); } public static Result showDetail(String repositoryId, String id){ JsonNode result = Util.getJsonResponse(session(), getEndpoint(repositoryId) + "show/" + id); if("success".equals(result.get("status").asText())){ JsonNode _user = result.get("user"); model.User user = new model.User(_user); return ok(property.render(repositoryId, user)); }else{ //TODO return internalServerError(); } } public static Result showPasswordChanger(String repositoryId, String id){ JsonNode result = Util.getJsonResponse(session(), getEndpoint(repositoryId) + "show/" + id); if("success".equals(result.get("status").asText())){ JsonNode _user = result.get("user"); model.User user = new model.User(_user); return ok(password.render(repositoryId, user)); }else{ //TODO return internalServerError(); } } public static Result showFavorites(String repositoryId, String id){ JsonNode result = Util.getJsonResponse(session(), getEndpoint(repositoryId) + "show/" + id); if("success".equals(result.get("status").asText())){ JsonNode _user = result.get("user"); model.User user = new model.User(_user); List<CmisObject> list = new ArrayList<CmisObject>(); Set<String>fs = user.favorites; if(CollectionUtils.isNotEmpty(fs)){ //CMIS session Session session = getCmisSession(repositoryId); Iterator<String>fsItr = fs.iterator(); while(fsItr.hasNext()){ String favId = fsItr.next(); list.add(session.getObject(favId)); } } return ok(favorites.render(repositoryId, user, list)); }else{ //TODO return internalServerError(); } } public static Result toggleFavorite(String repositoryId, String userId, String objectId){ Map<String, String>params = new HashMap<String, String>(); params.put("id", userId); JsonNode getResult = Util.getJsonResponse(session(), getEndpoint(repositoryId) + "show/" + userId); if("success".equals(getResult.get("status").asText())){ JsonNode _user = getResult.get("user"); model.User user = new model.User(_user); ArrayNode fs = new ArrayNode(new JsonNodeFactory(true)); fs.add(objectId); if(user.favorites == null || !user.favorites.contains(objectId)){ params.put("addFavorites", fs.toString()); }else{ params.put("removeFavorites", fs.toString()); } //Update JsonNode putResult = Util.putJsonResponse(session(), getEndpoint(repositoryId) + "update/" + userId , params); if("success".equals(putResult.get("status").asText())){ return ok(); }else{ //TODO return internalServerError("User updating failure"); } }else{ //TODO return internalServerError("User retrieving failure"); } } public static Result create(String repositoryId){ Map<String, String>params = buildParams(); JsonNode result = Util.postJsonResponse(session(), getEndpoint(repositoryId) + "create/" + params.get("id"), params); if(isSuccess(result)){ flash("flash message"); return redirect(routes.User.index(repositoryId)); }else{ String errorMsg = result.get("error").get("userId").asText(); return internalServerError(errorMsg); } } public static Result update(String repositoryId, String id){ Map<String, String>params = buildParams(); JsonNode result = Util.putJsonResponse(session(), getEndpoint(repositoryId) + "update/" + id , params); if(isSuccess(result)){ return ok(); }else{ return internalServerError(); } } public static Result changePassword(String repositoryId, String id){ DynamicForm input = Form.form(); input = input.bindFromRequest(); Map<String, String>changeParams = new HashMap<String, String>(); changeParams.put("id", input.get("userId")); changeParams.put("oldPassword", input.get("oldPassword")); changeParams.put("newPassword", input.get("newPassword1")); JsonNode changeResult = Util.putJsonResponse(session(), getEndpoint(repositoryId) + "changePassword/" + id , changeParams); if(isSuccess(changeResult)){ return redirect(routes.Application.logout(repositoryId)); }else{ String errorCode = changeResult.get("error").get(0).get("user").asText(); return internalServerError(ErrorMessage.getMessage(errorCode)); } } public static Result delete(String repositoryId, String id){ JsonNode deleteResult = Util.deleteJsonResponse(session(), getEndpoint(repositoryId) + "delete/" + id); if(isSuccess(deleteResult)){ return ok(); }else{ String error = deleteResult.get("error").get(0).get("user").asText(); return internalServerError(error); } } private static boolean isSuccess(JsonNode result){ return "success".equals(result.get("status").asText()); } private static Map<String, String> buildParams(){ DynamicForm input = Form.form(); input = input.bindFromRequest(); //Extract form parameters String userId = input.get("userId"); String userName = input.get("userName"); String firstName = input.get("firstName"); String lastName = input.get("lastName"); String email = input.get("email"); String password = input.get("password"); Map<String, String>params = new HashMap<String, String>(); params.put("id", userId); params.put("name", userName); params.put("firstName", firstName); params.put("lastName", lastName); params.put("email", email); if(StringUtils.isNotBlank(password)){ params.put("password", password); } return params; } private static String getEndpoint(String repositoryId){ return coreRestUri + "repo/" + repositoryId + "/user/"; } }