/** * 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.alfservice; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.log4j.Logger; import fr.itldev.koya.exception.KoyaServiceException; import fr.itldev.koya.model.KoyaModel; import fr.itldev.koya.model.exceptions.KoyaErrorCodes; import fr.itldev.koya.model.impl.Company; import fr.itldev.koya.model.impl.Space; /** * Spaces Handling service */ public class SpaceService { private final Logger logger = Logger.getLogger(this.getClass()); private NodeService nodeService; private KoyaNodeService koyaNodeService; private CompanyService companyService; private FileFolderService fileFolderService; // <editor-fold defaultstate="collapsed" desc="getters/setters"> public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } public void setKoyaNodeService(KoyaNodeService koyaNodeService) { this.koyaNodeService = koyaNodeService; } public void setCompanyService(CompanyService companyService) { this.companyService = companyService; } public void setFileFolderService(FileFolderService fileFolderService) { this.fileFolderService = fileFolderService; } // </editor-fold> /** * Space creation in a valid Container : Space or Company * * @param title * @param target * @param prop * @return * @throws KoyaServiceException */ public Space create(String title, NodeRef target, Map<String, String> prop) throws KoyaServiceException { // Space must have a name if (title == null || title.isEmpty()) { throw new KoyaServiceException(KoyaErrorCodes.SPACE_EMPTY_NAME); } NodeRef nrParent = null; if (nodeService.getType(target).equals(KoyaModel.TYPE_SPACE)) { // if parent is a space, select his node nrParent = target; } else if (nodeService.getType(target).equals(KoyaModel.TYPE_COMPANY)) { // if it's a company, select documentLibrary's node nrParent = getDocLibNodeRef(target); } else { throw new KoyaServiceException(KoyaErrorCodes.SPACE_INVALID_PARENT); } String name = koyaNodeService.getUniqueValidFileNameFromTitle(title); // build node properties final Map<QName, Serializable> properties = new HashMap<>(); properties.put(ContentModel.PROP_NAME, name); properties.put(ContentModel.PROP_TITLE, title); ChildAssociationRef car = nodeService .createNode(nrParent, ContentModel.ASSOC_CONTAINS, QName .createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name), KoyaModel.TYPE_SPACE, properties); return koyaNodeService.getKoyaNode(car.getChildRef(), Space.class); } /** * Returns Company Spaces recursive list. * * @param companyShortName * @param depth * @return * @throws fr.itldev.koya.exception.KoyaServiceException */ public List<Space> list(String companyShortName, Integer depth) throws KoyaServiceException { NodeRef nodeDocLib = getDocLibNodeRef(companyService.getSiteInfo( companyShortName).getNodeRef()); return listRecursive(nodeDocLib, depth); } public List<Space> list(Company c) throws KoyaServiceException { NodeRef nodeDocLib = getDocLibNodeRef(c.getNodeRef()); return listRecursive(nodeDocLib, Integer.MAX_VALUE); } /** * private recursive spaces list builder method. * * @param rootNodeRef * @param depth * @return * @throws KoyaServiceException */ private List<Space> listRecursive(NodeRef rootNodeRef, Integer depth) throws KoyaServiceException { List<Space> spaces = new ArrayList<>(); if (depth <= 0) { return spaces;// return empty list if max depth < = 0 : ie max depth // reached } for (final FileInfo fi : fileFolderService.listFolders(rootNodeRef)) { if (fi.getType().equals(KoyaModel.TYPE_SPACE)) { Space space = koyaNodeService.getKoyaNode(fi.getNodeRef(), Space.class); space.setChildSpaces(listRecursive(fi.getNodeRef(), depth - 1)); spaces.add(space); } } return spaces; } /** * * =============== private Methods ================= * */ /** * * Returns Company "documentLibrary" NodeRef (root spaces parent). * * @param s * @return * @throws KoyaServiceException */ private NodeRef getDocLibNodeRef(NodeRef companyNodeRef) throws KoyaServiceException { // TODO cache noderef / companies // TODO use // siteService.getContainer(siteService.getSite(companyNodeRef).getShortName(), // SiteService.DOCUMENT_LIBRARY); for (ChildAssociationRef car : nodeService .getChildAssocs(companyNodeRef)) { if (nodeService.getProperty(car.getChildRef(), ContentModel.PROP_NAME).equals(KoyaNodeService.DOCLIB_NAME)) { return car.getChildRef(); } } throw new KoyaServiceException( KoyaErrorCodes.SPACE_DOCLIB_NODE_NOT_FOUND); } }