Java tutorial
/** * 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 java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Iterator; 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.ResourceExporter; import org.vosao.business.imex.ThemeExporter; import org.vosao.business.imex.task.TaskTimeoutException; import org.vosao.business.imex.task.ZipOutStreamTaskAdapter; import org.vosao.dao.DaoTaskException; import org.vosao.entity.FolderEntity; import org.vosao.entity.TemplateEntity; import org.vosao.utils.FolderUtil; public class ThemeExporterImpl extends AbstractExporter implements ThemeExporter { public ThemeExporterImpl(ExporterFactoryImpl factory) { super(factory); } public void exportThemes(final ZipOutStreamTaskAdapter out, final List<TemplateEntity> themes) throws IOException, TaskTimeoutException { FolderEntity themeFolder = getDao().getFolderDao().getByPath("/theme"); if (themeFolder == null) { logger.error("Folder not found: /theme"); return; } getResourceExporter().addFolder(out, themeFolder, "theme/"); for (TemplateEntity theme : themes) { exportTheme(out, theme); } } public void exportTheme(final ZipOutStreamTaskAdapter out, final TemplateEntity theme) throws IOException, TaskTimeoutException { String themeFolder = getThemeZipPath(theme); addThemeResources(out, theme); String descriptionName = themeFolder + "_template.xml"; if (!out.isSkip(descriptionName)) { out.putNextEntry(new ZipEntry(descriptionName)); out.write(createThemeExportXML(theme).getBytes("UTF-8")); out.closeEntry(); out.nextFile(); } } private static String getThemeZipPath(final TemplateEntity theme) { return THEME_FOLDER + theme.getUrl() + "/"; } private static String getThemePath(final TemplateEntity theme) { return "/" + THEME_FOLDER + theme.getUrl(); } @Override public String createThemeExportXML(final TemplateEntity theme) { Document doc = DocumentHelper.createDocument(); Element root = doc.addElement("template"); root.addElement("title").addText(theme.getTitle()); root.addElement("url").addText(theme.getUrl()); root.addElement("content").addText(theme.getContent()); return doc.asXML(); } private void addThemeResources(final ZipOutStreamTaskAdapter out, final TemplateEntity theme) throws IOException, TaskTimeoutException { TreeItemDecorator<FolderEntity> root = getBusiness().getFolderBusiness().getTree(); TreeItemDecorator<FolderEntity> themeFolder = getBusiness().getFolderBusiness().findFolderByPath(root, getThemePath(theme)); if (themeFolder == null) { return; } getResourceExporter().addResourcesFromFolder(out, themeFolder, getThemeZipPath(theme)); } public boolean isThemeDescription(final ZipEntry entry) throws UnsupportedEncodingException { String[] chain = FolderUtil.getPathChain(entry); if (chain.length < 3 || !chain[0].equals("theme") || !chain[2].equals("description.xml")) { return false; } return true; } private TemplateEntity readThemeImportXML(final String xml) throws DocumentException { Document doc = DocumentHelper.parseText(xml); Element root = doc.getRootElement(); TemplateEntity template = new TemplateEntity(); for (Iterator<Element> i = root.elementIterator(); i.hasNext();) { Element element = i.next(); if (element.getName().equals("title")) { template.setTitle(element.getStringValue()); } if (element.getName().equals("url")) { template.setUrl(element.getStringValue()); } } return template; } public void createThemeByDescription(final ZipEntry entry, String xml) throws UnsupportedEncodingException, DocumentException, DaoTaskException { String[] chain = FolderUtil.getPathChain(entry); String themeName = chain[1]; TemplateEntity theme = getDao().getTemplateDao().getByUrl(themeName); if (theme == null) { theme = new TemplateEntity(); theme.setContent(""); } String content = theme.getContent(); TemplateEntity parsedEntity = readThemeImportXML(xml); theme.copy(parsedEntity); theme.setContent(content); getDaoTaskAdapter().templateSave(theme); } public boolean isThemeContent(final ZipEntry entry) throws UnsupportedEncodingException { String[] chain = FolderUtil.getPathChain(entry); if (chain.length < 3 || !chain[0].equals("theme") || !chain[2].equals("content.html")) { return false; } return true; } public void createThemeByContent(final ZipEntry entry, final String content) throws UnsupportedEncodingException, DocumentException, DaoTaskException { String[] chain = FolderUtil.getPathChain(entry); String themeName = chain[1]; TemplateEntity theme = getDao().getTemplateDao().getByUrl(themeName); if (theme == null) { theme = new TemplateEntity(); theme.setTitle(themeName); theme.setUrl(themeName); } theme.setContent(content); getDaoTaskAdapter().templateSave(theme); } public ResourceExporter getResourceExporter() { return getExporterFactory().getResourceExporter(); } /** * Read and import data from _template.xml file. * @param path - path to _temlate.xml file. * @param xml - _template.xml content. * @return true if successfully imported. * @throws DocumentException * @throws DaoTaskException */ public boolean readTemplateFile(String path, String xml) throws DocumentException, DaoTaskException { String folderPath = FolderUtil.getFilePath(path); String templateName = getTemplateName(folderPath); if (templateName == null) { return false; } TemplateEntity template = getDao().getTemplateDao().getByUrl(templateName); if (template == null) { template = new TemplateEntity(); template.setUrl(templateName); } Element root = DocumentHelper.parseText(xml).getRootElement(); String title = root.elementText("title"); if (!StringUtils.isEmpty(title)) { template.setTitle(title); } String content = root.elementText("content"); if (!StringUtils.isEmpty(content)) { template.setContent(content); } getDaoTaskAdapter().templateSave(template); return true; } private String getTemplateName(String folderPath) { try { String[] chain = FolderUtil.getPathChain(folderPath); if (chain.length == 2 && chain[0].equals("theme")) { return chain[1]; } } catch (Exception e) { e.printStackTrace(); } return null; } }