com.liferay.asset.publisher.web.upgrade.v1_0_0.UpgradePortletPreferences.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.asset.publisher.web.upgrade.v1_0_0.UpgradePortletPreferences.java

Source

/**
 * Copyright (c) 2000-present 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.asset.publisher.web.upgrade.v1_0_0;

import com.liferay.asset.publisher.web.constants.AssetPublisherPortletKeys;
import com.liferay.document.library.kernel.model.DLFileEntryType;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMStructureLink;
import com.liferay.dynamic.data.mapping.service.DDMStructureLinkLocalService;
import com.liferay.dynamic.data.mapping.service.DDMStructureLocalService;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.upgrade.BaseUpgradePortletPreferences;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.SAXReader;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

import java.text.DateFormat;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import javax.portlet.PortletPreferences;

/**
 * @author Sam Ziemer
 */
public class UpgradePortletPreferences extends BaseUpgradePortletPreferences {

    public UpgradePortletPreferences(DDMStructureLocalService ddmStructureLocalService,
            DDMStructureLinkLocalService ddmStructureLinkLocalService, SAXReader saxReader) {

        _ddmStructureLocalService = ddmStructureLocalService;
        _ddmStructureLinkLocalService = ddmStructureLinkLocalService;
        _saxReader = saxReader;

        _newDateFormat = DateFormatFactoryUtil.getSimpleDateFormat("yyyy-MM-dd");
        _oldDateFormat = DateFormatFactoryUtil.getSimpleDateFormat("yyyyMMddHHmmss");
    }

    protected DDMForm getDDMForm(long structureId) throws Exception {
        DDMForm ddmForm = _ddmSructureDDMForms.get(structureId);

        if (ddmForm != null) {
            return ddmForm;
        }

        DDMStructure ddmStructure = _ddmStructureLocalService.getStructure(structureId);

        ddmForm = ddmStructure.getDDMForm();

        _ddmSructureDDMForms.put(structureId, ddmForm);

        return ddmForm;
    }

    protected DDMFormField getDDMFormField(DDMForm ddmForm, String fieldName) {
        Map<String, DDMFormField> ddmFormFieldsMap = ddmForm.getDDMFormFieldsMap(false);

        return ddmFormFieldsMap.get(fieldName);
    }

    protected String getJournalArticleResourceUuid(String journalArticleUuid) throws Exception {

        StringBundler sb = new StringBundler(5);

        sb.append("select JournalArticleResource.uuid_ from ");
        sb.append("JournalArticleResource inner join JournalArticle on ");
        sb.append("JournalArticle.resourcePrimKey = ");
        sb.append("JournalArticleResource.resourcePrimKey where ");
        sb.append("JournalArticle.uuid_ = ?");

        try (PreparedStatement ps = connection.prepareStatement(sb.toString())) {

            ps.setString(1, journalArticleUuid);

            try (ResultSet rs = ps.executeQuery()) {
                if (rs.next()) {
                    return rs.getString("uuid_");
                }

                return null;
            }
        }
    }

    @Override
    protected String[] getPortletIds() {
        return new String[] { AssetPublisherPortletKeys.ASSET_PUBLISHER + "_INSTANCE_%" };
    }

    protected boolean isDateField(DDMForm ddmForm, String fieldName) {
        DDMFormField ddmFormField = getDDMFormField(ddmForm, fieldName);

        if (ddmFormField == null) {
            return false;
        }

        if (Objects.equals("ddm-date", ddmFormField.getType())) {
            return true;
        }

        return false;
    }

    protected boolean isFilterByFieldEnable(PortletPreferences portletPreferences, String key) {

        return GetterUtil.getBoolean(portletPreferences.getValue(key, Boolean.FALSE.toString()));
    }

    protected boolean isOldDDMPreferenceValueFormat(String value) {
        if (value.startsWith(_DDM_FIELD_OLD_PREFIX)) {
            return true;
        }

        return false;
    }

    protected void transformDateFieldValue(PortletPreferences portletPreferences) throws Exception {

        String value = GetterUtil.getString(portletPreferences.getValue(_DDM_STRUCTURE_FIELD_VALUE, null));

        if (Validator.isNotNull(value)) {
            Date date = _oldDateFormat.parse(value);

            portletPreferences.setValue(_DDM_STRUCTURE_FIELD_VALUE, _newDateFormat.format(date));
        }
    }

