com.fmdp.webform.action.ConfigurationActionImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.fmdp.webform.action.ConfigurationActionImpl.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.fmdp.webform.action;

import com.fmdp.webform.util.WebFormUtil;
import com.liferay.portal.kernel.portlet.DefaultConfigurationAction;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.Constants;
//import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.LocalizationUtil;
import com.liferay.portal.kernel.util.ParamUtil;
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.portlet.expando.DuplicateColumnNameException;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletPreferences;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

/**
 * @author Filippo Maria Del Prete
 * @author Jorge Ferrer
 * @author Alberto Montero
 * @author Julio Camarero
 * @author Brian Wing Shun Chan
 */
public class ConfigurationActionImpl extends DefaultConfigurationAction {

    @Override
    public void processAction(PortletConfig portletConfig, ActionRequest actionRequest,
            ActionResponse actionResponse) throws Exception {

        validateFields(actionRequest);

        //      boolean uploadToDM = ParamUtil.getBoolean(actionRequest,
        //            "uploadToDM");
        //      String uploadDiskDir = ParamUtil.getString(
        //                  actionRequest, "uploadDiskDir");
        long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");

        if (!SessionErrors.isEmpty(actionRequest)) {
            return;
        }

        Locale defaultLocale = LocaleUtil.getDefault();
        String defaultLanguageId = LocaleUtil.toLanguageId(defaultLocale);

        boolean updateFields = ParamUtil.getBoolean(actionRequest, "updateFields");

        String portletResource = ParamUtil.getString(actionRequest, "portletResource");

        PortletPreferences preferences = actionRequest.getPreferences();

        //      preferences.setValue("uploadToDisk", String.valueOf(uploadToDisk));
        //      preferences.setValue("uploadDiskDir", uploadDiskDir);

        LocalizationUtil.setLocalizedPreferencesValues(actionRequest, preferences, "title");
        LocalizationUtil.setLocalizedPreferencesValues(actionRequest, preferences, "description");

        if (updateFields) {
            int i = 1;
            boolean uploadToDisk = ParamUtil.getBoolean(actionRequest, "uploadToDisk");
            boolean uploadToDM = ParamUtil.getBoolean(actionRequest, "uploadToDM");
            boolean uploadIsWanted = uploadToDisk || uploadToDM;

            boolean isFileUpload = false;
            int howManyFileUploadFields = 0;

            String databaseTableName = WebFormUtil.getNewDatabaseTableName(portletResource);

            preferences.setValue("databaseTableName", databaseTableName);
            preferences.setValue("uploadToDisk", String.valueOf(uploadToDisk));
            preferences.setValue("uploadToDM", String.valueOf(uploadToDM));
            preferences.setValue("newFolderId", String.valueOf(newFolderId));

            int[] formFieldsIndexes = StringUtil.split(ParamUtil.getString(actionRequest, "formFieldsIndexes"), 0);

            for (int formFieldsIndex : formFieldsIndexes) {
                Map<Locale, String> fieldLabelMap = LocalizationUtil.getLocalizationMap(actionRequest,
                        "fieldLabel" + formFieldsIndex);

                if (Validator.isNull(fieldLabelMap.get(defaultLocale))) {
                    continue;
                }

                String fieldType = ParamUtil.getString(actionRequest, "fieldType" + formFieldsIndex);

                if ("file".equals(fieldType)) {
                    isFileUpload = true;
                    howManyFileUploadFields++;
                }

                if (howManyFileUploadFields > 1) {
                    SessionErrors.add(actionRequest, "tooManyFileUploadFields" + i);
                }
                boolean fieldOptional = ParamUtil.getBoolean(actionRequest, "fieldOptional" + formFieldsIndex);
                Map<Locale, String> fieldOptionsMap = LocalizationUtil.getLocalizationMap(actionRequest,
                        "fieldOptions" + formFieldsIndex);
                String fieldValidationScript = ParamUtil.getString(actionRequest,
                        "fieldValidationScript" + formFieldsIndex);
                String fieldValidationErrorMessage = ParamUtil.getString(actionRequest,
                        "fieldValidationErrorMessage" + formFieldsIndex);

                if (Validator.isNotNull(fieldValidationScript) ^ Validator.isNotNull(fieldValidationErrorMessage)) {

                    SessionErrors.add(actionRequest, "validationDefinitionInvalid" + i);
                }

                updateModifiedLocales("fieldLabel" + i, fieldLabelMap, preferences);
                updateModifiedLocales("fieldOptions" + i, fieldOptionsMap, preferences);

                preferences.setValue("fieldType" + i, fieldType);
                preferences.setValue("fieldOptional" + i, String.valueOf(fieldOptional));
                preferences.setValue("fieldValidationScript" + i, fieldValidationScript);
                preferences.setValue("fieldValidationErrorMessage" + i, fieldValidationErrorMessage);

                i++;
            }

            preferences.setValue("isFileUpload", String.valueOf(isFileUpload));
            if (!uploadIsWanted && isFileUpload) {
                SessionErrors.add(actionRequest, "uploadMethodUndefined");
            }
            if (!SessionErrors.isEmpty(actionRequest)) {
                return;
            }

            // Clear previous preferences that are now blank

            String fieldLabel = LocalizationUtil.getPreferencesValue(preferences, "fieldLabel" + i,
                    defaultLanguageId);

            while (Validator.isNotNull(fieldLabel)) {
                Map<Locale, String> fieldLabelMap = LocalizationUtil.getLocalizationMap(actionRequest,
                        "fieldLabel" + i);

                for (Locale locale : fieldLabelMap.keySet()) {
                    String languageId = LocaleUtil.toLanguageId(locale);

                    LocalizationUtil.setPreferencesValue(preferences, "fieldLabel" + i, languageId,
                            StringPool.BLANK);

                    LocalizationUtil.setPreferencesValue(preferences, "fieldOptions" + i, languageId,
                            StringPool.BLANK);
                }

                preferences.setValue("fieldType" + i, StringPool.BLANK);
                preferences.setValue("fieldOptional" + i, StringPool.BLANK);
                preferences.setValue("fieldValidationScript" + i, StringPool.BLANK);
                preferences.setValue("fieldValidationErrorMessage" + i, StringPool.BLANK);

                i++;

                fieldLabel = LocalizationUtil.getPreferencesValue(preferences, "fieldLabel" + i, defaultLanguageId);
            }
        }

        if (SessionErrors.isEmpty(actionRequest)) {
            preferences.store();
        }

        super.processAction(portletConfig, actionRequest, actionResponse);
    }

