Package org.vosao.business.impl.imex

Source Code of org.vosao.business.impl.imex.ResourceExporterImpl

/**
* 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);
    }
  }

 
}
TOP

Related Classes of org.vosao.business.impl.imex.ResourceExporterImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.