com.liferay.portlet.blogs.lar.BlogsPortletDataHandlerImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.blogs.lar.BlogsPortletDataHandlerImpl.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * 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.
 */

package com.liferay.portlet.blogs.lar;

import com.liferay.portal.kernel.lar.BasePortletDataHandler;
import com.liferay.portal.kernel.lar.PortletDataContext;
import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
import com.liferay.portal.kernel.util.CalendarFactoryUtil;
import com.liferay.portal.kernel.util.StreamUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.SAXReaderUtil;
import com.liferay.portal.model.Image;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.service.persistence.ImageUtil;
import com.liferay.portal.util.PortletKeys;
import com.liferay.portal.util.PropsValues;
import com.liferay.portlet.blogs.model.BlogsEntry;
import com.liferay.portlet.blogs.service.BlogsEntryLocalServiceUtil;
import com.liferay.portlet.blogs.service.persistence.BlogsEntryUtil;
import com.liferay.portlet.journal.lar.JournalPortletDataHandlerImpl;

import java.io.InputStream;

import java.util.Calendar;
import java.util.List;

import javax.portlet.PortletPreferences;

/**
 * @author Bruno Farache
 * @author Raymond Aug
 * @author Juan Fernndez
 */
public class BlogsPortletDataHandlerImpl extends BasePortletDataHandler {

    @Override
    public PortletDataHandlerControl[] getExportControls() {
        return new PortletDataHandlerControl[] { _entries, _categories, _comments, _ratings, _tags };
    }

    @Override
    public PortletDataHandlerControl[] getImportControls() {
        return new PortletDataHandlerControl[] { _entries, _categories, _comments, _ratings, _tags, _wordpress };
    }

    @Override
    public boolean isAlwaysExportable() {
        return _ALWAYS_EXPORTABLE;
    }

    @Override
    public boolean isPublishToLiveByDefault() {
        return PropsValues.BLOGS_PUBLISH_TO_LIVE_BY_DEFAULT;
    }

    @Override
    protected PortletPreferences doDeleteData(PortletDataContext portletDataContext, String portletId,
            PortletPreferences portletPreferences) throws Exception {

        if (!portletDataContext.addPrimaryKey(BlogsPortletDataHandlerImpl.class, "deleteData")) {

            BlogsEntryLocalServiceUtil.deleteEntries(portletDataContext.getScopeGroupId());
        }

        return null;
    }

    @Override
    protected String doExportData(PortletDataContext portletDataContext, String portletId,
            PortletPreferences portletPreferences) throws Exception {

        portletDataContext.addPermissions("com.liferay.portlet.blogs", portletDataContext.getScopeGroupId());

        Document document = SAXReaderUtil.createDocument();

        Element rootElement = document.addElement("blogs-data");

        rootElement.addAttribute("group-id", String.valueOf(portletDataContext.getScopeGroupId()));

        Element entriesElement = rootElement.addElement("entries");

        Element dlFileEntryTypesElement = entriesElement.addElement("dl-file-entry-types");
        Element dlFoldersElement = entriesElement.addElement("dl-folders");
        Element dlFileEntriesElement = entriesElement.addElement("dl-file-entries");
        Element dlFileRanksElement = entriesElement.addElement("dl-file-ranks");

        List<BlogsEntry> entries = BlogsEntryUtil.findByGroupId(portletDataContext.getScopeGroupId());

        for (BlogsEntry entry : entries) {
            exportEntry(portletDataContext, entriesElement, dlFileEntryTypesElement, dlFoldersElement,
                    dlFileEntriesElement, dlFileRanksElement, entry);
        }

        return document.formattedString();
    }

    @Override
    protected PortletPreferences doImportData(PortletDataContext portletDataContext, String portletId,
            PortletPreferences portletPreferences, String data) throws Exception {

        portletDataContext.importPermissions("com.liferay.portlet.blogs", portletDataContext.getSourceGroupId(),
                portletDataContext.getScopeGroupId());

        Document document = SAXReaderUtil.read(data);

        Element rootElement = document.getRootElement();

        Element entriesElement = rootElement.element("entries");

        if (entriesElement != null) {
            JournalPortletDataHandlerImpl.importReferencedData(portletDataContext, entriesElement);
        } else {
            entriesElement = rootElement;
        }

        for (Element entryElement : entriesElement.elements("entry")) {
            String path = entryElement.attributeValue("path");

            if (!portletDataContext.isPathNotProcessed(path)) {
                continue;
            }

            BlogsEntry entry = (BlogsEntry) portletDataContext.getZipEntryAsObject(path);

            importEntry(portletDataContext, entryElement, entry);
        }

        if (portletDataContext.getBooleanParameter(_NAMESPACE, "wordpress")) {
            WordPressImporter.importData(portletDataContext);
        }

        return null;
    }

