/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This file is part of Liferay Social Office. Liferay Social Office is free * software: you can redistribute it and/or modify it under the terms of the GNU * Affero General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later version. * * Liferay Social Office is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License * for more details. * * You should have received a copy of the GNU General Public License along with * Liferay Social Office. If not, see http://www.gnu.org/licenses/agpl-3.0.html. */ package com.liferay.so.util; import com.liferay.expando.kernel.model.ExpandoColumn; import com.liferay.expando.kernel.model.ExpandoColumnConstants; import com.liferay.expando.kernel.model.ExpandoTable; import com.liferay.expando.kernel.model.ExpandoTableConstants; import com.liferay.expando.kernel.service.ExpandoColumnLocalServiceUtil; import com.liferay.expando.kernel.service.ExpandoTableLocalServiceUtil; import com.liferay.expando.kernel.service.ExpandoValueLocalServiceUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.model.LayoutConstants; import com.liferay.portal.kernel.model.LayoutSetPrototype; import com.liferay.portal.kernel.model.Portlet; import com.liferay.portal.kernel.model.ResourceConstants; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.service.GroupLocalServiceUtil; import com.liferay.portal.kernel.service.LayoutLocalServiceUtil; import com.liferay.portal.kernel.service.LayoutSetLocalServiceUtil; import com.liferay.portal.kernel.service.LayoutSetPrototypeLocalServiceUtil; import com.liferay.portal.kernel.service.PortletLocalServiceUtil; import com.liferay.portal.kernel.service.ResourcePermissionLocalServiceUtil; import com.liferay.portal.kernel.service.RoleLocalServiceUtil; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.LocalizationUtil; import com.liferay.portal.kernel.util.PortletKeys; import com.liferay.portal.kernel.util.UnicodeProperties; import com.liferay.site.my.sites.web.constants.MySitesPortletKeys; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * @author Brian Wing Shun Chan * @author Ryan Park * @author Jonathan Lee */ public class InstanceUtil { public static void initInstance(long companyId) { try { setupRole(companyId); setupExpando(companyId); initLayoutSetPrototype(companyId); setInitialized(companyId, true); } catch (Exception e) { _log.error(e, e); } } public static void initLayoutSetPrototype(long companyId) throws Exception { setupLayoutSetPrototypeSite(companyId); setupLayoutSetPrototypeUserPrivate(companyId); setupLayoutSetPrototypeUserPublic(companyId); } public static void initRuntime(long companyId) { // Directory Portlet portlet = PortletLocalServiceUtil.getPortletById( PortletKeys.DIRECTORY); portlet.setAddDefaultResource(true); // My Sites portlet = PortletLocalServiceUtil.getPortletById( MySitesPortletKeys.MY_SITES); portlet.setAddDefaultResource(true); // Clear cache PortletLocalServiceUtil.clearCache(); } public static boolean isInitialized(long companyId) { try { Group group = GroupLocalServiceUtil.getCompanyGroup(companyId); UnicodeProperties typeSettingsProperties = group.getTypeSettingsProperties(); return GetterUtil.getBoolean( typeSettingsProperties.getProperty( "social-office-initialized")); } catch (Exception e) { return false; } } public static void setInitialized(long companyId, boolean initialized) throws Exception { Group group = GroupLocalServiceUtil.getCompanyGroup(companyId); UnicodeProperties typeSettingsProperties = group.getTypeSettingsProperties(); typeSettingsProperties.setProperty( "social-office-initialized", String.valueOf(initialized)); GroupLocalServiceUtil.updateGroup( group.getGroupId(), typeSettingsProperties.toString()); } protected static LayoutSetPrototype addLayoutSetPrototype( long companyId, String name) throws Exception { Map<Locale, String> localeNamesMap = new HashMap<>(); Locale defaultLocale = LocaleUtil.getDefault(); localeNamesMap.put(defaultLocale, name); String description = name; boolean active = true; long defaultUserId = UserLocalServiceUtil.getDefaultUserId(companyId); LayoutSetPrototype layoutSetPrototype = LayoutSetPrototypeLocalServiceUtil.addLayoutSetPrototype( defaultUserId, companyId, localeNamesMap, description, active, true, new ServiceContext()); UnicodeProperties settingsProperties = layoutSetPrototype.getSettingsProperties(); settingsProperties.setProperty( "customJspServletContextName", "so-hook"); layoutSetPrototype = LayoutSetPrototypeLocalServiceUtil.updateLayoutSetPrototype( layoutSetPrototype.getLayoutSetPrototypeId(), settingsProperties.toString()); return layoutSetPrototype; } protected static Map<Locale, String> getLocalizationMap(String key) { return LocalizationUtil.getLocalizationMap( "content.Language", InstanceUtil.class.getClassLoader(), key, false); } protected static void setupExpando(long companyId) throws Exception { ExpandoTable expandoTable = null; // Group try { expandoTable = ExpandoTableLocalServiceUtil.addTable( companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME); } catch (Exception e) { expandoTable = ExpandoTableLocalServiceUtil.getTable( companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME); } try { ExpandoColumn expandoColumn = ExpandoColumnLocalServiceUtil.addColumn( expandoTable.getTableId(), "socialOfficeEnabled", ExpandoColumnConstants.BOOLEAN); updatePermissions(expandoColumn); } catch (Exception e) { } // Layout set prototype try { expandoTable = ExpandoTableLocalServiceUtil.addTable( companyId, LayoutSetPrototype.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME); } catch (Exception e) { expandoTable = ExpandoTableLocalServiceUtil.getTable( companyId, LayoutSetPrototype.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME); } try { ExpandoColumn expandoColumn = ExpandoColumnLocalServiceUtil.addColumn( expandoTable.getTableId(), SocialOfficeConstants.LAYOUT_SET_PROTOTYPE_KEY, ExpandoColumnConstants.STRING); updatePermissions(expandoColumn); } catch (Exception e) { } } protected static void setupLayoutSetPrototypeSite(long companyId) throws Exception { LayoutSetPrototype layoutSetPrototype = addLayoutSetPrototype( companyId, "Default Social Office Site"); ExpandoValueLocalServiceUtil.addValue( companyId, LayoutSetPrototype.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME, SocialOfficeConstants.LAYOUT_SET_PROTOTYPE_KEY, layoutSetPrototype.getLayoutSetPrototypeId(), SocialOfficeConstants.LAYOUT_SET_PROTOTYPE_KEY_SITE); Role role = RoleLocalServiceUtil.getRole( layoutSetPrototype.getCompanyId(), RoleConstants.SOCIAL_OFFICE_USER); ResourcePermissionLocalServiceUtil.setResourcePermissions( layoutSetPrototype.getCompanyId(), LayoutSetPrototype.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(layoutSetPrototype.getPrimaryKey()), role.getRoleId(), new String[] {ActionKeys.VIEW}); Group group = layoutSetPrototype.getGroup(); LayoutLocalServiceUtil.deleteLayouts( group.getGroupId(), true, new ServiceContext()); LayoutSetLocalServiceUtil.updateLookAndFeel( group.getGroupId(), "so_WAR_sotheme", "01", ""); // Home Layout layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("home"), null, PortletPropsValues.SITE_PROTOTYPE_LAYOUT_TEMPLATE); LayoutUtil.addPortlets( group, layout, "/home", PortletPropsKeys.SITE_PROTOTYPE_PORTLETS); LayoutUtil.configureRSS(layout); LayoutUtil.updatePermissions(layout, true); // Calendar layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("calendar"), null, "1_column"); LayoutUtil.addPortlets( group, layout, "/calendar", PortletPropsKeys.SITE_PROTOTYPE_PORTLETS); LayoutUtil.updatePermissions(layout, true); // Documents layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("documents"), null, "1_column"); LayoutUtil.addPortlets( group, layout, "/documents", PortletPropsKeys.SITE_PROTOTYPE_PORTLETS); LayoutUtil.configureAssetPublisher(layout); LayoutUtil.updatePermissions(layout, true); // Forums layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("forums"), null, "1_column"); LayoutUtil.addPortlets( group, layout, "/forums", PortletPropsKeys.SITE_PROTOTYPE_PORTLETS); LayoutUtil.removePortletBorder(layout, "73"); LayoutUtil.removePortletBorder(layout, "19"); LayoutUtil.configureAssetPublisher(layout); LayoutUtil.configureMessageBoards(layout); LayoutUtil.updatePermissions(layout, true); // Blog layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("blogs"), null, "2_columns_iii"); LayoutUtil.addPortlets( group, layout, "/blog", PortletPropsKeys.SITE_PROTOTYPE_PORTLETS); LayoutUtil.configureAssetPublisher(layout); LayoutUtil.updatePermissions(layout, true); // Wiki layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("wiki"), null, "1_column"); LayoutUtil.addPortlets( group, layout, "/wiki", PortletPropsKeys.SITE_PROTOTYPE_PORTLETS); LayoutUtil.configureAssetPublisher(layout); LayoutUtil.updatePermissions(layout, true); // Members layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("members"), null, "1_column"); LayoutUtil.addPortlets( group, layout, "/members", PortletPropsKeys.SITE_PROTOTYPE_PORTLETS); LayoutUtil.removePortletBorder(layout, "2_WAR_soportlet"); LayoutUtil.updatePermissions(layout, true); } protected static void setupLayoutSetPrototypeUserPrivate(long companyId) throws Exception { LayoutSetPrototype layoutSetPrototype = addLayoutSetPrototype( companyId, "Social Office User Home"); ExpandoValueLocalServiceUtil.addValue( companyId, LayoutSetPrototype.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME, SocialOfficeConstants.LAYOUT_SET_PROTOTYPE_KEY, layoutSetPrototype.getLayoutSetPrototypeId(), SocialOfficeConstants.LAYOUT_SET_PROTOTYPE_KEY_USER_PRIVATE); Group group = layoutSetPrototype.getGroup(); LayoutLocalServiceUtil.deleteLayouts( group.getGroupId(), true, new ServiceContext()); LayoutSetLocalServiceUtil.updateLookAndFeel( group.getGroupId(), "so_WAR_sotheme", "01", ""); // Dashboard Layout layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("dashboard"), "/so/dashboard", "2_columns_iii"); LayoutUtil.addPortlets( group, layout, "/home", PortletPropsKeys.USER_PRIVATE_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, false); LayoutLocalServiceUtil.updatePriority(layout, 0); // Contacts Center layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("contacts-center"), "/so/contacts-center", "1_column"); LayoutUtil.addPortlets( group, layout, "/contacts-center", PortletPropsKeys.USER_PRIVATE_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 1); // Microblogs layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("microblogs"), "/so/microblogs", "1_column"); LayoutUtil.addPortlets( group, layout, "/microblogs", PortletPropsKeys.USER_PRIVATE_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 2); // Messages layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("messages"), "/so/messages", "1_column"); LayoutUtil.addPortlets( group, layout, "/messages", PortletPropsKeys.USER_PRIVATE_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 3); // My Documents layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("my-documents"), "/so/my-documents", "1_column"); LayoutUtil.addPortlets( group, layout, "/my-documents", PortletPropsKeys.USER_PRIVATE_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 4); // Tasks layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("tasks"), "/so/tasks", "1_column"); LayoutUtil.addPortlets( group, layout, "/tasks", PortletPropsKeys.USER_PRIVATE_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 5); } protected static void setupLayoutSetPrototypeUserPublic(long companyId) throws Exception { LayoutSetPrototype layoutSetPrototype = addLayoutSetPrototype( companyId, "Social Office User Profile"); ExpandoValueLocalServiceUtil.addValue( companyId, LayoutSetPrototype.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME, SocialOfficeConstants.LAYOUT_SET_PROTOTYPE_KEY, layoutSetPrototype.getLayoutSetPrototypeId(), SocialOfficeConstants.LAYOUT_SET_PROTOTYPE_KEY_USER_PUBLIC); Group group = layoutSetPrototype.getGroup(); LayoutLocalServiceUtil.deleteLayouts( group.getGroupId(), true, new ServiceContext()); LayoutSetLocalServiceUtil.updateLookAndFeel( group.getGroupId(), "so_WAR_sotheme", "01", ""); // Profile Layout layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("profile"), "/so/profile", "1_2_columns_ii"); LayoutUtil.addPortlets( group, layout, "/profile", PortletPropsKeys.USER_PUBLIC_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 0); // Contacts layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("contacts"), "/so/contacts", "1_column"); LayoutUtil.addPortlets( group, layout, "/contacts", PortletPropsKeys.USER_PUBLIC_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 1); // Microblogs layout = LayoutUtil.addLayout( group, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, getLocalizationMap("microblogs"), "/so/microblogs", "1_column"); LayoutUtil.addPortlets( group, layout, "/microblogs", PortletPropsKeys.USER_PUBLIC_LAYOUT_PORTLETS); LayoutUtil.updatePermissions(layout, true); LayoutLocalServiceUtil.updatePriority(layout, 2); } protected static void setupRole(long companyId) throws Exception { long defaultUserId = UserLocalServiceUtil.getDefaultUserId(companyId); Map<Locale, String> descriptionMap = new HashMap<>(); descriptionMap.put( LocaleUtil.getDefault(), "Social Office Users have access to the Social Office Suite."); Role role = RoleLocalServiceUtil.addRole( defaultUserId, null, 0, RoleConstants.SOCIAL_OFFICE_USER, null, descriptionMap, RoleConstants.TYPE_REGULAR, null, null); ResourcePermissionLocalServiceUtil.setResourcePermissions( companyId, PortletKeys.PORTAL, ResourceConstants.SCOPE_COMPANY, String.valueOf(companyId), role.getRoleId(), new String[] {ActionKeys.ADD_COMMUNITY}); ResourcePermissionLocalServiceUtil.setResourcePermissions( companyId, User.class.getName(), ResourceConstants.SCOPE_COMPANY, String.valueOf(companyId), role.getRoleId(), new String[] {ActionKeys.VIEW}); } protected static void updatePermissions(ExpandoColumn expandoColumn) throws Exception { Role role = RoleLocalServiceUtil.getRole( expandoColumn.getCompanyId(), RoleConstants.USER); String name = ExpandoColumn.class.getName(); int scope = ResourceConstants.SCOPE_INDIVIDUAL; String primKey = String.valueOf(expandoColumn.getPrimaryKey()); String[] actionIds = {ActionKeys.VIEW}; ResourcePermissionLocalServiceUtil.setResourcePermissions( expandoColumn.getCompanyId(), name, scope, primKey, role.getRoleId(), actionIds); } private static Log _log = LogFactoryUtil.getLog(InstanceUtil.class); }