org.craftercms.studio.impl.repository.mongodb.services.impl.NodeServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.craftercms.studio.impl.repository.mongodb.services.impl.NodeServiceImpl.java

Source

/*
 * 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.studio.impl.repository.mongodb.services.impl;

import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import com.mongodb.gridfs.GridFSFile;
import org.apache.commons.lang.StringUtils;
import org.craftercms.studio.api.content.PathService;
import org.craftercms.studio.impl.repository.mongodb.MongoRepositoryDefaults;
import org.craftercms.studio.impl.repository.mongodb.datarepos.NodeDataRepository;
import org.craftercms.studio.impl.repository.mongodb.domain.CoreMetadata;
import org.craftercms.studio.impl.repository.mongodb.domain.Node;
import org.craftercms.studio.impl.repository.mongodb.domain.NodeType;
import org.craftercms.studio.impl.repository.mongodb.exceptions.MongoRepositoryException;
import org.craftercms.studio.impl.repository.mongodb.services.GridFSService;
import org.craftercms.studio.impl.repository.mongodb.services.NodeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.data.mongodb.core.MongoTemplate;

/**
 * Default Implementation of {@link org.craftercms.studio.impl.repository.mongodb.services.NodeService}.
 */
public class NodeServiceImpl implements NodeService {
    /**
     * Logger.
     */
    private Logger log = LoggerFactory.getLogger(NodeServiceImpl.class);
    /**
     * Data Repository.
     */
    private NodeDataRepository nodeDataRepository;
    /**
     * Grid FS Helper Services.
     */
    private GridFSService gridFSService;
    /**
     * Mongo Template for support.
     */
    private MongoTemplate mongoTemplate;
    /**
     * Path Services
     */
    private PathService pathServices;

    /**
     * Default CTOR.
     */
    public NodeServiceImpl() {
    }

    @Override
    public Node createFileNode(final Node parent, final String fileName, String label, final String creatorName,
            final InputStream content) throws MongoRepositoryException {
        log.debug("Validating params for creating a new Folder Node");
        if (parent == null) {
            log.error("Trying to create a node with parent null");
            throw new IllegalArgumentException("Parent  of a File Node can't be null");
        }
        if (isNodeFolder(parent)) {

            log.debug("Creating File Node with params {}, {} in {}", fileName, creatorName, parent);
            Node newNode = new Node(parent, NodeType.FILE);
            newNode.setId(UUID.randomUUID().toString());
            try {
                newNode.getMetadata().setCore(createNodeMetadata(fileName, creatorName, content, label));
                if (isNodeUniqueNodeinTree(newNode)) {
                    newNode = nodeDataRepository.save(newNode);
                    log.debug("File node  {} saved ", newNode);
                    return newNode;
                } else {
                    log.debug("Node with name {} is already exist on given tree path {}",
                            newNode.getMetadata().getCore().getNodeName(), newNode.getAncestors());
                    throw new IllegalArgumentException("Node named " + fileName + " Already exist in given path "
                            + parent.getMetadata().getCore().getNodeName());
                }
            } catch (DataAccessException ex) {
                log.error("Unable to save node {} due a DataAccessException", newNode);
                log.error("DataAccessException ", ex);
                throw new MongoRepositoryException("Unable to save Node due a DataAccessException", ex);
            } catch (MongoRepositoryException e) {
                log.error("Unable to save node {} because file was unable to be saved {}", newNode, e.toString());
                throw new MongoRepositoryException("Unable to save node because file was unable to be saved", e);
            }
        } else {
            log.error("Parent node {} is no a folder. can't create a FileNode with out a folder", parent);
            throw new IllegalArgumentException("Node " + parent.getId() + " is not a folder");
        }
    }

    @Override
    public Node createFolderNode(final Node parent, final String folderName, final String folderLabel,
            final String creatorName) throws MongoRepositoryException {
        log.debug("Validating params for creating a new Folder Node");
        if (parent == null) {
            log.error("Trying to create a node with parent null");
            throw new IllegalArgumentException("Parent Node can't be null");
        }

        if (isNodeFolder(parent)) {
            //TODO Validate that folder with same name and ancenstor does not exist.
            log.debug("Params for new Folder node are ok");
            log.debug("Generating ID and CoreMetadata");
            Node newNode = new Node(parent, NodeType.FOLDER);
            newNode.setId(UUID.randomUUID().toString());
            newNode.getMetadata().setCore(createBasicMetadata(folderName, creatorName, folderLabel));
            log.debug("Generated Id {} , and coreMetadata {}", newNode.getId(), newNode.getMetadata());
            log.debug("Saving Folder");
            try {
                if (isNodeUniqueNodeinTree(newNode)) {
                    newNode = nodeDataRepository.save(newNode);
                } else {
                    log.debug("Node with name {} is already exist on given tree path {}",
                            newNode.getMetadata().getCore().getNodeName(), newNode.getAncestors());
                    throw new IllegalArgumentException("Node named " + folderName + " Already exist in given path "
                            + parent.getMetadata().getCore().getNodeName());
                }
            } catch (DataAccessException ex) {
                log.error("Unable to save Folder Node ", ex);
                throw new MongoRepositoryException("Unable to save Folder Node", ex);
            }
            log.debug("Node saved, returning node {}", newNode);
            return newNode;
        } else {
            log.error("Trying to create a node with a non folder parent");
            throw new IllegalArgumentException("Parent Node has to be a folder Type");
        }

    }

