com.ikon.util.impexp.metadata.DbMetadataAdapter.java Source code

Java tutorial

Introduction

Here is the source code for com.ikon.util.impexp.metadata.DbMetadataAdapter.java

Source

/**
 * openkm, Open Document Management System (http://www.openkm.com)
 * Copyright (c) 2006-2013 Paco Avila & Josep Llort
 * 
 * No bytes were intentionally harmed during the development of this application.
 * 
 * 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 2 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, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.ikon.util.impexp.metadata;

import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.ikon.bean.form.Input;
import com.ikon.bean.form.Select;
import com.ikon.core.DatabaseException;
import com.ikon.core.ItemExistsException;
import com.ikon.core.MimeTypeConfig;
import com.ikon.core.PathNotFoundException;
import com.ikon.core.RepositoryException;
import com.ikon.dao.HibernateUtil;
import com.ikon.dao.NodeBaseDAO;
import com.ikon.dao.NodeDocumentVersionDAO;
import com.ikon.dao.bean.NodeBase;
import com.ikon.dao.bean.NodeDocument;
import com.ikon.dao.bean.NodeDocumentVersion;
import com.ikon.dao.bean.NodeFolder;
import com.ikon.dao.bean.NodeMail;
import com.ikon.dao.bean.NodeNote;
import com.ikon.dao.bean.NodeProperty;
import com.ikon.module.db.stuff.FsDataStore;
import com.ikon.spring.PrincipalUtils;
import com.ikon.util.ISO8601;
import com.ikon.util.PathUtils;
import com.ikon.util.UserActivity;
import com.ikon.vernum.VersionNumerationAdapter;
import com.ikon.vernum.VersionNumerationFactory;

public class DbMetadataAdapter extends MetadataAdapter {
    private static Logger log = LoggerFactory.getLogger(DbMetadataAdapter.class);

    public DbMetadataAdapter(String token) {
        super.token = token;
    }

    @Override
    public void importWithMetadata(DocumentMetadata dmd, InputStream is)
            throws ItemExistsException, RepositoryException, DatabaseException, IOException {
        log.debug("importWithMetadata({}, {})", new Object[] { dmd, is });
        NodeDocumentVersion nDocVer = new NodeDocumentVersion();
        NodeDocument nDoc = new NodeDocument();
        Session session = null;
        Transaction tx = null;

        if (NodeBaseDAO.getInstance().itemPathExists(dmd.getPath())) {
            throw new ItemExistsException(dmd.getPath());
        }

        try {
            session = HibernateUtil.getSessionFactory().openSession();
            tx = session.beginTransaction();

            String name = PathUtils.getName(dmd.getPath());
            String user = PrincipalUtils.getUser();
            String parentPath = PathUtils.getParent(dmd.getPath());
            String parentUuid = NodeBaseDAO.getInstance().getUuidFromPath(parentPath);
            NodeBase parentNode = NodeBaseDAO.getInstance().findByPk(parentUuid);

            nDoc.setParent(parentUuid);
            nDoc.setContext(parentNode.getContext());

            if (uuid && dmd.getUuid() != null && !dmd.getUuid().equals("")) {
                nDoc.setUuid(dmd.getUuid());
            } else {
                nDoc.setUuid(UUID.randomUUID().toString());
            }

            // Basic
            if (dmd.getAuthor() != null && !dmd.getAuthor().equals("")) {
                nDoc.setAuthor(dmd.getAuthor());
            } else {
                nDoc.setAuthor(user);
            }

            if (dmd.getName() != null && !dmd.getName().equals("")) {
                nDoc.setName(dmd.getName());
            } else {
                nDoc.setName(name);
            }

            if (dmd.getCreated() != null) {
                nDoc.setCreated(dmd.getCreated());
            } else {
                nDoc.setCreated(Calendar.getInstance());
            }

            if (dmd.getLastModified() != null) {
                nDoc.setLastModified(dmd.getLastModified());
            } else {
                nDoc.setLastModified(nDoc.getCreated());
            }

            if (dmd.getLanguage() != null) {
                nDoc.setLanguage(dmd.getLanguage());
            }

            if (dmd.getTitle() != null) {
                nDoc.setTitle(dmd.getTitle());
            }

            if (dmd.getDescription() != null) {
                nDoc.setDescription(dmd.getDescription());
            }

            // Keywords & categories
            nDoc.setKeywords(dmd.getKeywords());
            nDoc.setCategories(getValues(dmd.getCategories()));

            // Notification
            if (!dmd.getSubscriptors().isEmpty()) {
                nDoc.setSubscriptors(dmd.getSubscriptors());
            }

            // Property Groups
            importPropertyGroups(nDoc, dmd.getPropertyGroups());

            // Security
            if (dmd.getGrantedUsers() != null && !dmd.getGrantedUsers().isEmpty()) {
                nDoc.setUserPermissions(dmd.getGrantedUsers());
            }

            if (dmd.getGrantedRoles() != null && !dmd.getGrantedRoles().isEmpty()) {
                nDoc.setRolePermissions(dmd.getGrantedRoles());
            }

            // Content / Version
            VersionMetadata vmd = dmd.getVersion();

            if (vmd == null) {
                vmd = new VersionMetadata();
            }

            VersionNumerationAdapter verNumAdapter = VersionNumerationFactory.getVersionNumerationAdapter();
            nDocVer.setParent(nDoc.getUuid());
            nDocVer.setUuid(UUID.randomUUID().toString());
            nDocVer.setName(verNumAdapter.getInitialVersionNumber());
            nDocVer.setCurrent(true);

            if (vmd.getSize() > 0) {
                nDocVer.setSize(vmd.getSize());
            } else {
                nDocVer.setSize(is.available());
            }

            if (vmd.getAuthor() != null && !vmd.getAuthor().equals("")) {
                nDocVer.setAuthor(vmd.getAuthor());
            } else {
                nDocVer.setAuthor(user);
            }

            if (vmd.getComment() != null && !vmd.getComment().equals("")) {
                nDocVer.setComment(vmd.getComment());
            } else {
                nDocVer.setComment("Imported by " + user);
            }

            if (vmd.getCreated() != null) {
                nDocVer.setCreated(vmd.getCreated());
            } else {
                nDocVer.setCreated(Calendar.getInstance());
            }

            if (vmd.getMimeType() != null && !vmd.getMimeType().equals("")) {
                nDocVer.setMimeType(vmd.getMimeType());
                nDoc.setMimeType(vmd.getMimeType());
            } else {
                String mimeType = MimeTypeConfig.mimeTypes.getContentType(name.toLowerCase());
                nDocVer.setMimeType(mimeType);
                nDoc.setMimeType(mimeType);
            }

            // Persist file in datastore
            FsDataStore.persist(nDocVer, is);

            // Persist
            session.save(nDoc);
            session.save(nDocVer);

            // Notes
            if (!dmd.getNotes().isEmpty()) {
                for (NoteMetadata nmd : dmd.getNotes()) {
                    NodeNote nNote = new NodeNote();
                    nNote.setUuid(UUID.randomUUID().toString());
                    nNote.setParent(nDoc.getUuid());
                    nNote.setAuthor(nmd.getUser());
                    nNote.setCreated(nmd.getDate());
                    nNote.setText(nmd.getText());
                    session.save(nNote);
                }
            }

            HibernateUtil.commit(tx);
        } catch (HibernateException e) {
            HibernateUtil.rollback(tx);

            // What happen when create fails? This datastore file should be deleted!
            FsDataStore.delete(nDocVer.getUuid());

            throw new DatabaseException(e.getMessage(), e);
        } catch (PathNotFoundException e) {
            HibernateUtil.rollback(tx);
            throw new RepositoryException("PathNotFound: " + e.getMessage(), e);
        } finally {
            HibernateUtil.close(session);
        }

        // Activity log
        UserActivity.log(PrincipalUtils.getUser(), "CREATE_DOCUMENT", nDoc.getUuid(), dmd.getPath(),
                "Imported with metadata");
    }

    @Override
    public void importWithMetadata(String parentPath, VersionMetadata vmd, InputStream is)
            throws ItemExistsException, RepositoryException, DatabaseException, IOException {
        log.debug("importWithMetadata({}, {})", vmd, is);
        VersionNumerationAdapter verNumAdapter = VersionNumerationFactory.getVersionNumerationAdapter();
        NodeDocumentVersion nDocVer = new NodeDocumentVersion();
        Session session = null;
        Transaction tx = null;

        try {
            session = HibernateUtil.getSessionFactory().openSession();
            tx = session.beginTransaction();

            String user = PrincipalUtils.getUser();
            String parentUuid = NodeBaseDAO.getInstance().getUuidFromPath(session, parentPath);
            NodeDocument parentNode = (NodeDocument) session.load(NodeDocument.class, parentUuid);

            nDocVer.setParent(parentUuid);
            nDocVer.setUuid(UUID.randomUUID().toString());
            nDocVer.setCurrent(true);

            NodeDocumentVersion prevDocVer = NodeDocumentVersionDAO.getInstance().findCurrentVersion(session,
                    parentUuid);
            prevDocVer.setCurrent(false);

            // Basic
            if (vmd.getAuthor() != null && !vmd.getAuthor().equals("")) {
                nDocVer.setAuthor(vmd.getAuthor());
            } else {
                nDocVer.setAuthor(user);
            }

            if (vmd.getComment() != null && !vmd.getComment().equals("")) {
                nDocVer.setComment(vmd.getComment());
            } else {
                nDocVer.setComment("Imported by " + user);
            }

            if (vmd.getCreated() != null) {
                nDocVer.setCreated(vmd.getCreated());
            } else {
                nDocVer.setCreated(Calendar.getInstance());
            }

            if (vmd.getSize() > 0) {
                nDocVer.setSize(vmd.getSize());
            } else {
                nDocVer.setSize(is.available());
            }

            if (vmd.getMimeType() != null && !vmd.getMimeType().equals("")) {
                nDocVer.setMimeType(vmd.getMimeType());
            } else {
                nDocVer.setMimeType(parentNode.getMimeType());
            }

            if (vmd.getName() != null && !vmd.getName().equals("")) {
                nDocVer.setName(vmd.getName());
            } else {
                nDocVer.setName(verNumAdapter.getNextVersionNumber(session, parentNode, nDocVer));
            }

            // Persist file in datastore
            FsDataStore.persist(nDocVer, is);

            // Persist
            session.save(nDocVer);
            session.save(prevDocVer);

            HibernateUtil.commit(tx);
        } catch (HibernateException e) {
            HibernateUtil.rollback(tx);

            // What happen when create fails? This datastore file should be deleted!
            FsDataStore.delete(nDocVer.getUuid());

            throw new DatabaseException(e.getMessage(), e);
        } catch (PathNotFoundException e) {
            HibernateUtil.rollback(tx);
            throw new RepositoryException("PathNotFound: " + e.getMessage(), e);
        } finally {
            HibernateUtil.close(session);
        }
    }

    @Override
    public void importWithMetadata(FolderMetadata fmd)
            throws ItemExistsException, RepositoryException, DatabaseException {
        log.debug("importWithMetadata({})", fmd);
        NodeFolder nFld = new NodeFolder();
        Session session = null;
        Transaction tx = null;

        if (NodeBaseDAO.getInstance().itemPathExists(fmd.getPath())) {
            throw new ItemExistsException(fmd.getPath());
        }

        try {
            session = HibernateUtil.getSessionFactory().openSession();
            tx = session.beginTransaction();

            String name = PathUtils.getName(fmd.getPath());
            String user = PrincipalUtils.getUser();
            String parentPath = PathUtils.getParent(fmd.getPath());
            String parentUuid = NodeBaseDAO.getInstance().getUuidFromPath(parentPath);
            NodeBase parentNode = NodeBaseDAO.getInstance().findByPk(parentUuid);

            nFld.setParent(parentUuid);
            nFld.setContext(parentNode.getContext());

            if (uuid && fmd.getUuid() != null && !fmd.getUuid().equals("")) {
                nFld.setUuid(fmd.getUuid());
            } else {
                nFld.setUuid(UUID.randomUUID().toString());
            }

            // Basic
            if (fmd.getAuthor() != null && !fmd.getAuthor().equals("")) {
                nFld.setAuthor(fmd.getAuthor());
            } else {
                nFld.setAuthor(user);
            }

            if (fmd.getName() != null && !fmd.getName().equals("")) {
                nFld.setName(fmd.getName());
            } else {
                nFld.setName(name);
            }

            if (fmd.getCreated() != null) {
                nFld.setCreated(fmd.getCreated());
            } else {
                nFld.setCreated(Calendar.getInstance());
            }

            if (fmd.getDescription() != null) {
                nFld.setDescription(fmd.getDescription());
            }

            // Keywords & categories
            nFld.setKeywords(fmd.getKeywords());
            nFld.setCategories(getValues(fmd.getCategories()));

            // Notification
            if (!fmd.getSubscriptors().isEmpty()) {
                nFld.setSubscriptors(fmd.getSubscriptors());
            }

            // Property Groups
            importPropertyGroups(nFld, fmd.getPropertyGroups());

            // Security
            if (fmd.getGrantedUsers() != null && !fmd.getGrantedUsers().isEmpty()) {
                nFld.setUserPermissions(fmd.getGrantedUsers());
            }

            if (fmd.getGrantedRoles() != null && !fmd.getGrantedRoles().isEmpty()) {
                nFld.setRolePermissions(fmd.getGrantedRoles());
            }

            // Persist
            session.save(nFld);

            // Notes
            if (!fmd.getNotes().isEmpty()) {
                for (NoteMetadata nmd : fmd.getNotes()) {
                    NodeNote nNote = new NodeNote();
                    nNote.setUuid(UUID.randomUUID().toString());
                    nNote.setParent(nFld.getUuid());
                    nNote.setAuthor(nmd.getUser());
                    nNote.setCreated(nmd.getDate());
                    nNote.setText(nmd.getText());
                    session.save(nNote);
                }
            }

            HibernateUtil.commit(tx);
        } catch (HibernateException e) {
            HibernateUtil.rollback(tx);
            throw new DatabaseException(e.getMessage(), e);
        } catch (PathNotFoundException e) {
            HibernateUtil.rollback(tx);
            throw new RepositoryException("PathNotFound: " + e.getMessage(), e);
        } finally {
            HibernateUtil.close(session);
        }

        // Activity log
        UserActivity.log(PrincipalUtils.getUser(), "CREATE_FOLDER", nFld.getUuid(), fmd.getPath(),
                "Imported with metadata");
    }

    @Override
    public void importWithMetadata(MailMetadata mmd)
            throws ItemExistsException, RepositoryException, DatabaseException {
        log.debug("importWithMetadata({})", new Object[] { mmd });
        NodeMail nMail = new NodeMail();
        Session session = null;
        Transaction tx = null;

        if (NodeBaseDAO.getInstance().itemPathExists(mmd.getPath())) {
            throw new ItemExistsException(mmd.getPath());
        }

        try {
            session = HibernateUtil.getSessionFactory().openSession();
            tx = session.beginTransaction();

            String name = PathUtils.getName(mmd.getPath());
            String user = PrincipalUtils.getUser();
            String parentPath = PathUtils.getParent(mmd.getPath());
            String parentUuid = NodeBaseDAO.getInstance().getUuidFromPath(parentPath);
            NodeBase parentNode = NodeBaseDAO.getInstance().findByPk(parentUuid);

            nMail.setParent(parentUuid);
            nMail.setContext(parentNode.getContext());

            if (uuid && mmd.getUuid() != null && !mmd.getUuid().equals("")) {
                nMail.setUuid(mmd.getUuid());
            } else {
                nMail.setUuid(UUID.randomUUID().toString());
            }

            // Basic
            if (mmd.getAuthor() != null && !mmd.getAuthor().equals("")) {
                nMail.setAuthor(mmd.getAuthor());
            } else {
                nMail.setAuthor(user);
            }

            if (mmd.getName() != null && !mmd.getName().equals("")) {
                nMail.setName(mmd.getName());
            } else {
                nMail.setName(name);
            }

            if (mmd.getCreated() != null) {
                nMail.setCreated(mmd.getCreated());
            } else {
                nMail.setCreated(Calendar.getInstance());
            }

            if (mmd.getSentDate() != null) {
                nMail.setSentDate(mmd.getSentDate());
            }

            if (mmd.getReceivedDate() != null) {
                nMail.setReceivedDate(mmd.getReceivedDate());
            }

            if (mmd.getSize() > 0) {
                nMail.setSize(mmd.getSize());
            }

            if (mmd.getSubject() != null) {
                nMail.setSubject(mmd.getSubject());
            }

            if (mmd.getContent() != null) {
                nMail.setContent(mmd.getContent());
            }

            // Keywords & categories
            nMail.setKeywords(mmd.getKeywords());
            nMail.setCategories(getValues(mmd.getCategories()));

            // Property Groups
            importPropertyGroups(nMail, mmd.getPropertyGroups());

            // Security
            if (mmd.getGrantedUsers() != null && !mmd.getGrantedUsers().isEmpty()) {
                nMail.setUserPermissions(mmd.getGrantedUsers());
            }

            if (mmd.getGrantedRoles() != null && !mmd.getGrantedRoles().isEmpty()) {
                nMail.setRolePermissions(mmd.getGrantedRoles());
            }

            // Persist
            session.save(nMail);

            // Notes
            if (!mmd.getNotes().isEmpty()) {
                for (NoteMetadata nmd : mmd.getNotes()) {
                    NodeNote nNote = new NodeNote();
                    nNote.setUuid(UUID.randomUUID().toString());
                    nNote.setParent(nMail.getUuid());
                    nNote.setAuthor(nmd.getUser());
                    nNote.setCreated(nmd.getDate());
                    nNote.setText(nmd.getText());
                    session.save(nNote);
                }
            }

            HibernateUtil.commit(tx);
        } catch (HibernateException e) {
            HibernateUtil.rollback(tx);
            throw new DatabaseException(e.getMessage(), e);
        } catch (PathNotFoundException e) {
            HibernateUtil.rollback(tx);
            throw new RepositoryException("PathNotFound: " + e.getMessage(), e);
        } finally {
            HibernateUtil.close(session);
        }

        // Activity log
        UserActivity.log(PrincipalUtils.getUser(), "CREATE_MAIL", nMail.getUuid(), mmd.getPath(),
                "Imported with metadata");
    }

    /**
     * 
     */
    private void importPropertyGroups(NodeBase nBase, List<PropertyGroupMetadata> pGroups) {
        Gson gson = new Gson();

        for (PropertyGroupMetadata pgmd : pGroups) {
            for (PropertyMetadata pmd : pgmd.getProperties()) {
                NodeProperty nProp = new NodeProperty();
                nProp.setGroup(pgmd.getName());
                nProp.setName(pmd.getName());
                nProp.setNode(nBase);

                if (pmd.isMultiValue() || Select.class.getSimpleName().equals(pmd.getType())) {
                    nProp.setValue(gson.toJson(pmd.getValues()));
                } else {
                    // Check if input of type date is in extended ISO8601 format, and convert if needed
                    if (Input.class.getSimpleName().equals(pmd.getType())) {
                        String value = pmd.getValue();

                        if (ISO8601.isExtended(value)) {
                            Calendar calValue = ISO8601.parseExtended(value);
                            nProp.setValue(ISO8601.formatBasic(calValue));
                        } else {
                            nProp.setValue(value);
                        }
                    } else {
                        nProp.setValue(pmd.getValue());
                    }
                }

                log.info("PROPERTY: {}", nProp);
                nBase.getProperties().add(nProp);
            }
        }
    }

    /**
     * Convert between formats.
     */
    private Set<String> getValues(Set<CategoryMetadata> categories) {
        Set<String> ret = new HashSet<String>();

        for (CategoryMetadata cmd : categories) {
            try {
                if (cmd.getUuid() != null && !cmd.getUuid().equals("")) {
                    if (NodeBaseDAO.getInstance().itemUuidExists(cmd.getUuid())) {
                        ret.add(cmd.getUuid());
                    } else {
                        log.warn("Category UUID not found: {}", cmd.getUuid());
                    }
                } else if (cmd.getPath() != null && !cmd.getPath().equals("")) {
                    String uuid = NodeBaseDAO.getInstance().getUuidFromPath(cmd.getPath());
                    ret.add(uuid);
                }
            } catch (PathNotFoundException e) {
                log.warn("Category node not found: {}", cmd.getPath());
            } catch (DatabaseException e) {
                log.warn("Error resolving category: {}", cmd);
            }
        }

        return ret;
    }
}