/**
* 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.text.ParseException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.json.JSONObject;
import org.vosao.business.imex.PageExporter;
import org.vosao.business.imex.PagePermissionExporter;
import org.vosao.business.imex.ResourceExporter;
import org.vosao.common.VosaoContext;
import org.vosao.dao.DaoTaskException;
import org.vosao.entity.CommentEntity;
import org.vosao.entity.ConfigEntity;
import org.vosao.entity.ContentEntity;
import org.vosao.entity.LanguageEntity;
import org.vosao.entity.PageEntity;
import org.vosao.entity.PageTagEntity;
import org.vosao.entity.StructureEntity;
import org.vosao.entity.StructureTemplateEntity;
import org.vosao.entity.TagEntity;
import org.vosao.entity.TemplateEntity;
import org.vosao.enums.PageState;
import org.vosao.enums.PageType;
import org.vosao.utils.DateUtil;
import org.vosao.utils.StrUtil;
import org.vosao.utils.XmlUtil;
public class PageExporterImpl extends AbstractExporter
implements PageExporter {
public PageExporterImpl(ExporterFactoryImpl factory) {
super(factory);
}
public String createPageContentXML(PageEntity page) {
Document doc = DocumentHelper.createDocument();
Element pageElement = doc.addElement("page");
createPageDetailsXML(page, pageElement);
createPageVersionXML(page, pageElement);
return doc.asXML();
}
public String createPageCommentsXML(String pageURL) {
Document doc = DocumentHelper.createDocument();
Element rootElement = doc.addElement("comments");
createCommentsXML(pageURL, rootElement);
return doc.asXML();
}
public String createPagePermissionsXML(String pageURL) {
Document doc = DocumentHelper.createDocument();
Element e = doc.addElement("permissions");
getPagePermissionExporter().createPagePermissionsXML(e,
pageURL);
return doc.asXML();
}
public String createPageTagXML(String pageURL) {
Document doc = DocumentHelper.createDocument();
Element e = doc.addElement("tags");
PageTagEntity pageTag = getDao().getPageTagDao().getByURL(pageURL);
if (pageTag != null) {
List<TagEntity> tags = getDao().getTagDao().getById(
pageTag.getTags());
for (TagEntity tag : tags) {
Element tagElement = e.addElement("tag");
tagElement.addElement("name").setText(
getBusiness().getTagBusiness().getPath(tag));
}
}
return doc.asXML();
}
private void createPageVersionXML(PageEntity page, Element pageElement) {
List<PageEntity> versions = getDao().getPageDao().selectByUrl(
page.getFriendlyURL());
for (PageEntity pageVersion : versions) {
if (!pageVersion.getId().equals(page.getId())) {
createPageDetailsXML(pageVersion, pageElement.addElement(
"page-version"));
}
}
}
private static String packTitle(PageEntity page) {
return page.getTitleValue();
}
private static String unpackTitle(String data) {
if (data.startsWith("{")) {
return data;
}
if (data.startsWith("<title>")) {
String old = data.replace("<title>", "").replace("</title>", "");
return (new JSONObject(StrUtil.unpack06Title(old))).toString();
}
return "{en:'" + data + "'}";
}
private void createPageDetailsXML(PageEntity page, Element pageElement) {
pageElement.addAttribute("url", page.getFriendlyURL());
pageElement.addAttribute("title", packTitle(page));
pageElement.addAttribute("commentsEnabled", String.valueOf(
page.isCommentsEnabled()));
if (page.getPublishDate() != null) {
pageElement.addAttribute("publishDate",
DateUtil.dateTimeToString(page.getPublishDate()));
}
if (page.getEndPublishDate() != null) {
pageElement.addAttribute("endPublishDate",
DateUtil.dateTimeToString(page.getEndPublishDate()));
}
TemplateEntity template = getDao().getTemplateDao().getById(
page.getTemplate());
if (template != null) {
pageElement.addAttribute("theme", template.getUrl());
}
pageElement.addElement("version").setText(page.getVersion().toString());
pageElement.addElement("versionTitle").setText(page.getVersionTitle());
pageElement.addElement("state").setText(page.getState().name());
pageElement.addElement("createUserEmail").setText(
page.getCreateUserEmail());
pageElement.addElement("modUserEmail").setText(
page.getModUserEmail());
if (page.getCreateDate() != null) {
pageElement.addElement("createDate").setText(
DateUtil.dateTimeToString(page.getCreateDate()));
}
if (page.getModDate() != null) {
pageElement.addElement("modDate").setText(
DateUtil.dateTimeToString(page.getModDate()));
}
StructureEntity structure = getDao().getStructureDao().getById(
page.getStructureId());
pageElement.addElement("structure").setText(
structure == null ? "" : structure.getTitle());
StructureTemplateEntity structureTemplate = getDao()
.getStructureTemplateDao().getById(page.getStructureTemplateId());
pageElement.addElement("structureTemplate").setText(
structureTemplate == null ? "" : structureTemplate.getName());
pageElement.addElement("pageType").setText(page.getPageType().name());
pageElement.addElement("sortIndex").setText(
page.getSortIndex() == null ? "0" : page.getSortIndex().toString());
pageElement.addElement("keywords").setText(XmlUtil.notNull(
page.getKeywords()));
pageElement.addElement("description").setText(XmlUtil.notNull(
page.getDescription()));
pageElement.addElement("headHtml").setText(XmlUtil.notNull(
page.getHeadHtml()));
pageElement.addElement("searchable").setText(String.valueOf(
page.isSearchable()));
pageElement.addElement("velocityProcessing").setText(String.valueOf(
page.isVelocityProcessing()));
pageElement.addElement("skipPostProcessing").setText(String.valueOf(
page.isSkipPostProcessing()));
pageElement.addElement("cached").setText(String.valueOf(
page.isCached()));
pageElement.addElement("contentType").setText(XmlUtil.notNull(
page.getContentType()));
pageElement.addElement("wikiProcessing").setText(String.valueOf(
page.isWikiProcessing()));
pageElement.addElement("enableCkeditor").setText(String.valueOf(
page.isEnableCkeditor()));
pageElement.addElement("attributes").setText(XmlUtil.notNull(
page.getAttributes()));
pageElement.addElement("restful").setText(String.valueOf(
page.isRestful()));
List<ContentEntity> contents = getDao().getPageDao().getContents(
page.getId());
for (ContentEntity content : contents) {
Element contentElement = pageElement.addElement("content");
contentElement.addAttribute("language", content.getLanguageCode());
contentElement.addText(content.getContent());
}
}
private void createCommentsXML(String pageURL, Element commentsElement) {
List<CommentEntity> comments = getDao().getCommentDao().getByPage(
pageURL);
for (CommentEntity comment : comments) {
Element commentElement = commentsElement.addElement("comment");
commentElement.addAttribute("name", comment.getName());
commentElement.addAttribute("disabled", String.valueOf(
comment.isDisabled()));
commentElement.addAttribute("publishDate",
DateUtil.dateTimeToString(comment.getPublishDate()));
commentElement.setText(comment.getContent());
}
}
public void readPages(Element pages) throws DaoTaskException {
for (Iterator<Element> i = pages.elementIterator(); i.hasNext(); ) {
Element pageElement = i.next();
readPage(pageElement);
}
}
private void readPage(Element pageElement)
throws DaoTaskException {
PageEntity page = readPageVersion(pageElement);
for (Iterator<Element> i = pageElement.elementIterator(); i.hasNext();) {
Element element = i.next();
if (element.getName().equals("page")) {
readPage(element);
}
if (element.getName().equals("comments")) {
readComments(element, page.getFriendlyURL());
}
if (element.getName().equals("page-version")) {
readPageVersion(element);
}
if (element.getName().equals("permissions")) {
getPagePermissionExporter().readPagePermissions(element,
page.getFriendlyURL());
}
}
}
private PageEntity readPageVersion(Element pageElement)
throws DaoTaskException {
String title = unpackTitle(pageElement.attributeValue("title"));
String url = pageElement.attributeValue("url");
String themeUrl = pageElement.attributeValue("theme");
String commentsEnabled = pageElement.attributeValue("commentsEnabled");
Date publishDate = new Date();
Date endPublishDate = null;
if (pageElement.attributeValue("publishDate") != null) {
try {
publishDate = DateUtil.dateTimeToDate(pageElement
.attributeValue("publishDate"));
} catch (ParseException e) {
try {
publishDate = DateUtil.toDate(pageElement
.attributeValue("publishDate"));
}
catch (ParseException e2) {
logger.error("Wrong date format "
+ pageElement.attributeValue("publishDate") + " "
+ title);
}
}
}
if (pageElement.attributeValue("endPublishDate") != null) {
try {
endPublishDate = DateUtil.dateTimeToDate(pageElement
.attributeValue("endPublishDate"));
} catch (ParseException e) {
logger.error("Wrong date format "
+ pageElement.attributeValue("endPublishDate") + " "
+ title);
}
}
TemplateEntity template = getDao().getTemplateDao().getByUrl(themeUrl);
Long templateId = null;
if (template != null) {
templateId = template.getId();
}
PageEntity newPage = new PageEntity();
newPage.setTitleValue(title);
newPage.setFriendlyURL(url);
newPage.setTemplate(templateId);
newPage.setPublishDate(publishDate);
newPage.setEndPublishDate(endPublishDate);
if (commentsEnabled != null) {
newPage.setCommentsEnabled(Boolean.valueOf(commentsEnabled));
}
newPage.setState(PageState.APPROVED);
for (Iterator<Element> i = pageElement.elementIterator(); i.hasNext();) {
Element element = i.next();
if (element.getName().equals("version")) {
newPage.setVersion(XmlUtil.readIntegerText(element, 1));
}
if (element.getName().equals("versionTitle")) {
newPage.setVersionTitle(element.getText());
}
if (element.getName().equals("state")) {
newPage.setState(PageState.valueOf(element.getText()));
}
if (element.getName().equals("createUserEmail")) {
newPage.setCreateUserEmail(element.getText());
}
if (element.getName().equals("modUserEmail")) {
newPage.setModUserEmail(element.getText());
}
if (element.getName().equals("pageType")) {
newPage.setPageType(PageType.valueOf(element.getText()));
}
if (element.getName().equals("sortIndex")) {
newPage.setSortIndex(XmlUtil.readIntegerText(element, 0));
}
if (element.getName().equals("structure")) {
StructureEntity structure = getDao().getStructureDao().getByTitle(
element.getText());
newPage.setStructureId(structure == null ? null : structure.getId());
}
if (element.getName().equals("structureTemplate")) {
StructureTemplateEntity structureTemplate = getDao()
.getStructureTemplateDao().getByName(element.getText());
if (structureTemplate == null) {
structureTemplate = getDao()
.getStructureTemplateDao().getByTitle(element.getText());
}
newPage.setStructureTemplateId(structureTemplate == null ? null :
structureTemplate.getId());
}
if (element.getName().equals("createDate")) {
try {
newPage.setCreateDate(DateUtil.dateTimeToDate(
element.getText()));
} catch (ParseException e) {
logger.error("Wrong date format for createDate "
+ element.getText());
}
}
if (element.getName().equals("modDate")) {
try {
newPage.setModDate(DateUtil.dateTimeToDate(
element.getText()));
} catch (ParseException e) {
logger.error("Wrong date format for createDate "
+ element.getText());
}
}
if (element.getName().equals("keywords")) {
newPage.setKeywords(element.getText());
}
if (element.getName().equals("description")) {
newPage.setDescription(element.getText());
}
if (element.getName().equals("searchable")) {
newPage.setSearchable(XmlUtil.readBooleanText(element, true));
}
if (element.getName().equals("velocityProcessing")) {
newPage.setVelocityProcessing(XmlUtil.readBooleanText(element,
false));
}
if (element.getName().equals("headHtml")) {
newPage.setHeadHtml(element.getText());
}
if (element.getName().equals("skipPostProcessing")) {
newPage.setSkipPostProcessing(XmlUtil.readBooleanText(element,
false));
}
if (element.getName().equals("cached")) {
newPage.setCached(XmlUtil.readBooleanText(element, true));
}
if (element.getName().equals("contentType")) {
newPage.setContentType(element.getText());
}
if (element.getName().equals("wikiProcessing")) {
newPage.setWikiProcessing(XmlUtil.readBooleanText(element,
false));
}
if (element.getName().equals("enableCkeditor")) {
newPage.setEnableCkeditor(XmlUtil.readBooleanText(element,
true));
}
if (element.getName().equals("attributes")) {
newPage.setAttributes(element.getText());
}
if (element.getName().equals("restful")) {
newPage.setRestful(XmlUtil.readBooleanText(element,
true));
}
}
PageEntity page = getDao().getPageDao().getByUrlVersion(url,
newPage.getVersion());
if (page != null) {
page.copy(newPage);
} else {
page = newPage;
}
getDaoTaskAdapter().pageSave(page);
readContents(pageElement, page);
return page;
}
private void readContents(Element pageElement, PageEntity page)
throws DaoTaskException {
ConfigEntity config = VosaoContext.getInstance().getConfig();
for (Iterator<Element> i = pageElement.elementIterator(); i.hasNext();) {
Element element = i.next();
if (element.getName().equals("content")) {
String content = element.getText();
String language = element.attributeValue("language");
if (language == null) {
language = config.getDefaultLanguage();
}
getDaoTaskAdapter().setPageContent(page.getId(), language,
content);
}
}
}
private void readComments(Element commentsElement, String url)
throws DaoTaskException {
for (Iterator<Element> i = commentsElement.elementIterator(); i
.hasNext();) {
Element element = i.next();
if (element.getName().equals("comment")) {
String name = element.attributeValue("name");
Date publishDate = new Date();
try {
publishDate = DateUtil.dateTimeToDate(element
.attributeValue("publishDate"));
} catch (ParseException e) {
logger.error("Error parsing comment publish date "
+ element.attributeValue("publishDate"));
}
boolean disabled = Boolean.valueOf(element
.attributeValue("disabled"));
String content = element.getText();
CommentEntity comment = new CommentEntity(name, content,
publishDate, url, disabled);
getDaoTaskAdapter().commentSave(comment);
}
}
}
private ResourceExporter getResourceExporter() {
return getExporterFactory().getResourceExporter();
}
private PagePermissionExporter getPagePermissionExporter() {
return getExporterFactory().getPagePermissionExporter();
}
/**
* Read and import data from _content.xml file.
* @param folderPath - _content.xml file path.
* @param xml - _content.xml file content.
* @return
* @throws DocumentException
* @throws DaoTaskException
*/
public boolean readContentFile(String folderPath, String xml)
throws DocumentException, DaoTaskException {
String pageURL = getPageURL(folderPath);
if (pageURL == null) {
return false;
}
Document doc = DocumentHelper.parseText(xml);
readPage(doc.getRootElement());
return true;
}
/**
* Read and import data from _comments.xml file.
* @param folderPath - _comments.xml file path.
* @param xml - _comments.xml file content.
* @return
* @throws DocumentException
* @throws DaoTaskException
*/
public boolean readCommentsFile(String folderPath, String xml)
throws DocumentException, DaoTaskException {
String pageURL = getPageURL(folderPath);
if (pageURL == null) {
return false;
}
Document doc = DocumentHelper.parseText(xml);
readComments(doc.getRootElement(), pageURL);
return true;
}
/**
* Read and import data from _permissions.xml file.
* @param folderPath - _permissions.xml file path.
* @param xml - _permissions.xml file content.
* @return
* @throws DocumentException
*/
public boolean readPermissionsFile(String folderPath, String xml)
throws DocumentException {
String pageURL = getPageURL(folderPath);
if (pageURL == null) {
return false;
}
Document doc = DocumentHelper.parseText(xml);
getPagePermissionExporter().readPagePermissions(doc.getRootElement(),
pageURL);
return true;
}
private String getPageURL(String folderPath) {
if (folderPath.equals("/page")) {
return "/";
}
if (folderPath.startsWith("/page")) {
return folderPath.replace("/page", "");
}
return null;
}
@Override
public boolean readPageTagFile(String folderPath, String xml)
throws DocumentException, DaoTaskException {
String pageURL = getPageURL(folderPath);
if (pageURL == null) {
return false;
}
Document doc = DocumentHelper.parseText(xml);
readTags(doc.getRootElement(), pageURL);
return true;
}
private void readTags(Element tagsElement, String pageURL)
throws DaoTaskException {
for (Iterator<Element> i = tagsElement.elementIterator(); i.hasNext();) {
Element element = i.next();
if (element.getName().equals("tag")) {
String path = element.elementText("name");
TagEntity tag = getBusiness().getTagBusiness().getByPath(path);
if(tag != null) {
PageTagEntity pageTag = getDao().getPageTagDao().getByURL(pageURL);
if (pageTag == null) {
pageTag = new PageTagEntity(pageURL);
}
if (!pageTag.getTags().contains(tag.getId())) {
pageTag.getTags().add(tag.getId());
}
getDaoTaskAdapter().pageTagSave(pageTag);
if (!tag.getPages().contains(pageURL)) {
tag.getPages().add(pageURL);
getDaoTaskAdapter().tagSave(tag);
}
}
else {
logger.error("Tag not found " + path);
}
}
}
}
}