org.craftercms.cstudio.alfresco.service.impl.CStudioNodeServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.craftercms.cstudio.alfresco.service.impl.CStudioNodeServiceImpl.java

Source

/*******************************************************************************
 * Crafter Studio Web-content authoring solution
 *     Copyright (C) 2007-2013 Crafter Software Corporation.
 *
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU 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 General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 *     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package org.craftercms.cstudio.alfresco.service.impl;

import javolution.util.FastMap;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.nodelocator.CompanyHomeNodeLocator;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.namespace.QName;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.craftercms.cstudio.alfresco.dm.to.DmPathTO;
import org.craftercms.cstudio.alfresco.pagenavigationordersequence.PageNavigationOrderSequenceDaoService;
import org.craftercms.cstudio.alfresco.service.AbstractRegistrableService;
import org.craftercms.cstudio.alfresco.service.api.CStudioNodeService;
import org.craftercms.cstudio.alfresco.service.api.GeneralLockService;
import org.craftercms.cstudio.alfresco.service.api.PersistenceManagerService;
import org.craftercms.cstudio.alfresco.to.PageNavigationOrderSequenceTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class CStudioNodeServiceImpl extends AbstractRegistrableService implements CStudioNodeService {

    private static Logger logger = LoggerFactory.getLogger(CStudioNodeServiceImpl.class);

    protected CompanyHomeNodeLocator _companyHomeNodeLocator;

    public CompanyHomeNodeLocator getCompanyHomeNodeLocator() {
        return _companyHomeNodeLocator;
    }

    public void setCompanyHomeNodeLocator(CompanyHomeNodeLocator companyHomeNodeLocator) {
        this._companyHomeNodeLocator = companyHomeNodeLocator;
    }

    protected PageNavigationOrderSequenceDaoService _pageNavigationOrderSequenceDaoService;

    public PageNavigationOrderSequenceDaoService getPageNavigationOrderSequenceDaoService() {
        return _pageNavigationOrderSequenceDaoService;
    }

    public void setPageNavigationOrderSequenceDaoService(
            PageNavigationOrderSequenceDaoService pageNavigationOrderSequenceDaoService) {
        this._pageNavigationOrderSequenceDaoService = pageNavigationOrderSequenceDaoService;
    }

    @Override
    public NodeRef getCompanyHomeNodeRef() {
        return getCompanyHomeNodeLocator().getNode(null, null);
    }

    @Override
    public void register() {
        this._servicesManager.registerService(CStudioNodeService.class, this);
    }

    /**
     * @deprecated Use {@link PersistenceManagerService#getNodeRef(String)}
     */
    @Override
    @Deprecated
    public NodeRef getNodeRef(String fullPath) {
        return getNodeRef(getCompanyHomeNodeRef(), fullPath);
    }

    /**
     * @deprecated Use {@link PersistenceManagerService#getNodeRef(NodeRef, String)}
     */
    @Override
    @Deprecated
    public NodeRef getNodeRef(NodeRef rootNode, String relativePath) {
        return getService(PersistenceManagerService.class).getNodeRef(rootNode, relativePath);
    }

    /**
     * @deprecated Use {@link PersistenceManagerService#getNodeRef(String, String)}
     */
    @Override
    @Deprecated
    public NodeRef getNodeRef(String rootPath, String relativePath) {
        return getNodeRef(getNodeRef(rootPath), relativePath);
    }

    @Override
    public String getNodePath(NodeRef nodeRef) {
        return getRelativeNodePath(getCompanyHomeNodeRef(), nodeRef);
    }

    @Override
    public String getRelativeNodePath(NodeRef rootNodeRef, NodeRef nodeRef) {
        StringBuilder sb = new StringBuilder();
        PersistenceManagerService persistenceManagerService = getService(PersistenceManagerService.class);
        Path nodePath = persistenceManagerService.getPath(nodeRef);
        boolean foundRootNodeRef = false;
        for (Path.Element element : nodePath) {
            Path.ChildAssocElement assocElement = (Path.ChildAssocElement) element;
            ChildAssociationRef childAssociationRef = assocElement.getRef();
            NodeRef elementNode = childAssociationRef.getChildRef();
            if (foundRootNodeRef) {
                sb.append("/").append(childAssociationRef.getQName().getLocalName());
            }
            foundRootNodeRef = foundRootNodeRef || elementNode.equals(rootNodeRef);
        }
        return sb.toString();
    }

    @Override
    public NodeRef createNewFolder(String fullPath) {
        return createNewFolder(fullPath, new FastMap<QName, Serializable>());
    }

    @Override
    public NodeRef createNewFolder(String fullPath, Map<QName, Serializable> nodeProperties) {
        int idx = StringUtils.lastIndexOf(fullPath, '/');
        String parentPath = StringUtils.substring(fullPath, 0, idx - 1);
        String folderName = StringUtils.substring(fullPath, idx + 1);
        if (!nodeProperties.containsKey(ContentModel.PROP_NAME)) {
            nodeProperties.put(ContentModel.PROP_NAME, folderName);
        }
        return createNewFolder(parentPath, folderName, nodeProperties);
    }

    @Override
    public NodeRef createNewFolder(String parentPath, String folderName) {
        Map<QName, Serializable> nodeProperties = new FastMap<QName, Serializable>();
        nodeProperties.put(ContentModel.PROP_NAME, folderName);
        return createNewFolder(parentPath, folderName, nodeProperties);
    }

    @Override
    public NodeRef createNewFolder(String parentPath, String folderName, Map<QName, Serializable> nodeProperties) {
        NodeRef parentNodeRef = getNodeRef(parentPath);
        if (!nodeProperties.containsKey(ContentModel.PROP_NAME)) {
            nodeProperties.put(ContentModel.PROP_NAME, folderName);
        }
        return createNewFolder(parentNodeRef, folderName, nodeProperties);
    }

    @Override
    public NodeRef createNewFolder(NodeRef parentNodeRef, String folderName) {
        Map<QName, Serializable> nodeProperties = new FastMap<QName, Serializable>();
        nodeProperties.put(ContentModel.PROP_NAME, folderName);
        return createNewFolder(parentNodeRef, folderName, nodeProperties);
    }

    @Override
    public NodeRef createNewFolder(NodeRef parentNodeRef, String folderName,
            Map<QName, Serializable> nodeProperties) {
        QName assocQName = QName.createQName(ContentModel.TYPE_CONTENT.getNamespaceURI(),
                QName.createValidLocalName(folderName));
        PersistenceManagerService persistenceManagerService = getService(PersistenceManagerService.class);
        //updateLastNavigationOrder(parentNodeRef);
        if (!nodeProperties.containsKey(ContentModel.PROP_NAME)) {
            nodeProperties.put(ContentModel.PROP_NAME, folderName);
        }
        NodeRef result = persistenceManagerService.createNode(parentNodeRef, ContentModel.ASSOC_CONTAINS,
                assocQName, ContentModel.TYPE_FOLDER, nodeProperties).getChildRef();
        return result;
    }

    @Override
    public NodeRef createNewFile(String fullPath, InputStream content) {
        return createNewFile(fullPath, content, new FastMap<QName, Serializable>());
    }

    @Override
    public NodeRef createNewFile(String fullPath, InputStream content, Map<QName, Serializable> nodeProperties) {
        int idx = StringUtils.lastIndexOf(fullPath, '/');
        String parentPath = StringUtils.substring(fullPath, 0, idx - 1);
        String fileName = StringUtils.substring(fullPath, idx + 1);
        if (!nodeProperties.containsKey(ContentModel.PROP_NAME)) {
            nodeProperties.put(ContentModel.PROP_NAME, fileName);
        }
        return createNewFile(parentPath, fileName, content, nodeProperties);
    }

    @Override
    public NodeRef createNewFile(String parentPath, String fileName, InputStream content) {
        NodeRef parentNodeRef = getNodeRef(parentPath);
        Map<QName, Serializable> nodeProperties = new FastMap<QName, Serializable>();
        nodeProperties.put(ContentModel.PROP_NAME, fileName);
        return createNewFile(parentNodeRef, fileName, content, nodeProperties);
    }

    @Override
    public NodeRef createNewFile(String parentPath, String fileName, InputStream content,
            Map<QName, Serializable> nodeProperties) {
        NodeRef parentNodeRef = getNodeRef(parentPath);
        if (!nodeProperties.containsKey(ContentModel.PROP_NAME)) {
            nodeProperties.put(ContentModel.PROP_NAME, fileName);
        }
        return createNewFile(parentNodeRef, fileName, content, nodeProperties);
    }

    @Override
    public NodeRef createNewFile(NodeRef parentNodeRef, String fileName, InputStream content) {
        Map<QName, Serializable> nodeProperties = new FastMap<QName, Serializable>();
        nodeProperties.put(ContentModel.PROP_NAME, fileName);
        return createNewFile(parentNodeRef, fileName, content, nodeProperties);
    }

    @Override
    public NodeRef createNewFile(NodeRef parentNodeRef, String fileName, InputStream content,
            Map<QName, Serializable> nodeProperties) {
        QName assocQName = QName.createQName(ContentModel.TYPE_CONTENT.getNamespaceURI(),
                QName.createValidLocalName(fileName));
        if (!nodeProperties.containsKey(ContentModel.PROP_NAME)) {
            nodeProperties.put(ContentModel.PROP_NAME, fileName);
        }
        PersistenceManagerService persistenceManagerService = getService(PersistenceManagerService.class);
        NodeRef newFileNodeRef = persistenceManagerService.createNode(parentNodeRef, ContentModel.ASSOC_CONTAINS,
                assocQName, ContentModel.TYPE_CONTENT, nodeProperties).getChildRef();
        ContentWriter writer = persistenceManagerService.getWriter(newFileNodeRef, ContentModel.PROP_CONTENT, true);
        OutputStream output = writer.getContentOutputStream();
        try {
            IOUtils.copy(content, output);
        } catch (IOException e) {
            if (logger.isErrorEnabled()) {
                logger.error("Error while creating new file", e);
            }
        } finally {
            IOUtils.closeQuietly(content);
            IOUtils.closeQuietly(output);
        }
        return newFileNodeRef;
    }

    protected void updateLastNavigationOrder(final NodeRef nodeRef) {
        GeneralLockService sequenceLockService = getService(GeneralLockService.class);
        sequenceLockService.lock(nodeRef.getId());
        try {
            PageNavigationOrderSequenceTO sequenceTO = _pageNavigationOrderSequenceDaoService
                    .getSequence(nodeRef.getId());
            if (sequenceTO == null) {
                String fullPath = getNodePath(nodeRef);
                DmPathTO dmPathTO = new DmPathTO(fullPath);
                List<FileInfo> children = getService(PersistenceManagerService.class).list(nodeRef);
                sequenceTO = new PageNavigationOrderSequenceTO(nodeRef.getId(), dmPathTO.getSiteName(),
                        dmPathTO.getRelativePath(), 100F * children.size());
                _pageNavigationOrderSequenceDaoService.setSequence(sequenceTO);
            } else {
                sequenceTO = _pageNavigationOrderSequenceDaoService.increaseSequence(nodeRef.getId());
            }
        } catch (Exception e) {
            if (logger.isErrorEnabled()) {
                logger.error("Unexpected error while updating the last navigation order on " + nodeRef, e);
            }
        } finally {
            sequenceLockService.unlock(nodeRef.getId());
        }

    }

    @Override
    public void deleteNode(NodeRef nodeRef) {
        PersistenceManagerService persistenceManagerService = getService(PersistenceManagerService.class);
        NodeRef parentNodeRef = persistenceManagerService.getPrimaryParent(nodeRef).getParentRef();
        persistenceManagerService.deleteNode(nodeRef);
        persistenceManagerService.deleteObjectState(nodeRef.getId());
        while (persistenceManagerService.list(parentNodeRef).size() == 0) {
            NodeRef helperNode = parentNodeRef;
            parentNodeRef = persistenceManagerService.getPrimaryParent(helperNode).getParentRef();
            persistenceManagerService.deleteNode(helperNode);
            persistenceManagerService.deleteObjectState(helperNode.getId());
        }
    }
}