--- /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.util;\r
+\r
+import java.sql.Connection;\r
+import java.sql.PreparedStatement;\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import javax.servlet.ServletContext;\r
+import javax.servlet.http.HttpServletRequest;\r
+\r
+import com.liferay.portal.NoSuchCompanyException;\r
+import com.liferay.portal.events.EventsProcessorUtil;\r
+import com.liferay.portal.kernel.dao.jdbc.DataAccess;\r
+import com.liferay.portal.kernel.dao.shard.ShardUtil;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.util.ArrayUtil;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.HttpUtil;\r
+import com.liferay.portal.kernel.util.PropsKeys;\r
+import com.liferay.portal.kernel.util.SetUtil;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.model.Company;\r
+import com.liferay.portal.model.Group;\r
+import com.liferay.portal.model.LayoutSet;\r
+import com.liferay.portal.model.PortletCategory;\r
+import com.liferay.portal.model.VirtualHost;\r
+import com.liferay.portal.search.lucene.LuceneHelperUtil;\r
+import com.liferay.portal.security.auth.CompanyThreadLocal;\r
+import com.liferay.portal.security.ldap.LDAPSettingsUtil;\r
+import com.liferay.portal.security.ldap.PortalLDAPUtil;\r
+import com.liferay.portal.service.CompanyLocalServiceUtil;\r
+import com.liferay.portal.service.GroupLocalServiceUtil;\r
+import com.liferay.portal.service.LayoutSetLocalServiceUtil;\r
+import com.liferay.portal.service.PortletLocalServiceUtil;\r
+import com.liferay.portal.service.VirtualHostLocalServiceUtil;\r
+import com.liferay.portlet.journal.service.JournalContentSearchLocalServiceUtil;\r
+import com.pentila.entSavoie.synchroLdap.impl.SynchronizationManager;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Jose Oliver\r
+ * @author Atul Patel\r
+ * @author Mika Koivisto\r
+ */\r
+public class PortalInstances {\r
+\r
+ public static void addCompanyId(long companyId) {\r
+ _instance._addCompanyId(companyId);\r
+ }\r
+\r
+ public static long getCompanyId(HttpServletRequest request) {\r
+ return _instance._getCompanyId(request);\r
+ }\r
+\r
+ public static long[] getCompanyIds() {\r
+ return _instance._getCompanyIds();\r
+ }\r
+\r
+ public static long[] getCompanyIdsBySQL() throws SQLException {\r
+ return _instance._getCompanyIdsBySQL();\r
+ }\r
+\r
+ public static long getDefaultCompanyId() {\r
+ return _instance._getDefaultCompanyId();\r
+ }\r
+\r
+ public static String[] getWebIds() {\r
+ return _instance._getWebIds();\r
+ }\r
+\r
+ public static long initCompany(\r
+ ServletContext servletContext, String webId) {\r
+\r
+ return _instance._initCompany(servletContext, webId);\r
+ }\r
+\r
+ public static boolean isAutoLoginIgnoreHost(String host) {\r
+ return _instance._isAutoLoginIgnoreHost(host);\r
+ }\r
+\r
+ public static boolean isAutoLoginIgnorePath(String path) {\r
+ return _instance._isAutoLoginIgnorePath(path);\r
+ }\r
+\r
+ public static boolean isCompanyActive(long companyId) {\r
+ return _instance._isCompanyActive(companyId);\r
+ }\r
+\r
+ public static boolean isVirtualHostsIgnoreHost(String host) {\r
+ return _instance._isVirtualHostsIgnoreHost(host);\r
+ }\r
+\r
+ public static boolean isVirtualHostsIgnorePath(String path) {\r
+ return _instance._isVirtualHostsIgnorePath(path);\r
+ }\r
+\r
+ public static void reload(ServletContext servletContext) {\r
+ _instance._reload(servletContext);\r
+ }\r
+\r
+ private PortalInstances() {\r
+ _companyIds = new long[0];\r
+ _autoLoginIgnoreHosts = SetUtil.fromArray(\r
+ PropsUtil.getArray(PropsKeys.AUTO_LOGIN_IGNORE_HOSTS));\r
+ _autoLoginIgnorePaths = SetUtil.fromArray(\r
+ PropsUtil.getArray(PropsKeys.AUTO_LOGIN_IGNORE_PATHS));\r
+ _virtualHostsIgnoreHosts = SetUtil.fromArray(\r
+ PropsUtil.getArray(PropsKeys.VIRTUAL_HOSTS_IGNORE_HOSTS));\r
+ _virtualHostsIgnorePaths = SetUtil.fromArray(\r
+ PropsUtil.getArray(PropsKeys.VIRTUAL_HOSTS_IGNORE_PATHS));\r
+ }\r
+\r
+ private void _addCompanyId(long companyId) {\r
+ if (ArrayUtil.contains(_companyIds, companyId)) {\r
+ return;\r
+ }\r
+\r
+ long[] companyIds = new long[_companyIds.length + 1];\r
+\r
+ System.arraycopy(_companyIds, 0, companyIds, 0, _companyIds.length);\r
+\r
+ companyIds[_companyIds.length] = companyId;\r
+\r
+ _companyIds = companyIds;\r
+ }\r
+\r
+ private long _getCompanyId(HttpServletRequest request) {\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Get company id");\r
+ }\r
+\r
+ Long companyIdObj = (Long)request.getAttribute(WebKeys.COMPANY_ID);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Company id from request " + companyIdObj);\r
+ }\r
+\r
+ if (companyIdObj != null) {\r
+ return companyIdObj.longValue();\r
+ }\r
+\r
+ long companyId = _getCompanyIdByVirtualHosts(request);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Company id from host " + companyId);\r
+ }\r
+\r
+ if (companyId <= 0) {\r
+ long cookieCompanyId = GetterUtil.getLong(\r
+ CookieKeys.getCookie(request, CookieKeys.COMPANY_ID, false));\r
+\r
+ if (cookieCompanyId > 0) {\r
+ try {\r
+ CompanyLocalServiceUtil.getCompanyById(cookieCompanyId);\r
+\r
+ companyId = cookieCompanyId;\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Company id from cookie " + companyId);\r
+ }\r
+ }\r
+ catch (NoSuchCompanyException nsce) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn(\r
+ "Company id from cookie " + cookieCompanyId +\r
+ " does not exist");\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (companyId <= 0) {\r
+ companyId = _getDefaultCompanyId();\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Default company id " + companyId);\r
+ }\r
+ }\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Set company id " + companyId);\r
+ }\r
+\r
+ request.setAttribute(WebKeys.COMPANY_ID, new Long(companyId));\r
+\r
+ CompanyThreadLocal.setCompanyId(companyId);\r
+\r
+ if (Validator.isNotNull(PropsValues.VIRTUAL_HOSTS_DEFAULT_SITE_NAME) &&\r
+ (request.getAttribute(WebKeys.VIRTUAL_HOST_LAYOUT_SET) == null)) {\r
+\r
+ try {\r
+ Group group = GroupLocalServiceUtil.getGroup(\r
+ companyId, PropsValues.VIRTUAL_HOSTS_DEFAULT_SITE_NAME);\r
+\r
+ LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(\r
+ group.getGroupId(), false);\r
+\r
+ if (Validator.isNull(layoutSet.getVirtualHostname())) {\r
+ request.setAttribute(\r
+ WebKeys.VIRTUAL_HOST_LAYOUT_SET, layoutSet);\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+ }\r
+\r
+ return companyId;\r
+ }\r
+\r
+ private long _getCompanyIdByVirtualHosts(HttpServletRequest request) {\r
+ String host = PortalUtil.getHost(request);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Host " + host);\r
+ }\r
+\r
+ if (Validator.isNull(host) || _isVirtualHostsIgnoreHost(host)) {\r
+ return 0;\r
+ }\r
+\r
+ try {\r
+ VirtualHost virtualHost =\r
+ VirtualHostLocalServiceUtil.fetchVirtualHost(host);\r
+\r
+ if (virtualHost == null) {\r
+ return 0;\r
+ }\r
+\r
+ if (virtualHost.getLayoutSetId() != 0) {\r
+ LayoutSet layoutSet = null;\r
+\r
+ try {\r
+ ShardUtil.pushCompanyService(virtualHost.getCompanyId());\r
+\r
+ layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(\r
+ virtualHost.getLayoutSetId());\r
+ }\r
+ finally {\r
+ ShardUtil.popCompanyService();\r
+ }\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug(\r
+ "Company " + virtualHost.getCompanyId() +\r
+ " is associated with layout set " +\r
+ virtualHost.getLayoutSetId());\r
+ }\r
+\r
+ request.setAttribute(\r
+ WebKeys.VIRTUAL_HOST_LAYOUT_SET, layoutSet);\r
+ }\r
+\r
+ return virtualHost.getCompanyId();\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ return 0;\r
+ }\r
+\r
+ private long[] _getCompanyIds() {\r
+ return _companyIds;\r
+ }\r
+\r
+ private long[] _getCompanyIdsBySQL() throws SQLException {\r
+ List<Long> companyIds = new ArrayList<Long>();\r
+\r
+ Connection con = null;\r
+ PreparedStatement ps = null;\r
+ ResultSet rs = null;\r
+\r
+ try {\r
+ con = DataAccess.getConnection();\r
+\r
+ ps = con.prepareStatement(_GET_COMPANY_IDS);\r
+\r
+ rs = ps.executeQuery();\r
+\r
+ while (rs.next()) {\r
+ long companyId = rs.getLong("companyId");\r
+\r
+ companyIds.add(companyId);\r
+ }\r
+ }\r
+ finally {\r
+ DataAccess.cleanUp(con, ps, rs);\r
+ }\r
+\r
+ return ArrayUtil.toArray(\r
+ companyIds.toArray(new Long[companyIds.size()]));\r
+ }\r
+\r
+ private long _getDefaultCompanyId() {\r
+ return _companyIds[0];\r
+ }\r
+\r
+ private String[] _getWebIds() {\r
+ if (_webIds != null) {\r
+ return _webIds;\r
+ }\r
+\r
+ if (Validator.isNull(PropsValues.COMPANY_DEFAULT_WEB_ID)) {\r
+ throw new RuntimeException("Default web id must not be null");\r
+ }\r
+\r
+ try {\r
+ List<Company> companies = CompanyLocalServiceUtil.getCompanies(\r
+ false);\r
+\r
+ List<String> webIdsList = new ArrayList<String>(companies.size());\r
+\r
+ for (Company company : companies) {\r
+ String webId = company.getWebId();\r
+\r
+ if (webId.equals(PropsValues.COMPANY_DEFAULT_WEB_ID)) {\r
+ webIdsList.add(0, webId);\r
+ }\r
+ else {\r
+ webIdsList.add(webId);\r
+ }\r
+ }\r
+\r
+ _webIds = webIdsList.toArray(new String[webIdsList.size()]);\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ if ((_webIds == null) || (_webIds.length == 0)) {\r
+ _webIds = new String[] {PropsValues.COMPANY_DEFAULT_WEB_ID};\r
+ }\r
+\r
+ return _webIds;\r
+ }\r
+\r
+ private long _initCompany(ServletContext servletContext, String webId) {\r
+\r
+ // Begin initializing company\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Begin initializing company with web id " + webId);\r
+ }\r
+\r
+ long companyId = 0;\r
+\r
+ try {\r
+ Company company = CompanyLocalServiceUtil.checkCompany(webId);\r
+\r
+ companyId = company.getCompanyId();\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ CompanyThreadLocal.setCompanyId(companyId);\r
+\r
+ // Lucene\r
+\r
+ LuceneHelperUtil.startup(companyId);\r
+\r
+ // Initialize display\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Initialize display");\r
+ }\r
+\r
+ try {\r
+ String xml = HttpUtil.URLtoString(servletContext.getResource(\r
+ "/WEB-INF/liferay-display.xml"));\r
+\r
+ PortletCategory portletCategory = (PortletCategory)WebAppPool.get(\r
+ companyId, WebKeys.PORTLET_CATEGORY);\r
+\r
+ if (portletCategory == null) {\r
+ portletCategory = new PortletCategory();\r
+ }\r
+\r
+ PortletCategory newPortletCategory =\r
+ PortletLocalServiceUtil.getEARDisplay(xml);\r
+\r
+ portletCategory.merge(newPortletCategory);\r
+\r
+ for (int i = 0; i < _companyIds.length; i++) {\r
+ long currentCompanyId = _companyIds[i];\r
+\r
+ PortletCategory currentPortletCategory =\r
+ (PortletCategory)WebAppPool.get(\r
+ currentCompanyId, WebKeys.PORTLET_CATEGORY);\r
+\r
+ if (currentPortletCategory != null) {\r
+ portletCategory.merge(currentPortletCategory);\r
+ }\r
+ }\r
+\r
+ WebAppPool.put(\r
+ companyId, WebKeys.PORTLET_CATEGORY, portletCategory);\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ // Check journal content search\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Check journal content search");\r
+ }\r
+\r
+ if (GetterUtil.getBoolean(\r
+ PropsUtil.get(\r
+ PropsKeys.JOURNAL_SYNC_CONTENT_SEARCH_ON_STARTUP))) {\r
+\r
+ try {\r
+ JournalContentSearchLocalServiceUtil.checkContentSearches(\r
+ companyId);\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+ }\r
+\r
+ // LDAP Import\r
+\r
+ try {\r
+ if (LDAPSettingsUtil.isImportOnStartup(companyId)) {\r
+ SynchronizationManager.runSynchronization();\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ // Process application startup events\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Process application startup events");\r
+ }\r
+\r
+ try {\r
+ EventsProcessorUtil.process(\r
+ PropsKeys.APPLICATION_STARTUP_EVENTS,\r
+ PropsValues.APPLICATION_STARTUP_EVENTS,\r
+ new String[] {String.valueOf(companyId)});\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ // End initializing company\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug(\r
+ "End initializing company with web id " + webId +\r
+ " and company id " + companyId);\r
+ }\r
+\r
+ addCompanyId(companyId);\r
+\r
+ return companyId;\r
+ }\r
+\r
+ private boolean _isAutoLoginIgnoreHost(String host) {\r
+ return _autoLoginIgnoreHosts.contains(host);\r
+ }\r
+\r
+ private boolean _isAutoLoginIgnorePath(String path) {\r
+ return _autoLoginIgnorePaths.contains(path);\r
+ }\r
+\r
+ private boolean _isCompanyActive(long companyId) {\r
+ try {\r
+ Company company = CompanyLocalServiceUtil.fetchCompanyById(\r
+ companyId);\r
+\r
+ if (company != null) {\r
+ return company.isActive();\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ private boolean _isVirtualHostsIgnoreHost(String host) {\r
+ return _virtualHostsIgnoreHosts.contains(host);\r
+ }\r
+\r
+ private boolean _isVirtualHostsIgnorePath(String path) {\r
+ return _virtualHostsIgnorePaths.contains(path);\r
+ }\r
+\r
+ private void _reload(ServletContext servletContext) {\r
+ _companyIds = new long[0];\r
+ _webIds = null;\r
+\r
+ String[] webIds = _getWebIds();\r
+\r
+ for (String webId : webIds) {\r
+ _initCompany(servletContext, webId);\r
+ }\r
+ }\r
+\r
+ private static final String _GET_COMPANY_IDS =\r
+ "select companyId from Company";\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(PortalInstances.class);\r
+\r
+ private static PortalInstances _instance = new PortalInstances();\r
+\r
+ private Set<String> _autoLoginIgnoreHosts;\r
+ private Set<String> _autoLoginIgnorePaths;\r
+ private long[] _companyIds;\r
+ private Set<String> _virtualHostsIgnoreHosts;\r
+ private Set<String> _virtualHostsIgnorePaths;\r
+ private String[] _webIds;\r
+\r
+}
\ No newline at end of file