/**
* 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.web.form.web.internal.portlet.action;
import com.liferay.expando.kernel.exception.ColumnNameException;
import com.liferay.expando.kernel.exception.DuplicateColumnNameException;
import com.liferay.portal.kernel.portlet.ConfigurationAction;
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.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.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.web.form.web.internal.constants.WebFormPortletKeys;
import com.liferay.web.form.web.internal.util.WebFormUtil;
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.servlet.http.HttpServletRequest;
import org.osgi.service.component.annotations.Component;
/**
* @author Jorge Ferrer
* @author Alberto Montero
* @author Julio Camarero
* @author Brian Wing Shun Chan
* @author Peter Fellwock
*/
@Component(
immediate = true,
property = {"javax.portlet.name=" + WebFormPortletKeys.WEB_FORM},
service = ConfigurationAction.class
)
public class WebFormConfigurationAction extends DefaultConfigurationAction {
@Override
public String getJspPath(HttpServletRequest request) {
String cmd = ParamUtil.getString(request, Constants.CMD);
if (cmd.equals(Constants.ADD)) {
return "/edit_field.jsp";
}
else {
return "/configuration.jsp";
}
}
@Override
public void processAction(
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse)
throws Exception {
validateFields(actionRequest);
if (!SessionErrors.isEmpty(actionRequest)) {
return;
}
Locale defaultLocale = LocaleUtil.getSiteDefault();
String defaultLanguageId = LocaleUtil.toLanguageId(defaultLocale);
boolean updateFields = ParamUtil.getBoolean(
actionRequest, "updateFields");
String portletResource = ParamUtil.getString(
actionRequest, "portletResource");
PortletPreferences preferences = actionRequest.getPreferences();
LocalizationUtil.setLocalizedPreferencesValues(
actionRequest, preferences, "title");
Map<Locale, String> titleMap = LocalizationUtil.getLocalizationMap(
actionRequest, "title");
preferences.setValue("title", titleMap.get(defaultLocale));
LocalizationUtil.setLocalizedPreferencesValues(
actionRequest, preferences, "description");
Map<Locale, String> descriptionMap =
LocalizationUtil.getLocalizationMap(actionRequest, "description");
preferences.setValue("description", descriptionMap.get(defaultLocale));
if (updateFields) {
int i = 1;
String databaseTableName = WebFormUtil.getNewDatabaseTableName(
portletResource);
preferences.setValue("databaseTableName", databaseTableName);
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);
boolean fieldOptional = ParamUtil.getBoolean(
actionRequest, "fieldOptional" + formFieldsIndex);
Map<Locale, String> fieldOptionsMap =
LocalizationUtil.getLocalizationMap(
actionRequest, "fieldOptions" + formFieldsIndex);
Map<Locale, String> fieldParagraphMap =
LocalizationUtil.getLocalizationMap(
actionRequest, "fieldParagraph" + 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);
updateModifiedLocales(
"fieldParagraph" + i, fieldParagraphMap, preferences);
preferences.setValue(
"fieldLabel" + i, fieldLabelMap.get(defaultLocale));
preferences.setValue("fieldType" + i, fieldType);
preferences.setValue(
"fieldOptional" + i, String.valueOf(fieldOptional));
preferences.setValue("fieldOptions" + i, StringPool.BLANK);
preferences.setValue("fieldParagraph" + i, StringPool.BLANK);
preferences.setValue(
"fieldValidationScript" + i, fieldValidationScript);
preferences.setValue(
"fieldValidationErrorMessage" + i,
fieldValidationErrorMessage);
i++;
}
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);
LocalizationUtil.setPreferencesValue(
preferences, "fieldParagraph" + i, languageId,
StringPool.BLANK);
}
preferences.setValue("fieldLabel" + i, 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);
}
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 validateEmailFields(ActionRequest actionRequest) {
String subject = getParameter(actionRequest, "subject");
if (Validator.isNull(subject)) {
SessionErrors.add(actionRequest, "subjectRequired");
}
String[] emailAdresses = WebFormUtil.split(
getParameter(actionRequest, "emailAddress"));
String emailFromAddress = GetterUtil.getString(
getParameter(actionRequest, "emailFromAddress"));
if ((emailAdresses.length == 0) || Validator.isNull(emailFromAddress)) {
SessionErrors.add(actionRequest, "emailAddressRequired");
}
if (Validator.isNotNull(emailFromAddress) &&
!Validator.isEmailAddress(emailFromAddress)) {
SessionErrors.add(actionRequest, "emailAddressInvalid");
}
else {
for (String emailAdress : emailAdresses) {
emailAdress = emailAdress.trim();
if (!Validator.isEmailAddress(emailAdress)) {
SessionErrors.add(actionRequest, "emailAddressInvalid");
break;
}
}
}
}
protected void validateFieldNameLength(ActionRequest actionRequest) {
Locale defaultLocale = LocaleUtil.getSiteDefault();
int[] formFieldsIndexes = StringUtil.split(
ParamUtil.getString(actionRequest, "formFieldsIndexes"), 0);
boolean saveToDatabase = GetterUtil.getBoolean(
getParameter(actionRequest, "saveToDatabase"));
for (int formFieldsIndex : formFieldsIndexes) {
Map<Locale, String> fieldLabelMap =
LocalizationUtil.getLocalizationMap(
actionRequest, "fieldLabel" + formFieldsIndex);
for (Locale locale : fieldLabelMap.keySet()) {
String fieldLabelValue = fieldLabelMap.get(locale);
if (locale.equals(defaultLocale) &&
Validator.isNull(fieldLabelValue)) {
SessionErrors.add(
actionRequest, ColumnNameException.class.getName());
return;
}
if (Validator.isNotNull(fieldLabelValue) && saveToDatabase &&
(fieldLabelValue.length() > 75)) {
SessionErrors.add(
actionRequest, "fieldSizeInvalid" + formFieldsIndex);
return;
}
}
}
}
protected void validateFields(ActionRequest actionRequest)
throws Exception {
boolean saveToDatabase = GetterUtil.getBoolean(
getParameter(actionRequest, "saveToDatabase"));
boolean saveToFile = GetterUtil.getBoolean(
getParameter(actionRequest, "saveToFile"));
boolean sendAsEmail = GetterUtil.getBoolean(
getParameter(actionRequest, "sendAsEmail"));
if (!saveToDatabase && !saveToFile && !sendAsEmail) {
SessionErrors.add(actionRequest, "handlingRequired");
}
if (sendAsEmail) {
validateEmailFields(actionRequest);
}
String successURL = getParameter(actionRequest, "successURL");
if (Validator.isNotNull(successURL) && !Validator.isUrl(successURL)) {
SessionErrors.add(actionRequest, "successURLInvalid");
}
validateFieldNameLength(actionRequest);
validateUniqueFieldNames(actionRequest);
}
protected void validateUniqueFieldNames(ActionRequest actionRequest) {
Locale defaultLocale = LocaleUtil.getSiteDefault();
Set<String> localizedUniqueFieldNames = new HashSet<>();
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)) {
SessionErrors.add(
actionRequest,
DuplicateColumnNameException.class.getName());
return;
}
}
}
}
}