Java tutorial
/** * 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; } }