    protected void upgradeDLDateFieldsValues(PortletPreferences portletPreferences) throws Exception {

        long fileEntryTypeId = GetterUtil.getLong(portletPreferences.getValue(_DL_CLASS_TYPE, "0"));

        if (fileEntryTypeId > 0) {
            long fileEntryTypeClassNameId = PortalUtil.getClassNameId(DLFileEntryType.class);

            List<DDMStructureLink> ddmStructureLinks = _ddmStructureLinkLocalService
                    .getStructureLinks(fileEntryTypeClassNameId, fileEntryTypeId);

            String selectedFieldName = GetterUtil
                    .getString(portletPreferences.getValue(_DDM_STRUCTURE_FIELD_NAME, null));

            for (DDMStructureLink ddmStructureLink : ddmStructureLinks) {
                DDMForm ddmForm = getDDMForm(ddmStructureLink.getStructureId());

                if (isDateField(ddmForm, selectedFieldName)) {
                    transformDateFieldValue(portletPreferences);

                    break;
                }
            }
        }
    }

    protected void upgradeJournalDateFieldValue(PortletPreferences portletPreferences) throws Exception {

        long structureId = GetterUtil.getLong(portletPreferences.getValue(_JOURNAL_CLASS_TYPE, "0"));

        if (structureId > 0) {
            String selectedFieldName = GetterUtil
                    .getString(portletPreferences.getValue(_DDM_STRUCTURE_FIELD_NAME, null));

            DDMForm ddmForm = getDDMForm(structureId);

            if (isDateField(ddmForm, selectedFieldName)) {
                transformDateFieldValue(portletPreferences);
            }
        }
    }

    protected void upgradeOrderByColumn(PortletPreferences portletPreferences, String column) throws Exception {

        String value = GetterUtil.getString(portletPreferences.getValue(column, null));

        if (Validator.isNull(value)) {
            return;
        }

        if (value.startsWith(_DDM_FIELD_OLD_PREFIX) || value.startsWith(_DDM_FIELD_PREFIX)) {

            String[] values = new String[0];

            boolean oldDDMPreferenceValueFormat = isOldDDMPreferenceValueFormat(value);

            if (oldDDMPreferenceValueFormat) {
                values = StringUtil.split(value, _DDM_FIELD_OLD_SEPARATOR);
            } else {
                values = StringUtil.split(value, _DDM_FIELD_SEPARATOR);
            }

            if (values.length == 3) {
                long structureId = GetterUtil.getLong(values[1]);

                DDMForm ddmForm = getDDMForm(structureId);

                DDMFormField ddmFormField = getDDMFormField(ddmForm, values[2]);

                if ((ddmFormField != null) && Validator.isNotNull(ddmFormField.getIndexType())) {

                    StringBundler sb = new StringBundler(7);

                    sb.append(values[0]);
                    sb.append(_DDM_FIELD_SEPARATOR);
                    sb.append(ddmFormField.getIndexType());
                    sb.append(_DDM_FIELD_SEPARATOR);
                    sb.append(values[1]);
                    sb.append(_DDM_FIELD_SEPARATOR);
                    sb.append(values[2]);

                    value = sb.toString();
                }
            } else if ((values.length == 4) && oldDDMPreferenceValueFormat) {
                value = StringUtil.replace(value, _DDM_FIELD_OLD_SEPARATOR, _DDM_FIELD_SEPARATOR);
            }

            portletPreferences.setValue(column, value);
        }
    }

    protected void upgradeOrderByColumns(PortletPreferences portletPreferences) throws Exception {

        upgradeOrderByColumn(portletPreferences, _ORDER_BY_COLUMN_1);
        upgradeOrderByColumn(portletPreferences, _ORDER_BY_COLUMN_2);
    }