    protected void exportEntry(PortletDataContext portletDataContext, Element entriesElement,
            Element dlFileEntryTypesElement, Element dlFoldersElement, Element dlFileEntriesElement,
            Element dlFileRanksElement, BlogsEntry entry) throws Exception {

        if (!portletDataContext.isWithinDateRange(entry.getModifiedDate())) {
            return;
        }

        if (entry.getStatus() != WorkflowConstants.STATUS_APPROVED) {
            return;
        }

        String path = getEntryPath(portletDataContext, entry);

        if (!portletDataContext.isPathNotProcessed(path)) {
            return;
        }

        // Clone this entry to make sure changes to its content are never
        // persisted

        entry = (BlogsEntry) entry.clone();

        Element entryElement = (Element) entriesElement
                .selectSingleNode("//page[@path='".concat(path).concat("']"));

        if (entryElement == null) {
            entryElement = entriesElement.addElement("entry");
        }

        String content = JournalPortletDataHandlerImpl.exportReferencedContent(portletDataContext,
                dlFileEntryTypesElement, dlFoldersElement, dlFileEntriesElement, dlFileRanksElement, entryElement,
                entry.getContent());

        entry.setContent(content);

        String imagePath = getEntryImagePath(portletDataContext, entry);

        entryElement.addAttribute("image-path", imagePath);

        Image smallImage = ImageUtil.fetchByPrimaryKey(entry.getSmallImageId());

        if (entry.isSmallImage() && (smallImage != null)) {
            String smallImagePath = getEntrySmallImagePath(portletDataContext, entry);

            entryElement.addAttribute("small-image-path", smallImagePath);

            entry.setSmallImageType(smallImage.getType());

            portletDataContext.addZipEntry(smallImagePath, smallImage.getTextObj());
        }

        portletDataContext.addClassedModel(entryElement, path, entry, _NAMESPACE);
    }

    protected String getEntryImagePath(PortletDataContext portletDataContext, BlogsEntry entry) throws Exception {

        StringBundler sb = new StringBundler(4);

        sb.append(portletDataContext.getPortletPath(PortletKeys.BLOGS));
        sb.append("/entry/");
        sb.append(entry.getUuid());
        sb.append(StringPool.SLASH);

        return sb.toString();
    }

    protected String getEntryPath(PortletDataContext portletDataContext, BlogsEntry entry) {

        StringBundler sb = new StringBundler(4);

        sb.append(portletDataContext.getPortletPath(PortletKeys.BLOGS));
        sb.append("/entries/");
        sb.append(entry.getEntryId());
        sb.append(".xml");

        return sb.toString();
    }

    protected String getEntrySmallImagePath(PortletDataContext portletDataContext, BlogsEntry entry)
            throws Exception {

        StringBundler sb = new StringBundler(6);

        sb.append(portletDataContext.getPortletPath(PortletKeys.BLOGS));
        sb.append("/entries/");
        sb.append(entry.getUuid());
        sb.append("/thumbnail");
        sb.append(StringPool.PERIOD);
        sb.append(entry.getSmallImageType());

        return sb.toString();
    }

