com.liferay.portlet.documentlibrary.store.CMISStore.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.documentlibrary.store.CMISStore.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 */

package com.liferay.portlet.documentlibrary.store;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.repository.cmis.CMISRepositoryUtil;
import com.liferay.portal.util.PropsValues;
import com.liferay.portlet.documentlibrary.DuplicateFileException;
import com.liferay.portlet.documentlibrary.NoSuchFileException;
import com.liferay.portlet.documentlibrary.util.DLUtil;

import java.io.InputStream;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.ItemIterable;
import org.apache.chemistry.opencmis.client.api.ObjectId;
import org.apache.chemistry.opencmis.client.api.Repository;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.SessionFactory;
import org.apache.chemistry.opencmis.client.runtime.ObjectIdImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.BindingType;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;

/**
 * @author Alexander Chow
 * @author Edward Han
 */
public class CMISStore extends BaseStore {

    public CMISStore() {
        _systemRootDir = getFolder(SessionHolder.session.getRootFolder(),
                PropsValues.DL_STORE_CMIS_SYSTEM_ROOT_DIR);

        if (_systemRootDir == null) {
            _systemRootDir = createFolder(SessionHolder.session.getRootFolder(),
                    PropsValues.DL_STORE_CMIS_SYSTEM_ROOT_DIR);
        }
    }

    @Override
    public void addDirectory(long companyId, long repositoryId, String dirName) {

        Folder folder = getRepositoryFolder(companyId, repositoryId);

        String[] dirNames = StringUtil.split(dirName, CharPool.SLASH);

        for (String curDirName : dirNames) {
            Folder subFolder = getFolder(folder, curDirName);

            if (subFolder == null) {
                subFolder = createFolder(folder, curDirName);
            }

            folder = subFolder;
        }
    }

    @Override
    public void addFile(long companyId, long repositoryId, String fileName, InputStream is) throws PortalException {

        updateFile(companyId, repositoryId, fileName, VERSION_DEFAULT, is);
    }

    @Override
    public void checkRoot(long companyId) {
    }

    @Override
    public void copyFileVersion(long companyId, long repositoryId, String fileName, String fromVersionLabel,
            String toVersionLabel) throws PortalException {

        Folder versioningFolder = getVersioningFolder(companyId, repositoryId, fileName, false);

        ObjectId versioningFolderObjectId = new ObjectIdImpl(versioningFolder.getId());

        Map<String, Object> documentProperties = new HashMap<String, Object>();

        String title = String.valueOf(toVersionLabel);

        documentProperties.put(PropertyIds.NAME, title);

        documentProperties.put(PropertyIds.OBJECT_TYPE_ID, BaseTypeId.CMIS_DOCUMENT.value());

        Document document = getVersionedDocument(companyId, repositoryId, fileName, fromVersionLabel);

        document.copy(versioningFolderObjectId, documentProperties, null, document.getPolicies(), null, null, null);
    }

    @Override
    public void deleteDirectory(long companyId, long repositoryId, String dirName) {

        Folder repositoryFolder = getRepositoryFolder(companyId, repositoryId);

        Folder directory = getFolder(repositoryFolder, dirName);

        if (directory != null) {
            directory.deleteTree(true, UnfileObject.DELETE, false);
        }
    }

    @Override
    public void deleteFile(long companyId, long repositoryId, String fileName) throws PortalException {

        Folder versioningFolder = getVersioningFolder(companyId, repositoryId, fileName, false);

        if (versioningFolder == null) {
            throw new NoSuchFileException();
        }

        versioningFolder.deleteTree(true, UnfileObject.DELETE, false);
    }

    @Override
    public void deleteFile(long companyId, long repositoryId, String fileName, String versionLabel)
            throws PortalException {

        Document document = getVersionedDocument(companyId, repositoryId, fileName, versionLabel);

        document.delete(true);
    }

    @Override
    public InputStream getFileAsStream(long companyId, long repositoryId, String fileName, String versionLabel)
            throws PortalException {

        if (Validator.isNull(versionLabel)) {
            versionLabel = getHeadVersionLabel(companyId, repositoryId, fileName);
        }

        Document document = getVersionedDocument(companyId, repositoryId, fileName, versionLabel);

        return document.getContentStream().getStream();
    }

    public String[] getFileNames(long companyId, long repositoryId) {
        Folder folder = getRepositoryFolder(companyId, repositoryId);

        List<Folder> folders = getFolders(folder);

        String[] fileNames = new String[folders.size()];

        for (int i = 0; i < folders.size(); i++) {
            Folder curFolder = folders.get(i);

            fileNames[i] = curFolder.getName();
        }

        return fileNames;
    }

