package controllers;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.commons.codec.Charsets;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security.Authenticated;
import util.Util;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import constant.Token;
@Authenticated(Secured.class)
public class Principal extends Controller{
private static String coreRestUri = Util.buildNemakiCoreUri() + "rest/";
private static Session getCmisSession(String repositoryId){
return CmisSessions.getCmisSession(repositoryId, session());
}
public static Result search(String repositoryId, String term, String groupId){
List<model.Principal>principals = new ArrayList<model.Principal>();
//user search
JsonNode resultUsers = Util.getJsonResponse(session(), coreRestUri + "repo/" + repositoryId + "/user/search?query=" + term); //TODO
//TODO check status
JsonNode users = resultUsers.get("result");
if(users != null){
Iterator<JsonNode> userItr = users.iterator();
while(userItr.hasNext()){
JsonNode user = userItr.next();
model.Principal p = new model.Principal(Token.PRINCIPAL_GENRE_USER, user.get("userId").asText(), user.get("userName").asText());
principals.add(p);
}
}
//group search
JsonNode resultGroups = Util.getJsonResponse(session(), coreRestUri + "repo/" + repositoryId + "/group/search?query=" + term);
//TODO check status
JsonNode groups = resultGroups.get("result");
if(groups != null){
Iterator<JsonNode> groupItr = groups.iterator();
while(groupItr.hasNext()){
JsonNode group = groupItr.next();
model.Principal p = new model.Principal(Token.PRINCIPAL_GENRE_GROUP, group.get("groupId").asText(), group.get("groupName").asText());
//Remove the same group id when called from a group member search
if(p.id != null && p.id.equals(groupId)){
continue;
}
principals.add(p);
}
}
//Add anyone group
principals.add(getAnyone(repositoryId));
//convert
final ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectMapper mapper = new ObjectMapper();
try {
mapper.writeValue(out, principals);
final byte[] data = out.toByteArray();
JsonNode converted = Json.parse(new String(data, Charsets.UTF_8));
return ok(converted);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ok();
}
private static model.Principal getAnyone(String repositoryId){
Session session = getCmisSession(repositoryId);
String anyone = session.getRepositoryInfo().getPrincipalIdAnyone();
model.Principal p = new model.Principal(Token.PRINCIPAL_GENRE_GROUP, anyone, anyone);
return p;
}
}