com.liferay.portlet.dynamicdatamapping.util.DDMImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.dynamicdatamapping.util.DDMImpl.java

Source

/**
 * Copyright (c) 2000-2013 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.dynamicdatamapping.util;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.security.pacl.DoPrivileged;
import com.liferay.portal.kernel.upload.UploadRequest;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.UnicodeFormatter;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.Layout;
import com.liferay.portal.service.LayoutLocalServiceUtil;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portal.util.PropsValues;
import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
import com.liferay.portlet.documentlibrary.util.DLUtil;
import com.liferay.portlet.dynamicdatamapping.NoSuchTemplateException;
import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.storage.Field;
import com.liferay.portlet.dynamicdatamapping.storage.FieldConstants;
import com.liferay.portlet.dynamicdatamapping.storage.Fields;
import com.liferay.portlet.dynamicdatamapping.util.comparator.StructureIdComparator;
import com.liferay.portlet.dynamicdatamapping.util.comparator.StructureModifiedDateComparator;
import com.liferay.portlet.dynamicdatamapping.util.comparator.TemplateIdComparator;
import com.liferay.portlet.dynamicdatamapping.util.comparator.TemplateModifiedDateComparator;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;

import java.text.DateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

/**
 * @author Eduardo Lundgren
 * @author Brian Wing Shun Chan
 * @author Eduardo Garcia
 * @author Marcellus Tavares
 */
@DoPrivileged
public class DDMImpl implements DDM {

    public static final String FIELDS_DISPLAY_NAME = "_fieldsDisplay";

    public static final String INSTANCE_SEPARATOR = "_INSTANCE_";

    public static final String TYPE_CHECKBOX = "checkbox";

    public static final String TYPE_DDM_DATE = "ddm-date";

    public static final String TYPE_DDM_DOCUMENTLIBRARY = "ddm-documentlibrary";

    public static final String TYPE_DDM_LINK_TO_PAGE = "ddm-link-to-page";

    public static final String TYPE_RADIO = "radio";

    public static final String TYPE_SELECT = "select";

    @Override
    public DDMDisplay getDDMDisplay(ServiceContext serviceContext) {
        String refererPortletName = (String) serviceContext.getAttribute("refererPortletName");

        if (refererPortletName == null) {
            refererPortletName = serviceContext.getPortletId();
        }

        return DDMDisplayRegistryUtil.getDDMDisplay(refererPortletName);
    }

    @Override
    public Serializable getDisplayFieldValue(ThemeDisplay themeDisplay, Serializable fieldValue, String type)
            throws Exception {

        if (fieldValue instanceof Date) {
            Date valueDate = (Date) fieldValue;

            DateFormat dateFormat = DateFormatFactoryUtil.getDate(themeDisplay.getLocale());

            fieldValue = dateFormat.format(valueDate);
        } else if (type.equals(DDMImpl.TYPE_CHECKBOX)) {
            Boolean valueBoolean = (Boolean) fieldValue;

            if (valueBoolean) {
                fieldValue = LanguageUtil.get(themeDisplay.getLocale(), "yes");
            } else {
                fieldValue = LanguageUtil.get(themeDisplay.getLocale(), "no");
            }
        } else if (type.equals(DDMImpl.TYPE_DDM_DOCUMENTLIBRARY)) {
            if (Validator.isNull(fieldValue)) {
                return StringPool.BLANK;
            }

            String valueString = String.valueOf(fieldValue);

            JSONObject jsonObject = JSONFactoryUtil.createJSONObject(valueString);

            String uuid = jsonObject.getString("uuid");
            long groupId = jsonObject.getLong("groupId");

            FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntryByUuidAndGroupId(uuid, groupId);

            fieldValue = DLUtil.getPreviewURL(fileEntry, fileEntry.getFileVersion(), null, StringPool.BLANK, false,
                    true);
        } else if (type.equals(DDMImpl.TYPE_DDM_LINK_TO_PAGE)) {
            if (Validator.isNull(fieldValue)) {
                return StringPool.BLANK;
            }

            String valueString = String.valueOf(fieldValue);

            JSONObject jsonObject = JSONFactoryUtil.createJSONObject(valueString);

            long groupId = jsonObject.getLong("groupId");
            boolean privateLayout = jsonObject.getBoolean("privateLayout");
            long layoutId = jsonObject.getLong("layoutId");

            Layout layout = LayoutLocalServiceUtil.getLayout(groupId, privateLayout, layoutId);

            fieldValue = PortalUtil.getLayoutFriendlyURL(layout, themeDisplay);
        } else if (type.equals(DDMImpl.TYPE_RADIO) || type.equals(DDMImpl.TYPE_SELECT)) {

            String valueString = String.valueOf(fieldValue);

            JSONArray jsonArray = JSONFactoryUtil.createJSONArray(valueString);

            String[] stringArray = ArrayUtil.toStringArray(jsonArray);

            fieldValue = stringArray[0];
        }

        return fieldValue;
    }

