org.vosao.business.impl.imex.ResourceExporterImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.vosao.business.impl.imex.ResourceExporterImpl.java

Source

/**
 * Vosao CMS. Simple CMS for Google App Engine.
 * 
 * Copyright (C) 2009-2010 Vosao development team.
 *
 * 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.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * email: vosao.dev@gmail.com
 */

package org.vosao.business.impl.imex;

import static org.vosao.utils.XmlUtil.notNull;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;

import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.vosao.business.decorators.TreeItemDecorator;
import org.vosao.business.imex.PageExporter;
import org.vosao.business.imex.ResourceExporter;
import org.vosao.business.imex.task.TaskTimeoutException;
import org.vosao.business.imex.task.ZipOutStreamTaskAdapter;
import org.vosao.dao.DaoTaskException;
import org.vosao.entity.FileEntity;
import org.vosao.entity.FolderEntity;
import org.vosao.entity.FolderPermissionEntity;
import org.vosao.entity.GroupEntity;
import org.vosao.entity.PageEntity;
import org.vosao.enums.FolderPermissionType;
import org.vosao.utils.FolderUtil;
import org.vosao.utils.MimeType;

public class ResourceExporterImpl extends AbstractExporter implements ResourceExporter {

    public ResourceExporterImpl(ExporterFactoryImpl factory) {
        super(factory);
    }

    /**
     * Add folder and _folder.xml file to zip archive.
     * @param out - zip output stream
     * @param folder - folder 
     * @param zipPath - folder path under which resources will be placed to zip. 
     *                 Should not start with / symbol and should end with / symbol.
     * @throws IOException
     */
    public void addFolder(final ZipOutStreamTaskAdapter out, final FolderEntity folder, final String zipPath)
            throws IOException, TaskTimeoutException {
        if (zipPath.length() != 0) {
            out.putNextEntry(new ZipEntry(zipPath));
            out.closeEntry();
        }
        if (!out.isSkip(zipPath + "_folder.xml")) {
            out.putNextEntry(new ZipEntry(zipPath + "_folder.xml"));
            out.write(getFolderSystemFile(folder).getBytes("UTF-8"));
            out.closeEntry();
            out.nextFile();
        }
    }

    /**
     * Add files from resource folder to zip archive.
     * @param out - zip output stream
     * @param folder - folder tree item
     * @param zipPath - folder path under which resources will be placed to zip. 
     *                 Should not start with / symbol and should end with / symbol.
     * @throws IOException
     */
    public void addResourcesFromFolder(final ZipOutStreamTaskAdapter out,
            final TreeItemDecorator<FolderEntity> folder, final String zipPath)
            throws IOException, TaskTimeoutException {
        addFolder(out, folder.getEntity(), zipPath);
        List<String> childrenNames = new ArrayList<String>();
        for (TreeItemDecorator<FolderEntity> child : folder.getChildren()) {
            addResourcesFromFolder(out, child, zipPath + child.getEntity().getName() + "/");
            childrenNames.add(child.getEntity().getName());
        }
        if (zipPath.startsWith("page/")) {
            String pageURL = zipPath.replace("page", "");
            if (!pageURL.equals("/")) {
                pageURL = pageURL.substring(0, pageURL.length() - 1);
            }
            List<PageEntity> children = getDao().getPageDao().getByParent(pageURL);
            for (PageEntity child : children) {
                if (!childrenNames.contains(child.getPageFriendlyURL())) {
                    addResourcesFromPage(out, child.getFriendlyURL(), zipPath + child.getPageFriendlyURL() + "/");
                }
            }
            List<PageEntity> pages = getDao().getPageDao().selectByUrl(pageURL);
            if (pages.size() > 0) {
                addPageFiles(out, pages.get(0), zipPath);
            }
        }
        List<FileEntity> files = getDao().getFileDao().getByFolder(folder.getEntity().getId());
        for (FileEntity file : files) {
            String filePath = zipPath + file.getFilename();
            if (!out.isSkip(filePath)) {
                out.putNextEntry(new ZipEntry(filePath));
                out.write(getDao().getFileDao().getFileContent(file));
                out.closeEntry();
                out.nextFile();
            }
        }
    }

    /**
     * Add files from resource folder to zip archive.
     * @param out - zip output stream
     * @param folder - folder tree item
     * @param zipPath - folder path under which resources will be placed to zip. 
     *                 Should not start with / symbol and should end with / symbol.
     * @throws IOException
     */
    public void addResourcesFromPage(final ZipOutStreamTaskAdapter out, final String pageURL, final String zipPath)
            throws IOException, TaskTimeoutException {
        out.putNextEntry(new ZipEntry(zipPath));
        out.closeEntry();
        List<PageEntity> children = getDao().getPageDao().getByParent(pageURL);
        for (PageEntity child : children) {
            addResourcesFromPage(out, child.getFriendlyURL(), zipPath + child.getPageFriendlyURL() + "/");
        }
        List<PageEntity> pages = getDao().getPageDao().selectByUrl(pageURL);
        if (pages.size() > 0) {
            addPageFiles(out, pages.get(0), zipPath);
        }
    }

