--- /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.portal.service.impl;\r
+\r
+import com.liferay.portal.kernel.cluster.Clusterable;\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.image.SpriteProcessorUtil;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.plugin.PluginPackage;\r
+import com.liferay.portal.kernel.portlet.FriendlyURLMapper;\r
+import com.liferay.portal.kernel.portlet.LiferayPortletConfig;\r
+import com.liferay.portal.kernel.portlet.LiferayWindowState;\r
+import com.liferay.portal.kernel.scheduler.SchedulerEntry;\r
+import com.liferay.portal.kernel.scheduler.SchedulerEntryImpl;\r
+import com.liferay.portal.kernel.scheduler.TimeUnit;\r
+import com.liferay.portal.kernel.scheduler.TriggerType;\r
+import com.liferay.portal.kernel.servlet.ServletContextUtil;\r
+import com.liferay.portal.kernel.spring.aop.Skip;\r
+import com.liferay.portal.kernel.transaction.Transactional;\r
+import com.liferay.portal.kernel.util.CharPool;\r
+import com.liferay.portal.kernel.util.ContentTypes;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.ListUtil;\r
+import com.liferay.portal.kernel.util.ServerDetector;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.xml.Document;\r
+import com.liferay.portal.kernel.xml.Element;\r
+import com.liferay.portal.kernel.xml.QName;\r
+import com.liferay.portal.kernel.xml.SAXReaderUtil;\r
+import com.liferay.portal.model.CompanyConstants;\r
+import com.liferay.portal.model.EventDefinition;\r
+import com.liferay.portal.model.Portlet;\r
+import com.liferay.portal.model.PortletApp;\r
+import com.liferay.portal.model.PortletCategory;\r
+import com.liferay.portal.model.PortletConstants;\r
+import com.liferay.portal.model.PortletFilter;\r
+import com.liferay.portal.model.PortletInfo;\r
+import com.liferay.portal.model.PortletURLListener;\r
+import com.liferay.portal.model.PublicRenderParameter;\r
+import com.liferay.portal.model.ResourceConstants;\r
+import com.liferay.portal.model.Role;\r
+import com.liferay.portal.model.impl.EventDefinitionImpl;\r
+import com.liferay.portal.model.impl.PortletAppImpl;\r
+import com.liferay.portal.model.impl.PortletFilterImpl;\r
+import com.liferay.portal.model.impl.PortletImpl;\r
+import com.liferay.portal.model.impl.PortletURLListenerImpl;\r
+import com.liferay.portal.model.impl.PublicRenderParameterImpl;\r
+import com.liferay.portal.security.permission.ActionKeys;\r
+import com.liferay.portal.security.permission.ResourceActionsUtil;\r
+import com.liferay.portal.service.base.PortletLocalServiceBaseImpl;\r
+import com.liferay.portal.util.PortalUtil;\r
+import com.liferay.portal.util.PortletKeys;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portal.util.WebAppPool;\r
+import com.liferay.portal.util.WebKeys;\r
+import com.liferay.portlet.PortletConfigFactoryUtil;\r
+import com.liferay.portlet.PortletContextFactory;\r
+import com.liferay.portlet.PortletInstanceFactoryUtil;\r
+import com.liferay.portlet.PortletPreferencesFactoryUtil;\r
+import com.liferay.portlet.PortletQNameUtil;\r
+import com.liferay.portlet.expando.model.CustomAttributesDisplay;\r
+import com.liferay.util.ContentUtil;\r
+import com.liferay.util.bridges.mvc.MVCPortlet;\r
+\r
+import java.io.File;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Properties;\r
+import java.util.Set;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+import javax.portlet.PortletMode;\r
+import javax.portlet.PreferencesValidator;\r
+import javax.portlet.WindowState;\r
+\r
+import javax.servlet.ServletContext;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Raymond Augé\r
+ * @author Eduardo Lundgren\r
+ * @author Wesley Gong\r
+ * @author Shuyang Zhou\r
+ */\r
+public class PortletLocalServiceImpl extends PortletLocalServiceBaseImpl {\r
+\r
+ @Skip\r
+ public void addPortletCategory(long companyId, String categoryName) {\r
+ PortletCategory portletCategory = (PortletCategory)WebAppPool.get(\r
+ companyId, WebKeys.PORTLET_CATEGORY);\r
+\r
+ if (portletCategory == null) {\r
+ _log.error(\r
+ "Unable to add portlet category for company " + companyId +\r
+ " because it does not exist");\r
+\r
+ return;\r
+ }\r
+\r
+ PortletCategory newPortletCategory = new PortletCategory(categoryName);\r
+\r
+ if (newPortletCategory.getParentCategory() == null) {\r
+ PortletCategory rootPortletCategory = new PortletCategory();\r
+\r
+ rootPortletCategory.addCategory(newPortletCategory);\r
+ }\r
+\r
+ portletCategory.merge(newPortletCategory.getRootCategory());\r
+ }\r
+\r
+ public void checkPortlet(Portlet portlet)\r
+ throws PortalException, SystemException {\r
+\r
+ if (portlet.isSystem()) {\r
+ return;\r
+ }\r
+\r
+ String[] roleNames = portlet.getRolesArray();\r
+\r
+ if (roleNames.length == 0) {\r
+ return;\r
+ }\r
+\r
+ long companyId = portlet.getCompanyId();\r
+ String name = portlet.getPortletId();\r
+ int scope = ResourceConstants.SCOPE_COMPANY;\r
+ String primKey = String.valueOf(companyId);\r
+ String actionId = ActionKeys.ADD_TO_PAGE;\r
+\r
+ List<String> actionIds = ResourceActionsUtil.getPortletResourceActions(\r
+ name);\r
+\r
+ if (actionIds.contains(actionId)) {\r
+ for (String roleName : roleNames) {\r
+ Role role = roleLocalService.getRole(companyId, roleName);\r
+\r
+ if (PropsValues.PERMISSIONS_USER_CHECK_ALGORITHM == 6) {\r
+ if (resourceBlockLocalService.isSupported(name)) {\r
+ resourceBlockLocalService.addCompanyScopePermission(\r
+ companyId, name, role.getRoleId(), actionId);\r
+ }\r
+ else {\r
+ resourcePermissionLocalService.addResourcePermission(\r
+ companyId, name, scope, primKey, role.getRoleId(),\r
+ actionId);\r
+ }\r
+ }\r
+ else {\r
+ permissionLocalService.setRolePermission(\r
+ role.getRoleId(), companyId, name, scope, primKey,\r
+ actionId);\r
+ }\r
+ }\r
+ }\r
+\r
+ updatePortlet(\r
+ companyId, portlet.getPortletId(), StringPool.BLANK,\r
+ portlet.isActive());\r
+ }\r
+\r
+ public void checkPortlets(long companyId)\r
+ throws PortalException, SystemException {\r
+\r
+ List<Portlet> portlets = getPortlets(companyId);\r
+\r
+ for (Portlet portlet : portlets) {\r
+ checkPortlet(portlet);\r
+ }\r
+ }\r
+\r
+ @Skip\r
+ public void clearCache() {\r
+\r
+ // Refresh security path to portlet id mapping for all portlets\r
+\r
+ _portletIdsByStrutsPath.clear();\r
+\r
+ // Refresh company portlets\r
+\r
+ portletLocalService.clearCompanyPortletsPool();\r
+ }\r
+\r
+ @Clusterable\r
+ @Transactional(enabled = false)\r
+ public void clearCompanyPortletsPool() {\r
+ _companyPortletsPool.clear();\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #clonePortlet(String)}\r
+ */\r
+ @Skip\r
+ public Portlet clonePortlet(long companyId, String portletId) {\r
+ return clonePortlet(portletId);\r
+ }\r
+\r
+ @Skip\r
+ public Portlet clonePortlet(String portletId) {\r
+ Portlet portlet = getPortletById(portletId);\r
+\r
+ return (Portlet)portlet.clone();\r
+ }\r
+\r
+ public Portlet deployRemotePortlet(Portlet portlet, String categoryName)\r
+ throws PortalException, SystemException {\r
+\r
+ return deployRemotePortlet(portlet, new String[] {categoryName});\r
+ }\r
+\r
+ public Portlet deployRemotePortlet(Portlet portlet, String[] categoryNames)\r
+ throws PortalException, SystemException {\r
+\r
+ Map<String, Portlet> portletsPool = _getPortletsPool();\r
+\r
+ portletsPool.put(portlet.getPortletId(), portlet);\r
+\r
+ PortletInstanceFactoryUtil.clear(portlet, false);\r
+\r
+ PortletConfigFactoryUtil.destroy(portlet);\r
+\r
+ clearCache();\r
+\r
+ List<String> portletActions =\r
+ ResourceActionsUtil.getPortletResourceActions(\r
+ portlet.getPortletId());\r
+\r
+ resourceActionLocalService.checkResourceActions(\r
+ portlet.getPortletId(), portletActions);\r
+\r
+ PortletCategory portletCategory = (PortletCategory)WebAppPool.get(\r
+ portlet.getCompanyId(), WebKeys.PORTLET_CATEGORY);\r
+\r
+ if (portletCategory == null) {\r
+ _log.error(\r
+ "Unable to register remote portlet for company " +\r
+ portlet.getCompanyId() + " because it does not exist");\r
+\r
+ return portlet;\r
+ }\r
+\r
+ portletCategory.separate(portlet.getPortletId());\r
+\r
+ for (String categoryName : categoryNames) {\r
+ PortletCategory newPortletCategory = new PortletCategory(\r
+ categoryName);\r
+\r
+ if (newPortletCategory.getParentCategory() == null) {\r
+ PortletCategory rootPortletCategory = new PortletCategory();\r
+\r
+ rootPortletCategory.addCategory(newPortletCategory);\r
+ }\r
+\r
+ Set<String> portletIds = newPortletCategory.getPortletIds();\r
+\r
+ portletIds.add(portlet.getPortletId());\r
+\r
+ portletCategory.merge(newPortletCategory.getRootCategory());\r
+ }\r
+\r
+ checkPortlet(portlet);\r
+\r
+ return portlet;\r
+ }\r
+\r
+ @Skip\r
+ public void destroyPortlet(Portlet portlet) {\r
+ String portletId = portlet.getRootPortletId();\r
+\r
+ _friendlyURLMapperPortlets.remove(portletId);\r
+\r
+ Map<String, Portlet> portletsPool = _getPortletsPool();\r
+\r
+ portletsPool.remove(portletId);\r
+\r
+ PortletApp portletApp = portlet.getPortletApp();\r
+\r
+ if (portletApp != null) {\r
+ _portletAppsPool.remove(portletApp.getServletContextName());\r
+ }\r
+\r
+ clearCache();\r
+ }\r
+\r
+ @Skip\r
+ public void destroyRemotePortlet(Portlet portlet) {\r
+ destroyPortlet(portlet);\r
+ }\r
+\r
+ @Skip\r
+ public List<CustomAttributesDisplay> getCustomAttributesDisplays() {\r
+ List<CustomAttributesDisplay> customAttributesDisplays =\r
+ new ArrayList<CustomAttributesDisplay>(\r
+ _customAttributesDisplayPortlets.size());\r
+\r
+ for (Map.Entry<String, Portlet> entry :\r
+ _customAttributesDisplayPortlets.entrySet()) {\r
+\r
+ Portlet portlet = entry.getValue();\r
+\r
+ List<CustomAttributesDisplay> portletCustomAttributesDisplays =\r
+ portlet.getCustomAttributesDisplayInstances();\r
+\r
+ if ((portletCustomAttributesDisplays != null) &&\r
+ !portletCustomAttributesDisplays.isEmpty()) {\r
+\r
+ customAttributesDisplays.addAll(\r
+ portletCustomAttributesDisplays);\r
+ }\r
+ }\r
+\r
+ return customAttributesDisplays;\r
+ }\r
+\r
+ @Skip\r
+ public PortletCategory getEARDisplay(String xml) throws SystemException {\r
+ try {\r
+ return _readLiferayDisplayXML(xml);\r
+ }\r
+ catch (Exception e) {\r
+ throw new SystemException(e);\r
+ }\r
+ }\r
+\r
+ @Skip\r
+ public List<Portlet> getFriendlyURLMapperPortlets() {\r
+ List<Portlet> portlets = new ArrayList<Portlet>(\r
+ _friendlyURLMapperPortlets.size());\r
+\r
+ for (Map.Entry<String, Portlet> entry :\r
+ _friendlyURLMapperPortlets.entrySet()) {\r
+\r
+ Portlet portlet = entry.getValue();\r
+\r
+ FriendlyURLMapper friendlyURLMapper =\r
+ portlet.getFriendlyURLMapperInstance();\r
+\r
+ if (friendlyURLMapper != null) {\r
+ portlets.add(portlet);\r
+ }\r
+ }\r
+\r
+ return portlets;\r
+ }\r
+\r
+ @Skip\r
+ public List<FriendlyURLMapper> getFriendlyURLMappers() {\r
+ List<FriendlyURLMapper> friendlyURLMappers =\r
+ new ArrayList<FriendlyURLMapper>(_friendlyURLMapperPortlets.size());\r
+\r
+ for (Map.Entry<String, Portlet> entry :\r
+ _friendlyURLMapperPortlets.entrySet()) {\r
+\r
+ Portlet portlet = entry.getValue();\r
+\r
+ FriendlyURLMapper friendlyURLMapper =\r
+ portlet.getFriendlyURLMapperInstance();\r
+\r
+ if (friendlyURLMapper != null) {\r
+ friendlyURLMappers.add(friendlyURLMapper);\r
+ }\r
+ }\r
+\r
+ return friendlyURLMappers;\r
+ }\r
+\r
+ @Skip\r
+ public PortletApp getPortletApp(String servletContextName) {\r
+ return _getPortletApp(servletContextName);\r
+ }\r
+\r
+ @Skip\r
+ public Portlet getPortletById(long companyId, String portletId)\r
+ throws SystemException {\r
+\r
+ portletId = PortalUtil.getJsSafePortletId(portletId);\r
+\r
+ Portlet portlet = null;\r
+\r
+ Map<String, Portlet> companyPortletsPool = _getPortletsPool(companyId);\r
+\r
+ String rootPortletId = PortletConstants.getRootPortletId(portletId);\r
+\r
+ if (portletId.equals(rootPortletId)) {\r
+ portlet = companyPortletsPool.get(portletId);\r
+ }\r
+ else {\r
+ portlet = companyPortletsPool.get(rootPortletId);\r
+\r
+ if (portlet != null) {\r
+ portlet = portlet.getClonedInstance(portletId);\r
+ }\r
+ }\r
+\r
+ if (portlet != null) {\r
+ return portlet;\r
+ }\r
+\r
+ if (portletId.equals(PortletKeys.LIFERAY_PORTAL)) {\r
+ return portlet;\r
+ }\r
+\r
+ if (_portletsPool.isEmpty()) {\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("No portlets are installed");\r
+ }\r
+ }\r
+ else {\r
+ if (_log.isInfoEnabled()) {\r
+ _log.info(\r
+ "Portlet not found for " + companyId + " " + portletId);\r
+ }\r
+\r
+ portlet = new PortletImpl(CompanyConstants.SYSTEM, portletId);\r
+\r
+ portlet.setTimestamp(System.currentTimeMillis());\r
+\r
+ PortletApp portletApp = _getPortletApp(StringPool.BLANK);\r
+\r
+ portlet.setPortletApp(portletApp);\r
+\r
+ portlet.setPortletName(portletId);\r
+ portlet.setDisplayName(portletId);\r
+ portlet.setPortletClass(MVCPortlet.class.getName());\r
+\r
+ Map<String, String> initParams = portlet.getInitParams();\r
+\r
+ initParams.put("view-jsp", "/html/portal/undeployed_portlet.jsp");\r
+\r
+ Set<String> mimeTypePortletModes = new HashSet<String>();\r
+\r
+ mimeTypePortletModes.add(PortletMode.VIEW.toString().toLowerCase());\r
+\r
+ Map<String, Set<String>> portletModes = portlet.getPortletModes();\r
+\r
+ portletModes.put(ContentTypes.TEXT_HTML, mimeTypePortletModes);\r
+\r
+ Set<String> mimeTypeWindowStates = new HashSet<String>();\r
+\r
+ mimeTypeWindowStates.add(\r
+ WindowState.NORMAL.toString().toLowerCase());\r
+\r
+ Map<String, Set<String>> windowStates = portlet.getWindowStates();\r
+\r
+ windowStates.put(ContentTypes.TEXT_HTML, mimeTypeWindowStates);\r
+\r
+ portlet.setPortletInfo(\r
+ new PortletInfo(portletId, portletId, portletId, portletId));\r
+\r
+ if (PortletConstants.hasInstanceId(portletId)) {\r
+ portlet.setInstanceable(true);\r
+ }\r
+\r
+ portlet.setActive(true);\r
+ portlet.setUndeployedPortlet(true);\r
+ }\r
+\r
+ return portlet;\r
+ }\r
+\r
+ @Skip\r
+ public Portlet getPortletById(String portletId) {\r
+ Map<String, Portlet> portletsPool = _getPortletsPool();\r
+\r
+ return portletsPool.get(portletId);\r
+ }\r
+\r
+ @Skip\r
+ public Portlet getPortletByStrutsPath(long companyId, String strutsPath)\r
+ throws SystemException {\r
+\r
+ return getPortletById(companyId, _getPortletId(strutsPath));\r
+ }\r
+\r
+ @Skip\r
+ public List<Portlet> getPortlets() {\r
+ Map<String, Portlet> portletsPool = _getPortletsPool();\r
+\r
+ return ListUtil.fromMapValues(portletsPool);\r
+ }\r
+\r
+ @Skip\r
+ public List<Portlet> getPortlets(long companyId) throws SystemException {\r
+ return getPortlets(companyId, true, true);\r
+ }\r
+\r
+ @Skip\r
+ public List<Portlet> getPortlets(\r
+ long companyId, boolean showSystem, boolean showPortal)\r
+ throws SystemException {\r
+\r
+ Map<String, Portlet> portletsPool = _getPortletsPool(companyId);\r
+\r
+ List<Portlet> portlets = ListUtil.fromMapValues(portletsPool);\r
+\r
+ if (!showSystem || !showPortal) {\r
+ Iterator<Portlet> itr = portlets.iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ Portlet portlet = itr.next();\r
+\r
+ if (showPortal &&\r
+ portlet.getPortletId().equals(PortletKeys.PORTAL)) {\r
+\r
+ }\r
+ else if (!showPortal &&\r
+ portlet.getPortletId().equals(PortletKeys.PORTAL)) {\r
+\r
+ itr.remove();\r
+ }\r
+ else if (!showSystem && portlet.isSystem()) {\r
+ itr.remove();\r
+ }\r
+ }\r
+ }\r
+\r
+ return portlets;\r
+ }\r
+\r
+ @Skip\r
+ public List<Portlet> getScopablePortlets() {\r
+ Map<String, Portlet> portletsPool = _getPortletsPool();\r
+\r
+ List<Portlet> portlets = ListUtil.fromMapValues(portletsPool);\r
+\r
+ Iterator<Portlet> itr = portlets.iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ Portlet portlet = itr.next();\r
+\r
+ if (!portlet.isScopeable()) {\r
+ itr.remove();\r
+ }\r
+ }\r
+\r
+ return portlets;\r
+ }\r
+\r
+ @Skip\r
+ public PortletCategory getWARDisplay(String servletContextName, String xml)\r
+ throws SystemException {\r
+\r
+ try {\r
+ return _readLiferayDisplayXML(servletContextName, xml);\r
+ }\r
+ catch (Exception e) {\r
+ throw new SystemException(e);\r
+ }\r
+ }\r
+\r
+ @Skip\r
+ public boolean hasPortlet(long companyId, String portletId)\r
+ throws SystemException {\r
+\r
+ portletId = PortalUtil.getJsSafePortletId(portletId);\r
+\r
+ Portlet portlet = null;\r
+\r
+ Map<String, Portlet> companyPortletsPool = _getPortletsPool(companyId);\r
+\r
+ String rootPortletId = PortletConstants.getRootPortletId(portletId);\r
+\r
+ if (portletId.equals(rootPortletId)) {\r
+ portlet = companyPortletsPool.get(portletId);\r
+ }\r
+ else {\r
+ portlet = companyPortletsPool.get(rootPortletId);\r
+ }\r
+\r
+ if (portlet == null) {\r
+ return false;\r
+ }\r
+ else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ @Skip\r
+ public void initEAR(\r
+ ServletContext servletContext, String[] xmls,\r
+ PluginPackage pluginPackage) {\r
+\r
+ // Clear pools every time initEAR is called. See LEP-5452.\r
+\r
+ portletLocalService.clearCompanyPortletsPool();\r
+\r
+ _portletAppsPool.clear();\r
+ _portletsPool.clear();\r
+ _portletIdsByStrutsPath.clear();\r
+ _friendlyURLMapperPortlets.clear();\r
+\r
+ Map<String, Portlet> portletsPool = _getPortletsPool();\r
+\r
+ try {\r
+ Set<String> servletURLPatterns = _readWebXML(xmls[4]);\r
+\r
+ Set<String> portletIds = _readPortletXML(\r
+ servletContext, xmls[0], portletsPool, servletURLPatterns,\r
+ pluginPackage);\r
+\r
+ portletIds.addAll(\r
+ _readPortletXML(\r
+ servletContext, xmls[1], portletsPool, servletURLPatterns,\r
+ pluginPackage));\r
+\r
+ Set<String> liferayPortletIds = _readLiferayPortletXML(\r
+ xmls[2], portletsPool);\r
+\r
+ liferayPortletIds.addAll(\r
+ _readLiferayPortletXML(xmls[3], portletsPool));\r
+\r
+ // Check for missing entries in liferay-portlet.xml\r
+\r
+ for (String portletId : portletIds) {\r
+ if (_log.isWarnEnabled() &&\r
+ !liferayPortletIds.contains(portletId)) {\r
+\r
+ _log.warn(\r
+ "Portlet with the name " + portletId +\r
+ " is described in portlet.xml but does not " +\r
+ "have a matching entry in liferay-portlet.xml");\r
+ }\r
+ }\r
+\r
+ // Check for missing entries in portlet.xml\r
+\r
+ for (String portletId : liferayPortletIds) {\r
+ if (_log.isWarnEnabled() && !portletIds.contains(portletId)) {\r
+ _log.warn(\r
+ "Portlet with the name " + portletId +\r
+ " is described in liferay-portlet.xml but does " +\r
+ "not have a matching entry in portlet.xml");\r
+ }\r
+ }\r
+\r
+ // Remove portlets that should not be included\r
+\r
+ Iterator<Map.Entry<String, Portlet>> portletPoolsItr =\r
+ portletsPool.entrySet().iterator();\r
+\r
+ while (portletPoolsItr.hasNext()) {\r
+ Map.Entry<String, Portlet> entry = portletPoolsItr.next();\r
+\r
+ Portlet portletModel = entry.getValue();\r
+\r
+ if (!portletModel.getPortletId().equals(PortletKeys.ADMIN) &&\r
+ !portletModel.getPortletId().equals(\r
+ PortletKeys.MY_ACCOUNT) &&\r
+ !portletModel.isInclude()) {\r
+\r
+ portletPoolsItr.remove();\r
+\r
+ _friendlyURLMapperPortlets.remove(\r
+ portletModel.getPortletId());\r
+ }\r
+ }\r
+\r
+ // Sprite images\r
+\r
+ PortletApp portletApp = _getPortletApp(StringPool.BLANK);\r
+\r
+ _setSpriteImages(servletContext, portletApp, "/html/icons/");\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+ }\r
+\r
+ @Skip\r
+ public List<Portlet> initWAR(\r
+ String servletContextName, ServletContext servletContext, String[] xmls,\r
+ PluginPackage pluginPackage) {\r
+\r
+ List<Portlet> portlets = new ArrayList<Portlet>();\r
+\r
+ Map<String, Portlet> portletsPool = _getPortletsPool();\r
+\r
+ try {\r
+ Set<String> servletURLPatterns = _readWebXML(xmls[3]);\r
+\r
+ Set<String> portletIds = _readPortletXML(\r
+ servletContextName, servletContext, xmls[0], portletsPool,\r
+ servletURLPatterns, pluginPackage);\r
+\r
+ portletIds.addAll(\r
+ _readPortletXML(\r
+ servletContextName, servletContext, xmls[1], portletsPool,\r
+ servletURLPatterns, pluginPackage));\r
+\r
+ Set<String> liferayPortletIds = _readLiferayPortletXML(\r
+ servletContextName, xmls[2], portletsPool);\r
+\r
+ // Check for missing entries in liferay-portlet.xml\r
+\r
+ for (String portletId : portletIds) {\r
+ if (_log.isWarnEnabled() &&\r
+ !liferayPortletIds.contains(portletId)) {\r
+\r
+ _log.warn(\r
+ "Portlet with the name " + portletId +\r
+ " is described in portlet.xml but does not " +\r
+ "have a matching entry in liferay-portlet.xml");\r
+ }\r
+ }\r
+\r
+ // Check for missing entries in portlet.xml\r
+\r
+ for (String portletId : liferayPortletIds) {\r
+ if (_log.isWarnEnabled() && !portletIds.contains(portletId)) {\r
+ _log.warn(\r
+ "Portlet with the name " + portletId +\r
+ " is described in liferay-portlet.xml but does " +\r
+ "not have a matching entry in portlet.xml");\r
+ }\r
+ }\r
+\r
+ // Return the new portlets\r
+\r
+ for (String portletId : portletIds) {\r
+ Portlet portlet = _getPortletsPool().get(portletId);\r
+\r
+ portlets.add(portlet);\r
+\r
+ PortletInstanceFactoryUtil.clear(portlet);\r
+\r
+ PortletConfigFactoryUtil.destroy(portlet);\r
+ PortletContextFactory.destroy(portlet);\r
+ }\r
+\r
+ // Sprite images\r
+\r
+ PortletApp portletApp = _getPortletApp(servletContextName);\r
+\r
+ _setSpriteImages(servletContext, portletApp, "/icons/");\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ clearCache();\r
+\r
+ return portlets;\r
+ }\r
+\r
+ public Map<String, Portlet> loadGetPortletsPool(long companyId)\r
+ throws SystemException {\r
+\r
+ Map<String, Portlet> portletsPool =\r
+ new ConcurrentHashMap<String, Portlet>();\r
+\r
+ Map<String, Portlet> parentPortletsPool = _getPortletsPool();\r
+\r
+ if (parentPortletsPool == null) {\r
+\r
+ // The Upgrade scripts sometimes try to access portlet preferences\r
+ // before the portal's been initialized. Return an empty pool.\r
+\r
+ return portletsPool;\r
+ }\r
+\r
+ for (Portlet portlet : parentPortletsPool.values()) {\r
+ portlet = (Portlet)portlet.clone();\r
+\r
+ portlet.setCompanyId(companyId);\r
+\r
+ portletsPool.put(portlet.getPortletId(), portlet);\r
+ }\r
+\r
+ List<Portlet> portlets = portletPersistence.findByCompanyId(companyId);\r
+\r
+ for (Portlet portlet : portlets) {\r
+ Portlet portletModel = portletsPool.get(portlet.getPortletId());\r
+\r
+ // Portlet may be null if it exists in the database but its portlet\r
+ // WAR is not yet loaded\r
+\r
+ if (portletModel != null) {\r
+ portletModel.setPluginPackage(portlet.getPluginPackage());\r
+ portletModel.setDefaultPluginSetting(\r
+ portlet.getDefaultPluginSetting());\r
+ portletModel.setRoles(portlet.getRoles());\r
+ portletModel.setActive(portlet.getActive());\r
+ }\r
+ }\r
+\r
+ return portletsPool;\r
+ }\r
+\r
+ @Clusterable\r
+ @Transactional(enabled = false)\r
+ public void removeCompanyPortletsPool(long companyId) {\r
+ _companyPortletsPool.remove(companyId);\r
+ }\r
+\r
+ public Portlet updatePortlet(\r
+ long companyId, String portletId, String roles, boolean active)\r
+ throws SystemException {\r
+\r
+ portletId = PortalUtil.getJsSafePortletId(portletId);\r
+\r
+ Portlet portlet = portletPersistence.fetchByC_P(companyId, portletId);\r
+\r
+ if (portlet == null) {\r
+ long id = counterLocalService.increment();\r
+\r
+ portlet = portletPersistence.create(id);\r
+\r
+ portlet.setCompanyId(companyId);\r
+ portlet.setPortletId(portletId);\r
+ }\r
+\r
+ portlet.setRoles(roles);\r
+ portlet.setActive(active);\r
+\r
+ portletPersistence.update(portlet, false);\r
+\r
+ portlet = getPortletById(companyId, portletId);\r
+\r
+ portlet.setRoles(roles);\r
+ portlet.setActive(active);\r
+\r
+ portletLocalService.removeCompanyPortletsPool(companyId);\r
+\r
+ return portlet;\r
+ }\r
+\r
+ private PortletApp _getPortletApp(String servletContextName) {\r
+ PortletApp portletApp = _portletAppsPool.get(servletContextName);\r
+\r
+ if (portletApp == null) {\r
+ portletApp = new PortletAppImpl(servletContextName);\r
+\r
+ _portletAppsPool.put(servletContextName, portletApp);\r
+ }\r
+\r
+ return portletApp;\r
+ }\r
+\r
+ private String _getPortletId(String securityPath) {\r
+ if (_portletIdsByStrutsPath.isEmpty()) {\r
+ for (Portlet portlet : _getPortletsPool().values()) {\r
+ String strutsPath = portlet.getStrutsPath();\r
+\r
+ if (_portletIdsByStrutsPath.containsKey(strutsPath)) {\r
+ //_log.warn("Duplicate struts path " + strutsPath);\r
+ }\r
+\r
+ _portletIdsByStrutsPath.put(strutsPath, portlet.getPortletId());\r
+ }\r
+ }\r
+\r
+ String portletId = _portletIdsByStrutsPath.get(securityPath);\r
+\r
+ if (Validator.isNull(portletId)) {\r
+ for (String strutsPath : _portletIdsByStrutsPath.keySet()) {\r
+ if (securityPath.startsWith(\r
+ strutsPath.concat(StringPool.SLASH))) {\r
+\r
+ portletId = _portletIdsByStrutsPath.get(strutsPath);\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (Validator.isNull(portletId)) {\r
+ _log.error(\r
+ "Struts path " + securityPath + " is not mapped to a portlet " +\r
+ "in liferay-portlet.xml");\r
+ }\r
+\r
+ return portletId;\r
+ }\r
+\r
+ private List<Portlet> _getPortletsByPortletName(\r
+ String portletName, String servletContextName,\r
+ Map<String, Portlet> portletsPool) {\r
+\r
+ List<Portlet> portlets = null;\r
+\r
+ int pos = portletName.indexOf(CharPool.STAR);\r
+\r
+ if (pos == -1) {\r
+ portlets = new ArrayList<Portlet>();\r
+\r
+ String portletId = portletName;\r
+\r
+ if (Validator.isNotNull(servletContextName)) {\r
+ portletId =\r
+ portletId + PortletConstants.WAR_SEPARATOR +\r
+ servletContextName;\r
+ }\r
+\r
+ portletId = PortalUtil.getJsSafePortletId(portletId);\r
+\r
+ Portlet portlet = portletsPool.get(portletId);\r
+\r
+ if (portlet != null) {\r
+ portlets.add(portlet);\r
+ }\r
+\r
+ return portlets;\r
+ }\r
+\r
+ String portletNamePrefix = portletName.substring(0, pos);\r
+\r
+ portlets = _getPortletsByServletContextName(\r
+ servletContextName, portletsPool);\r
+\r
+ Iterator<Portlet> itr = portlets.iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ Portlet portlet = itr.next();\r
+\r
+ String portletId = portlet.getPortletId();\r
+\r
+ if (!portletId.startsWith(portletNamePrefix)) {\r
+ itr.remove();\r
+ }\r
+ }\r
+\r
+ return portlets;\r
+ }\r
+\r
+ private List<Portlet> _getPortletsByServletContextName(\r
+ String servletContextName, Map<String, Portlet> portletsPool) {\r
+\r
+ List<Portlet> portlets = new ArrayList<Portlet>();\r
+\r
+ String servletContextNameSuffix = servletContextName;\r
+\r
+ if (Validator.isNotNull(servletContextName)) {\r
+ servletContextNameSuffix = PortalUtil.getJsSafePortletId(\r
+ PortletConstants.WAR_SEPARATOR.concat(servletContextName));\r
+ }\r
+\r
+ for (Map.Entry<String, Portlet> entry : portletsPool.entrySet()) {\r
+ String portletId = entry.getKey();\r
+ Portlet portlet = entry.getValue();\r
+\r
+ if (Validator.isNotNull(servletContextNameSuffix)) {\r
+ if (portletId.endsWith(servletContextNameSuffix)) {\r
+\r
+ portlets.add(portlet);\r
+ }\r
+ }\r
+ else {\r
+ if (!portletId.contains(PortletConstants.WAR_SEPARATOR)) {\r
+ portlets.add(portlet);\r
+ }\r
+ }\r
+ }\r
+\r
+ return portlets;\r
+ }\r
+\r
+ private Map<String, Portlet> _getPortletsPool() {\r
+ return _portletsPool;\r
+ }\r
+\r
+ private Map<String, Portlet> _getPortletsPool(long companyId)\r
+ throws SystemException {\r
+\r
+ Map<String, Portlet> portletsPool = _companyPortletsPool.get(companyId);\r
+\r
+ if (portletsPool == null) {\r
+ portletsPool = portletLocalService.loadGetPortletsPool(companyId);\r
+\r
+ _companyPortletsPool.put(companyId, portletsPool);\r
+ }\r
+\r
+ return portletsPool;\r
+ }\r
+\r
+ private void _readLiferayDisplay(\r
+ String servletContextName, Element element,\r
+ PortletCategory portletCategory, Set<String> portletIds) {\r
+\r
+ for (Element categoryElement : element.elements("category")) {\r
+ String name = categoryElement.attributeValue("name");\r
+\r
+ PortletCategory curPortletCategory = new PortletCategory(name);\r
+\r
+ portletCategory.addCategory(curPortletCategory);\r
+\r
+ Set<String> curPortletIds = curPortletCategory.getPortletIds();\r
+\r
+ for (Element portletElement : categoryElement.elements("portlet")) {\r
+ String portletId = portletElement.attributeValue("id");\r
+\r
+ if (Validator.isNotNull(servletContextName)) {\r
+ portletId =\r
+ portletId + PortletConstants.WAR_SEPARATOR +\r
+ servletContextName;\r
+ }\r
+\r
+ portletId = PortalUtil.getJsSafePortletId(portletId);\r
+\r
+ portletIds.add(portletId);\r
+ curPortletIds.add(portletId);\r
+ }\r
+\r
+ _readLiferayDisplay(\r
+ servletContextName, categoryElement, curPortletCategory,\r
+ portletIds);\r
+ }\r
+ }\r
+\r
+ private PortletCategory _readLiferayDisplayXML(String xml)\r
+ throws Exception {\r
+\r
+ return _readLiferayDisplayXML(null, xml);\r
+ }\r
+\r
+ private PortletCategory _readLiferayDisplayXML(\r
+ String servletContextName, String xml)\r
+ throws Exception {\r
+\r
+ PortletCategory portletCategory = new PortletCategory();\r
+\r
+ if (xml == null) {\r
+ xml = ContentUtil.get(\r
+ "com/liferay/portal/deploy/dependencies/liferay-display.xml");\r
+ }\r
+\r
+ Document document = SAXReaderUtil.read(xml, true);\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ Set<String> portletIds = new HashSet<String>();\r
+\r
+ _readLiferayDisplay(\r
+ servletContextName, rootElement, portletCategory, portletIds);\r
+\r
+ // Portlets that do not belong to any categories should default to the\r
+ // Undefined category\r
+\r
+ Set<String> undefinedPortletIds = new HashSet<String>();\r
+\r
+ for (Portlet portlet : _getPortletsPool().values()) {\r
+ String portletId = portlet.getPortletId();\r
+\r
+ PortletApp portletApp = portlet.getPortletApp();\r
+\r
+ if ((servletContextName != null) && portletApp.isWARFile() &&\r
+ (portletId.endsWith(\r
+ PortletConstants.WAR_SEPARATOR +\r
+ PortalUtil.getJsSafePortletId(servletContextName)) &&\r
+ !portletIds.contains(portletId))) {\r
+\r
+ undefinedPortletIds.add(portletId);\r
+ }\r
+ else if ((servletContextName == null) &&\r
+ !portletApp.isWARFile() &&\r
+ (portletId.indexOf(\r
+ PortletConstants.WAR_SEPARATOR) == -1) &&\r
+ !portletIds.contains(portletId)) {\r
+\r
+ undefinedPortletIds.add(portletId);\r
+ }\r
+ }\r
+\r
+ if (!undefinedPortletIds.isEmpty()) {\r
+ PortletCategory undefinedCategory = new PortletCategory(\r
+ "category.undefined");\r
+\r
+ portletCategory.addCategory(undefinedCategory);\r
+\r
+ undefinedCategory.getPortletIds().addAll(undefinedPortletIds);\r
+ }\r
+\r
+ return portletCategory;\r
+ }\r
+\r
+ private Set<String> _readLiferayPortletXML(\r
+ String xml, Map<String, Portlet> portletsPool)\r
+ throws Exception {\r
+\r
+ return _readLiferayPortletXML(StringPool.BLANK, xml, portletsPool);\r
+ }\r
+\r
+ private void _readLiferayPortletXML(\r
+ String servletContextName, Map<String, Portlet> portletsPool,\r
+ Set<String> liferayPortletIds, Map<String, String> roleMappers,\r
+ Element portletElement) {\r
+\r
+ String portletId = portletElement.elementText("portlet-name");\r
+\r
+ if (Validator.isNotNull(servletContextName)) {\r
+ portletId = portletId.concat(PortletConstants.WAR_SEPARATOR).concat(\r
+ servletContextName);\r
+ }\r
+\r
+ portletId = PortalUtil.getJsSafePortletId(portletId);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Reading portlet extension " + portletId);\r
+ }\r
+\r
+ liferayPortletIds.add(portletId);\r
+\r
+ Portlet portletModel = portletsPool.get(portletId);\r
+\r
+ if (portletModel == null) {\r
+ return;\r
+ }\r
+\r
+ portletModel.setIcon(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("icon"), portletModel.getIcon()));\r
+ portletModel.setVirtualPath(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("virtual-path"),\r
+ portletModel.getVirtualPath()));\r
+ portletModel.setStrutsPath(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("struts-path"),\r
+ portletModel.getStrutsPath()));\r
+\r
+ String strutsPath = portletModel.getStrutsPath();\r
+\r
+ if (Validator.isNotNull(strutsPath)) {\r
+ if (_portletIdsByStrutsPath.containsKey(strutsPath)) {\r
+ _log.warn("Duplicate struts path " + strutsPath);\r
+ }\r
+\r
+ _portletIdsByStrutsPath.put(strutsPath, portletId);\r
+ }\r
+\r
+ portletModel.setParentStrutsPath(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("parent-struts-path"),\r
+ portletModel.getParentStrutsPath()));\r
+\r
+ if (Validator.isNotNull(\r
+ portletElement.elementText("configuration-path"))) {\r
+\r
+ _log.error(\r
+ "The configuration-path element is no longer supported. Use " +\r
+ "configuration-action-class instead.");\r
+ }\r
+\r
+ portletModel.setConfigurationActionClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("configuration-action-class"),\r
+ portletModel.getConfigurationActionClass()));\r
+\r
+ List<String> indexerClasses = portletModel.getIndexerClasses();\r
+\r
+ for (Element indexerClassElement :\r
+ portletElement.elements("indexer-class")) {\r
+\r
+ indexerClasses.add(indexerClassElement.getText());\r
+ }\r
+\r
+ portletModel.setOpenSearchClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("open-search-class"),\r
+ portletModel.getOpenSearchClass()));\r
+\r
+ for (Element schedulerEntryElement :\r
+ portletElement.elements("scheduler-entry")) {\r
+\r
+ SchedulerEntry schedulerEntry = new SchedulerEntryImpl();\r
+\r
+ schedulerEntry.setContextPath(portletModel.getContextPath());\r
+ schedulerEntry.setDescription(\r
+ GetterUtil.getString(\r
+ schedulerEntryElement.elementText(\r
+ "scheduler-description")));\r
+ schedulerEntry.setEventListenerClass(\r
+ GetterUtil.getString(\r
+ schedulerEntryElement.elementText(\r
+ "scheduler-event-listener-class"),\r
+ schedulerEntry.getEventListenerClass()));\r
+\r
+ Element triggerElement = schedulerEntryElement.element("trigger");\r
+\r
+ Element cronElement = triggerElement.element("cron");\r
+ Element simpleElement = triggerElement.element("simple");\r
+\r
+ if (cronElement != null) {\r
+ schedulerEntry.setTriggerType(TriggerType.CRON);\r
+\r
+ Element propertyKeyElement = cronElement.element(\r
+ "property-key");\r
+\r
+ if (propertyKeyElement != null) {\r
+ schedulerEntry.setPropertyKey(\r
+ propertyKeyElement.getTextTrim());\r
+ }\r
+ else {\r
+ schedulerEntry.setTriggerValue(\r
+ cronElement.elementText("cron-trigger-value"));\r
+ }\r
+ }\r
+ else if (simpleElement != null) {\r
+ schedulerEntry.setTriggerType(TriggerType.SIMPLE);\r
+\r
+ Element propertyKeyElement = simpleElement.element(\r
+ "property-key");\r
+\r
+ if (propertyKeyElement != null) {\r
+ schedulerEntry.setPropertyKey(\r
+ propertyKeyElement.getTextTrim());\r
+ }\r
+ else {\r
+ Element simpleTriggerValueElement = simpleElement.element(\r
+ "simple-trigger-value");\r
+\r
+ schedulerEntry.setTriggerValue(\r
+ simpleTriggerValueElement.getTextTrim());\r
+ }\r
+\r
+ String timeUnit = GetterUtil.getString(\r
+ simpleElement.elementText("time-unit"),\r
+ TimeUnit.SECOND.getValue());\r
+\r
+ schedulerEntry.setTimeUnit(\r
+ TimeUnit.parse(timeUnit.toLowerCase()));\r
+ }\r
+\r
+ portletModel.addSchedulerEntry(schedulerEntry);\r
+ }\r
+\r
+ portletModel.setPortletURLClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("portlet-url-class"),\r
+ portletModel.getPortletURLClass()));\r
+\r
+ portletModel.setFriendlyURLMapperClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("friendly-url-mapper-class"),\r
+ portletModel.getFriendlyURLMapperClass()));\r
+\r
+ if (Validator.isNull(portletModel.getFriendlyURLMapperClass())) {\r
+ _friendlyURLMapperPortlets.remove(portletId);\r
+ }\r
+ else {\r
+ _friendlyURLMapperPortlets.put(portletId, portletModel);\r
+ }\r
+\r
+ portletModel.setFriendlyURLMapping(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("friendly-url-mapping"),\r
+ portletModel.getFriendlyURLMapping()));\r
+ portletModel.setFriendlyURLRoutes(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("friendly-url-routes"),\r
+ portletModel.getFriendlyURLRoutes()));\r
+ portletModel.setURLEncoderClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("url-encoder-class"),\r
+ portletModel.getURLEncoderClass()));\r
+ portletModel.setPortletDataHandlerClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("portlet-data-handler-class"),\r
+ portletModel.getPortletDataHandlerClass()));\r
+ portletModel.setPortletLayoutListenerClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("portlet-layout-listener-class"),\r
+ portletModel.getPortletLayoutListenerClass()));\r
+ portletModel.setPollerProcessorClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("poller-processor-class"),\r
+ portletModel.getPollerProcessorClass()));\r
+ portletModel.setPopMessageListenerClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("pop-message-listener-class"),\r
+ portletModel.getPopMessageListenerClass()));\r
+ portletModel.setSocialActivityInterpreterClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("social-activity-interpreter-class"),\r
+ portletModel.getSocialActivityInterpreterClass()));\r
+ portletModel.setSocialRequestInterpreterClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("social-request-interpreter-class"),\r
+ portletModel.getSocialRequestInterpreterClass()));\r
+ portletModel.setWebDAVStorageToken(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("webdav-storage-token"),\r
+ portletModel.getWebDAVStorageToken()));\r
+ portletModel.setWebDAVStorageClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("webdav-storage-class"),\r
+ portletModel.getWebDAVStorageClass()));\r
+ portletModel.setXmlRpcMethodClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("xml-rpc-method-class"),\r
+ portletModel.getXmlRpcMethodClass()));\r
+ portletModel.setControlPanelEntryCategory(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("control-panel-entry-category"),\r
+ portletModel.getControlPanelEntryCategory()));\r
+ portletModel.setControlPanelEntryWeight(\r
+ GetterUtil.getDouble(\r
+ portletElement.elementText("control-panel-entry-weight"),\r
+ portletModel.getControlPanelEntryWeight()));\r
+ portletModel.setControlPanelEntryClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("control-panel-entry-class"),\r
+ portletModel.getControlPanelEntryClass()));\r
+\r
+ List<String> assetRendererFactoryClasses =\r
+ portletModel.getAssetRendererFactoryClasses();\r
+\r
+ for (Element assetRendererFactoryClassElement :\r
+ portletElement.elements("asset-renderer-factory")) {\r
+\r
+ assetRendererFactoryClasses.add(\r
+ assetRendererFactoryClassElement.getText());\r
+ }\r
+\r
+ List<String> atomCollectionAdapterClasses =\r
+ portletModel.getAtomCollectionAdapterClasses();\r
+\r
+ for (Element atomCollectionAdapterClassElement :\r
+ portletElement.elements("atom-collection-adapter")) {\r
+\r
+ atomCollectionAdapterClasses.add(\r
+ atomCollectionAdapterClassElement.getText());\r
+ }\r
+\r
+ List<String> customAttributesDisplayClasses =\r
+ portletModel.getCustomAttributesDisplayClasses();\r
+\r
+ for (Element customAttributesDisplayClassElement :\r
+ portletElement.elements("custom-attributes-display")) {\r
+\r
+ customAttributesDisplayClasses.add(\r
+ customAttributesDisplayClassElement.getText());\r
+ }\r
+\r
+ if (customAttributesDisplayClasses.isEmpty()) {\r
+ _customAttributesDisplayPortlets.remove(portletId);\r
+ }\r
+ else {\r
+ _customAttributesDisplayPortlets.put(portletId, portletModel);\r
+ }\r
+\r
+ portletModel.setPermissionPropagatorClass(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("permission-propagator"),\r
+ portletModel.getPermissionPropagatorClass()));\r
+\r
+ List<String> workflowHandlerClasses =\r
+ portletModel.getWorkflowHandlerClasses();\r
+\r
+ for (Element workflowHandlerClassElement :\r
+ portletElement.elements("workflow-handler")) {\r
+\r
+ workflowHandlerClasses.add(workflowHandlerClassElement.getText());\r
+ }\r
+\r
+ portletModel.setPreferencesCompanyWide(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("preferences-company-wide"),\r
+ portletModel.isPreferencesCompanyWide()));\r
+ portletModel.setPreferencesUniquePerLayout(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("preferences-unique-per-layout"),\r
+ portletModel.isPreferencesUniquePerLayout()));\r
+ portletModel.setPreferencesOwnedByGroup(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("preferences-owned-by-group"),\r
+ portletModel.isPreferencesOwnedByGroup()));\r
+ portletModel.setUseDefaultTemplate(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("use-default-template"),\r
+ portletModel.isUseDefaultTemplate()));\r
+ portletModel.setShowPortletAccessDenied(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("show-portlet-access-denied"),\r
+ portletModel.isShowPortletAccessDenied()));\r
+ portletModel.setShowPortletInactive(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("show-portlet-inactive"),\r
+ portletModel.isShowPortletInactive()));\r
+ portletModel.setActionURLRedirect(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("action-url-redirect"),\r
+ portletModel.isActionURLRedirect()));\r
+ portletModel.setRestoreCurrentView(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("restore-current-view"),\r
+ portletModel.isRestoreCurrentView()));\r
+ portletModel.setMaximizeEdit(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("maximize-edit"),\r
+ portletModel.isMaximizeEdit()));\r
+ portletModel.setMaximizeHelp(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("maximize-help"),\r
+ portletModel.isMaximizeHelp()));\r
+ portletModel.setPopUpPrint(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("pop-up-print"),\r
+ portletModel.isPopUpPrint()));\r
+ portletModel.setLayoutCacheable(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("layout-cacheable"),\r
+ portletModel.isLayoutCacheable()));\r
+ portletModel.setInstanceable(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("instanceable"),\r
+ portletModel.isInstanceable()));\r
+ portletModel.setRemoteable(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("remoteable"),\r
+ portletModel.isRemoteable()));\r
+ portletModel.setScopeable(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("scopeable"),\r
+ portletModel.isScopeable()));\r
+ portletModel.setUserPrincipalStrategy(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("user-principal-strategy"),\r
+ portletModel.getUserPrincipalStrategy()));\r
+ portletModel.setPrivateRequestAttributes(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("private-request-attributes"),\r
+ portletModel.isPrivateRequestAttributes()));\r
+ portletModel.setPrivateSessionAttributes(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("private-session-attributes"),\r
+ portletModel.isPrivateSessionAttributes()));\r
+\r
+ Element autopropagatedParametersElement = portletElement.element(\r
+ "autopropagated-parameters");\r
+\r
+ if (autopropagatedParametersElement != null) {\r
+ Set<String> autopropagatedParameters =\r
+ portletModel.getAutopropagatedParameters();\r
+\r
+ String[] autopropagatedParametersArray = StringUtil.split(\r
+ autopropagatedParametersElement.getText());\r
+\r
+ for (String autopropagatedParameter :\r
+ autopropagatedParametersArray) {\r
+\r
+ autopropagatedParameters.add(autopropagatedParameter);\r
+ }\r
+ }\r
+\r
+ portletModel.setActionTimeout(\r
+ GetterUtil.getInteger(\r
+ portletElement.elementText("action-timeout"),\r
+ portletModel.getActionTimeout()));\r
+ portletModel.setRenderTimeout(\r
+ GetterUtil.getInteger(\r
+ portletElement.elementText("render-timeout"),\r
+ portletModel.getRenderTimeout()));\r
+ portletModel.setRenderWeight(\r
+ GetterUtil.getInteger(\r
+ portletElement.elementText("render-weight"),\r
+ portletModel.getRenderWeight()));\r
+ portletModel.setAjaxable(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("ajaxable"),\r
+ portletModel.isAjaxable()));\r
+\r
+ List<String> headerPortalCssList = portletModel.getHeaderPortalCss();\r
+\r
+ for (Element headerPortalCssElement :\r
+ portletElement.elements("header-portal-css")) {\r
+\r
+ headerPortalCssList.add(headerPortalCssElement.getText());\r
+ }\r
+\r
+ List<String> headerPortletCssList = portletModel.getHeaderPortletCss();\r
+\r
+ for (Element headerPortletCssElement :\r
+ portletElement.elements("header-portlet-css")) {\r
+\r
+ headerPortletCssList.add(headerPortletCssElement.getText());\r
+ }\r
+\r
+ List<String> headerPortalJavaScriptList =\r
+ portletModel.getHeaderPortalJavaScript();\r
+\r
+ for (Element headerPortalJavaScriptElement :\r
+ portletElement.elements("header-portal-javascript")) {\r
+\r
+ headerPortalJavaScriptList.add(\r
+ headerPortalJavaScriptElement.getText());\r
+ }\r
+\r
+ List<String> headerPortletJavaScriptList =\r
+ portletModel.getHeaderPortletJavaScript();\r
+\r
+ for (Element headerPortletJavaScriptElement :\r
+ portletElement.elements("header-portlet-javascript")) {\r
+\r
+ headerPortletJavaScriptList.add(\r
+ headerPortletJavaScriptElement.getText());\r
+ }\r
+\r
+ List<String> footerPortalCssList = portletModel.getFooterPortalCss();\r
+\r
+ for (Element footerPortalCssElement :\r
+ portletElement.elements("footer-portal-css")) {\r
+\r
+ footerPortalCssList.add(footerPortalCssElement.getText());\r
+ }\r
+\r
+ List<String> footerPortletCssList = portletModel.getFooterPortletCss();\r
+\r
+ for (Element footerPortletCssElement :\r
+ portletElement.elements("footer-portlet-css")) {\r
+\r
+ footerPortletCssList.add(footerPortletCssElement.getText());\r
+ }\r
+\r
+ List<String> footerPortalJavaScriptList =\r
+ portletModel.getFooterPortalJavaScript();\r
+\r
+ for (Element footerPortalJavaScriptElement :\r
+ portletElement.elements("footer-portal-javascript")) {\r
+\r
+ footerPortalJavaScriptList.add(\r
+ footerPortalJavaScriptElement.getText());\r
+ }\r
+\r
+ List<String> footerPortletJavaScriptList =\r
+ portletModel.getFooterPortletJavaScript();\r
+\r
+ for (Element footerPortletJavaScriptElement :\r
+ portletElement.elements("footer-portlet-javascript")) {\r
+\r
+ footerPortletJavaScriptList.add(\r
+ footerPortletJavaScriptElement.getText());\r
+ }\r
+\r
+ portletModel.setCssClassWrapper(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("css-class-wrapper"),\r
+ portletModel.getCssClassWrapper()));\r
+ portletModel.setFacebookIntegration(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("facebook-integration"),\r
+ portletModel.getFacebookIntegration()));\r
+ portletModel.setAddDefaultResource(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("add-default-resource"),\r
+ portletModel.isAddDefaultResource()));\r
+ portletModel.setSystem(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("system"), portletModel.isSystem()));\r
+ portletModel.setActive(\r
+ GetterUtil.getBoolean(\r
+ portletElement.elementText("active"), portletModel.isActive()));\r
+ portletModel.setInclude(\r
+ GetterUtil.getBoolean(portletElement.elementText("include"),\r
+ portletModel.isInclude()));\r
+\r
+ if (Validator.isNull(servletContextName)) {\r
+ portletModel.setReady(true);\r
+ }\r
+\r
+ if (!portletModel.isAjaxable() &&\r
+ (portletModel.getRenderWeight() < 1)) {\r
+\r
+ portletModel.setRenderWeight(1);\r
+ }\r
+\r
+ portletModel.getRoleMappers().putAll(roleMappers);\r
+ portletModel.linkRoles();\r
+ }\r
+\r
+ private Set<String> _readLiferayPortletXML(\r
+ String servletContextName, String xml,\r
+ Map<String, Portlet> portletsPool)\r
+ throws Exception {\r
+\r
+ Set<String> liferayPortletIds = new HashSet<String>();\r
+\r
+ if (xml == null) {\r
+ return liferayPortletIds;\r
+ }\r
+\r
+ Document document = SAXReaderUtil.read(xml, true);\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ PortletApp portletApp = _getPortletApp(servletContextName);\r
+\r
+ Map<String, String> roleMappers = new HashMap<String, String>();\r
+\r
+ for (Element roleMapperElement : rootElement.elements("role-mapper")) {\r
+ String roleName = roleMapperElement.elementText("role-name");\r
+ String roleLink = roleMapperElement.elementText("role-link");\r
+\r
+ roleMappers.put(roleName, roleLink);\r
+ }\r
+\r
+ Map<String, String> customUserAttributes =\r
+ portletApp.getCustomUserAttributes();\r
+\r
+ for (Element customUserAttributeElement :\r
+ rootElement.elements("custom-user-attribute")) {\r
+\r
+ String customClass = customUserAttributeElement.elementText(\r
+ "custom-class");\r
+\r
+ for (Element nameElement :\r
+ customUserAttributeElement.elements("name")) {\r
+\r
+ String name = nameElement.getText();\r
+\r
+ customUserAttributes.put(name, customClass);\r
+ }\r
+ }\r
+\r
+ for (Element portletElement : rootElement.elements("portlet")) {\r
+ _readLiferayPortletXML(\r
+ servletContextName, portletsPool, liferayPortletIds,\r
+ roleMappers, portletElement);\r
+ }\r
+\r
+ return liferayPortletIds;\r
+ }\r
+\r
+ private Set<String> _readPortletXML(\r
+ ServletContext servletContext, String xml,\r
+ Map<String, Portlet> portletsPool, Set<String> servletURLPatterns,\r
+ PluginPackage pluginPackage)\r
+ throws Exception {\r
+\r
+ return _readPortletXML(\r
+ StringPool.BLANK, servletContext, xml, portletsPool,\r
+ servletURLPatterns, pluginPackage);\r
+ }\r
+\r
+ private void _readPortletXML(\r
+ String servletContextName, Map<String, Portlet> portletsPool,\r
+ PluginPackage pluginPackage, PortletApp portletApp,\r
+ Set<String> portletIds, long timestamp, Element portletElement) {\r
+\r
+ String portletName = portletElement.elementText("portlet-name");\r
+\r
+ String portletId = portletName;\r
+\r
+ if (Validator.isNotNull(servletContextName)) {\r
+ portletId = portletId.concat(PortletConstants.WAR_SEPARATOR).concat(\r
+ servletContextName);\r
+ }\r
+\r
+ portletId = PortalUtil.getJsSafePortletId(portletId);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Reading portlet " + portletId);\r
+ }\r
+\r
+ portletIds.add(portletId);\r
+\r
+ Portlet portletModel = portletsPool.get(portletId);\r
+\r
+ if (portletModel == null) {\r
+ portletModel = new PortletImpl(CompanyConstants.SYSTEM, portletId);\r
+\r
+ portletsPool.put(portletId, portletModel);\r
+ }\r
+\r
+ portletModel.setTimestamp(timestamp);\r
+\r
+ portletModel.setPluginPackage(pluginPackage);\r
+ portletModel.setPortletApp(portletApp);\r
+\r
+ portletModel.setPortletName(portletName);\r
+ portletModel.setDisplayName(\r
+ GetterUtil.getString(\r
+ portletElement.elementText("display-name"),\r
+ portletModel.getDisplayName()));\r
+ portletModel.setPortletClass(\r
+ GetterUtil.getString(portletElement.elementText("portlet-class")));\r
+\r
+ Map<String, String> initParams = portletModel.getInitParams();\r
+\r
+ for (Element initParamElement : portletElement.elements("init-param")) {\r
+ initParams.put(\r
+ initParamElement.elementText("name"),\r
+ initParamElement.elementText("value"));\r
+ }\r
+\r
+ Element expirationCacheElement = portletElement.element(\r
+ "expiration-cache");\r
+\r
+ if (expirationCacheElement != null) {\r
+ portletModel.setExpCache(\r
+ GetterUtil.getInteger(expirationCacheElement.getText()));\r
+ }\r
+\r
+ for (Element supportsElement : portletElement.elements("supports")) {\r
+ Map<String, Set<String>> portletModes =\r
+ portletModel.getPortletModes();\r
+\r
+ String mimeType = supportsElement.elementText("mime-type");\r
+\r
+ Set<String> mimeTypePortletModes = portletModes.get(mimeType);\r
+\r
+ if (mimeTypePortletModes == null) {\r
+ mimeTypePortletModes = new HashSet<String>();\r
+\r
+ portletModes.put(mimeType, mimeTypePortletModes);\r
+ }\r
+\r
+ mimeTypePortletModes.add(PortletMode.VIEW.toString().toLowerCase());\r
+\r
+ for (Element portletModeElement :\r
+ supportsElement.elements("portlet-mode")) {\r
+\r
+ mimeTypePortletModes.add(\r
+ portletModeElement.getTextTrim().toLowerCase());\r
+ }\r
+\r
+ Map<String, Set<String>> windowStates =\r
+ portletModel.getWindowStates();\r
+\r
+ Set<String> mimeTypeWindowStates = windowStates.get(mimeType);\r
+\r
+ if (mimeTypeWindowStates == null) {\r
+ mimeTypeWindowStates = new HashSet<String>();\r
+\r
+ windowStates.put(mimeType, mimeTypeWindowStates);\r
+ }\r
+\r
+ mimeTypeWindowStates.add(\r
+ WindowState.NORMAL.toString().toLowerCase());\r
+\r
+ List<Element> windowStateElements = supportsElement.elements(\r
+ "window-state");\r
+\r
+ if (windowStateElements.isEmpty()) {\r
+ mimeTypeWindowStates.add(\r
+ WindowState.MAXIMIZED.toString().toLowerCase());\r
+ mimeTypeWindowStates.add(\r
+ WindowState.MINIMIZED.toString().toLowerCase());\r
+ mimeTypeWindowStates.add(\r
+ LiferayWindowState.EXCLUSIVE.toString().toLowerCase());\r
+ mimeTypeWindowStates.add(\r
+ LiferayWindowState.POP_UP.toString().toLowerCase());\r
+ }\r
+\r
+ for (Element windowStateElement : windowStateElements) {\r
+ mimeTypeWindowStates.add(\r
+ windowStateElement.getTextTrim().toLowerCase());\r
+ }\r
+ }\r
+\r
+ Set<String> supportedLocales = portletModel.getSupportedLocales();\r
+\r
+ //supportedLocales.add(\r
+ // LocaleUtil.toLanguageId(LocaleUtil.getDefault()));\r
+\r
+ for (Element supportedLocaleElement : portletElement.elements(\r
+ "supported-locale")) {\r
+\r
+ String supportedLocale = supportedLocaleElement.getText();\r
+\r
+ supportedLocales.add(supportedLocale);\r
+ }\r
+\r
+ portletModel.setResourceBundle(\r
+ portletElement.elementText("resource-bundle"));\r
+\r
+ Element portletInfoElement = portletElement.element("portlet-info");\r
+\r
+ String portletInfoTitle = null;\r
+ String portletInfoShortTitle = null;\r
+ String portletInfoKeyWords = null;\r
+ String portletInfoDescription = null;\r
+\r
+ if (portletInfoElement != null) {\r
+ portletInfoTitle = portletInfoElement.elementText("title");\r
+ portletInfoShortTitle = portletInfoElement.elementText(\r
+ "short-title");\r
+ portletInfoKeyWords = portletInfoElement.elementText("keywords");\r
+ }\r
+\r
+ PortletInfo portletInfo = new PortletInfo(\r
+ portletInfoTitle, portletInfoShortTitle, portletInfoKeyWords,\r
+ portletInfoDescription);\r
+\r
+ portletModel.setPortletInfo(portletInfo);\r
+\r
+ Element portletPreferencesElement = portletElement.element(\r
+ "portlet-preferences");\r
+\r
+ String defaultPreferences = null;\r
+ String preferencesValidator = null;\r
+\r
+ if (portletPreferencesElement != null) {\r
+ Element preferencesValidatorElement =\r
+ portletPreferencesElement.element("preferences-validator");\r
+\r
+ if (preferencesValidatorElement != null) {\r
+ preferencesValidator = preferencesValidatorElement.getText();\r
+\r
+ portletPreferencesElement.remove(preferencesValidatorElement);\r
+ }\r
+\r
+ defaultPreferences = portletPreferencesElement.asXML();\r
+ }\r
+\r
+ portletModel.setDefaultPreferences(defaultPreferences);\r
+ portletModel.setPreferencesValidator(preferencesValidator);\r
+\r
+ if (!portletApp.isWARFile() &&\r
+ Validator.isNotNull(preferencesValidator) &&\r
+ PropsValues.PREFERENCE_VALIDATE_ON_STARTUP) {\r
+\r
+ try {\r
+ PreferencesValidator preferencesValidatorObj =\r
+ PortalUtil.getPreferencesValidator(portletModel);\r
+\r
+ preferencesValidatorObj.validate(\r
+ PortletPreferencesFactoryUtil.fromDefaultXML(\r
+ defaultPreferences));\r
+ }\r
+ catch (Exception e) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn(\r
+ "Portlet with the name " + portletId +\r
+ " does not have valid default preferences");\r
+ }\r
+ }\r
+ }\r
+\r
+ Set<String> unlikedRoles = portletModel.getUnlinkedRoles();\r
+\r
+ for (Element roleElement :\r
+ portletElement.elements("security-role-ref")) {\r
+\r
+ unlikedRoles.add(roleElement.elementText("role-name"));\r
+ }\r
+\r
+ for (Element supportedProcessingEventElement :\r
+ portletElement.elements("supported-processing-event")) {\r
+\r
+ Element qNameElement = supportedProcessingEventElement.element(\r
+ "qname");\r
+ Element nameElement = supportedProcessingEventElement.element(\r
+ "name");\r
+\r
+ QName qName = PortletQNameUtil.getQName(\r
+ qNameElement, nameElement, portletApp.getDefaultNamespace());\r
+\r
+ portletModel.addProcessingEvent(qName);\r
+ }\r
+\r
+ for (Element supportedPublishingEventElement :\r
+ portletElement.elements("supported-publishing-event")) {\r
+\r
+ Element qNameElement = supportedPublishingEventElement.element(\r
+ "qname");\r
+ Element nameElement = supportedPublishingEventElement.element(\r
+ "name");\r
+\r
+ QName qName = PortletQNameUtil.getQName(\r
+ qNameElement, nameElement, portletApp.getDefaultNamespace());\r
+\r
+ portletModel.addPublishingEvent(qName);\r
+ }\r
+\r
+ for (Element supportedPublicRenderParameter :\r
+ portletElement.elements("supported-public-render-parameter")) {\r
+\r
+ String identifier = supportedPublicRenderParameter.getTextTrim();\r
+\r
+ PublicRenderParameter publicRenderParameter =\r
+ portletApp.getPublicRenderParameter(identifier);\r
+\r
+ if (publicRenderParameter == null) {\r
+ _log.error(\r
+ "Supported public render parameter references " +\r
+ "unnknown identifier " + identifier);\r
+\r
+ continue;\r
+ }\r
+\r
+ portletModel.addPublicRenderParameter(publicRenderParameter);\r
+ }\r
+ }\r
+\r
+ private Set<String> _readPortletXML(\r
+ String servletContextName, ServletContext servletContext,\r
+ String xml, Map<String, Portlet> portletsPool,\r
+ Set<String> servletURLPatterns, PluginPackage pluginPackage)\r
+ throws Exception {\r
+\r
+ Set<String> portletIds = new HashSet<String>();\r
+\r
+ if (xml == null) {\r
+ return portletIds;\r
+ }\r
+\r
+ Document document = SAXReaderUtil.read(\r
+ xml, PropsValues.PORTLET_XML_VALIDATE);\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ PortletApp portletApp = _getPortletApp(servletContextName);\r
+\r
+ portletApp.addServletURLPatterns(servletURLPatterns);\r
+\r
+ Set<String> userAttributes = portletApp.getUserAttributes();\r
+\r
+ for (Element userAttributeElement :\r
+ rootElement.elements("user-attribute")) {\r
+\r
+ String name = userAttributeElement.elementText("name");\r
+\r
+ userAttributes.add(name);\r
+ }\r
+\r
+ String defaultNamespace = rootElement.elementText("default-namespace");\r
+\r
+ if (Validator.isNotNull(defaultNamespace)) {\r
+ portletApp.setDefaultNamespace(defaultNamespace);\r
+ }\r
+\r
+ for (Element eventDefinitionElement :\r
+ rootElement.elements("event-definition")) {\r
+\r
+ Element qNameElement = eventDefinitionElement.element("qname");\r
+ Element nameElement = eventDefinitionElement.element("name");\r
+ String valueType = eventDefinitionElement.elementText("value-type");\r
+\r
+ QName qName = PortletQNameUtil.getQName(\r
+ qNameElement, nameElement, portletApp.getDefaultNamespace());\r
+\r
+ EventDefinition eventDefinition = new EventDefinitionImpl(\r
+ qName, valueType, portletApp);\r
+\r
+ portletApp.addEventDefinition(eventDefinition);\r
+ }\r
+\r
+ for (Element publicRenderParameterElement :\r
+ rootElement.elements("public-render-parameter")) {\r
+\r
+ String identifier = publicRenderParameterElement.elementText(\r
+ "identifier");\r
+ Element qNameElement = publicRenderParameterElement.element(\r
+ "qname");\r
+ Element nameElement = publicRenderParameterElement.element("name");\r
+\r
+ QName qName = PortletQNameUtil.getQName(\r
+ qNameElement, nameElement, portletApp.getDefaultNamespace());\r
+\r
+ PublicRenderParameter publicRenderParameter =\r
+ new PublicRenderParameterImpl(identifier, qName, portletApp);\r
+\r
+ portletApp.addPublicRenderParameter(publicRenderParameter);\r
+ }\r
+\r
+ for (Element containerRuntimeOptionElement :\r
+ rootElement.elements("container-runtime-option")) {\r
+\r
+ String name = GetterUtil.getString(\r
+ containerRuntimeOptionElement.elementText("name"));\r
+\r
+ List<String> values = new ArrayList<String>();\r
+\r
+ for (Element valueElement :\r
+ containerRuntimeOptionElement.elements("value")) {\r
+\r
+ values.add(valueElement.getTextTrim());\r
+ }\r
+\r
+ Map<String, String[]> containerRuntimeOptions =\r
+ portletApp.getContainerRuntimeOptions();\r
+\r
+ containerRuntimeOptions.put(\r
+ name, values.toArray(new String[values.size()]));\r
+\r
+ if (name.equals(\r
+ LiferayPortletConfig.RUNTIME_OPTION_PORTAL_CONTEXT) &&\r
+ !values.isEmpty() && GetterUtil.getBoolean(values.get(0))) {\r
+\r
+ portletApp.setWARFile(false);\r
+ }\r
+ }\r
+\r
+ long timestamp = ServletContextUtil.getLastModified(servletContext);\r
+\r
+ for (Element portletElement : rootElement.elements("portlet")) {\r
+ _readPortletXML(\r
+ servletContextName, portletsPool, pluginPackage, portletApp,\r
+ portletIds, timestamp, portletElement);\r
+ }\r
+\r
+ for (Element filterElement : rootElement.elements("filter")) {\r
+ String filterName = filterElement.elementText("filter-name");\r
+ String filterClass = filterElement.elementText("filter-class");\r
+\r
+ Set<String> lifecycles = new LinkedHashSet<String>();\r
+\r
+ for (Element lifecycleElement :\r
+ filterElement.elements("lifecycle")) {\r
+\r
+ lifecycles.add(lifecycleElement.getText());\r
+ }\r
+\r
+ Map<String, String> initParams = new HashMap<String, String>();\r
+\r
+ for (Element initParamElement :\r
+ filterElement.elements("init-param")) {\r
+\r
+ initParams.put(\r
+ initParamElement.elementText("name"),\r
+ initParamElement.elementText("value"));\r
+ }\r
+\r
+ PortletFilter portletFilter = new PortletFilterImpl(\r
+ filterName, filterClass, lifecycles, initParams, portletApp);\r
+\r
+ portletApp.addPortletFilter(portletFilter);\r
+ }\r
+\r
+ for (Element filterMappingElement :\r
+ rootElement.elements("filter-mapping")) {\r
+\r
+ String filterName = filterMappingElement.elementText("filter-name");\r
+\r
+ for (Element portletNameElement :\r
+ filterMappingElement.elements("portlet-name")) {\r
+\r
+ String portletName = portletNameElement.getTextTrim();\r
+\r
+ PortletFilter portletFilter = portletApp.getPortletFilter(\r
+ filterName);\r
+\r
+ if (portletFilter == null) {\r
+ _log.error(\r
+ "Filter mapping references unnknown filter name " +\r
+ filterName);\r
+\r
+ continue;\r
+ }\r
+\r
+ List<Portlet> portletModels = _getPortletsByPortletName(\r
+ portletName, servletContextName, portletsPool);\r
+\r
+ if (portletModels.size() == 0) {\r
+ _log.error(\r
+ "Filter mapping with filter name " + filterName +\r
+ " references unnknown portlet name " + portletName);\r
+ }\r
+\r
+ for (Portlet portletModel : portletModels) {\r
+ portletModel.getPortletFilters().put(\r
+ filterName, portletFilter);\r
+ }\r
+ }\r
+ }\r
+\r
+ for (Element listenerElement : rootElement.elements("listener")) {\r
+ String listenerClass = listenerElement.elementText(\r
+ "listener-class");\r
+\r
+ PortletURLListener portletURLListener = new PortletURLListenerImpl(\r
+ listenerClass, portletApp);\r
+\r
+ portletApp.addPortletURLListener(portletURLListener);\r
+ }\r
+\r
+ return portletIds;\r
+ }\r
+\r
+ private Set<String> _readWebXML(String xml) throws Exception {\r
+ Set<String> servletURLPatterns = new LinkedHashSet<String>();\r
+\r
+ if (xml == null) {\r
+ return servletURLPatterns;\r
+ }\r
+\r
+ Document document = SAXReaderUtil.read(xml);\r
+\r
+ Element rootElement = document.getRootElement();\r
+\r
+ for (Element servletMappingElement :\r
+ rootElement.elements("servlet-mapping")) {\r
+\r
+ String urlPattern = servletMappingElement.elementText(\r
+ "url-pattern");\r
+\r
+ servletURLPatterns.add(urlPattern);\r
+ }\r
+\r
+ return servletURLPatterns;\r
+ }\r
+\r
+ private void _setSpriteImages(\r
+ ServletContext servletContext, PortletApp portletApp,\r
+ String resourcePath)\r
+ throws Exception {\r
+\r
+ Set<String> resourcePaths = servletContext.getResourcePaths(\r
+ resourcePath);\r
+\r
+ if (resourcePaths == null) {\r
+ return;\r
+ }\r
+\r
+ List<File> imageFiles = new ArrayList<File>(resourcePaths.size());\r
+\r
+ for (String curResourcePath : resourcePaths) {\r
+ if (curResourcePath.endsWith(StringPool.SLASH)) {\r
+ _setSpriteImages(servletContext, portletApp, curResourcePath);\r
+ }\r
+ else if (curResourcePath.endsWith(".png")) {\r
+ String realPath = ServletContextUtil.getRealPath(\r
+ servletContext, curResourcePath);\r
+\r
+ if (realPath != null) {\r
+ File imageFile = new File(realPath);\r
+\r
+ imageFiles.add(imageFile);\r
+ }\r
+ else {\r
+ if (ServerDetector.isTomcat()) {\r
+ if (_log.isInfoEnabled()) {\r
+ _log.info(ServletContextUtil.LOG_INFO_SPRITES);\r
+ }\r
+ }\r
+ else {\r
+ _log.error(\r
+ "Real path for " + curResourcePath + " is null");\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ String spriteFileName = PropsValues.SPRITE_FILE_NAME;\r
+ String spritePropertiesFileName =\r
+ PropsValues.SPRITE_PROPERTIES_FILE_NAME;\r
+ String spritePropertiesRootPath = ServletContextUtil.getRealPath(\r
+ servletContext, StringPool.SLASH);\r
+\r
+ Properties spriteProperties = SpriteProcessorUtil.generate(\r
+ servletContext, imageFiles, spriteFileName,\r
+ spritePropertiesFileName, spritePropertiesRootPath, 16, 16, 10240);\r
+\r
+ if (spriteProperties == null) {\r
+ return;\r
+ }\r
+\r
+ spriteFileName =\r
+ resourcePath.substring(0, resourcePath.length()) + spriteFileName;\r
+\r
+ portletApp.setSpriteImages(spriteFileName, spriteProperties);\r
+ }\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(\r
+ PortletLocalServiceImpl.class);\r
+\r
+ private static Map<Long, Map<String, Portlet>> _companyPortletsPool =\r
+ new ConcurrentHashMap<Long, Map<String, Portlet>>();\r
+ private static Map<String, Portlet> _customAttributesDisplayPortlets =\r
+ new ConcurrentHashMap<String, Portlet>();\r
+ private static Map<String, Portlet> _friendlyURLMapperPortlets =\r
+ new ConcurrentHashMap<String, Portlet>();\r
+ private static Map<String, PortletApp> _portletAppsPool =\r
+ new ConcurrentHashMap<String, PortletApp>();\r
+ private static Map<String, String> _portletIdsByStrutsPath =\r
+ new ConcurrentHashMap<String, String>();\r
+ private static Map<String, Portlet> _portletsPool =\r
+ new ConcurrentHashMap<String, Portlet>();\r
+\r
+}
\ No newline at end of file