package controllers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import model.Principal;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.commons.collections.CollectionUtils;
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.Util;
import views.html.group.blank;
import views.html.group.index;
import views.html.group.property;
import com.fasterxml.jackson.databind.JsonNode;
@Authenticated(Secured.class)
public class Group extends Controller {
private static String coreRestUri = Util.buildNemakiCoreUri() + "rest/";
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);
List<model.Group> list = new ArrayList<model.Group>();
//TODO check status
JsonNode groups = result.get("result");
if(groups == null){
groups = Json.parse("[]");
}else{
Iterator<JsonNode>itr = groups.elements();
while(itr.hasNext()){
JsonNode node = itr.next();
model.Group group = new model.Group();
group.id = node.get("groupId").asText();
group.name = node.get("groupName").asText();
//member(user)
group.usersSize = node.get("usersSize").asInt();
if(!node.get("users").isNull()){
List<String> memberUsers = new ArrayList<String>();
for(final JsonNode userId : node.get("users")){
memberUsers.add(userId.asText());
}
group.users = memberUsers;
}
//member(group)
group.groupsSize = node.get("groupsSize").asInt();
if(!node.get("groups").isNull()){
List<String> memberGroups = new ArrayList<String>();
for(final JsonNode groupId : node.get("groups")){
memberGroups.add(groupId.asText());
}
group.groups = memberGroups;
}
list.add(group);
}
}
//render
if(Util.dataTypeIsHtml(request().acceptedTypes())){
return ok(index.render(repositoryId, list));
}else{
return ok(groups);
}
}
public static Result showBlank(String repositoryId){
model.Group emptyGroup = new model.Group("", "", 0, 0, new ArrayList<String>(), new ArrayList<String>());
return ok(blank.render(repositoryId, emptyGroup));
}
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)){
return ok();
}else{
return internalServerError("Failed to create a group");
}
}
public static Result delete(String repositoryId, String id){
JsonNode result = Util.deleteJsonResponse(session(), getEndpoint(repositoryId) + "delete/" + id);
//TODO error
return ok();
}
public static Result showDetail(String repositoryId, String id){
JsonNode result = Util.getJsonResponse(session(), getEndpoint(repositoryId) + "show/" + id);
if(isSuccess(result)){
JsonNode _group = result.get("group");
model.Group group = new model.Group(_group);
//List of (userId,userName)
List<Principal> users = new ArrayList<Principal>();
List<String> userIds = group.users;
if(CollectionUtils.isNotEmpty(userIds)){
for(String userId : userIds){
JsonNode _memberUser = Util.getJsonResponse(session(), getEndpointForUser(repositoryId) + "show/" + userId);
if(isSuccess(_memberUser)){
String userName = _memberUser.get("user").get("userName").asText();
users.add(new Principal("user", userId, userName));
}
}
}
//List of (groupId,groupName)
List<Principal> groups = new ArrayList<Principal>();
List<String> groupIds = group.groups;
if(CollectionUtils.isNotEmpty(groupIds)){
for(String groupId : groupIds){
JsonNode _memberGroup = Util.getJsonResponse(session(), getEndpoint(repositoryId) + "show/" + groupId);
if(isSuccess(_memberGroup)){
String groupName = _memberGroup.get("group").get("groupName").asText();
groups.add(new Principal("group", groupId, groupName));
}
}
}
List<Principal>principals = new ArrayList<Principal>();
principals.addAll(users);
principals.addAll(groups);
return ok(property.render(repositoryId, group, principals));
}else{
//TODO
return internalServerError();
}
}
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();
}
}
private static boolean isSuccess(JsonNode result){
return "success".equals(result.get("status").asText()) ||
("failure".equals(result.get("status").asText()) && "notFound".equals(result.get("error").get("group")));
}
private static Map<String, String> buildParams(){
DynamicForm input = Form.form();
input = input.bindFromRequest();
//Extract form parameters
String groupId = input.get("groupId");
String groupName = input.get("groupName");
String users = input.get("users");
String groups = input.get("groups");
Map<String, String>params = new HashMap<String, String>();
params.put("id", groupId);
params.put("name", groupName);
params.put("users", users);
params.put("groups", groups);
return params;
}
private static String getEndpoint(String repositoryId){
return coreRestUri + "repo/" + repositoryId + "/group/";
}
private static String getEndpointForUser(String repositoryId){
return coreRestUri + "repo/" + repositoryId + "/user/";
}
}