    private void addPageFiles(final ZipOutStreamTaskAdapter out, PageEntity page, String zipPath)
            throws IOException, TaskTimeoutException {
        if (!out.isSkip(zipPath + "_content.xml")) {
            saveFile(out, zipPath + "_content.xml", getPageExporter().createPageContentXML(page));
        }
        if (!out.isSkip(zipPath + "_comments.xml")) {
            saveFile(out, zipPath + "_comments.xml",
                    getPageExporter().createPageCommentsXML(page.getFriendlyURL()));
        }
        if (!out.isSkip(zipPath + "_permissions.xml")) {
            saveFile(out, zipPath + "_permissions.xml",
                    getPageExporter().createPagePermissionsXML(page.getFriendlyURL()));
        }
        if (!out.isSkip(zipPath + "_tag.xml")) {
            saveFile(out, zipPath + "_tag.xml", getPageExporter().createPageTagXML(page.getFriendlyURL()));
        }
    }

    @Override
    public String getFolderSystemFile(FolderEntity folder) {
        Document doc = DocumentHelper.createDocument();
        Element e = doc.addElement("folder");
        e.addElement("title").setText(notNull(folder.getTitle()));
        Element p = e.addElement("permissions");
        List<FolderPermissionEntity> list = getDao().getFolderPermissionDao().selectByFolder(folder.getId());
        for (FolderPermissionEntity permission : list) {
            createFolderPermissionXML(p, permission);
        }
        return doc.asXML();
    }

    private void createFolderPermissionXML(Element permissionsElement, final FolderPermissionEntity permission) {
        GroupEntity group = getDao().getGroupDao().getById(permission.getGroupId());
        Element permissionElement = permissionsElement.addElement("permission");
        permissionElement.addElement("group").setText(group.getName());
        permissionElement.addElement("permissionType").setText(permission.getPermission().name());
    }

    @Override
    public String importResourceFile(final ZipEntry entry, byte[] data)
            throws UnsupportedEncodingException, DaoTaskException {
        return importResourceFile("/" + entry.getName(), data);
    }

    @Override
    public String importResourceFile(String name, byte[] data)
            throws UnsupportedEncodingException, DaoTaskException {

        String folderPath = FolderUtil.getFilePath(name);
        String fileName = FolderUtil.getFileName(name);
        //logger.debug("importResourceFile: " + folderPath + " " + fileName + " "
        //      + data.length);
        FolderEntity folderEntity = getBusiness().getFolderBusiness().createFolder(folderPath);
        //logger.debug("folderEntity: " + folderEntity);
        String contentType = MimeType.getContentTypeByExt(FolderUtil.getFileExt(fileName));
        FileEntity fileEntity = getDao().getFileDao().getByName(folderEntity.getId(), fileName);
        if (fileEntity != null) {
            fileEntity.setLastModifiedTime(new Date());
            fileEntity.setSize(data.length);
        } else {
            fileEntity = new FileEntity(fileName, fileName, folderEntity.getId(), contentType, new Date(),
                    data.length);
        }
        getDaoTaskAdapter().fileSave(fileEntity, data);
        return name;
    }

    private PageExporter getPageExporter() {
        return getExporterFactory().getPageExporter();
    }

    /**
     * Read and import data from _folder.xml file.
     * @param folderPath - folder path.
     * @param xml - _folder.xml file.
     * @throws DocumentException 
     * @throws DaoTaskException 
     */
    public void readFolderFile(String folderPath, String xml) throws DocumentException, DaoTaskException {
        FolderEntity folder = getBusiness().getFolderBusiness().createFolder(folderPath);
        Element root = DocumentHelper.parseText(xml).getRootElement();
        String title = root.elementText("title");
        if (!StringUtils.isEmpty(title)) {
            folder.setTitle(title);
            getDaoTaskAdapter().folderSave(folder);
        }
        readFolderPermissions(root.element("permissions"), folder);
    }

    private void readFolderPermissions(Element element, FolderEntity folder) {
        for (Element permElement : (List<Element>) element.elements("permission")) {
            GroupEntity group = getDao().getGroupDao().getByName(permElement.elementText("group"));
            FolderPermissionType permission = FolderPermissionType
                    .valueOf(permElement.elementText("permissionType"));
            getBusiness().getFolderPermissionBusiness().setPermission(folder, group, permission);
        }
    }

}