    @Override
    public List<Node> findNodesByParents(final List<Node> parents) {
        log.debug("Finding all children of {}", parents);
        List<Node> foundNodes = nodeDataRepository.findAllByAncestors(parents);
        log.debug("Found {} children nodes ", foundNodes);
        return foundNodes;
    }

    @Override
    public Node getRootNode() {
        return nodeDataRepository.findRootNode();
    }

    @Override
    public boolean isNodeFolder(final Node nodeToCheck) {
        return nodeToCheck.getType() == NodeType.FOLDER;
    }

    @Override
    public boolean isNodeFile(final Node nodeToCheck) {
        return nodeToCheck.getType() == NodeType.FILE;
    }

    @Override
    public Node getNode(final String nodeId) throws MongoRepositoryException {

        if (StringUtils.isBlank(nodeId)) {
            log.error("Given Node Id is either null,empty or blank");
            throw new IllegalArgumentException("Node Id can't be null, empty or blank");
        }

        log.debug("Getting node by id = {}", nodeId);
        try {
            Node foundNode = nodeDataRepository.findOne(nodeId);
            log.debug("Found {} ", foundNode);
            return foundNode;
        } catch (DataAccessException ex) {
            log.error("Unable to find Node with id {} due a DataAccessException", nodeId);
            log.error("DataAccessException is ", ex);
            throw new MongoRepositoryException("Unable to find Node ", ex);
        }
    }

    @Override
    public Node findNodeByAncestorsAndName(final List<Node> ancestors, final String nodeName) {
        if (StringUtils.isBlank(nodeName)) {
            log.debug("Node name can't be empty or blank");
            throw new IllegalArgumentException("Can't search node with name either null ,empty or blank");
        }
        if (ancestors == null || ancestors.isEmpty()) { //Quick List of 1
            return nodeDataRepository.findNodeByAncestorsAndMetadataCoreNodeName(Arrays.asList(getRootNode()),
                    nodeName);
        } else {
            return nodeDataRepository.findNodeByAncestorsAndMetadataCoreNodeName(ancestors, nodeName);
        }
    }

    @Override
    public Node getSiteNode(String siteName) {
        return findNodeByAncestorsAndName(Arrays.asList(getRootNode()), siteName);
    }

    @Override
    public Node createFolderStructure(final String path) throws MongoRepositoryException {
        String[] pathParts = path.substring(1).split(MongoRepositoryDefaults.REPO_DEFAULT_PATH_SEPARATOR_CHAR);
        Node parentNode = getRootNode();
        for (int i = 0; i < pathParts.length; i++) {
            Node pivot = findNodeByAncestorsAndName(parentNode.getAncestors(), pathParts[i]);
            if (pivot == null) {
                parentNode = createFolderNode(parentNode, pathParts[i], pathParts[i],
                        MongoRepositoryDefaults.SYSTEM_USER_NAME);

            }
        }
        return parentNode;
    }

    @Override
    public InputStream getFile(final String fileId) throws MongoRepositoryException {
        if (StringUtils.isBlank(fileId)) {
            log.debug("File Id can't be empty or blank");
            throw new IllegalArgumentException("Can't search file if the id either null ,empty or blank");
        }
        return gridFSService.getFile(fileId);
    }

    private boolean isNodeUniqueNodeinTree(Node nodeToValidate) {
        return nodeDataRepository.findNodeByAncestorsAndMetadataCoreNodeName(nodeToValidate.getAncestors(),
                nodeToValidate.getMetadata().getCore().getNodeName()) == null;
    }

    private CoreMetadata createNodeMetadata(final String fileName, final String creatorName,
            final InputStream content, final String folderLabel) throws MongoRepositoryException {
        CoreMetadata coreMetadata = createBasicMetadata(fileName, creatorName, folderLabel);
        try {
            GridFSFile savedFile = gridFSService.saveFile(fileName, content);
            coreMetadata.setSize(savedFile.getLength());
            coreMetadata.setFileId(savedFile.getId().toString());
        } catch (DataAccessException ex) {
            log.error("Unable to save {} file due a DataAccessException", fileName);
            log.error("DataAccessException thrown ", ex);
            throw new MongoRepositoryException("Unable to save file due a DataAccessException", ex);
        }
        return coreMetadata;
    }

    private CoreMetadata createBasicMetadata(final String fileName, final String creatorName,
            final String folderLabel) {
        CoreMetadata coreMetadata = new CoreMetadata();
        coreMetadata.setNodeName(fileName);
        coreMetadata.setCreator(creatorName);
        coreMetadata.setCreateDate(new Date());
        coreMetadata.setLastModifiedDate(new Date());
        coreMetadata.setModifier(creatorName);
        coreMetadata.setLabel(folderLabel);
        return coreMetadata;
    }

    public void setNodeDataRepository(final NodeDataRepository nodeDataRepository) {
        this.nodeDataRepository = nodeDataRepository;
    }

    public void setGridFSService(final GridFSService gridFSService) {
        this.gridFSService = gridFSService;
    }

    public void setMongoTemplate(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    public void setPathServices(PathService pathServices) {
        this.pathServices = pathServices;
    }
}