--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portlet.admin.action;\r
+\r
+import java.io.File;\r
+import java.util.Enumeration;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.concurrent.CountDownLatch;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import javax.portlet.ActionRequest;\r
+import javax.portlet.ActionResponse;\r
+import javax.portlet.PortletConfig;\r
+import javax.portlet.PortletContext;\r
+import javax.portlet.PortletPreferences;\r
+import javax.portlet.PortletSession;\r
+import javax.portlet.PortletURL;\r
+import javax.portlet.WindowState;\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpSession;\r
+\r
+import org.apache.log4j.Level;\r
+import org.apache.struts.action.ActionForm;\r
+import org.apache.struts.action.ActionMapping;\r
+\r
+import com.liferay.mail.service.MailServiceUtil;\r
+import com.liferay.portal.captcha.CaptchaImpl;\r
+import com.liferay.portal.captcha.recaptcha.ReCaptchaImpl;\r
+import com.liferay.portal.captcha.simplecaptcha.SimpleCaptchaImpl;\r
+import com.liferay.portal.convert.ConvertProcess;\r
+import com.liferay.portal.kernel.cache.CacheRegistryUtil;\r
+import com.liferay.portal.kernel.cache.MultiVMPoolUtil;\r
+import com.liferay.portal.kernel.captcha.Captcha;\r
+import com.liferay.portal.kernel.captcha.CaptchaUtil;\r
+import com.liferay.portal.kernel.cluster.Address;\r
+import com.liferay.portal.kernel.cluster.ClusterExecutorUtil;\r
+import com.liferay.portal.kernel.cluster.ClusterLinkUtil;\r
+import com.liferay.portal.kernel.cluster.ClusterRequest;\r
+import com.liferay.portal.kernel.concurrent.ThreadPoolExecutor;\r
+import com.liferay.portal.kernel.dao.shard.ShardUtil;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.executor.PortalExecutorManagerUtil;\r
+import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;\r
+import com.liferay.portal.kernel.io.unsync.UnsyncPrintWriter;\r
+import com.liferay.portal.kernel.json.JSONFactoryUtil;\r
+import com.liferay.portal.kernel.json.JSONObject;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.mail.Account;\r
+import com.liferay.portal.kernel.messaging.BaseAsyncDestination;\r
+import com.liferay.portal.kernel.messaging.Destination;\r
+import com.liferay.portal.kernel.messaging.DestinationNames;\r
+import com.liferay.portal.kernel.messaging.MessageBus;\r
+import com.liferay.portal.kernel.messaging.MessageBusUtil;\r
+import com.liferay.portal.kernel.messaging.proxy.MessageValuesThreadLocal;\r
+import com.liferay.portal.kernel.scripting.ScriptingException;\r
+import com.liferay.portal.kernel.scripting.ScriptingUtil;\r
+import com.liferay.portal.kernel.search.Indexer;\r
+import com.liferay.portal.kernel.search.SearchEngineUtil;\r
+import com.liferay.portal.kernel.servlet.SessionErrors;\r
+import com.liferay.portal.kernel.servlet.SessionMessages;\r
+import com.liferay.portal.kernel.util.CharPool;\r
+import com.liferay.portal.kernel.util.Constants;\r
+import com.liferay.portal.kernel.util.InstancePool;\r
+import com.liferay.portal.kernel.util.MethodHandler;\r
+import com.liferay.portal.kernel.util.MethodKey;\r
+import com.liferay.portal.kernel.util.ParamUtil;\r
+import com.liferay.portal.kernel.util.PropsKeys;\r
+import com.liferay.portal.kernel.util.StringBundler;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.ThreadUtil;\r
+import com.liferay.portal.kernel.util.Time;\r
+import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.webcache.WebCachePoolUtil;\r
+import com.liferay.portal.kernel.xuggler.XugglerInstallStatus;\r
+import com.liferay.portal.kernel.xuggler.XugglerUtil;\r
+import com.liferay.portal.model.Portlet;\r
+import com.liferay.portal.search.lucene.LuceneHelperUtil;\r
+import com.liferay.portal.search.lucene.cluster.LuceneClusterUtil;\r
+import com.liferay.portal.security.auth.PrincipalException;\r
+import com.liferay.portal.security.permission.PermissionChecker;\r
+import com.liferay.portal.service.PortletLocalServiceUtil;\r
+import com.liferay.portal.service.ServiceComponentLocalServiceUtil;\r
+import com.liferay.portal.struts.ActionConstants;\r
+import com.liferay.portal.struts.PortletAction;\r
+import com.liferay.portal.theme.ThemeDisplay;\r
+import com.liferay.portal.upload.UploadServletRequestImpl;\r
+import com.liferay.portal.util.MaintenanceUtil;\r
+import com.liferay.portal.util.PortalInstances;\r
+import com.liferay.portal.util.PortalUtil;\r
+import com.liferay.portal.util.PrefsPropsUtil;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portal.util.ShutdownUtil;\r
+import com.liferay.portal.util.WebKeys;\r
+import com.liferay.portlet.ActionResponseImpl;\r
+import com.liferay.portlet.admin.util.CleanUpPermissionsUtil;\r
+import com.liferay.portlet.documentlibrary.util.DLPreviewableProcessor;\r
+import com.liferay.portlet.documentlibrary.util.PDFProcessorUtil;\r
+import com.liferay.util.log4j.Log4JUtil;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Shuyang Zhou\r
+ */\r
+public class EditServerAction extends PortletAction {\r
+\r
+ @Override\r
+ public void processAction(\r
+ ActionMapping mapping, ActionForm form, PortletConfig portletConfig,\r
+ ActionRequest actionRequest, ActionResponse actionResponse)\r
+ throws Exception {\r
+\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(\r
+ WebKeys.THEME_DISPLAY);\r
+\r
+ PermissionChecker permissionChecker =\r
+ themeDisplay.getPermissionChecker();\r
+\r
+ if (!permissionChecker.isOmniadmin()) {\r
+ SessionErrors.add(\r
+ actionRequest, PrincipalException.class.getName());\r
+\r
+ setForward(actionRequest, "portlet.admin.error");\r
+\r
+ return;\r
+ }\r
+\r
+ PortletPreferences preferences = PrefsPropsUtil.getPreferences();\r
+\r
+ String cmd = ParamUtil.getString(actionRequest, Constants.CMD);\r
+\r
+ String redirect = null;\r
+\r
+ if (cmd.equals("addLogLevel")) {\r
+ addLogLevel(actionRequest);\r
+ }\r
+ else if (cmd.equals("cacheDb")) {\r
+ cacheDb();\r
+ }\r
+ else if (cmd.equals("cacheMulti")) {\r
+ cacheMulti();\r
+ }\r
+ else if (cmd.equals("cacheSingle")) {\r
+ cacheSingle();\r
+ }\r
+ else if (cmd.equals("cleanUpPermissions")) {\r
+ CleanUpPermissionsUtil.cleanUpAddToPagePermissions(actionRequest);\r
+ }\r
+ else if (cmd.startsWith("convertProcess.")) {\r
+ redirect = convertProcess(actionRequest, actionResponse, cmd);\r
+ }\r
+ else if (cmd.equals("dlPreviews")) {\r
+ DLPreviewableProcessor.deleteFiles();\r
+ }\r
+ else if (cmd.equals("gc")) {\r
+ gc();\r
+ }\r
+ else if (cmd.equals("installXuggler")) {\r
+ installXuggler(actionRequest, actionResponse);\r
+\r
+ setForward(actionRequest, ActionConstants.COMMON_NULL);\r
+\r
+ return;\r
+ }\r
+ else if (cmd.equals("reindex")) {\r
+ reindex(actionRequest);\r
+ }\r
+ else if (cmd.equals("runScript")) {\r
+ runScript(portletConfig, actionRequest, actionResponse);\r
+ }\r
+ else if (cmd.equals("shutdown")) {\r
+ shutdown(actionRequest);\r
+ }\r
+ else if (cmd.equals("threadDump")) {\r
+ threadDump();\r
+ }\r
+ else if (cmd.equals("updateCaptcha")) {\r
+ updateCaptcha(actionRequest, preferences);\r
+ }\r
+ else if (cmd.equals("updateExternalServices")) {\r
+ updateExternalServices(actionRequest, preferences);\r
+ }\r
+ else if (cmd.equals("updateFileUploads")) {\r
+ updateFileUploads(actionRequest, preferences);\r
+ }\r
+ else if (cmd.equals("updateLogLevels")) {\r
+ updateLogLevels(actionRequest);\r
+ }\r
+ else if (cmd.equals("updateMail")) {\r
+ updateMail(actionRequest, preferences);\r
+ }\r
+ else if (cmd.equals("verifyPluginTables")) {\r
+ verifyPluginTables();\r
+ }\r
+\r
+ sendRedirect(actionRequest, actionResponse, redirect);\r
+ }\r
+\r
+ protected void addLogLevel(ActionRequest actionRequest) throws Exception {\r
+ String loggerName = ParamUtil.getString(actionRequest, "loggerName");\r
+ String priority = ParamUtil.getString(actionRequest, "priority");\r
+\r
+ Log4JUtil.setLevel(loggerName, priority, true);\r
+ }\r
+\r
+ protected void cacheDb() throws Exception {\r
+ CacheRegistryUtil.clear();\r
+ }\r
+\r
+ protected void cacheMulti() throws Exception {\r
+ MultiVMPoolUtil.clear();\r
+ }\r
+\r
+ protected void cacheSingle() throws Exception {\r
+ WebCachePoolUtil.clear();\r
+ }\r
+\r
+ protected String convertProcess(\r
+ ActionRequest actionRequest, ActionResponse actionResponse,\r
+ String cmd)\r
+ throws Exception {\r
+\r
+ ActionResponseImpl actionResponseImpl =\r
+ (ActionResponseImpl)actionResponse;\r
+\r
+ PortletSession portletSession = actionRequest.getPortletSession();\r
+\r
+ String className = StringUtil.replaceFirst(\r
+ cmd, "convertProcess.", StringPool.BLANK);\r
+\r
+ ConvertProcess convertProcess = (ConvertProcess)InstancePool.get(\r
+ className);\r
+\r
+ String[] parameters = convertProcess.getParameterNames();\r
+\r
+ if (parameters != null) {\r
+ String[] values = new String[parameters.length];\r
+\r
+ for (int i = 0; i < parameters.length; i++) {\r
+ String parameter =\r
+ className + StringPool.PERIOD + parameters[i];\r
+\r
+ if (parameters[i].contains(StringPool.EQUAL)) {\r
+ String[] parameterPair = StringUtil.split(\r
+ parameters[i], CharPool.EQUAL);\r
+\r
+ parameter =\r
+ className + StringPool.PERIOD + parameterPair[0];\r
+ }\r
+\r
+ values[i] = ParamUtil.getString(actionRequest, parameter);\r
+ }\r
+\r
+ convertProcess.setParameterValues(values);\r
+ }\r
+\r
+ String path = convertProcess.getPath();\r
+\r
+ if (path != null) {\r
+ PortletURL portletURL = actionResponseImpl.createRenderURL();\r
+\r
+ portletURL.setWindowState(WindowState.MAXIMIZED);\r
+\r
+ portletURL.setParameter("struts_action", path);\r
+\r
+ return portletURL.toString();\r
+ }\r
+ else {\r
+ MaintenanceUtil.maintain(portletSession.getId(), className);\r
+\r
+ MessageBusUtil.sendMessage(\r
+ DestinationNames.CONVERT_PROCESS, className);\r
+\r
+ return null;\r
+ }\r
+ }\r
+\r
+ protected void gc() throws Exception {\r
+ Runtime.getRuntime().gc();\r
+ }\r
+\r
+ protected String getFileExtensions(\r
+ ActionRequest actionRequest, String name) {\r
+\r
+ String value = ParamUtil.getString(actionRequest, name);\r
+\r
+ return value.replace(", .", ",.");\r
+ }\r
+\r
+ protected void installXuggler(\r
+ ActionRequest actionRequest, ActionResponse actionResponse)\r
+ throws Exception {\r
+\r
+ HttpServletRequest request = PortalUtil.getHttpServletRequest(\r
+ actionRequest);\r
+\r
+ HttpSession session = request.getSession();\r
+\r
+ XugglerInstallStatus xugglerInstallStatus = new XugglerInstallStatus();\r
+\r
+ session.setAttribute(\r
+ WebKeys.XUGGLER_INSTALL_STATUS, xugglerInstallStatus);\r
+\r
+ String jarName = ParamUtil.getString(actionRequest, "jarName");\r
+\r
+ try {\r
+ XugglerUtil.installNativeLibraries(jarName, xugglerInstallStatus);\r
+\r
+ JSONObject jsonObject = JSONFactoryUtil.createJSONObject();\r
+\r
+ jsonObject.put("success", Boolean.TRUE);\r
+\r
+ writeJSON(actionRequest, actionResponse, jsonObject);\r
+ }\r
+ catch (Exception e) {\r
+ JSONObject jsonObject = JSONFactoryUtil.createJSONObject();\r
+\r
+ jsonObject.put("exception", e.getMessage());\r
+ jsonObject.put("success", Boolean.FALSE);\r
+\r
+ writeJSON(actionRequest, actionResponse, jsonObject);\r
+ }\r
+ finally {\r
+ session.removeAttribute(WebKeys.XUGGLER_INSTALL_STATUS);\r
+ }\r
+ }\r
+\r
+ protected void reindex(ActionRequest actionRequest) throws Exception {\r
+ String portletId = ParamUtil.getString(actionRequest, "portletId");\r
+\r
+ long[] companyIds = PortalInstances.getCompanyIds();\r
+\r
+ if (LuceneHelperUtil.isLoadIndexFromClusterEnabled()) {\r
+ MessageValuesThreadLocal.setValue(\r
+ ClusterLinkUtil.CLUSTER_FORWARD_MESSAGE, true);\r
+ }\r
+\r
+ Set<String> usedSearchEngineIds = new HashSet<String>();\r
+\r
+ if (Validator.isNull(portletId)) {\r
+ List<Portlet> portlets = PortletLocalServiceUtil.getPortlets(companyIds[0], false, false);\r
+ \r
+ String[] companyId = {String.valueOf(companyIds[0])};\r
+ \r
+ for (Portlet portlet : portlets) {\r
+ \r
+ try{\r
+ \r
+ if (!portlet.isActive()) {\r
+ continue;\r
+ }\r
+ \r
+ List<Indexer> indexers = portlet.getIndexerInstances();\r
+ \r
+ if (indexers == null || indexers.isEmpty()) {\r
+ continue;\r
+ }\r
+ \r
+ for(Indexer indexer: indexers){\r
+ indexer.reindex(companyId);\r
+ }\r
+ \r
+ } catch (Exception e){\r
+ \r
+ }\r
+ }\r
+// for (long companyId : companyIds) {\r
+// try {\r
+// LuceneIndexer luceneIndexer = new LuceneIndexer(companyId);\r
+//\r
+// luceneIndexer.reindex();\r
+//\r
+// usedSearchEngineIds.addAll(\r
+// luceneIndexer.getUsedSearchEngineIds());\r
+// }\r
+// catch (Exception e) {\r
+// _log.error(e, e);\r
+// }\r
+// }\r
+ }\r
+ else {\r
+ Portlet portlet = PortletLocalServiceUtil.getPortletById(\r
+ companyIds[0], portletId);\r
+\r
+ if (portlet == null) {\r
+ return;\r
+ }\r
+\r
+ List<Indexer> indexers = portlet.getIndexerInstances();\r
+\r
+ if (indexers == null) {\r
+ return;\r
+ }\r
+\r
+ for (Indexer indexer : indexers) {\r
+ for (long companyId : companyIds) {\r
+ ShardUtil.pushCompanyService(companyId);\r
+\r
+ try {\r
+ SearchEngineUtil.deletePortletDocuments(\r
+ indexer.getSearchEngineId(), companyId, portletId);\r
+\r
+ indexer.reindex(\r
+ new String[] {String.valueOf(companyId)});\r
+\r
+ usedSearchEngineIds.add(indexer.getSearchEngineId());\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ ShardUtil.popCompanyService();\r
+ }\r
+ }\r
+ }\r
+\r
+ if (LuceneHelperUtil.isLoadIndexFromClusterEnabled()) {\r
+ Set<BaseAsyncDestination> searchWriterDestinations =\r
+ new HashSet<BaseAsyncDestination>();\r
+\r
+ MessageBus messageBus = MessageBusUtil.getMessageBus();\r
+\r
+ for (String usedSearchEngineId : usedSearchEngineIds) {\r
+ String searchWriterDestinationName =\r
+ SearchEngineUtil.getSearchWriterDestinationName(\r
+ usedSearchEngineId);\r
+\r
+ Destination destination = messageBus.getDestination(\r
+ searchWriterDestinationName);\r
+\r
+ if (destination instanceof BaseAsyncDestination) {\r
+ BaseAsyncDestination baseAsyncDestination =\r
+ (BaseAsyncDestination)destination;\r
+\r
+ searchWriterDestinations.add(baseAsyncDestination);\r
+ }\r
+ }\r
+\r
+ submitClusterIndexLoadingSyncJob(\r
+ searchWriterDestinations, companyIds);\r
+ }\r
+ }\r
+\r
+ protected void runScript(\r
+ PortletConfig portletConfig, ActionRequest actionRequest,\r
+ ActionResponse actionResponse)\r
+ throws Exception {\r
+\r
+ String language = ParamUtil.getString(actionRequest, "language");\r
+ String script = ParamUtil.getString(actionRequest, "script");\r
+\r
+ PortletContext portletContext = portletConfig.getPortletContext();\r
+\r
+ Map<String, Object> portletObjects = ScriptingUtil.getPortletObjects(\r
+ portletConfig, portletContext, actionRequest, actionResponse);\r
+\r
+ UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =\r
+ new UnsyncByteArrayOutputStream();\r
+\r
+ UnsyncPrintWriter unsyncPrintWriter = UnsyncPrintWriterPool.borrow(\r
+ unsyncByteArrayOutputStream);\r
+\r
+ portletObjects.put("out", unsyncPrintWriter);\r
+\r
+ try {\r
+ SessionMessages.add(actionRequest, "language", language);\r
+ SessionMessages.add(actionRequest, "script", script);\r
+\r
+ ScriptingUtil.exec(null, portletObjects, language, script);\r
+\r
+ unsyncPrintWriter.flush();\r
+\r
+ SessionMessages.add(\r
+ actionRequest, "script_output",\r
+ unsyncByteArrayOutputStream.toString());\r
+ }\r
+ catch (ScriptingException se) {\r
+ SessionErrors.add(\r
+ actionRequest, ScriptingException.class.getName(), se);\r
+\r
+ _log.error(se.getMessage());\r
+ }\r
+ }\r
+\r
+ protected void shutdown(ActionRequest actionRequest) throws Exception {\r
+ long minutes =\r
+ ParamUtil.getInteger(actionRequest, "minutes") * Time.MINUTE;\r
+ String message = ParamUtil.getString(actionRequest, "message");\r
+\r
+ if (minutes <= 0) {\r
+ ShutdownUtil.cancel();\r
+ }\r
+ else {\r
+ ShutdownUtil.shutdown(minutes, message);\r
+ }\r
+ }\r
+\r
+ protected void submitClusterIndexLoadingSyncJob(\r
+ Set<BaseAsyncDestination> baseAsyncDestinations, long[] companyIds)\r
+ throws Exception {\r
+\r
+ if (_log.isInfoEnabled()) {\r
+ StringBundler sb = new StringBundler(\r
+ baseAsyncDestinations.size() + 1);\r
+\r
+ sb.append("[");\r
+\r
+ for (BaseAsyncDestination baseAsyncDestination :\r
+ baseAsyncDestinations) {\r
+\r
+ sb.append(baseAsyncDestination.getName());\r
+ sb.append(", ");\r
+ }\r
+\r
+ sb.setStringAt("]", sb.index() - 1);\r
+\r
+ _log.info(\r
+ "Synchronizecluster index loading for destinations " +\r
+ sb.toString());\r
+ }\r
+\r
+ int totalWorkersMaxSize = 0;\r
+\r
+ for (BaseAsyncDestination baseAsyncDestination :\r
+ baseAsyncDestinations) {\r
+\r
+ totalWorkersMaxSize += baseAsyncDestination.getWorkersMaxSize();\r
+ }\r
+\r
+ if (_log.isInfoEnabled()) {\r
+ _log.info(\r
+ "There are " + totalWorkersMaxSize +\r
+ " synchronization threads");\r
+ }\r
+\r
+ CountDownLatch countDownLatch = new CountDownLatch(\r
+ totalWorkersMaxSize + 1);\r
+\r
+ ClusterLoadingSyncJob slaveClusterLoadingSyncJob =\r
+ new ClusterLoadingSyncJob(companyIds, countDownLatch, false);\r
+\r
+ for (BaseAsyncDestination baseAsyncDestination :\r
+ baseAsyncDestinations) {\r
+\r
+ ThreadPoolExecutor threadPoolExecutor =\r
+ PortalExecutorManagerUtil.getPortalExecutor(\r
+ baseAsyncDestination.getName());\r
+\r
+ for (int i = 0; i < baseAsyncDestination.getWorkersMaxSize(); i++) {\r
+ threadPoolExecutor.execute(slaveClusterLoadingSyncJob);\r
+ }\r
+ }\r
+\r
+ ClusterLoadingSyncJob masterClusterLoadingSyncJob =\r
+ new ClusterLoadingSyncJob(companyIds, countDownLatch, true);\r
+\r
+ ThreadPoolExecutor threadPoolExecutor =\r
+ PortalExecutorManagerUtil.getPortalExecutor(\r
+ EditServerAction.class.getName());\r
+\r
+ threadPoolExecutor.execute(masterClusterLoadingSyncJob);\r
+ }\r
+\r
+ protected void threadDump() throws Exception {\r
+ if (_log.isInfoEnabled()) {\r
+ _log.info(ThreadUtil.threadDump());\r
+ }\r
+ else {\r
+ _log.error(\r
+ "Thread dumps require the log level to be at least INFO for " +\r
+ getClass().getName());\r
+ }\r
+ }\r
+\r
+ protected void updateCaptcha(\r
+ ActionRequest actionRequest, PortletPreferences preferences)\r
+ throws Exception {\r
+\r
+ boolean reCaptchaEnabled = ParamUtil.getBoolean(\r
+ actionRequest, "reCaptchaEnabled");\r
+ String reCaptchaPrivateKey = ParamUtil.getString(\r
+ actionRequest, "reCaptchaPrivateKey");\r
+ String reCaptchaPublicKey = ParamUtil.getString(\r
+ actionRequest, "reCaptchaPublicKey");\r
+\r
+ Captcha captcha = null;\r
+\r
+ if (reCaptchaEnabled) {\r
+ captcha = new ReCaptchaImpl();\r
+ }\r
+ else {\r
+ captcha = new SimpleCaptchaImpl();\r
+ }\r
+\r
+ validateCaptcha(actionRequest);\r
+\r
+ if (SessionErrors.isEmpty(actionRequest)) {\r
+ preferences.setValue(\r
+ PropsKeys.CAPTCHA_ENGINE_IMPL, captcha.getClass().getName());\r
+ preferences.setValue(\r
+ PropsKeys.CAPTCHA_ENGINE_RECAPTCHA_KEY_PRIVATE,\r
+ reCaptchaPrivateKey);\r
+ preferences.setValue(\r
+ PropsKeys.CAPTCHA_ENGINE_RECAPTCHA_KEY_PUBLIC,\r
+ reCaptchaPublicKey);\r
+\r
+ preferences.store();\r
+\r
+ CaptchaImpl captchaImpl = (CaptchaImpl)CaptchaUtil.getCaptcha();\r
+\r
+ captchaImpl.setCaptcha(captcha);\r
+ }\r
+ }\r
+\r
+ protected void updateExternalServices(\r
+ ActionRequest actionRequest, PortletPreferences preferences)\r
+ throws Exception {\r
+\r
+ boolean imageMagickEnabled = ParamUtil.getBoolean(\r
+ actionRequest, "imageMagickEnabled");\r
+ String imageMagickPath = ParamUtil.getString(\r
+ actionRequest, "imageMagickPath");\r
+ boolean openOfficeEnabled = ParamUtil.getBoolean(\r
+ actionRequest, "openOfficeEnabled");\r
+ int openOfficePort = ParamUtil.getInteger(\r
+ actionRequest, "openOfficePort");\r
+ boolean xugglerEnabled = ParamUtil.getBoolean(\r
+ actionRequest, "xugglerEnabled");\r
+\r
+ preferences.setValue(\r
+ PropsKeys.IMAGEMAGICK_ENABLED, String.valueOf(imageMagickEnabled));\r
+ preferences.setValue(\r
+ PropsKeys.IMAGEMAGICK_GLOBAL_SEARCH_PATH, imageMagickPath);\r
+ preferences.setValue(\r
+ PropsKeys.OPENOFFICE_SERVER_ENABLED,\r
+ String.valueOf(openOfficeEnabled));\r
+ preferences.setValue(\r
+ PropsKeys.OPENOFFICE_SERVER_PORT, String.valueOf(openOfficePort));\r
+ preferences.setValue(\r
+ PropsKeys.XUGGLER_ENABLED, String.valueOf(xugglerEnabled));\r
+\r
+ Enumeration<String> enu = actionRequest.getParameterNames();\r
+\r
+ while (enu.hasMoreElements()) {\r
+ String name = enu.nextElement();\r
+\r
+ if (name.startsWith("imageMagickLimit")) {\r
+ String key = name.substring(16, name.length()).toLowerCase();\r
+ String value = ParamUtil.getString(actionRequest, name);\r
+\r
+ preferences.setValue(\r
+ PropsKeys.IMAGEMAGICK_RESOURCE_LIMIT + key, value);\r
+ }\r
+ }\r
+\r
+ preferences.store();\r
+\r
+ PDFProcessorUtil.reset();\r
+ }\r
+\r
+ protected void updateFileUploads(\r
+ ActionRequest actionRequest, PortletPreferences preferences)\r
+ throws Exception {\r
+\r
+ long dlFileEntryThumbnailMaxHeight = ParamUtil.getLong(\r
+ actionRequest, "dlFileEntryThumbnailMaxHeight");\r
+ long dlFileEntryThumbnailMaxWidth = ParamUtil.getLong(\r
+ actionRequest, "dlFileEntryThumbnailMaxWidth");\r
+ String dlFileExtensions = getFileExtensions(\r
+ actionRequest, "dlFileExtensions");\r
+ long dlFileMaxSize = ParamUtil.getLong(actionRequest, "dlFileMaxSize");\r
+ String journalImageExtensions = getFileExtensions(\r
+ actionRequest, "journalImageExtensions");\r
+ long journalImageSmallMaxSize = ParamUtil.getLong(\r
+ actionRequest, "journalImageSmallMaxSize");\r
+ String shoppingImageExtensions = getFileExtensions(\r
+ actionRequest, "shoppingImageExtensions");\r
+ long scImageMaxSize = ParamUtil.getLong(\r
+ actionRequest, "scImageMaxSize");\r
+ long scImageThumbnailMaxHeight = ParamUtil.getLong(\r
+ actionRequest, "scImageThumbnailMaxHeight");\r
+ long scImageThumbnailMaxWidth = ParamUtil.getLong(\r
+ actionRequest, "scImageThumbnailMaxWidth");\r
+ long shoppingImageLargeMaxSize = ParamUtil.getLong(\r
+ actionRequest, "shoppingImageLargeMaxSize");\r
+ long shoppingImageMediumMaxSize = ParamUtil.getLong(\r
+ actionRequest, "shoppingImageMediumMaxSize");\r
+ long shoppingImageSmallMaxSize = ParamUtil.getLong(\r
+ actionRequest, "shoppingImageSmallMaxSize");\r
+ long uploadServletRequestImplMaxSize = ParamUtil.getLong(\r
+ actionRequest, "uploadServletRequestImplMaxSize");\r
+ String uploadServletRequestImplTempDir = ParamUtil.getString(\r
+ actionRequest, "uploadServletRequestImplTempDir");\r
+ long usersImageMaxSize = ParamUtil.getLong(\r
+ actionRequest, "usersImageMaxSize");\r
+\r
+ preferences.setValue(\r
+ PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_HEIGHT,\r
+ String.valueOf(dlFileEntryThumbnailMaxHeight));\r
+ preferences.setValue(\r
+ PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_WIDTH,\r
+ String.valueOf(dlFileEntryThumbnailMaxWidth));\r
+ preferences.setValue(PropsKeys.DL_FILE_EXTENSIONS, dlFileExtensions);\r
+ preferences.setValue(\r
+ PropsKeys.DL_FILE_MAX_SIZE, String.valueOf(dlFileMaxSize));\r
+ preferences.setValue(\r
+ PropsKeys.JOURNAL_IMAGE_EXTENSIONS, journalImageExtensions);\r
+ preferences.setValue(\r
+ PropsKeys.JOURNAL_IMAGE_SMALL_MAX_SIZE,\r
+ String.valueOf(journalImageSmallMaxSize));\r
+ preferences.setValue(\r
+ PropsKeys.SHOPPING_IMAGE_EXTENSIONS, shoppingImageExtensions);\r
+ preferences.setValue(\r
+ PropsKeys.SHOPPING_IMAGE_LARGE_MAX_SIZE,\r
+ String.valueOf(shoppingImageLargeMaxSize));\r
+ preferences.setValue(\r
+ PropsKeys.SHOPPING_IMAGE_MEDIUM_MAX_SIZE,\r
+ String.valueOf(shoppingImageMediumMaxSize));\r
+ preferences.setValue(\r
+ PropsKeys.SHOPPING_IMAGE_SMALL_MAX_SIZE,\r
+ String.valueOf(shoppingImageSmallMaxSize));\r
+ preferences.setValue(\r
+ PropsKeys.SC_IMAGE_MAX_SIZE, String.valueOf(scImageMaxSize));\r
+ preferences.setValue(\r
+ PropsKeys.SC_IMAGE_THUMBNAIL_MAX_HEIGHT,\r
+ String.valueOf(scImageThumbnailMaxHeight));\r
+ preferences.setValue(\r
+ PropsKeys.SC_IMAGE_THUMBNAIL_MAX_WIDTH,\r
+ String.valueOf(scImageThumbnailMaxWidth));\r
+ preferences.setValue(\r
+ PropsKeys.UPLOAD_SERVLET_REQUEST_IMPL_MAX_SIZE,\r
+ String.valueOf(uploadServletRequestImplMaxSize));\r
+\r
+ if (Validator.isNotNull(uploadServletRequestImplTempDir)) {\r
+ preferences.setValue(\r
+ PropsKeys.UPLOAD_SERVLET_REQUEST_IMPL_TEMP_DIR,\r
+ uploadServletRequestImplTempDir);\r
+\r
+ UploadServletRequestImpl.setTempDir(\r
+ new File(uploadServletRequestImplTempDir));\r
+ }\r
+\r
+ preferences.setValue(\r
+ PropsKeys.USERS_IMAGE_MAX_SIZE, String.valueOf(usersImageMaxSize));\r
+\r
+ preferences.store();\r
+ }\r
+\r
+ protected void updateLogLevels(ActionRequest actionRequest)\r
+ throws Exception {\r
+\r
+ Enumeration<String> enu = actionRequest.getParameterNames();\r
+\r
+ while (enu.hasMoreElements()) {\r
+ String name = enu.nextElement();\r
+\r
+ if (name.startsWith("logLevel")) {\r
+ String loggerName = name.substring(8);\r
+\r
+ String priority = ParamUtil.getString(\r
+ actionRequest, name, Level.INFO.toString());\r
+\r
+ Log4JUtil.setLevel(loggerName, priority, true);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void updateMail(\r
+ ActionRequest actionRequest, PortletPreferences preferences)\r
+ throws Exception {\r
+\r
+ String advancedProperties = ParamUtil.getString(\r
+ actionRequest, "advancedProperties");\r
+ String pop3Host = ParamUtil.getString(actionRequest, "pop3Host");\r
+ String pop3Password = ParamUtil.getString(\r
+ actionRequest, "pop3Password");\r
+ int pop3Port = ParamUtil.getInteger(actionRequest, "pop3Port");\r
+ boolean pop3Secure = ParamUtil.getBoolean(actionRequest, "pop3Secure");\r
+ String pop3User = ParamUtil.getString(actionRequest, "pop3User");\r
+ String smtpHost = ParamUtil.getString(actionRequest, "smtpHost");\r
+ String smtpPassword = ParamUtil.getString(\r
+ actionRequest, "smtpPassword");\r
+ int smtpPort = ParamUtil.getInteger(actionRequest, "smtpPort");\r
+ boolean smtpSecure = ParamUtil.getBoolean(actionRequest, "smtpSecure");\r
+ String smtpUser = ParamUtil.getString(actionRequest, "smtpUser");\r
+\r
+ String storeProtocol = Account.PROTOCOL_POP;\r
+\r
+ if (pop3Secure) {\r
+ storeProtocol = Account.PROTOCOL_POPS;\r
+ }\r
+\r
+ String transportProtocol = Account.PROTOCOL_SMTP;\r
+\r
+ if (smtpSecure) {\r
+ transportProtocol = Account.PROTOCOL_SMTPS;\r
+ }\r
+\r
+ preferences.setValue(PropsKeys.MAIL_SESSION_MAIL, "true");\r
+ preferences.setValue(\r
+ PropsKeys.MAIL_SESSION_MAIL_ADVANCED_PROPERTIES,\r
+ advancedProperties);\r
+ preferences.setValue(PropsKeys.MAIL_SESSION_MAIL_POP3_HOST, pop3Host);\r
+ preferences.setValue(\r
+ PropsKeys.MAIL_SESSION_MAIL_POP3_PASSWORD, pop3Password);\r
+ preferences.setValue(\r
+ PropsKeys.MAIL_SESSION_MAIL_POP3_PORT, String.valueOf(pop3Port));\r
+ preferences.setValue(PropsKeys.MAIL_SESSION_MAIL_POP3_USER, pop3User);\r
+ preferences.setValue(PropsKeys.MAIL_SESSION_MAIL_SMTP_HOST, smtpHost);\r
+ preferences.setValue(\r
+ PropsKeys.MAIL_SESSION_MAIL_SMTP_PASSWORD, smtpPassword);\r
+ preferences.setValue(\r
+ PropsKeys.MAIL_SESSION_MAIL_SMTP_PORT, String.valueOf(smtpPort));\r
+ preferences.setValue(PropsKeys.MAIL_SESSION_MAIL_SMTP_USER, smtpUser);\r
+ preferences.setValue(\r
+ PropsKeys.MAIL_SESSION_MAIL_STORE_PROTOCOL, storeProtocol);\r
+ preferences.setValue(\r
+ PropsKeys.MAIL_SESSION_MAIL_TRANSPORT_PROTOCOL, transportProtocol);\r
+\r
+ preferences.store();\r
+\r
+ MailServiceUtil.clearSession();\r
+ }\r
+\r
+ protected void validateCaptcha(ActionRequest actionRequest)\r
+ throws Exception {\r
+\r
+ boolean reCaptchaEnabled = ParamUtil.getBoolean(\r
+ actionRequest, "reCaptchaEnabled");\r
+\r
+ if (!reCaptchaEnabled) {\r
+ return;\r
+ }\r
+\r
+ String reCaptchaPrivateKey = ParamUtil.getString(\r
+ actionRequest, "reCaptchaPrivateKey");\r
+ String reCaptchaPublicKey = ParamUtil.getString(\r
+ actionRequest, "reCaptchaPublicKey");\r
+\r
+ if (Validator.isNull(reCaptchaPublicKey)) {\r
+ SessionErrors.add(actionRequest, "reCaptchaPublicKey");\r
+ }\r
+ else if (Validator.isNull(reCaptchaPrivateKey)) {\r
+ SessionErrors.add(actionRequest, "reCaptchaPrivateKey");\r
+ }\r
+ }\r
+\r
+ protected void verifyPluginTables() throws Exception {\r
+ ServiceComponentLocalServiceUtil.verifyDB();\r
+ }\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(EditServerAction.class);\r
+\r
+ private static MethodKey _loadIndexesFromClusterMethodKey = new MethodKey(\r
+ LuceneClusterUtil.class.getName(), "loadIndexesFromCluster",\r
+ long[].class, Address.class);\r
+\r
+ private static class ClusterLoadingSyncJob implements Runnable {\r
+\r
+ public ClusterLoadingSyncJob(\r
+ long[] companyIds, CountDownLatch countDownLatch, boolean master) {\r
+\r
+ _companyIds = companyIds;\r
+ _countDownLatch = countDownLatch;\r
+ _master = master;\r
+ }\r
+\r
+ public void run() {\r
+ _countDownLatch.countDown();\r
+\r
+ String logPrefix = StringPool.BLANK;\r
+\r
+ if (_log.isInfoEnabled()) {\r
+ Thread currentThread = Thread.currentThread();\r
+\r
+ if (_master) {\r
+ logPrefix =\r
+ "Monitor thread name " + currentThread.getName() +\r
+ " with thread ID " + currentThread.getId();\r
+ }\r
+ else {\r
+ logPrefix =\r
+ "Thread name " + currentThread.getName() +\r
+ " with thread ID " + currentThread.getId();\r
+ }\r
+ }\r
+\r
+ if (!_master && _log.isInfoEnabled()) {\r
+ _log.info(\r
+ logPrefix + " synchronized on latch. Waiting for others.");\r
+ }\r
+\r
+ try {\r
+ if (_master) {\r
+ _countDownLatch.await();\r
+ }\r
+ else {\r
+ boolean result = _countDownLatch.await(\r
+ PropsValues.LUCENE_CLUSTER_INDEX_LOADING_SYNC_TIMEOUT,\r
+ TimeUnit.MILLISECONDS);\r
+\r
+ if (!result) {\r
+ _log.error(\r
+ logPrefix + " timed out. You may need to " +\r
+ "re-trigger a reindex process.");\r
+ }\r
+ }\r
+ }\r
+ catch (InterruptedException ie) {\r
+ if (_master) {\r
+ _log.error(\r
+ logPrefix + " was interrupted. Skip cluster index " +\r
+ "loading notification.",\r
+ ie);\r
+\r
+ return;\r
+ }\r
+ else {\r
+ _log.error(\r
+ logPrefix + " was interrupted. You may need to " +\r
+ "re-trigger a reindex process.",\r
+ ie);\r
+ }\r
+ }\r
+\r
+ if (_master) {\r
+ Address localClusterNodeAddress =\r
+ ClusterExecutorUtil.getLocalClusterNodeAddress();\r
+\r
+ ClusterRequest clusterRequest =\r
+ ClusterRequest.createMulticastRequest(\r
+ new MethodHandler(\r
+ _loadIndexesFromClusterMethodKey, _companyIds,\r
+ localClusterNodeAddress),\r
+ true);\r
+\r
+ try {\r
+ ClusterExecutorUtil.execute(clusterRequest);\r
+ }\r
+ catch (SystemException se) {\r
+ _log.error(\r
+ "Unable to notify peers to start index loading", se);\r
+ }\r
+\r
+ if (_log.isInfoEnabled()) {\r
+ _log.info(\r
+ logPrefix + " unlocked latch. Notified peers to " +\r
+ "start index loading.");\r
+ }\r
+ }\r
+ }\r
+\r
+ private long[] _companyIds;\r
+ private CountDownLatch _countDownLatch;\r
+ private boolean _master;\r
+\r
+ }\r
+\r
+}
\ No newline at end of file