    @Override
    public Fields getFields(long ddmStructureId, long ddmTemplateId, ServiceContext serviceContext)
            throws PortalException, SystemException {

        return getFields(ddmStructureId, ddmTemplateId, StringPool.BLANK, serviceContext);
    }

    @Override
    public Fields getFields(long ddmStructureId, long ddmTemplateId, String fieldNamespace,
            ServiceContext serviceContext) throws PortalException, SystemException {

        DDMStructure ddmStructure = getDDMStructure(ddmStructureId, ddmTemplateId);

        Set<String> fieldNames = ddmStructure.getFieldNames();

        Fields fields = new Fields();

        for (String fieldName : fieldNames) {
            List<Serializable> fieldValues = getFieldValues(ddmStructure, fieldName, fieldNamespace,
                    serviceContext);

            if ((fieldValues == null) || fieldValues.isEmpty()) {
                continue;
            }

            Field field = createField(ddmStructure, fieldName, fieldValues, serviceContext);

            fields.put(field);
        }

        return fields;
    }

    @Override
    public Fields getFields(long ddmStructureId, ServiceContext serviceContext)
            throws PortalException, SystemException {

        return getFields(ddmStructureId, 0, serviceContext);
    }

    @Override
    public Fields getFields(long ddmStructureId, String fieldNamespace, ServiceContext serviceContext)
            throws PortalException, SystemException {

        return getFields(ddmStructureId, 0, fieldNamespace, serviceContext);
    }

    @Override
    public String[] getFieldsDisplayValues(Field fieldsDisplayField) throws Exception {

        DDMStructure ddmStructure = fieldsDisplayField.getDDMStructure();

        List<String> fieldsDisplayValues = new ArrayList<String>();

        String[] values = StringUtil.split((String) fieldsDisplayField.getValue());

        for (String value : values) {
            String fieldName = StringUtil.extractFirst(value, DDMImpl.INSTANCE_SEPARATOR);

            if (ddmStructure.hasField(fieldName)) {
                fieldsDisplayValues.add(fieldName);
            }
        }

        return fieldsDisplayValues.toArray(new String[fieldsDisplayValues.size()]);
    }

    @Override
    public Serializable getIndexedFieldValue(Serializable fieldValue, String type) throws Exception {

        if (fieldValue instanceof Date) {
            Date valueDate = (Date) fieldValue;

            DateFormat dateFormat = DateFormatFactoryUtil.getSimpleDateFormat("yyyyMMddHHmmss");

            fieldValue = dateFormat.format(valueDate);
        } else if (type.equals(DDMImpl.TYPE_RADIO) || type.equals(DDMImpl.TYPE_SELECT)) {

            String valueString = (String) fieldValue;

            JSONArray jsonArray = JSONFactoryUtil.createJSONArray(valueString);

            String[] stringArray = ArrayUtil.toStringArray(jsonArray);

            fieldValue = stringArray[0];
        }

        return fieldValue;
    }

    @Override
    public OrderByComparator getStructureOrderByComparator(String orderByCol, String orderByType) {

        boolean orderByAsc = false;

        if (orderByType.equals("asc")) {
            orderByAsc = true;
        }

        OrderByComparator orderByComparator = null;

        if (orderByCol.equals("id")) {
            orderByComparator = new StructureIdComparator(orderByAsc);
        } else if (orderByCol.equals("modified-date")) {
            orderByComparator = new StructureModifiedDateComparator(orderByAsc);
        }

        return orderByComparator;
    }

    @Override
    public OrderByComparator getTemplateOrderByComparator(String orderByCol, String orderByType) {

        boolean orderByAsc = false;

        if (orderByType.equals("asc")) {
            orderByAsc = true;
        }

        OrderByComparator orderByComparator = null;

        if (orderByCol.equals("id")) {
            orderByComparator = new TemplateIdComparator(orderByAsc);
        } else if (orderByCol.equals("modified-date")) {
            orderByComparator = new TemplateModifiedDateComparator(orderByAsc);
        }

        return orderByComparator;
    }

    @Override
    public Fields mergeFields(Fields newFields, Fields existingFields) {
        Iterator<Field> itr = newFields.iterator(true);

        while (itr.hasNext()) {
            Field newField = itr.next();

            Field existingField = existingFields.get(newField.getName());

            if (existingField == null) {
                existingFields.put(newField);
            } else {
                for (Locale locale : newField.getAvailableLocales()) {
                    existingField.setValues(locale, newField.getValues(locale));
                }

                existingField.setDefaultLocale(newField.getDefaultLocale());
            }
        }

        return existingFields;
    }

    protected Field createField(DDMStructure ddmStructure, String fieldName, List<Serializable> fieldValues,
            ServiceContext serviceContext) throws PortalException, SystemException {

        Field field = new Field();

        field.setDDMStructureId(ddmStructure.getStructureId());

        String languageId = GetterUtil.getString(serviceContext.getAttribute("languageId"),
                serviceContext.getLanguageId());

        Locale locale = LocaleUtil.fromLanguageId(languageId);

        String defaultLanguageId = GetterUtil.getString(serviceContext.getAttribute("defaultLanguageId"));

        Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);

