/**
* Koya is an alfresco module that provides a corporate orientated dataroom.
*
* Copyright (C) Itl Developpement 2014
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see `<http://www.gnu.org/licenses/>`.
*/
package fr.itldev.koya.services.impl;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
import org.codehaus.jackson.type.TypeReference;
import org.json.simple.JSONObject;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import fr.itldev.koya.model.KoyaNode;
import fr.itldev.koya.model.impl.Directory;
import fr.itldev.koya.model.impl.Document;
import fr.itldev.koya.model.impl.User;
import fr.itldev.koya.model.interfaces.KoyaContent;
import fr.itldev.koya.model.json.AlfrescoUploadReturn;
import fr.itldev.koya.model.json.DiskSizeWrapper;
import fr.itldev.koya.model.json.PaginatedContentList;
import fr.itldev.koya.model.json.PdfRendition;
import fr.itldev.koya.services.KoyaContentService;
import fr.itldev.koya.services.exceptions.AlfrescoServiceException;
public class KoyaContentServiceImpl extends AlfrescoRestService implements KoyaContentService, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final String REST_GET_MOVECONTENT = "/s/fr/itldev/koya/content/move/{nodeRef}?destNodeRef={destNodeRef}&alf_ticket={alf_ticket}";
private static final String REST_GET_COPYCONTENT = "/s/fr/itldev/koya/content/copy/{nodeRef}?destNodeRef={destNodeRef}&alf_ticket={alf_ticket}";
private static final String REST_GET_LISTCONTENTTREE = "/s/fr/itldev/koya/content/tree/{nodeRef}?onlyFolders={onlyFolders}&maxdepth={maxdepth}&alf_ticket={alf_ticket}";
private static final String REST_GET_DISKSIZE = "/s/fr/itldev/koya/global/disksize/{nodeRef}?alf_ticket={alf_ticket}";
private static final String REST_GET_IMPORTZIP = "/s/fr/itldev/koya/content/importzip/{zipnoderef}?alf_ticket={alf_ticket}";
private static final String POST_GENERATE_ZIP = "/s/fr/itldev/koya/content/zip?alf_ticket={alf_ticket}";
private static final String POST_PDFS_RENDER = "/s/fr/itldev/koya/render/pdfrender?alf_ticket={alf_ticket}";
@Override
public Directory createDir(User user, KoyaNode parent, String title)
throws AlfrescoServiceException {
return (Directory) super.create(user, parent, Directory.newInstance(title));
}
@Override
public Document upload(User user, NodeRef parent, File f)
throws AlfrescoServiceException {
return upload(user, parent, (Object) f);
}
@Override
public Document upload(User user, NodeRef parent, Resource r)
throws AlfrescoServiceException {
return upload(user, parent, (Object) r);
}
private Document upload(User user, NodeRef parent, Object o)
throws AlfrescoServiceException {
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("filedata", o);
parts.add("destination", parent.toString());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(
parts, headers);
AlfrescoUploadReturn upReturn = fromJSON(
new TypeReference<AlfrescoUploadReturn>() {
},
getTemplate().postForObject(
getAlfrescoServerUrl() + REST_POST_UPLOAD, request,
String.class,user.getTicketAlfresco()));
return (Document) getKoyaNode(user, upReturn.getNodeRef());
}
@Override
public KoyaContent move(User user, NodeRef contentToMove,
NodeRef destination)
throws AlfrescoServiceException {
return (KoyaContent) fromJSON(
new TypeReference<KoyaNode>() {
},
getTemplate().getForObject(
getAlfrescoServerUrl() + REST_GET_MOVECONTENT,
String.class, contentToMove, destination,user.getTicketAlfresco()));
}
@Override
public KoyaContent copy(User user, NodeRef contentToCopy,
NodeRef destination)
throws AlfrescoServiceException {
return (KoyaContent) fromJSON(
new TypeReference<KoyaNode>() {
},
getTemplate().getForObject(
getAlfrescoServerUrl() + REST_GET_COPYCONTENT,
String.class, contentToCopy, destination,user.getTicketAlfresco()));
}
// TODO merge with a generic listing service
@SuppressWarnings("unchecked")
@Override
public List<KoyaContent> list(User user, NodeRef containerToList,
Boolean onlyFolders, Integer depth) throws AlfrescoServiceException {
@SuppressWarnings("rawtypes")
List contents = fromJSON(
new TypeReference<List<KoyaNode>>() {
},
getTemplate().getForObject(
getAlfrescoServerUrl() + REST_GET_LISTCONTENTTREE,
String.class, containerToList, onlyFolders, depth,user.getTicketAlfresco()));
return contents;
}
/**
*
* @param user
* @param containerToList
* @param skipCount
* @param maxItems
* @param onlyFolders
* @return
* @throws AlfrescoServiceException
*/
@Override
public PaginatedContentList listPaginatedDirectChild(User user,
NodeRef containerToList, Integer skipCount, Integer maxItems,
Boolean onlyFolders, String sortField, Boolean ascending) throws AlfrescoServiceException {
PaginatedContentList pcl = getTemplate().getForObject(
getAlfrescoServerUrl()
+ AlfrescoRestService.REST_GET_LISTCHILD_PAGINATED,
PaginatedContentList.class, containerToList, skipCount,
maxItems, onlyFolders, null,"", sortField, ascending, user.getTicketAlfresco());
return pcl;
}
@Override
public Integer countChildren(User user, KoyaNode parent, Boolean onlyFolders)
throws AlfrescoServiceException {
Set<QName> typeFilter = new HashSet<>();
if (onlyFolders) {
typeFilter.add(ContentModel.TYPE_FOLDER);
}
return countChildren(user, parent, typeFilter);
}
@Override
public Long getDiskSize(User user, KoyaNode KoyaNode)
throws AlfrescoServiceException {
DiskSizeWrapper ret = fromJSON(
new TypeReference<DiskSizeWrapper>() {
},
getTemplate().getForObject(
getAlfrescoServerUrl() + REST_GET_DISKSIZE,
String.class, KoyaNode.getNodeRef(),user.getTicketAlfresco()));
return ret.getSize();
}
@Override
public KoyaNode getZipKoyaNode(User user, List<KoyaNode> koyaNodes,String zipname,
Boolean pdf,Boolean async) {
Map<String, Serializable> params = new HashMap<>();
ArrayList<String> selected = new ArrayList<>();
params.put("nodeRefs", selected);
for (KoyaNode item : koyaNodes) {
selected.add(item.getNodeRef().toString());
}
params.put("pdf", pdf);
params.put("async", async);
params.put("zipname", zipname);
JSONObject postParams = new JSONObject(params);
KoyaNode result= fromJSON(
new TypeReference<KoyaNode>() {
},
getTemplate().postForObject(
getAlfrescoServerUrl() + POST_GENERATE_ZIP,
postParams,
String.class,user.getTicketAlfresco()));
return result;
}
@Override
public void importZipedContent(User user, Document zipFile)
throws AlfrescoServiceException {
getTemplate().getForObject(
getAlfrescoServerUrl() + REST_GET_IMPORTZIP, String.class,
zipFile.getNodeRef(),user.getTicketAlfresco());
}
@Override
public KoyaNode getContentPdfNode(User user, KoyaNode koyaNode) throws AlfrescoServiceException {
Map<String, Serializable> params = new HashMap<>();
params.put("nodeRef", koyaNode.getNodeRef().toString());
JSONObject postParams = new JSONObject(params);
PdfRendition rendition = fromJSON(
new TypeReference<PdfRendition>() {
},
getTemplate().postForObject(
getAlfrescoServerUrl() + POST_PDFS_RENDER,
postParams,
String.class,user.getTicketAlfresco()));
KoyaNode node = getKoyaNode(user, rendition.getNodeRef());
node.setTitle(rendition.getTitle());
return node;
}
}