    @Override
    public String render(PortletConfig portletConfig, RenderRequest renderRequest, RenderResponse renderResponse)
            throws Exception {

        String cmd = ParamUtil.getString(renderRequest, Constants.CMD);

        if (cmd.equals(Constants.ADD)) {
            return "/edit_field.jsp";
        } else {
            return "/configuration.jsp";
        }
    }

    protected void updateModifiedLocales(String parameter, Map<Locale, String> newLocalizationMap,
            PortletPreferences preferences) throws Exception {

        Map<Locale, String> oldLocalizationMap = LocalizationUtil.getLocalizationMap(preferences, parameter);

        List<Locale> modifiedLocales = LocalizationUtil.getModifiedLocales(oldLocalizationMap, newLocalizationMap);

        for (Locale locale : modifiedLocales) {
            String languageId = LocaleUtil.toLanguageId(locale);
            String value = newLocalizationMap.get(locale);

            LocalizationUtil.setPreferencesValue(preferences, parameter, languageId, value);
        }
    }

    protected void validateFields(ActionRequest actionRequest) throws Exception {

        //      Locale defaultLocale = LocaleUtil.getDefault();
        //      String defaultLanguageId = LocaleUtil.toLanguageId(defaultLocale);

        boolean sendAsEmail = GetterUtil.getBoolean(getParameter(actionRequest, "sendAsEmail"));
        String subject = getParameter(actionRequest, "subject");

        boolean sendThanksEmail = GetterUtil.getBoolean(getParameter(actionRequest, "sendThanksEmail"));
        String thanksSubject = getParameter(actionRequest, "thanks-subject");

        boolean saveToDatabase = GetterUtil.getBoolean(getParameter(actionRequest, "saveToDatabase"));

        boolean showPreviousPosts = GetterUtil.getBoolean(getParameter(actionRequest, "showPreviousPosts"));

        boolean saveToFile = GetterUtil.getBoolean(getParameter(actionRequest, "saveToFile"));

        if (!sendAsEmail && !saveToDatabase && !saveToFile) {
            SessionErrors.add(actionRequest, "handlingRequired");
        }

        if (sendAsEmail) {
            if (Validator.isNull(subject)) {
                SessionErrors.add(actionRequest, "subjectRequired");
            }

            String[] emailAdresses = WebFormUtil.split(getParameter(actionRequest, "emailAddress"));

            if (emailAdresses.length == 0) {
                SessionErrors.add(actionRequest, "emailAddressRequired");
            }

            for (String emailAdress : emailAdresses) {
                emailAdress = emailAdress.trim();

                if (!Validator.isEmailAddress(emailAdress)) {
                    SessionErrors.add(actionRequest, "emailAddressInvalid");
                }
            }
            if (sendThanksEmail) {
                if (Validator.isNull(thanksSubject)) {
                    SessionErrors.add(actionRequest, "thanksSubjectRequired");
                }
            }

        }

        boolean uploadToDisk = GetterUtil.getBoolean(getParameter(actionRequest, "uploadToDisk"));

        if (uploadToDisk) {
            String uploadDiskDir = getParameter(actionRequest, "uploadDiskDir");
            boolean pathIsValid = true;
            try {
                File checkFolder = null;
                checkFolder = new File(uploadDiskDir);
                if (!checkFolder.isDirectory()) {
                    pathIsValid = false;
                    SessionErrors.add(actionRequest, "pathNameInvalid");
                }
            } catch (SecurityException se) {
                pathIsValid = false;
                SessionErrors.add(actionRequest, "pathNameInvalid");
            } catch (NullPointerException ne) {
                pathIsValid = false;
                SessionErrors.add(actionRequest, "pathNameInvalid");
            }
            if (pathIsValid) {
                StringBundler tmpFile = new StringBundler(3);

                tmpFile.append(StringUtil.randomString());
                tmpFile.append(StringPool.PERIOD);
                tmpFile.append("tmp");

                String tmpFileName = uploadDiskDir + File.separator + tmpFile.toString();
                // Check if server can create a file as specified

                try {
                    FileOutputStream fileOutputStream = new FileOutputStream(tmpFileName, true);

                    fileOutputStream.close();
                } catch (SecurityException se) {
                    SessionErrors.add(actionRequest, "pathNameInvalid");
                } catch (FileNotFoundException fnfe) {
                    SessionErrors.add(actionRequest, "pathNameInvalid");
                }
            }
        }

        if (saveToFile) {
            String fileName = getParameter(actionRequest, "fileName");

            // Check if server can create a file as specified

            try {
                FileOutputStream fileOutputStream = new FileOutputStream(fileName, true);

                fileOutputStream.close();
            } catch (SecurityException se) {
                SessionErrors.add(actionRequest, "fileNameInvalid");
            } catch (FileNotFoundException fnfe) {
                SessionErrors.add(actionRequest, "fileNameInvalid");
            }
        }

        if (saveToDatabase) {
            int i = 1;

            String languageId = LocaleUtil.toLanguageId(actionRequest.getLocale());

            String fieldLabel = ParamUtil.getString(actionRequest, "fieldLabel" + i + "_" + languageId);

            while ((i == 1) || Validator.isNotNull(fieldLabel)) {
                if (fieldLabel.length() > 75) {
                    SessionErrors.add(actionRequest, "fieldSizeInvalid" + i);
                }

                i++;

                fieldLabel = ParamUtil.getString(actionRequest, "fieldLabel" + i + "_" + languageId);
            }
        }

        if (!saveToDatabase && showPreviousPosts) {
            SessionErrors.add(actionRequest, "noPreviousPosts");
        }
        if (!validateUniqueFieldNames(actionRequest)) {
            SessionErrors.add(actionRequest, DuplicateColumnNameException.class.getName());
        }
    }

    protected boolean validateUniqueFieldNames(ActionRequest actionRequest) {
        Locale defaultLocale = LocaleUtil.getDefault();

        Set<String> localizedUniqueFieldNames = new HashSet<String>();

        int[] formFieldsIndexes = StringUtil.split(ParamUtil.getString(actionRequest, "formFieldsIndexes"), 0);

        for (int formFieldsIndex : formFieldsIndexes) {
            Map<Locale, String> fieldLabelMap = LocalizationUtil.getLocalizationMap(actionRequest,
                    "fieldLabel" + formFieldsIndex);

            if (Validator.isNull(fieldLabelMap.get(defaultLocale))) {
                continue;
            }

            for (Locale locale : fieldLabelMap.keySet()) {
                String fieldLabelValue = fieldLabelMap.get(locale);

                if (Validator.isNull(fieldLabelValue)) {
                    continue;
                }

                String languageId = LocaleUtil.toLanguageId(locale);

                if (!localizedUniqueFieldNames.add(languageId + "_" + fieldLabelValue)) {

                    return false;
                }
            }
        }

        return true;
    }

}