        if (ddmStructure.isFieldPrivate(fieldName)) {
            locale = LocaleUtil.getSiteDefault();

            defaultLocale = LocaleUtil.getSiteDefault();
        }

        field.setDefaultLocale(defaultLocale);

        field.setName(fieldName);
        field.setValues(locale, fieldValues);

        return field;
    }

    protected DDMStructure getDDMStructure(long ddmStructureId, long ddmTemplateId)
            throws PortalException, SystemException {

        DDMStructure ddmStructure = DDMStructureLocalServiceUtil.getStructure(ddmStructureId);

        try {
            DDMTemplate ddmTemplate = DDMTemplateLocalServiceUtil.getTemplate(ddmTemplateId);

            // Clone ddmStructure to make sure changes are never persisted

            ddmStructure = (DDMStructure) ddmStructure.clone();

            ddmStructure.setXsd(ddmTemplate.getScript());
        } catch (NoSuchTemplateException nste) {
        }

        return ddmStructure;
    }

    protected List<String> getFieldNames(String fieldNamespace, String fieldName, ServiceContext serviceContext) {

        String[] fieldsDisplayValues = StringUtil
                .split((String) serviceContext.getAttribute(fieldNamespace + FIELDS_DISPLAY_NAME));

        List<String> privateFieldNames = ListUtil
                .fromArray(PropsValues.DYNAMIC_DATA_MAPPING_STRUCTURE_PRIVATE_FIELD_NAMES);

        List<String> fieldNames = new ArrayList<String>();

        if ((fieldsDisplayValues.length == 0) || privateFieldNames.contains(fieldName)) {

            fieldNames.add(fieldNamespace + fieldName);
        } else {
            for (String namespacedFieldName : fieldsDisplayValues) {
                String fieldNameValue = StringUtil.extractFirst(namespacedFieldName, INSTANCE_SEPARATOR);

                if (fieldNameValue.equals(fieldName)) {
                    fieldNames.add(fieldNamespace + namespacedFieldName);
                }
            }
        }

        return fieldNames;
    }

    protected List<Serializable> getFieldValues(DDMStructure ddmStructure, String fieldName, String fieldNamespace,
            ServiceContext serviceContext) throws PortalException, SystemException {

        String fieldDataType = ddmStructure.getFieldDataType(fieldName);
        String fieldType = ddmStructure.getFieldType(fieldName);

        List<String> fieldNames = getFieldNames(fieldNamespace, fieldName, serviceContext);

        List<Serializable> fieldValues = new ArrayList<Serializable>(fieldNames.size());

        for (String fieldNameValue : fieldNames) {
            Serializable fieldValue = serviceContext.getAttribute(fieldNameValue);
            if (fieldDataType.equals(FieldConstants.DATE)) {
                int fieldValueMonth = GetterUtil.getInteger(serviceContext.getAttribute(fieldNameValue + "Month"));
                int fieldValueDay = GetterUtil.getInteger(serviceContext.getAttribute(fieldNameValue + "Day"));
                int fieldValueYear = GetterUtil.getInteger(serviceContext.getAttribute(fieldNameValue + "Year"));

                Date fieldValueDate = PortalUtil.getDate(fieldValueMonth, fieldValueDay, fieldValueYear);

                if (fieldValueDate != null) {
                    fieldValue = String.valueOf(fieldValueDate.getTime());
                }
            } else if (fieldDataType.equals(FieldConstants.IMAGE) && Validator.isNull(fieldValue)) {

                HttpServletRequest request = serviceContext.getRequest();

                if (!(request instanceof UploadRequest)) {
                    return null;
                }

                UploadRequest uploadRequest = (UploadRequest) request;

                File file = uploadRequest.getFile(fieldNameValue);

                try {
                    byte[] bytes = FileUtil.getBytes(file);

                    if (ArrayUtil.isNotEmpty(bytes)) {
                        fieldValue = UnicodeFormatter.bytesToHex(bytes);
                    } else {
                        fieldValue = "update";
                    }
                } catch (IOException ioe) {
                    return null;
                }
            }

            if (fieldValue == null) {
                return null;
            }

            if (DDMImpl.TYPE_RADIO.equals(fieldType) || DDMImpl.TYPE_SELECT.equals(fieldType)) {

                if (fieldValue instanceof String) {
                    fieldValue = new String[] { String.valueOf(fieldValue) };
                }

                fieldValue = JSONFactoryUtil.serialize(fieldValue);
            }

            Serializable fieldValueSerializable = FieldConstants.getSerializable(fieldDataType,
                    GetterUtil.getString(fieldValue));

            fieldValues.add(fieldValueSerializable);
        }

        return fieldValues;
    }

}