    @Override
    protected String upgradePreferences(long companyId, long ownerId, int ownerType, long plid, String portletId,
            String xml) throws Exception {

        PortletPreferences portletPreferences = PortletPreferencesFactoryUtil.fromXML(companyId, ownerId, ownerType,
                plid, portletId, xml);

        String[] assetEntryXmls = portletPreferences.getValues("asset-entry-xml", new String[0]);

        if (ArrayUtil.isNotEmpty(assetEntryXmls)) {
            upgradeUuids(assetEntryXmls);

            portletPreferences.setValues("assetEntryXml", assetEntryXmls);
        }

        boolean subtypeFieldsFilterEnabled = GetterUtil
                .getBoolean(portletPreferences.getValue("subtypeFieldsFilterEnabled", Boolean.FALSE.toString()));

        if (subtypeFieldsFilterEnabled) {
            boolean dlFilterByFieldEnable = isFilterByFieldEnable(portletPreferences,
                    _DL_FILTER_BY_FIELD_ENABLED_KEY);
            boolean journalFilterByFieldEnable = isFilterByFieldEnable(portletPreferences,
                    _JOURNAL_FILTER_BY_FIELD_ENABLED_KEY);

            if (dlFilterByFieldEnable) {
                upgradeDLDateFieldsValues(portletPreferences);
            } else if (journalFilterByFieldEnable) {
                upgradeJournalDateFieldValue(portletPreferences);
            }

            upgradeOrderByColumns(portletPreferences);
        }

        return PortletPreferencesFactoryUtil.toXML(portletPreferences);
    }

    protected void upgradeUuids(String[] assetEntryXmls) throws Exception {
        for (int i = 0; i < assetEntryXmls.length; i++) {
            String assetEntry = assetEntryXmls[i];

            Document document = _saxReader.read(assetEntry);

            Element rootElement = document.getRootElement();

            Element assetTypeElementUuid = rootElement.element("asset-entry-uuid");

            if (assetTypeElementUuid == null) {
                continue;
            }

            String journalArticleResourceUuid = getJournalArticleResourceUuid(
                    assetTypeElementUuid.getStringValue());

            if (journalArticleResourceUuid == null) {
                continue;
            }

            rootElement.remove(assetTypeElementUuid);

            assetTypeElementUuid.setText(journalArticleResourceUuid);

            rootElement.add(assetTypeElementUuid);

            document.setRootElement(rootElement);

            assetEntryXmls[i] = document.formattedString(StringPool.BLANK);
        }
    }

    private static final String _DDM_FIELD_NAMESPACE = "ddm";

    private static final String _DDM_FIELD_OLD_PREFIX = _DDM_FIELD_NAMESPACE + StringPool.FORWARD_SLASH;

    private static final String _DDM_FIELD_OLD_SEPARATOR = StringPool.FORWARD_SLASH;

    private static final String _DDM_FIELD_PREFIX = _DDM_FIELD_NAMESPACE + StringPool.DOUBLE_UNDERLINE;

    private static final String _DDM_FIELD_SEPARATOR = StringPool.DOUBLE_UNDERLINE;

    private static final String _DDM_STRUCTURE_FIELD_NAME = "ddmStructureFieldName";

    private static final String _DDM_STRUCTURE_FIELD_VALUE = "ddmStructureFieldValue";

    private static final String _DL_CLASS_TYPE = "anyClassTypeDLFileEntryAssetRendererFactory";

    private static final String _DL_FILTER_BY_FIELD_ENABLED_KEY = "subtypeFieldsFilterEnabledDLFileEntryAssetRendererFactory";

    private static final String _JOURNAL_CLASS_TYPE = "anyClassTypeJournalArticleAssetRendererFactory";

    private static final String _JOURNAL_FILTER_BY_FIELD_ENABLED_KEY = "subtypeFieldsFilterEnabledJournalArticleAssetRendererFactory";

    private static final String _ORDER_BY_COLUMN_1 = "orderByColumn1";

    private static final String _ORDER_BY_COLUMN_2 = "orderByColumn2";

    private static final Map<Long, DDMForm> _ddmSructureDDMForms = new HashMap<>();

    private final DDMStructureLinkLocalService _ddmStructureLinkLocalService;
    private final DDMStructureLocalService _ddmStructureLocalService;
    private final DateFormat _newDateFormat;
    private final DateFormat _oldDateFormat;
    private final SAXReader _saxReader;

}