    @Override
    public String[] getFileNames(long companyId, long repositoryId, String dirName) {

        Folder folder = getRepositoryFolder(companyId, repositoryId);

        String[] dirNames = StringUtil.split(dirName, CharPool.SLASH);

        for (String curDirName : dirNames) {
            Folder subFolder = getFolder(folder, curDirName);

            if (subFolder == null) {
                subFolder = createFolder(folder, curDirName);
            }

            folder = subFolder;
        }

        List<Folder> folders = getFolders(folder);

        String[] fileNames = new String[folders.size()];

        for (int i = 0; i < folders.size(); i++) {
            Folder curFolder = folders.get(i);

            String fileName = curFolder.getName();

            fileNames[i] = dirName.concat(StringPool.SLASH).concat(fileName);
        }

        return fileNames;
    }

    @Override
    public long getFileSize(long companyId, long repositoryId, String fileName) throws PortalException {

        String versionLabel = getHeadVersionLabel(companyId, repositoryId, fileName);

        Document document = getVersionedDocument(companyId, repositoryId, fileName, versionLabel);

        return document.getContentStreamLength();
    }

    @Override
    public boolean hasDirectory(long companyId, long repositoryId, String dirName) {

        Folder folder = getRepositoryFolder(companyId, repositoryId);

        String[] dirNames = StringUtil.split(dirName, CharPool.SLASH);

        for (String subdirName : dirNames) {
            Folder subfolder = getFolder(folder, subdirName);

            if (subfolder == null) {
                return false;
            }
        }

        return true;
    }

    public String getHeadVersionLabel(long companyId, long repositoryId, String dirName)
            throws NoSuchFileException {

        Folder versioningFolder = getVersioningFolder(companyId, repositoryId, dirName, false);

        if (versioningFolder == null) {
            throw new NoSuchFileException();
        }

        List<Folder> folders = getFolders(versioningFolder);

        String headVersionLabel = VERSION_DEFAULT;

        for (Folder folder : folders) {
            String versionLabel = folder.getName();

            if (DLUtil.compareVersions(versionLabel, headVersionLabel) > 0) {
                headVersionLabel = versionLabel;
            }
        }

        return headVersionLabel;
    }

