package controllers;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import model.Principal;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.FileableCmisObject;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.ItemIterable;
import org.apache.chemistry.opencmis.client.api.ObjectId;
import org.apache.chemistry.opencmis.client.api.ObjectType;
import org.apache.chemistry.opencmis.client.api.OperationContext;
import org.apache.chemistry.opencmis.client.api.Property;
import org.apache.chemistry.opencmis.client.api.Rendition;
import org.apache.chemistry.opencmis.client.api.SecondaryType;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.Tree;
import org.apache.chemistry.opencmis.client.runtime.ObjectIdImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.definitions.DocumentTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PermissionDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.Cardinality;
import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed;
import org.apache.chemistry.opencmis.commons.enums.Updatability;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlEntryImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlPrincipalDataImpl;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import play.api.libs.Files.TemporaryFile;
import play.data.DynamicForm;
import play.data.Form;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Http.MultipartFormData;
import play.mvc.Http.MultipartFormData.FilePart;
import play.mvc.Result;
import play.mvc.Security.Authenticated;
import util.Util;
import views.html.node.blank;
import views.html.node.detail;
import views.html.node.file;
import views.html.node.preview;
import views.html.node.property;
import views.html.node.search;
import views.html.node.tree;
import views.html.node.version;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import constant.Token;
@Authenticated(Secured.class)
public class Node extends Controller {
private static Session getCmisSession(String repositoryId) {
return CmisSessions.getCmisSession(repositoryId, session());
}
public static Result index(String repositoryId) {
try {
Session session = getCmisSession(repositoryId);
Folder root = session.getRootFolder();
return showChildren(repositoryId, root.getId());
} catch (Exception ex) {
CmisSessions.disconnect(repositoryId, session());
return redirect(routes.Application.login(repositoryId));
}
}
public static Result showChildren(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject parent = session.getObject(id);
// TODO type check
Folder _parent = (Folder) parent;
ItemIterable<CmisObject> children = _parent.getChildren();
List<CmisObject> results = new ArrayList<CmisObject>();
Iterator<CmisObject> itr = children.iterator();
while (itr.hasNext()) {
CmisObject obj = itr.next();
// Check and replace to PWC for owner
if (Util.isDocument(obj)) {
Document doc = (Document) obj;
if (doc.isVersionSeriesCheckedOut()) {
// check owner
String loginUser = session().get(Token.LOGIN_USER_ID);
String owner = doc.getVersionSeriesCheckedOutBy();
if (loginUser.equals(owner)) {
String pwcId = doc.getVersionSeriesCheckedOutId();
CmisObject pwc = session.getObject(pwcId);
results.add(pwc);
continue;
}
}
}
results.add(obj);
}
// Fill in CMIS types
List<Tree<ObjectType>> typeFolders = session.getTypeDescendants(BaseTypeId.CMIS_FOLDER.value(), -1, false);
List<Tree<ObjectType>> typeDocs = session.getTypeDescendants(BaseTypeId.CMIS_DOCUMENT.value(), -1, false);
List<Tree<ObjectType>> types = new ArrayList<Tree<ObjectType>>();
types.addAll(typeFolders);
types.addAll(typeDocs);
return ok(tree.render(repositoryId, _parent, results, types));
}
public static Result showChildrenByPath(String repositoryId, String path) {
Session session = getCmisSession(repositoryId);
CmisObject o = session.getObjectByPath(path);
return showChildren(repositoryId, o.getId());
}
public static Result search(String repositoryId, String term) {
Session session = getCmisSession(repositoryId);
OperationContext ctxt = session.getDefaultContext();
List<CmisObject> list = new ArrayList<CmisObject>();
// Build WHERE clause(cmis:document)
MessageFormat docFormat = new MessageFormat(
"cmis:name LIKE ''%{0}%'' OR cmis:description LIKE ''%{0}%'' OR CONTAINS(''{0}'')");
String docStatement = "";
if (StringUtils.isNotBlank(term)) {
docStatement = docFormat.format(new String[] { term });
}
ItemIterable<CmisObject> docResults = session.queryObjects("cmis:document", docStatement, false, ctxt);
Iterator<CmisObject> docItr = docResults.iterator();
while (docItr.hasNext()) {
CmisObject doc = docItr.next();
boolean val = doc.getPropertyValue("cmis:isLatestVersion");
if (!val)
continue;
list.add(doc);
}
return ok(search.render(repositoryId, term, list));
}
public static Result showBlank(String repositoryId) {
String parentId = request().getQueryString("parentId");
String objectTypeId = request().getQueryString("objectType");
if (StringUtils.isEmpty(objectTypeId)) {
objectTypeId = "cmis:folder"; // default
}
Session session = getCmisSession(repositoryId);
ObjectType objectType = session.getTypeDefinition(objectTypeId);
return ok(blank.render(repositoryId, parentId, objectType));
}
public static Result showDetail(String repositoryId, String id, Boolean activatePreviewTab) {
Session session = getCmisSession(repositoryId);
FileableCmisObject o = (FileableCmisObject) session.getObject(id);
// Get parentId
String parentId = o.getParents().get(0).getId();
// Get user
final String endPoint = Util.buildNemakiCoreRestRepositoryUri(repositoryId);
String url = endPoint + "user/show/" + session().get(Token.LOGIN_USER_ID);
JsonNode result = Util.getJsonResponse(session(), url);
model.User user = new model.User();
if ("success".equals(result.get("status").asText())) {
JsonNode _user = result.get("user");
user = new model.User(_user);
} else {
internalServerError("User retrieveing failure");
}
return ok(detail.render(repositoryId, o, parentId, activatePreviewTab, user));
}
public static Result showProperty(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
FileableCmisObject o = (FileableCmisObject) session.getObject(id);
List<Property<?>> properties = o.getProperties();
List<SecondaryType> secondaryTypes = o.getSecondaryTypes();
// divide
List<Property<?>> primaries = new ArrayList<Property<?>>();
Map<SecondaryType, List<Property<?>>> secondaries = new HashMap<SecondaryType, List<Property<?>>>();
if (CollectionUtils.isNotEmpty(secondaryTypes)) {
Iterator<SecondaryType> itr = secondaryTypes.iterator();
while (itr.hasNext()) {
SecondaryType st = itr.next();
secondaries.put(st, new ArrayList<Property<?>>());
}
}
for (Property<?> p : properties) {
boolean isSecondary = false;
if (CollectionUtils.isNotEmpty(secondaryTypes)) {
Iterator<SecondaryType> itr2 = secondaryTypes.iterator();
while (itr2.hasNext()) {
SecondaryType st = itr2.next();
if (st.getPropertyDefinitions().containsKey(p.getId())) {
secondaries.get(st).add(p);
isSecondary = true;
}
}
}
if (!isSecondary) {
primaries.add(p);
}
}
return ok(property.render(repositoryId, o, primaries, secondaries));
}
public static Result showFile(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
FileableCmisObject o = (FileableCmisObject) session.getObject(id);
// Get parentId
String parentId = o.getParents().get(0).getId();
return ok(file.render(repositoryId, o, parentId));
}
public static Result download(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject obj = session.getObject(id);
if (!Util.isDocument(obj)) {
// TODO logging
return badRequest();
}
Document doc = (Document) obj;
ContentStream cs = doc.getContentStream();
File tmpFile = null;
try {
tmpFile = Util.convertInputStreamToFile(cs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (request().getHeader("User-Agent").indexOf("MSIE") == -1) {
// Firefox, Opera 11
response().setHeader("Content-Disposition", String.format(Locale.JAPAN,
"attachment; filename*=utf-8'jp'%s", URLEncoder.encode(doc.getName(), "utf-8")));
} else {
// IE7, 8, 9
response().setHeader("Content-Disposition", String.format(Locale.JAPAN, "attachment; filename=\"%s\"",
new String(doc.getName().getBytes("MS932"), "ISO8859_1")));
}
} catch (Exception e) {
e.printStackTrace();
}
response().setContentType(cs.getMimeType());
try {
TemporaryFileInputStream fin = new TemporaryFileInputStream(tmpFile);
return ok(fin);
} catch (FileNotFoundException e) {
e.printStackTrace();
return internalServerError("File not found");
}
}
public static Result downloadPreview(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject obj = session.getObject(id);
if (!Util.isDocument(obj)) {
// TODO logging
return badRequest();
}
if (!Util.existPreview(obj)) {
// TODO logging
return badRequest();
}
List<Rendition> renditions = obj.getRenditions();
Rendition preview = null;
for (Rendition rendition : renditions) {
if ("cmis:preview".equals(rendition.getKind())) {
preview = rendition;
}
}
// Download
File tmpFile = null;
try {
tmpFile = Util.convertInputStreamToFile(preview.getContentStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO better solution for encoding file name
response().setHeader("Content-disposition", "filename=" + obj.getName() + ".pdf");
response().setContentType(preview.getContentStream().getMimeType());
try {
TemporaryFileInputStream fin = new TemporaryFileInputStream(tmpFile);
return ok(fin);
} catch (FileNotFoundException e) {
e.printStackTrace();
return internalServerError("File not found");
}
}
public static Result showVersion(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject o = session.getObject(id);
List<Document> result = new ArrayList<Document>();
if (Util.isDocument(o)) {
Document doc = (Document) o;
result = doc.getAllVersions();
}
return ok(version.render(repositoryId, result));
}
public static Result showPreview(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject obj = session.getObject(id);
return ok(preview.render(repositoryId, obj));
}
public static Result showPermission(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject obj = session.getObject(id);
// Get permission types
List<PermissionDefinition> permissionDefs = Util
.trimForDisplay(session.getRepositoryInfo().getAclCapabilities().getPermissions());
// Principals
List<Principal> members = new ArrayList<Principal>();
if (obj.getAcl() != null) {
List<Ace> list = obj.getAcl().getAces();
if (CollectionUtils.isNotEmpty(list)) {
String anyone = session.getRepositoryInfo().getPrincipalIdAnyone();
String anonymous = session.getRepositoryInfo().getPrincipalIdAnonymous();
for (Ace ace : list) {
String principalId = ace.getPrincipalId();
// call API
Principal p = getPrincipal(repositoryId, principalId, anyone, anonymous);
if (p != null) {
members.add(p);
}
}
}
}
// for IE
// ResponseUtil.setNoCache(response());
return ok(views.html.node.permission.render(repositoryId, obj, members, permissionDefs));
}
/**
* Handle with a file per each request
* Multiple drag & drop should be made by calling this as many times
* @param repositoryId
* @param action
* @return
*/
public static Result dragAndDrop(String repositoryId, String action) {
// Bind input parameters
DynamicForm input = Form.form();
input = input.bindFromRequest();
// Process the file
MultipartFormData body = request().body().asMultipartFormData();
List<FilePart> files = body.getFiles();
if (CollectionUtils.isEmpty(files)) {
// Do nothing
return ok();
} else {
if ("create".equals(action)) {
dragAndDropCreate(repositoryId, files.get(0), input);
} else if ("update".equals(action)) {
dragAndDropUpdate(repositoryId, files.get(0), input);
} else {
return internalServerError("Specify drag & drop action type");
}
return ok();
}
}
private static void setParam(Map<String, Object> param, DynamicForm input, String key) {
param.put(key, Util.getFormData(input, key));
}
private static void dragAndDropCreate(String repositoryId, FilePart file, DynamicForm input) {
// Parse parameters
Map<String, Object> param = new HashMap<String, Object>();
ObjectId parentId = new ObjectIdImpl(Util.getFormData(input, PropertyIds.PARENT_ID));
setParam(param, input, PropertyIds.OBJECT_TYPE_ID);
setParam(param, input, PropertyIds.NAME);
// Execute
Session session = getCmisSession(repositoryId);
ContentStream cs = Util.convertFileToContentStream(session, file);
session.createDocument(param, parentId, cs, VersioningState.MAJOR);
//Clean temp file just after CMIS createDocument finished
file.getFile().delete();
}
private static void dragAndDropUpdate(String repositoryId, FilePart file, DynamicForm input) {
// Parse parameters
Map<String, Object> param = new HashMap<String, Object>();
ObjectId objectId = new ObjectIdImpl(Util.getFormData(input, PropertyIds.OBJECT_ID));
setParam(param, input, PropertyIds.OBJECT_TYPE_ID);
// setParam(param, input, PropertyIds.NAME);
// Execute
Session session = getCmisSession(repositoryId);
ContentStream cs = Util.convertFileToContentStream(session, file);
Document d0 = (Document) session.getObject(objectId);
Document d1 = d0.setContentStream(cs, true);
//Clean temp file just after CMIS createDocument finished
file.getFile().delete();
}
public static Result create(String repositoryId) {
DynamicForm input = Form.form();
input = input.bindFromRequest();
// Extract special property
String objectTypeId = Util.getFormData(input, PropertyIds.OBJECT_TYPE_ID);
String _parentId = Util.getFormData(input, PropertyIds.PARENT_ID);
ObjectId parentId = new ObjectIdImpl(_parentId);
Session session = getCmisSession(repositoryId);
ObjectType objectType = session.getTypeDefinition(objectTypeId);
// Set CMIS parameter
Map<String, PropertyDefinition<?>> pdfs = session.getTypeDefinition(objectTypeId).getPropertyDefinitions();
List<Updatability> upds = new ArrayList<Updatability>();
upds.add(Updatability.ONCREATE);
upds.add(Updatability.READWRITE);
HashMap<String, Object> param = Util.buildProperties(pdfs, input, upds);
param.put(PropertyIds.OBJECT_TYPE_ID, objectTypeId);
// Document/Folder specific
switch (Util.getBaseType(session, objectTypeId)) {
case CMIS_DOCUMENT:
ContentStreamAllowed csa = ((DocumentTypeDefinition) objectType).getContentStreamAllowed();
if (csa == ContentStreamAllowed.NOTALLOWED) {
// don't set content stream
session.createDocument(param, parentId, null, VersioningState.MAJOR);
}else{
List<FilePart> files = null;
MultipartFormData body = request().body().asMultipartFormData();
if (body != null && CollectionUtils.isNotEmpty(body.getFiles())) {
files = body.getFiles();
}
if (CollectionUtils.isEmpty(files)) {
//Case: no file
if (csa == ContentStreamAllowed.REQUIRED){
return internalServerError(objectTypeId + ":This type requires a file");
}else if(csa == ContentStreamAllowed.ALLOWED){
session.createDocument(param, parentId, null, VersioningState.MAJOR);
}
}else{
//Case: file exists
ContentStream contentStream = Util.convertFileToContentStream(session, files.get(0));
if (param.get(PropertyIds.NAME) == null) {
param.put(PropertyIds.NAME, contentStream.getFileName());
}
session.createDocument(param, parentId, contentStream, VersioningState.MAJOR);
//Clean temp file just after CMIS createDocument finished
if(CollectionUtils.isNotEmpty(files)){
for(FilePart file : files){
file.getFile().delete();
}
}
}
}
break;
case CMIS_FOLDER:
session.createFolder(param, parentId);
break;
default:
break;
}
return redirectToParent(repositoryId, input);
}
public static Result update(String repositoryId, String id) {
// Get an object in the repository
Session session = getCmisSession(repositoryId);
CmisObject o = session.getObject(id);
// Get input form data
DynamicForm input = Form.form();
input = input.bindFromRequest();
// Build upadte properties
Map<String, Object> properties = new HashMap<String, Object>();
for (Entry<String, PropertyDefinition<?>> entry : o.getType().getPropertyDefinitions().entrySet()) {
PropertyDefinition<?> pdf = entry.getValue();
if (Updatability.READWRITE == pdf.getUpdatability()) {
// TODO work around
if (PropertyIds.SECONDARY_OBJECT_TYPE_IDS.equals(pdf.getId())) {
continue;
}
if (Cardinality.SINGLE == pdf.getCardinality()) {
String value = input.data().get(pdf.getId());
// TODO type conversion
properties.put(pdf.getId(), value);
} else {
// TODO find better way
List<String> list = new ArrayList<String>();
for (int i = 0; i < input.data().keySet().size(); i++) {
String keyWithIndex = pdf.getId() + "[" + i + "]";
String value = input.data().get(keyWithIndex);
if (value == null) {
break;
}
list.add(value);
}
properties.put(pdf.getId(), list);
}
}
}
// Set change token
properties.put(PropertyIds.CHANGE_TOKEN, o.getChangeToken());
// Execute
o.updateProperties(properties);
// return redirectToParent(input);
return ok();
}
public static Result updatePermission(String repositoryId, String id) {
// Get an object in the repository
Session session = getCmisSession(repositoryId);
CmisObject obj = session.getObject(id);
List<Ace> originalAcl = obj.getAcl().getAces();
Map<String, Ace> originalAclMap = new HashMap<String, Ace>();
for (Ace ace : originalAcl) {
originalAclMap.put(ace.getPrincipalId(), ace);
}
List<Ace> addAces = new ArrayList<Ace>();
List<Ace> removeAces = new ArrayList<Ace>();
Map<String, Ace> newAclMap = new HashMap<String, Ace>();
// Get input form data
DynamicForm input = Form.form();
input = input.bindFromRequest();
String acl = input.get("acl");
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode jn = mapper.readTree(acl);
Iterator<JsonNode> itr = jn.iterator();
while (itr.hasNext()) {
JsonNode ace = itr.next();
Boolean inheritance = ace.get("inheritance").asBoolean();
if (inheritance)
continue;
String principalId = ace.get("principalId").asText();
List<String> _permission = new ArrayList<String>();
JsonNode permission = ace.get("permission");
Iterator<JsonNode> itr2 = permission.iterator();
while (itr2.hasNext()) {
_permission.add(itr2.next().asText());
}
Ace _newAce = buildAce(principalId, _permission);
Ace newAce = convertNoneAce(principalId, _newAce);
newAclMap.put(principalId, newAce);
// Compare with original and allot to add/removeAces
Ace originalAce = originalAclMap.get(principalId);
if (originalAce == null) {
// Add a new ACE row
addAces.add(newAce);
} else {
// add or remove permissions of an existing ACE row
List<String> original = (originalAce.isDirect()) ? originalAce.getPermissions()
: new ArrayList<String>();
List<String> remove = Util.difference(original, newAce.getPermissions());
List<String> add = Util.difference(newAce.getPermissions(), original);
AccessControlPrincipalDataImpl principal = new AccessControlPrincipalDataImpl(principalId);
if (CollectionUtils.isNotEmpty(add)) {
Ace addAce = new AccessControlEntryImpl(principal, new ArrayList<String>(add));
addAces.add(addAce);
}
if (CollectionUtils.isNotEmpty(remove)) {
Ace removeAce = new AccessControlEntryImpl(principal, new ArrayList<String>(remove));
removeAces.add(removeAce);
}
}
}
// Remove an existing ACE row
for (String key : originalAclMap.keySet()) {
if (!newAclMap.containsKey(key)) {
removeAces.add(originalAclMap.get(key));
}
}
obj.applyAcl(addAces, removeAces, AclPropagation.PROPAGATE);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ok();
}
private static Ace convertNoneAce(String principalId, Ace ace) {
if (CollectionUtils.isEmpty(ace.getPermissions())) {
AccessControlPrincipalDataImpl principal = new AccessControlPrincipalDataImpl(principalId);
List<String> cmisNone = Arrays.asList("cmis:none");
Ace none = new AccessControlEntryImpl(principal, cmisNone);
return none;
} else {
return ace;
}
}
private static Ace buildAce(String principalId, List<String> permission) {
AccessControlEntryImpl ace = new AccessControlEntryImpl();
AccessControlPrincipalDataImpl principal = new AccessControlPrincipalDataImpl(principalId);
ace.setPrincipal(principal);
ace.setPermissions(permission);
return ace;
}
public static Result upload(String repositoryId, String id) {
DynamicForm input = Form.form();
input = input.bindFromRequest();
Session session = getCmisSession(repositoryId);
CmisObject o = session.getObject(id);
if (o.getType() instanceof DocumentTypeDefinition) {
ContentStreamAllowed csa = ((DocumentTypeDefinition) (o.getType())).getContentStreamAllowed();
if (csa == ContentStreamAllowed.NOTALLOWED) {
return redirectToParent(repositoryId, input);
}
}
MultipartFormData body = request().body().asMultipartFormData();
List<FilePart> files = body.getFiles();
if (files.isEmpty()) {
// TODO error
System.err.println("There is no file when uploading");
}
FilePart file = files.get(0);
Document doc = (Document) o;
ContentStream cs = Util.convertFileToContentStream(session, file);
doc.setContentStream(cs, true);
return redirectToParent(repositoryId, input);
}
public static Result delete(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject object = session.getObject(id);
if (BaseTypeId.CMIS_FOLDER == object.getBaseTypeId()) {
Folder folder = (Folder) object;
folder.deleteTree(true, null, true);
} else {
session.delete(new ObjectIdImpl(id));
}
return ok();
}
public static Result checkOut(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject o = session.getObject(id);
DynamicForm input = Form.form();
input = input.bindFromRequest();
if (!Util.isDocument(o)) {
// TODO error
}
Document doc = (Document) o;
// Check if checkout is possible
if (doc.isVersionSeriesCheckedOut()) {
// TODO error
System.out.println("already checked out");
} else {
// Check out
doc.checkOut();
}
return ok();
}
public static Result cancelCheckOut(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject o = session.getObject(id);
if (!Util.isDocument(o)) {
// TODO error
}
Document doc = (Document) o;
doc.cancelCheckOut();
DynamicForm input = Form.form();
input = input.bindFromRequest();
return redirectToParent(repositoryId, input);
}
public static Result checkIn(String repositoryId, String id) {
Session session = getCmisSession(repositoryId);
CmisObject obj = session.getObject(id);
DynamicForm input = Form.form();
input = input.bindFromRequest();
MultipartFormData body = request().body().asMultipartFormData();
// Files
List<FilePart> files = body.getFiles();
if (files.isEmpty()) {
// TODO error
}
FilePart file = files.get(0);
Document doc = (Document) obj;
ContentStream cs = Util.convertFileToContentStream(session, file);
// Comment
String checkinComment = Util.getFormData(input, PropertyIds.CHECKIN_COMMENT);
// Execute
Map<String, Object> param = new HashMap<String, Object>();
doc.checkIn(true, param, cs, checkinComment);
return redirectToParent(repositoryId, input);
}
private static Principal getPrincipal(String repositoryId, String principalId, String anyone, String anonymous) {
// anyone
if (anyone.equals(principalId)) {
return new Principal("group", anyone, anyone);
}
// anonymous
if (anonymous.equals(principalId)) {
return new Principal("user", anonymous, anonymous);
}
String coreRestUri = Util.buildNemakiCoreRestRepositoryUri(repositoryId);
// user
JsonNode resultUser = Util.getJsonResponse(session(), coreRestUri + "user/show/" + principalId);
// TODO check status
JsonNode user = resultUser.get("user");
if (user != null) {
Principal p = new Principal("user", user.get("userId").asText(), user.get("userName").asText());
return p;
}
// group
JsonNode resultGroup = Util.getJsonResponse(session(), coreRestUri + "group/show/" + principalId);
// TODO check status
JsonNode group = resultGroup.get("group");
if (group != null) {
Principal p = new Principal("group", group.get("groupId").asText(), group.get("groupName").asText());
return p;
}
return null;
}
private static Result redirectToParent(String repositoryId, DynamicForm input) {
String parentId = Util.getFormData(input, PropertyIds.PARENT_ID);
// TODO fix hard code
if ("".equals(parentId) || "/".equals(parentId)) {
return redirect(routes.Node.index(repositoryId));
} else {
return redirect(routes.Node.showChildren(repositoryId, parentId));
}
}
public static Result getAce(String repositoryId, String objectId, String principalId) {
Session session = getCmisSession(repositoryId);
CmisObject obj = session.getObject(objectId);
Map<String, Ace> map = Util.zipWithId(obj.getAcl());
Ace ace = map.get(principalId);
if (ace == null) {
return ok(Util.emptyJsonObject());
} else {
JsonNode json = Json.toJson(ace);
return ok(json);
}
}
private static class TemporaryFileInputStream extends FileInputStream {
private File file;
public TemporaryFileInputStream(File file) throws FileNotFoundException {
super(file);
this.file = file;
}
@Override
public void close() throws IOException {
super.close();
this.file.delete();
}
}
}