    protected void importEntry(PortletDataContext portletDataContext, Element entryElement, BlogsEntry entry)
            throws Exception {

        long userId = portletDataContext.getUserId(entry.getUserUuid());

        String content = JournalPortletDataHandlerImpl.importReferencedContent(portletDataContext, entryElement,
                entry.getContent());

        entry.setContent(content);

        Calendar displayDateCal = CalendarFactoryUtil.getCalendar();

        displayDateCal.setTime(entry.getDisplayDate());

        int displayDateMonth = displayDateCal.get(Calendar.MONTH);
        int displayDateDay = displayDateCal.get(Calendar.DATE);
        int displayDateYear = displayDateCal.get(Calendar.YEAR);
        int displayDateHour = displayDateCal.get(Calendar.HOUR);
        int displayDateMinute = displayDateCal.get(Calendar.MINUTE);

        if (displayDateCal.get(Calendar.AM_PM) == Calendar.PM) {
            displayDateHour += 12;
        }

        boolean allowPingbacks = entry.isAllowPingbacks();
        boolean allowTrackbacks = entry.isAllowTrackbacks();
        String[] trackbacks = StringUtil.split(entry.getTrackbacks());
        int status = entry.getStatus();

        ServiceContext serviceContext = portletDataContext.createServiceContext(entryElement, entry, _NAMESPACE);

        if (status != WorkflowConstants.STATUS_APPROVED) {
            serviceContext.setWorkflowAction(WorkflowConstants.ACTION_SAVE_DRAFT);
        }

        String smallImageFileName = null;
        InputStream smallImageInputStream = null;

        try {
            String smallImagePath = entryElement.attributeValue("small-image-path");

            if (entry.isSmallImage() && Validator.isNotNull(smallImagePath)) {
                smallImageFileName = String.valueOf(entry.getSmallImageId()).concat(StringPool.PERIOD)
                        .concat(entry.getSmallImageType());
                smallImageInputStream = portletDataContext.getZipEntryAsInputStream(smallImagePath);
            }

            BlogsEntry importedEntry = null;

            if (portletDataContext.isDataStrategyMirror()) {
                BlogsEntry existingEntry = BlogsEntryUtil.fetchByUUID_G(entry.getUuid(),
                        portletDataContext.getScopeGroupId());

                if (existingEntry == null) {
                    serviceContext.setUuid(entry.getUuid());

                    importedEntry = BlogsEntryLocalServiceUtil.addEntry(userId, entry.getTitle(),
                            entry.getDescription(), entry.getContent(), displayDateMonth, displayDateDay,
                            displayDateYear, displayDateHour, displayDateMinute, allowPingbacks, allowTrackbacks,
                            trackbacks, entry.isSmallImage(), entry.getSmallImageURL(), smallImageFileName,
                            smallImageInputStream, serviceContext);
                } else {
                    importedEntry = BlogsEntryLocalServiceUtil.updateEntry(userId, existingEntry.getEntryId(),
                            entry.getTitle(), entry.getDescription(), entry.getContent(), displayDateMonth,
                            displayDateDay, displayDateYear, displayDateHour, displayDateMinute, allowPingbacks,
                            allowTrackbacks, trackbacks, entry.getSmallImage(), entry.getSmallImageURL(),
                            smallImageFileName, smallImageInputStream, serviceContext);
                }
            } else {
                importedEntry = BlogsEntryLocalServiceUtil.addEntry(userId, entry.getTitle(),
                        entry.getDescription(), entry.getContent(), displayDateMonth, displayDateDay,
                        displayDateYear, displayDateHour, displayDateMinute, allowPingbacks, allowTrackbacks,
                        trackbacks, entry.getSmallImage(), entry.getSmallImageURL(), smallImageFileName,
                        smallImageInputStream, serviceContext);
            }

            portletDataContext.importClassedModel(entry, importedEntry, _NAMESPACE);
        } finally {
            StreamUtil.cleanUp(smallImageInputStream);
        }

    }

    private static final boolean _ALWAYS_EXPORTABLE = true;

    private static final String _NAMESPACE = "blogs";

    private static PortletDataHandlerBoolean _categories = new PortletDataHandlerBoolean(_NAMESPACE, "categories");

    private static PortletDataHandlerBoolean _comments = new PortletDataHandlerBoolean(_NAMESPACE, "comments");

    private static PortletDataHandlerBoolean _entries = new PortletDataHandlerBoolean(_NAMESPACE, "entries", true,
            true);

    private static PortletDataHandlerBoolean _ratings = new PortletDataHandlerBoolean(_NAMESPACE, "ratings");

    private static PortletDataHandlerBoolean _tags = new PortletDataHandlerBoolean(_NAMESPACE, "tags");

    private static PortletDataHandlerBoolean _wordpress = new PortletDataHandlerBoolean(_NAMESPACE, "wordpress");

}