    @Override
    public boolean hasFile(long companyId, long repositoryId, String fileName, String versionLabel) {

        Folder versioningFolder = getVersioningFolder(companyId, repositoryId, fileName, true);

        Document document = getDocument(versioningFolder, versionLabel);

        if (document == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void move(String srcDir, String destDir) {
    }

    @Override
    public void updateFile(long companyId, long repositoryId, long newRepositoryId, String fileName) {

        Folder oldVersioningFolderEntry = getVersioningFolder(companyId, repositoryId, fileName, true);
        Folder newVersioningFolderEntry = getVersioningFolder(companyId, newRepositoryId, fileName, true);

        List<Folder> folders = getFolders(oldVersioningFolderEntry);

        for (Folder folder : folders) {
            String curFileName = folder.getName();

            Document document = getDocument(oldVersioningFolderEntry, curFileName);

            InputStream is = document.getContentStream().getStream();

            createDocument(newVersioningFolderEntry, curFileName, is);
        }

        oldVersioningFolderEntry.deleteTree(true, UnfileObject.DELETE, false);
    }

    public void updateFile(long companyId, long repositoryId, String fileName, String newFileName) {

        Folder oldVersioningFolderEntry = getVersioningFolder(companyId, repositoryId, fileName, true);
        Folder newVersioningFolderEntry = getVersioningFolder(companyId, repositoryId, newFileName, true);

        List<Folder> folders = getFolders(oldVersioningFolderEntry);

        for (Folder folder : folders) {
            String curFileName = folder.getName();

            Document document = getDocument(oldVersioningFolderEntry, curFileName);

            InputStream is = document.getContentStream().getStream();

            createDocument(newVersioningFolderEntry, curFileName, is);
        }

        oldVersioningFolderEntry.deleteTree(true, UnfileObject.DELETE, false);
    }

    @Override
    public void updateFile(long companyId, long repositoryId, String fileName, String versionLabel, InputStream is)
            throws PortalException {

        Folder versioningFolder = getVersioningFolder(companyId, repositoryId, fileName, true);

        String title = String.valueOf(versionLabel);

        Document document = getDocument(versioningFolder, title);

        if (document != null) {
            throw new DuplicateFileException();
        }

        createDocument(versioningFolder, title, is);
    }

    @Override
    public void updateFileVersion(long companyId, long repositoryId, String fileName, String fromVersionLabel,
            String toVersionLabel) throws PortalException {

        Folder versioningFolder = getVersioningFolder(companyId, repositoryId, fileName, false);

        String title = String.valueOf(toVersionLabel);

        Document document = getDocument(versioningFolder, title);

        if (document != null) {
            throw new DuplicateFileException();
        }

        document = getVersionedDocument(companyId, repositoryId, fileName, fromVersionLabel);

        Map<String, Object> documentProperties = new HashMap<String, Object>();

        documentProperties.put(PropertyIds.NAME, title);

        document.updateProperties(documentProperties);
    }

    protected Document createDocument(Folder versioningFolder, String title, InputStream is) {

        Map<String, Object> documentProperties = new HashMap<String, Object>();

        documentProperties.put(PropertyIds.NAME, title);
        documentProperties.put(PropertyIds.OBJECT_TYPE_ID, BaseTypeId.CMIS_DOCUMENT.value());

        ContentStream contentStream = new ContentStreamImpl(null, null, ContentTypes.APPLICATION_OCTET_STREAM, is);

        return versioningFolder.createDocument(documentProperties, contentStream, null);
    }

    protected Folder createFolder(ObjectId parentFolderId, String name) {
        Map<String, Object> properties = new HashMap<String, Object>();

        properties.put(PropertyIds.NAME, name);
        properties.put(PropertyIds.OBJECT_TYPE_ID, BaseTypeId.CMIS_FOLDER.value());

        ObjectId objectId = SessionHolder.session.createFolder(properties, parentFolderId);

        return (Folder) SessionHolder.session.getObject(objectId);
    }

    protected Folder getCompanyFolder(long companyId) {
        String name = String.valueOf(companyId);

        Folder companyFolder = getFolder(_systemRootDir, name);

        if (companyFolder == null) {
            companyFolder = createFolder(_systemRootDir, name);
        }

        return companyFolder;
    }

    protected Document getDocument(Folder parentFolder, String name) {
        ItemIterable<CmisObject> cmisObjects = parentFolder.getChildren();

        Iterator<CmisObject> itr = cmisObjects.iterator();

        while (itr.hasNext()) {
            CmisObject cmisObject = itr.next();

            if (name.equals(cmisObject.getName()) && cmisObject instanceof Document) {

                return (Document) cmisObject;
            }
        }

        return null;
    }

    protected Folder getFolder(Folder parentFolder, String name) {
        ItemIterable<CmisObject> cmisObjects = parentFolder.getChildren();

        Iterator<CmisObject> itr = cmisObjects.iterator();

        while (itr.hasNext()) {
            CmisObject cmisObject = itr.next();

            if (name.equals(cmisObject.getName()) && cmisObject instanceof Folder) {

                return (Folder) cmisObject;
            }
        }

        return null;
    }

    protected List<Folder> getFolders(Folder folder) {
        List<Folder> folders = new ArrayList<Folder>();

        ItemIterable<CmisObject> cmisObjects = folder.getChildren();

        Iterator<CmisObject> itr = cmisObjects.iterator();

        while (itr.hasNext()) {
            CmisObject cmisObject = itr.next();

            if (cmisObject instanceof Folder) {
                folders.add((Folder) cmisObject);
            }
        }

        return folders;
    }

    protected Folder getRepositoryFolder(long companyId, long repositoryId) {
        Folder companyFolder = getCompanyFolder(companyId);

        String name = String.valueOf(repositoryId);

        Folder repositoryFolder = getFolder(companyFolder, name);

        if (repositoryFolder == null) {
            repositoryFolder = createFolder(companyFolder, name);
        }

        return repositoryFolder;
    }

    protected Document getVersionedDocument(long companyId, long repositoryId, String fileName, String versionLabel)
            throws NoSuchFileException {

        Folder versioningFolder = getVersioningFolder(companyId, repositoryId, fileName, false);

        if (versioningFolder == null) {
            throw new NoSuchFileException();
        }

        Document document = getDocument(versioningFolder, versionLabel);

        if (document == null) {
            throw new NoSuchFileException();
        }

        return document;
    }

    protected Folder getVersioningFolder(long companyId, long repositoryId, String fileName, boolean create) {

        Folder repositoryFolder = getRepositoryFolder(companyId, repositoryId);

        Folder versioningFolder = repositoryFolder;

        String[] dirNames = StringUtil.split(fileName, CharPool.SLASH);

        for (String dirName : dirNames) {
            Folder subFolder = getFolder(versioningFolder, dirName);

            if (create && (subFolder == null)) {
                subFolder = createFolder(versioningFolder, dirName);
            }

            versioningFolder = subFolder;
        }

        return versioningFolder;
    }

    private static class SessionHolder {

        private final static Session session;

        static {
            Map<String, String> parameters = new HashMap<String, String>();

            parameters.put(SessionParameter.ATOMPUB_URL, PropsValues.DL_STORE_CMIS_REPOSITORY_URL);
            parameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
            parameters.put(SessionParameter.COMPRESSION, Boolean.TRUE.toString());

            Locale locale = LocaleUtil.getDefault();

            parameters.put(SessionParameter.LOCALE_ISO3166_COUNTRY, locale.getCountry());
            parameters.put(SessionParameter.LOCALE_ISO639_LANGUAGE, locale.getLanguage());
            parameters.put(SessionParameter.PASSWORD, PropsValues.DL_STORE_CMIS_CREDENTIALS_PASSWORD);
            parameters.put(SessionParameter.USER, PropsValues.DL_STORE_CMIS_CREDENTIALS_USERNAME);

            SessionFactory sessionFactory = CMISRepositoryUtil.getSessionFactory();

            List<Repository> repositories = sessionFactory.getRepositories(parameters);

            Repository repository = repositories.get(0);

            session = repository.createSession();

            session.setDefaultContext(CMISRepositoryUtil.getOperationContext());
        }

    }

    private static Folder _systemRootDir;

}