/** * 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.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; import org.codehaus.jackson.type.TypeReference; import fr.itldev.koya.model.KoyaModel; import fr.itldev.koya.model.KoyaNode; import fr.itldev.koya.model.impl.Document; import fr.itldev.koya.model.impl.Dossier; import fr.itldev.koya.model.impl.Space; import fr.itldev.koya.model.impl.User; import fr.itldev.koya.model.json.PaginatedContentList; import fr.itldev.koya.model.permissions.KoyaPermissionCollaborator; import fr.itldev.koya.services.DossierService; import fr.itldev.koya.services.cache.CacheManager; import fr.itldev.koya.services.exceptions.AlfrescoServiceException; public class DossierServiceImpl extends AlfrescoRestService implements DossierService, Serializable { /** * */ private static final long serialVersionUID = 1L; private static final String REST_POST_MODIFYMEMBERSHIP = "/s/fr/itldev/koya/security/membership/{method}/{rolename}/{noderef}?alf_ticket={alf_ticket}"; private static final String REST_GET_SITECONSUMER_DOC_LIST = "/s/fr/itldev/koya/dossier/siteconsumerdocuments/{noderef}?alf_ticket={alf_ticket}"; private static final String REST_CONFIDENTIAL = "/s/fr/itldev/koya/dossier/confidential/{nodeRef}?alf_ticket={alf_ticket}"; private static final String REST_SUMMARY = "/s/fr/itldev/koya/dossier/summary/{nodeId}?alf_ticket={alf_ticket}"; private CacheManager cacheManager; public void setCacheManager(CacheManager cacheManager) { this.cacheManager = cacheManager; } @Override public Dossier create(User user, Space parentSpace, String title) throws AlfrescoServiceException { return (Dossier) super.create(user, parentSpace, Dossier.newInstance(title)); } /** * * @param user * @param dossier * @return * @throws AlfrescoServiceException */ @Override public Dossier edit(User user, Dossier dossier) throws AlfrescoServiceException { throw new UnsupportedOperationException("Not supported yet."); } /** * List all Space Dossiers * * @param user * @param space * @throws AlfrescoServiceException */ @Override public PaginatedContentList list(User user, Space space, int skipCount, int maxItems) throws AlfrescoServiceException { return list(user, space, skipCount, maxItems, "", null, null); } /** * List all Space Dossiers TODO sort parameter not process in this version * * * @param user * @param space * @throws AlfrescoServiceException */ @Override public PaginatedContentList list(User user, Space space, int skipCount, int maxItems, String filter, String sortField, Boolean ascending) throws AlfrescoServiceException { PaginatedContentList pcl = getTemplate().getForObject( getAlfrescoServerUrl() + AlfrescoRestService.REST_GET_LISTCHILD_PAGINATED, PaginatedContentList.class, space.getNodeRef(), skipCount, maxItems, true, filter, "", sortField, ascending, user.getTicketAlfresco()); return pcl; } /** * Count all Space Dossiers * * @param user * @param space * @return * @throws AlfrescoServiceException */ @SuppressWarnings("serial") @Override public Integer countChildren(User user, Space space) throws AlfrescoServiceException { return countChildren(user, space, new HashSet<QName>() { { add(KoyaModel.TYPE_DOSSIER); } }); } /** * Adds a user in charge of specified Dossier. * * @param user * @param dossier * @param responsible * @throws AlfrescoServiceException */ @Override public void addResponsible(User user, Dossier dossier, User responsible) throws AlfrescoServiceException { getTemplate().postForObject(getAlfrescoServerUrl() + REST_POST_MODIFYMEMBERSHIP, responsible, String.class, "add", KoyaPermissionCollaborator.RESPONSIBLE, dossier.getNodeRef(), user.getTicketAlfresco()); // invalidate user cache cacheManager.revokePermission(responsible, dossier.getNodeRef()); } @Override public void addMember(User user, Dossier dossier, User member) throws AlfrescoServiceException { getTemplate().postForObject(getAlfrescoServerUrl() + REST_POST_MODIFYMEMBERSHIP, member, String.class, "add", KoyaPermissionCollaborator.MEMBER, dossier.getNodeRef(), user.getTicketAlfresco()); // invalidate user cache cacheManager.revokePermission(member, dossier.getNodeRef()); } /** * Add a list of users in charge of specified Dossier. * * @param user * @param dossier * @param responsibles * @throws AlfrescoServiceException */ @Override public void addResponsible(User user, Dossier dossier, List<User> responsibles) throws AlfrescoServiceException { for (User u : responsibles) { addResponsible(user, dossier, u); } } /** * Remove user member or responsible of specified Dossier. * * @param user * @param dossier * @param memberOrResp * @throws AlfrescoServiceException */ @Override public void removeMembership(User user, Dossier dossier, User memberOrResp) throws AlfrescoServiceException { String rolename = "any"; getTemplate().postForObject(getAlfrescoServerUrl() + REST_POST_MODIFYMEMBERSHIP, memberOrResp, String.class, "del", rolename, dossier.getNodeRef(), user.getTicketAlfresco()); cacheManager.revokePermission(memberOrResp, dossier.getNodeRef()); } /** * checks if dossier is confidential * * @param user * @param dossier * @return * @throws AlfrescoServiceException */ @Override public Boolean isConfidential(User user, Dossier dossier) throws AlfrescoServiceException { if (dossier == null) { return false; } Boolean confidential = cacheManager.getDossierConfidential(dossier); if (confidential != null) { return confidential; } confidential = Boolean .valueOf(getTemplate().getForObject(getAlfrescoServerUrl() + REST_CONFIDENTIAL, String.class, dossier.getNodeRef(), user.getTicketAlfresco())); cacheManager.setDossierConfidential(dossier, confidential); return confidential; } /** * change dossier confidentiality status * * @param user * @param dossier * @return * @throws AlfrescoServiceException */ @Override public Boolean setConfidentiality(User user, Dossier dossier, Boolean confidential) throws AlfrescoServiceException { Map<String, String> params = new HashMap<>(); params.put("confidential", confidential.toString()); cacheManager.revokeDossierConfidential(dossier); getTemplate().postForObject(getAlfrescoServerUrl() + REST_CONFIDENTIAL, params, String.class, dossier.getNodeRef(), user.getTicketAlfresco()); return isConfidential(user, dossier); } @Override public KoyaNode createSummary(User user, Dossier dossier) throws AlfrescoServiceException { return fromJSON( new TypeReference<KoyaNode>() { }, getTemplate().getForObject( getAlfrescoServerUrl() + REST_SUMMARY, String.class, dossier.getNodeRef().getId(), user.getTicketAlfresco())); } @Override public List<Document> listClientUploadedDocuments(User user, Dossier dossier) { return fromJSON(new TypeReference<List<Document>>() { }, getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_SITECONSUMER_DOC_LIST, String.class, dossier.getNodeRef(), user.getTicketAlfresco())); } /** * Workflow methods * */ private static final String REST_POST_START_WORKFLOW = "/s/fr/itldev/koya/workflow/start/{workflowId}/{nodeRef}?alf_ticket={alf_ticket}"; private static final String REST_POST_VALIDATE_STEP = "/s/api/task/{workflowInstanceId}/formprocessor?alf_ticket={alf_ticket}"; private static final String REST_GET_WORKFLOW_STATUS = "/s/fr/itldev/koya/workflow/workflow-instance/{workflowInstanceId}?includeTasks=true&alf_ticket={alf_ticket}"; private static final String REST_GET_TASK_STATUS = "/s/fr/itldev/koya/workflow/task-isassignee/{taskInstanceId}?alf_ticket={alf_ticket}"; @Override public String startWorkflow(User user, Dossier d, String workflowId, Map<String, String> properties) throws AlfrescoServiceException { return fromJSON(new TypeReference<String>() { }, getTemplate().postForObject(getAlfrescoServerUrl() + REST_POST_START_WORKFLOW, properties, String.class, workflowId, d.getNodeRef(), user.getTicketAlfresco())); } @Override public void endTask(User user, String taskId, Map<String, String> properties) throws AlfrescoServiceException { getTemplate().postForObject(getAlfrescoServerUrl() + REST_POST_VALIDATE_STEP, properties, String.class, taskId, user.getTicketAlfresco()); } @Override public Map<String, Serializable> getWorkflowStatus(User user, String workflowInstanceId) throws AlfrescoServiceException { Map<String, Serializable> returnValues = getTemplate().getForObject( getAlfrescoServerUrl() + REST_GET_WORKFLOW_STATUS, Map.class, workflowInstanceId, user.getTicketAlfresco()); return returnValues; } @Override public Boolean taskIsAssignee(User user, String taskInstanceId) throws AlfrescoServiceException { Map<String, Serializable> map = getTemplate().getForObject( getAlfrescoServerUrl() + REST_GET_TASK_STATUS, Map.class, taskInstanceId, user.getTicketAlfresco()); return Boolean.valueOf(map.get("isassignee").toString()); } }