/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.service.impl; import com.liferay.portal.kernel.bean.BeanReference; import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery; import com.liferay.portal.kernel.dao.orm.DynamicQuery; import com.liferay.portal.kernel.dao.orm.EntityCacheUtil; import com.liferay.portal.kernel.dao.orm.Property; import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil; import com.liferay.portal.kernel.exception.AccountNameException; import com.liferay.portal.kernel.exception.CompanyMxException; import com.liferay.portal.kernel.exception.CompanyVirtualHostException; import com.liferay.portal.kernel.exception.CompanyWebIdException; import com.liferay.portal.kernel.exception.LocaleException; import com.liferay.portal.kernel.exception.NoSuchVirtualHostException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.RequiredCompanyException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.instance.lifecycle.PortalInstanceLifecycleManager; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.messaging.async.Async; import com.liferay.portal.kernel.model.Account; import com.liferay.portal.kernel.model.Company; import com.liferay.portal.kernel.model.CompanyConstants; import com.liferay.portal.kernel.model.Contact; import com.liferay.portal.kernel.model.ContactConstants; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.GroupConstants; import com.liferay.portal.kernel.model.LayoutPrototype; import com.liferay.portal.kernel.model.LayoutSetPrototype; import com.liferay.portal.kernel.model.Organization; import com.liferay.portal.kernel.model.OrganizationConstants; import com.liferay.portal.kernel.model.PasswordPolicy; import com.liferay.portal.kernel.model.PortalPreferences; import com.liferay.portal.kernel.model.Portlet; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.model.RoleConstants; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.model.UserGroup; import com.liferay.portal.kernel.model.VirtualHost; import com.liferay.portal.kernel.search.Hits; import com.liferay.portal.kernel.search.SearchContext; import com.liferay.portal.kernel.search.SearchEngineHelperUtil; import com.liferay.portal.kernel.search.SearchException; import com.liferay.portal.kernel.search.facet.AssetEntriesFacet; import com.liferay.portal.kernel.search.facet.Facet; import com.liferay.portal.kernel.search.facet.ScopeFacet; import com.liferay.portal.kernel.search.facet.faceted.searcher.FacetedSearcher; import com.liferay.portal.kernel.search.facet.faceted.searcher.FacetedSearcherManagerUtil; import com.liferay.portal.kernel.security.auth.CompanyThreadLocal; import com.liferay.portal.kernel.service.persistence.CompanyProvider; import com.liferay.portal.kernel.service.persistence.CompanyProviderWrapper; import com.liferay.portal.kernel.transaction.Isolation; import com.liferay.portal.kernel.transaction.TransactionCommitCallbackUtil; import com.liferay.portal.kernel.transaction.Transactional; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.LocaleThreadLocal; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PortletKeys; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.TimeZoneUtil; import com.liferay.portal.kernel.util.UnicodeProperties; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.liveusers.LiveUsers; import com.liferay.portal.service.base.CompanyLocalServiceBaseImpl; import com.liferay.portal.util.PortalInstances; import com.liferay.portal.util.PrefsPropsUtil; import com.liferay.portal.util.PropsUtil; import com.liferay.portal.util.PropsValues; import com.liferay.registry.Registry; import com.liferay.registry.RegistryUtil; import com.liferay.registry.ServiceReference; import com.liferay.registry.ServiceTracker; import com.liferay.registry.ServiceTrackerCustomizer; import com.liferay.util.Encryptor; import com.liferay.util.EncryptorException; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.TimeZone; import java.util.concurrent.Callable; import javax.portlet.PortletException; import javax.portlet.PortletPreferences; /** * Provides the local service for adding, checking, and updating companies. Each * company refers to a separate portal instance. * * @author Brian Wing Shun Chan * @author Julio Camarero */ public class CompanyLocalServiceImpl extends CompanyLocalServiceBaseImpl { public CompanyLocalServiceImpl() { Registry registry = RegistryUtil.getRegistry(); _serviceTracker = registry.trackServices( PortalInstanceLifecycleManager.class, new PortalInstanceLifecycleManagerServiceTrackerCustomizer()); _serviceTracker.open(); } /** * Adds a company. * * @param webId the the company's web domain * @param virtualHostname the company's virtual host name * @param mx the company's mail domain * @param system whether the company is the very first company (i.e., the * super company) * @param maxUsers the max number of company users (optionally * <code>0</code>) * @param active whether the company is active * @return the company */ @Override public Company addCompany( String webId, String virtualHostname, String mx, boolean system, int maxUsers, boolean active) throws PortalException { // Company virtualHostname = StringUtil.toLowerCase( StringUtil.trim(virtualHostname)); if (Validator.isNull(webId) || webId.equals(PropsValues.COMPANY_DEFAULT_WEB_ID) || (companyPersistence.fetchByWebId(webId) != null)) { throw new CompanyWebIdException(); } validateVirtualHost(webId, virtualHostname); validateMx(mx); Company company = checkCompany(webId, mx); company = companyPersistence.fetchByPrimaryKey(company.getCompanyId()); company.setMx(mx); company.setSystem(system); company.setMaxUsers(maxUsers); company.setActive(active); companyPersistence.update(company); // Virtual host company = updateVirtualHostname( company.getCompanyId(), virtualHostname); return company; } /** * Returns the company with the web domain. * * The method sets mail domain to the web domain to the default name set in * portal.properties * * @param webId the company's web domain * @return the company with the web domain */ @Override public Company checkCompany(String webId) throws PortalException { String mx = webId; return companyLocalService.checkCompany(webId, mx); } /** * Returns the company with the web domain and mail domain. If no such * company exits, the method will create a new company. * * The method goes through a series of checks to ensure that the company * contains default users, groups, etc. * * @param webId the company's web domain * @param mx the company's mail domain * @return the company with the web domain and mail domain */ @Override @Transactional( isolation = Isolation.PORTAL, rollbackFor = {PortalException.class, SystemException.class} ) public Company checkCompany(String webId, String mx) throws PortalException { // Company Date now = new Date(); Company company = companyPersistence.fetchByWebId(webId); if (company == null) { long companyId = counterLocalService.increment(); company = companyPersistence.create(companyId); try { company.setKey(Encryptor.serializeKey(Encryptor.generateKey())); } catch (EncryptorException ee) { throw new SystemException(ee); } company.setWebId(webId); company.setMx(mx); company.setActive(true); company = companyPersistence.update(company); // Account String name = webId; if (webId.equals(PropsValues.COMPANY_DEFAULT_WEB_ID)) { name = PropsValues.COMPANY_DEFAULT_NAME; } String legalName = null; String legalId = null; String legalType = null; String sicCode = null; String tickerSymbol = null; String industry = null; String type = null; String size = null; updateAccount( company, name, legalName, legalId, legalType, sicCode, tickerSymbol, industry, type, size); // Virtual host if (webId.equals(PropsValues.COMPANY_DEFAULT_WEB_ID)) { company = updateVirtualHostname( companyId, _DEFAULT_VIRTUAL_HOST); } // Demo settings if (webId.equals("liferay.net")) { company = companyPersistence.findByWebId(webId); updateVirtualHostname(companyId, "demo.liferay.net"); updateSecurity( companyId, CompanyConstants.AUTH_TYPE_EA, true, true, true, true, false, true); PortletPreferences preferences = PrefsPropsUtil.getPreferences( companyId); try { preferences.setValue( PropsKeys.ADMIN_EMAIL_FROM_NAME, "Liferay Demo"); preferences.setValue( PropsKeys.ADMIN_EMAIL_FROM_ADDRESS, "test@liferay.net"); preferences.store(); } catch (IOException ioe) { throw new SystemException(ioe); } catch (PortletException pe) { throw new SystemException(pe); } } } preregisterCompany(company.getCompanyId()); CompanyProvider currentCompanyProvider = _companyProviderWrapper.getCompanyProvider(); Locale localeThreadLocalDefaultLocale = LocaleThreadLocal.getDefaultLocale(); try { Locale companyDefaultLocale = LocaleUtil.fromLanguageId( PropsValues.COMPANY_DEFAULT_LOCALE); LocaleThreadLocal.setDefaultLocale(companyDefaultLocale); final long companyId = company.getCompanyId(); _companyProviderWrapper.setCompanyProvider( new CustomCompanyProvider(companyId)); // Key checkCompanyKey(companyId); // Default user User defaultUser = userPersistence.fetchByC_DU(companyId, true); if (defaultUser != null) { if (!defaultUser.isAgreedToTermsOfUse()) { defaultUser.setAgreedToTermsOfUse(true); userPersistence.update(defaultUser); } } else { long userId = counterLocalService.increment(); defaultUser = userPersistence.create(userId); defaultUser.setCompanyId(companyId); defaultUser.setDefaultUser(true); defaultUser.setContactId(counterLocalService.increment()); defaultUser.setPassword("password"); defaultUser.setScreenName( String.valueOf(defaultUser.getUserId())); defaultUser.setEmailAddress("default@" + company.getMx()); defaultUser.setLanguageId( LocaleUtil.toLanguageId(companyDefaultLocale)); if (Validator.isNotNull( PropsValues.COMPANY_DEFAULT_TIME_ZONE)) { defaultUser.setTimeZoneId( PropsValues.COMPANY_DEFAULT_TIME_ZONE); } else { TimeZone timeZone = TimeZoneUtil.getDefault(); defaultUser.setTimeZoneId(timeZone.getID()); } String greeting = LanguageUtil.format( defaultUser.getLocale(), "welcome", null, false); defaultUser.setGreeting(greeting + StringPool.EXCLAMATION); defaultUser.setLoginDate(now); defaultUser.setFailedLoginAttempts(0); defaultUser.setAgreedToTermsOfUse(true); defaultUser.setStatus(WorkflowConstants.STATUS_APPROVED); userPersistence.update(defaultUser); // Contact Contact defaultContact = contactPersistence.create( defaultUser.getContactId()); defaultContact.setCompanyId(defaultUser.getCompanyId()); defaultContact.setUserId(defaultUser.getUserId()); defaultContact.setUserName(StringPool.BLANK); defaultContact.setClassName(User.class.getName()); defaultContact.setClassPK(defaultUser.getUserId()); defaultContact.setAccountId(company.getAccountId()); defaultContact.setParentContactId( ContactConstants.DEFAULT_PARENT_CONTACT_ID); defaultContact.setEmailAddress(defaultUser.getEmailAddress()); defaultContact.setFirstName(StringPool.BLANK); defaultContact.setMiddleName(StringPool.BLANK); defaultContact.setLastName(StringPool.BLANK); defaultContact.setMale(true); defaultContact.setBirthday(now); contactPersistence.update(defaultContact); } // System roles roleLocalService.checkSystemRoles(companyId); // System groups groupLocalService.checkSystemGroups(companyId); // Company group groupLocalService.checkCompanyGroup(companyId); // Default password policy passwordPolicyLocalService.checkDefaultPasswordPolicy(companyId); // Default user must have the Guest role Role guestRole = roleLocalService.getRole( companyId, RoleConstants.GUEST); roleLocalService.setUserRoles( defaultUser.getUserId(), new long[] {guestRole.getRoleId()}); // Default admin if (userPersistence.countByCompanyId(companyId) == 1) { String emailAddress = PropsValues.DEFAULT_ADMIN_EMAIL_ADDRESS_PREFIX + "@" + mx; userLocalService.addDefaultAdminUser( companyId, PropsValues.DEFAULT_ADMIN_SCREEN_NAME, emailAddress, defaultUser.getLocale(), PropsValues.DEFAULT_ADMIN_FIRST_NAME, PropsValues.DEFAULT_ADMIN_MIDDLE_NAME, PropsValues.DEFAULT_ADMIN_LAST_NAME); } // Portlets portletLocalService.checkPortlets(companyId); final Company finalCompany = company; TransactionCommitCallbackUtil.registerCallback( new Callable<Void>() { @Override public Void call() throws Exception { registerCompany(finalCompany); return null; } }); } finally { _companyProviderWrapper.setCompanyProvider(currentCompanyProvider); LocaleThreadLocal.setDefaultLocale(localeThreadLocalDefaultLocale); } return company; } /** * Checks if the company has an encryption key. It will create a key if one * does not exist. * * @param companyId the primary key of the company */ @Override public void checkCompanyKey(long companyId) throws PortalException { Company company = companyPersistence.findByPrimaryKey(companyId); if (company.getKeyObj() != null) { return; } try { company.setKey(Encryptor.serializeKey(Encryptor.generateKey())); } catch (EncryptorException ee) { throw new SystemException(ee); } companyPersistence.update(company); } @Override public Company deleteCompany(Company company) throws PortalException { return deleteCompany(company.getCompanyId()); } @Override public Company deleteCompany(long companyId) throws PortalException { if (companyId == PortalInstances.getDefaultCompanyId()) { throw new RequiredCompanyException(); } Long currentCompanyId = CompanyThreadLocal.getCompanyId(); boolean deleteInProcess = CompanyThreadLocal.isDeleteInProcess(); try { CompanyThreadLocal.setCompanyId(companyId); CompanyThreadLocal.setDeleteInProcess(true); return doDeleteCompany(companyId); } finally { CompanyThreadLocal.setCompanyId(currentCompanyId); CompanyThreadLocal.setDeleteInProcess(deleteInProcess); } } /** * Deletes the company's logo. * * @param companyId the primary key of the company * @return the deleted logo's company */ @Override public Company deleteLogo(long companyId) throws PortalException { Company company = companyPersistence.findByPrimaryKey(companyId); PortalUtil.updateImageId(company, false, null, "logoId", 0, 0, 0); return company; } /** * Returns the company with the primary key. * * @param companyId the primary key of the company * @return the company with the primary key, <code>null</code> if a company * with the primary key could not be found */ @Override public Company fetchCompanyById(long companyId) { return companyPersistence.fetchByPrimaryKey(companyId); } /** * Returns the company with the virtual host name. * * @param virtualHostname the virtual host name * @return the company with the virtual host name, <code>null</code> if a * company with the virtual host could not be found */ @Override public Company fetchCompanyByVirtualHost(String virtualHostname) { virtualHostname = StringUtil.toLowerCase( StringUtil.trim(virtualHostname)); VirtualHost virtualHost = virtualHostPersistence.fetchByHostname( virtualHostname); if ((virtualHost == null) || (virtualHost.getLayoutSetId() != 0)) { return null; } return companyPersistence.fetchByPrimaryKey(virtualHost.getCompanyId()); } /** * Returns all the companies. * * @return the companies */ @Override public List<Company> getCompanies() { return companyPersistence.findAll(); } /** * Returns all the companies used by WSRP. * * @param system whether the company is the very first company (i.e., the * super company) * @return the companies used by WSRP */ @Override public List<Company> getCompanies(boolean system) { return companyPersistence.findBySystem(system); } @Override public List<Company> getCompanies(boolean system, int start, int end) { return companyPersistence.findBySystem(system, start, end); } /** * Returns the number of companies used by WSRP. * * @param system whether the company is the very first company (i.e., the * super company) * @return the number of companies used by WSRP */ @Override public int getCompaniesCount(boolean system) { return companyPersistence.countBySystem(system); } /** * Returns the company with the primary key. * * @param companyId the primary key of the company * @return the company with the primary key */ @Override public Company getCompanyById(long companyId) throws PortalException { return companyPersistence.findByPrimaryKey(companyId); } /** * Returns the company with the logo. * * @param logoId the ID of the company's logo * @return the company with the logo */ @Override public Company getCompanyByLogoId(long logoId) throws PortalException { return companyPersistence.findByLogoId(logoId); } /** * Returns the company with the mail domain. * * @param mx the company's mail domain * @return the company with the mail domain */ @Override public Company getCompanyByMx(String mx) throws PortalException { return companyPersistence.findByMx(mx); } /** * Returns the company with the virtual host name. * * @param virtualHostname the company's virtual host name * @return the company with the virtual host name */ @Override public Company getCompanyByVirtualHost(String virtualHostname) throws PortalException { try { virtualHostname = StringUtil.toLowerCase( StringUtil.trim(virtualHostname)); VirtualHost virtualHost = virtualHostPersistence.findByHostname( virtualHostname); if (virtualHost.getLayoutSetId() != 0) { throw new CompanyVirtualHostException( "Virtual host is associated with layout set " + virtualHost.getLayoutSetId()); } return companyPersistence.findByPrimaryKey( virtualHost.getCompanyId()); } catch (NoSuchVirtualHostException nsvhe) { throw new CompanyVirtualHostException(nsvhe); } } /** * Returns the company with the web domain. * * @param webId the company's web domain * @return the company with the web domain */ @Override public Company getCompanyByWebId(String webId) throws PortalException { return companyPersistence.findByWebId(webId); } /** * Returns the user's company. * * @param userId the primary key of the user * @return Returns the first company if there is only one company or the * user's company if there are more than one company; <code>0</code> * otherwise * @throws Exception if a user with the primary key could not be found */ @Override public long getCompanyIdByUserId(long userId) throws Exception { long[] companyIds = PortalInstances.getCompanyIds(); long companyId = 0; if (companyIds.length == 1) { companyId = companyIds[0]; } else if (companyIds.length > 1) { try { User user = userPersistence.findByPrimaryKey(userId); companyId = user.getCompanyId(); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn( "Unable to get the company id for user " + userId, e); } } } return companyId; } /** * Removes the values that match the keys of the company's preferences. * * This method is called by {@link * com.liferay.portlet.portalsettings.action.EditLDAPServerAction} remotely * through {@link com.liferay.portal.kernel.service.CompanyService}. * * @param companyId the primary key of the company * @param keys the company's preferences keys to be remove */ @Override public void removePreferences(long companyId, String[] keys) { PortletPreferences preferences = PrefsPropsUtil.getPreferences( companyId); try { for (String key : keys) { preferences.reset(key); } preferences.store(); } catch (Exception e) { throw new SystemException(e); } } /** * Returns an ordered range of all assets that match the keywords in the * company. * * The method is called in {@link * com.liferay.portal.search.PortalOpenSearchImpl} which is not longer used * by the Search portlet. * * @param companyId the primary key of the company * @param userId the primary key of the user * @param keywords the keywords (space separated),which may occur in assets * in the company (optionally <code>null</code>) * @param start the lower bound of the range of assets to return * @param end the upper bound of the range of assets to return (not * inclusive) * @return the matching assets in the company */ @Override public Hits search( long companyId, long userId, String keywords, int start, int end) { return search(companyId, userId, null, 0, null, keywords, start, end); } /** * Returns an ordered range of all assets that match the keywords in the * portlet within the company. * * @param companyId the primary key of the company * @param userId the primary key of the user * @param portletId the primary key of the portlet (optionally * <code>null</code>) * @param groupId the primary key of the group (optionally <code>0</code>) * @param type the mime type of assets to return(optionally * <code>null</code>) * @param keywords the keywords (space separated), which may occur in any * assets in the portlet (optionally <code>null</code>) * @param start the lower bound of the range of assets to return * @param end the upper bound of the range of assets to return (not * inclusive) * @return the matching assets in the portlet within the company */ @Override public Hits search( long companyId, long userId, String portletId, long groupId, String type, String keywords, int start, int end) { FacetedSearcher facetedSearcher = FacetedSearcherManagerUtil.createFacetedSearcher(); SearchContext searchContext = createSearchContext( companyId, userId, portletId, groupId, keywords, start, end); addAssetEntriesFacet(searchContext); addScopeFacet(searchContext); try { return facetedSearcher.search(searchContext); } catch (SearchException se) { throw new SystemException(se); } } /** * Updates the company. * * @param companyId the primary key of the company * @param virtualHostname the company's virtual host name * @param mx the company's mail domain * @param maxUsers the max number of company users (optionally * <code>0</code>) * @param active whether the company is active * @return the company with the primary key */ @Override public Company updateCompany( long companyId, String virtualHostname, String mx, int maxUsers, boolean active) throws PortalException { // Company virtualHostname = StringUtil.toLowerCase( StringUtil.trim(virtualHostname)); if (!active) { if (companyId == PortalInstances.getDefaultCompanyId()) { active = true; } } Company company = companyPersistence.findByPrimaryKey(companyId); validateVirtualHost(company.getWebId(), virtualHostname); if (PropsValues.MAIL_MX_UPDATE) { validateMx(mx); company.setMx(mx); } company.setMaxUsers(maxUsers); company.setActive(active); companyPersistence.update(company); // Virtual host company = updateVirtualHostname(companyId, virtualHostname); return company; } /** * Update the company with additional account information. * * @param companyId the primary key of the company * @param virtualHostname the company's virtual host name * @param mx the company's mail domain * @param homeURL the company's home URL (optionally <code>null</code>) * @param logo whether to update the company's logo * @param logoBytes the new logo image data * @param name the company's account name(optionally <code>null</code>) * @param legalName the company's account legal name (optionally * <code>null</code>) * @param legalId the company's account legal ID (optionally * <code>null</code>) * @param legalType the company's account legal type (optionally * <code>null</code>) * @param sicCode the company's account SIC code (optionally * <code>null</code>) * @param tickerSymbol the company's account ticker symbol (optionally * <code>null</code>) * @param industry the company's account industry (optionally * <code>null</code>) * @param type the company's account type (optionally <code>null</code>) * @param size the company's account size (optionally <code>null</code>) * @return the company with the primary key */ @Override public Company updateCompany( long companyId, String virtualHostname, String mx, String homeURL, boolean logo, byte[] logoBytes, String name, String legalName, String legalId, String legalType, String sicCode, String tickerSymbol, String industry, String type, String size) throws PortalException { // Company virtualHostname = StringUtil.toLowerCase( StringUtil.trim(virtualHostname)); Company company = companyPersistence.findByPrimaryKey(companyId); validateVirtualHost(company.getWebId(), virtualHostname); if (PropsValues.MAIL_MX_UPDATE) { validateMx(mx); } validateName(companyId, name); if (PropsValues.MAIL_MX_UPDATE) { company.setMx(mx); } company.setHomeURL(homeURL); PortalUtil.updateImageId(company, logo, logoBytes, "logoId", 0, 0, 0); companyPersistence.update(company); // Account updateAccount( company, name, legalName, legalId, legalType, sicCode, tickerSymbol, industry, type, size); // Virtual host company = updateVirtualHostname(companyId, virtualHostname); return company; } /** * Update the company with additional account information. * * @param companyId the primary key of the company * @param virtualHostname the company's virtual host name * @param mx the company's mail domain * @param homeURL the company's home URL (optionally <code>null</code>) * @param name the company's account name(optionally <code>null</code>) * @param legalName the company's account legal name (optionally * <code>null</code>) * @param legalId the company's account legal ID (optionally * <code>null</code>) * @param legalType the company's account legal type (optionally * <code>null</code>) * @param sicCode the company's account SIC code (optionally * <code>null</code>) * @param tickerSymbol the company's account ticker symbol (optionally * <code>null</code>) * @param industry the company's account industry (optionally * <code>null</code>) * @param type the company's account type (optionally * <code>null</code>) * @param size the company's account size (optionally * <code>null</code>) * @return the company with the primary key * @deprecated As of 7.0.0, replaced by {@link #updateCompany(long, String, * String, String, boolean, byte[], String, String, String, * String, String, String, String, String, String)} */ @Deprecated @Override public Company updateCompany( long companyId, String virtualHostname, String mx, String homeURL, String name, String legalName, String legalId, String legalType, String sicCode, String tickerSymbol, String industry, String type, String size) throws PortalException { return updateCompany( companyId, virtualHostname, mx, homeURL, true, null, name, legalName, legalId, legalType, sicCode, tickerSymbol, industry, type, size); } /** * Update the company's display. * * @param companyId the primary key of the company * @param languageId the ID of the company's default user's language * @param timeZoneId the ID of the company's default user's time zone */ @Override public void updateDisplay( long companyId, String languageId, String timeZoneId) throws PortalException { User user = userLocalService.getDefaultUser(companyId); user.setLanguageId(languageId); user.setTimeZoneId(timeZoneId); userPersistence.update(user); updateDisplayGroupNames(companyId); } @Async @Override public void updateDisplayGroupNames(long companyId) throws PortalException { User user = userLocalService.getDefaultUser(companyId); Locale locale = user.getLocale(); if (locale.equals(LocaleUtil.getDefault())) { return; } ActionableDynamicQuery groupActionableDynamicQuery = groupLocalService.getActionableDynamicQuery(); groupActionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { Property activeProperty = PropertyFactoryUtil.forName( "active"); dynamicQuery.add(activeProperty.eq(Boolean.TRUE)); Property nameProperty = PropertyFactoryUtil.forName("name"); dynamicQuery.add(nameProperty.isNotNull()); Property typeProperty = PropertyFactoryUtil.forName("type"); dynamicQuery.add( typeProperty.ne(GroupConstants.TYPE_SITE_SYSTEM)); } }); groupActionableDynamicQuery.setCompanyId(user.getCompanyId()); groupActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<Group>() { @Override public void performAction(Group group) { Map<Locale, String> nameMap = group.getNameMap(); if (MapUtil.isEmpty(nameMap)) { return; } Locale locale = user.getLocale(); String groupDefaultName = nameMap.get(locale); if (Validator.isNotNull(groupDefaultName)) { return; } String oldGroupDefaultName = nameMap.get( LocaleUtil.getDefault()); if (_log.isWarnEnabled()) { StringBundler sb = new StringBundler(5); sb.append("No name was found for locale "); sb.append(locale); sb.append(". Using \""); sb.append(oldGroupDefaultName); sb.append("\" as the name instead."); _log.warn(sb.toString()); } nameMap.put(locale, oldGroupDefaultName); group.setNameMap(nameMap); groupLocalService.updateGroup(group); } }); groupActionableDynamicQuery.performActions(); } /** * Updates the company's logo. * * @param companyId the primary key of the company * @param bytes the bytes of the company's logo image * @return the company with the primary key */ @Override public Company updateLogo(long companyId, byte[] bytes) throws PortalException { Company company = checkLogo(companyId); imageLocalService.updateImage(company.getLogoId(), bytes); return company; } /** * Updates the company's logo. * * @param companyId the primary key of the company * @param file the file of the company's logo image * @return the company with the primary key */ @Override public Company updateLogo(long companyId, File file) throws PortalException { Company company = checkLogo(companyId); imageLocalService.updateImage(company.getLogoId(), file); return company; } /** * Update the company's logo. * * @param companyId the primary key of the company * @param is the input stream of the company's logo image * @return the company with the primary key */ @Override public Company updateLogo(long companyId, InputStream is) throws PortalException { Company company = checkLogo(companyId); imageLocalService.updateImage(company.getLogoId(), is); return company; } /** * Updates the company's preferences. The company's default properties are * found in portal.properties. * * @param companyId the primary key of the company * @param properties the company's properties. See {@link UnicodeProperties} */ @Override public void updatePreferences(long companyId, UnicodeProperties properties) throws PortalException { PortletPreferences portletPreferences = PrefsPropsUtil.getPreferences( companyId); try { String newLanguageIds = properties.getProperty(PropsKeys.LOCALES); if (Validator.isNotNull(newLanguageIds)) { String oldLanguageIds = portletPreferences.getValue( PropsKeys.LOCALES, StringPool.BLANK); if (!Objects.equals(oldLanguageIds, newLanguageIds)) { validateLanguageIds(newLanguageIds); LanguageUtil.resetAvailableLocales(companyId); // Invalidate cache of all layout set prototypes that belong // to this company. See LPS-36403. Date now = new Date(); for (LayoutSetPrototype layoutSetPrototype : layoutSetPrototypeLocalService. getLayoutSetPrototypes(companyId)) { layoutSetPrototype.setModifiedDate(now); layoutSetPrototypeLocalService.updateLayoutSetPrototype( layoutSetPrototype); } } } List<String> resetKeys = new ArrayList<>(); for (Map.Entry<String, String> entry : properties.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (value.equals(Portal.TEMP_OBFUSCATION_VALUE)) { continue; } String propsUtilValue = PropsUtil.get(key); if (!value.equals(propsUtilValue)) { portletPreferences.setValue(key, value); } else { String portletPreferencesValue = portletPreferences.getValue(key, null); if (portletPreferencesValue != null) { resetKeys.add(key); } } } for (String key : resetKeys) { portletPreferences.reset(key); } portletPreferences.store(); } catch (LocaleException le) { throw le; } catch (Exception e) { throw new SystemException(e); } _clearCompanyCache(companyId); } /** * Updates the company's security properties. * * @param companyId the primary key of the company * @param authType the company's method of authenticating users * @param autoLogin whether to allow users to select the "remember me" * feature * @param sendPassword whether to allow users to ask the company to send * their password * @param strangers whether to allow strangers to create accounts register * themselves in the company * @param strangersWithMx whether to allow strangers to create accounts with * email addresses that match the company mail suffix * @param strangersVerify whether to require strangers who create accounts * to be verified via email * @param siteLogo whether to allow site administrators to use their own * logo instead of the enterprise logo */ @Override public void updateSecurity( long companyId, String authType, boolean autoLogin, boolean sendPassword, boolean strangers, boolean strangersWithMx, boolean strangersVerify, boolean siteLogo) { PortletPreferences preferences = PrefsPropsUtil.getPreferences( companyId); try { preferences.setValue( PropsKeys.COMPANY_SECURITY_AUTH_TYPE, authType); preferences.setValue( PropsKeys.COMPANY_SECURITY_AUTO_LOGIN, String.valueOf(autoLogin)); preferences.setValue( PropsKeys.COMPANY_SECURITY_SEND_PASSWORD, String.valueOf(sendPassword)); preferences.setValue( PropsKeys.COMPANY_SECURITY_STRANGERS, String.valueOf(strangers)); preferences.setValue( PropsKeys.COMPANY_SECURITY_STRANGERS_WITH_MX, String.valueOf(strangersWithMx)); preferences.setValue( PropsKeys.COMPANY_SECURITY_STRANGERS_VERIFY, String.valueOf(strangersVerify)); preferences.setValue( PropsKeys.COMPANY_SECURITY_SITE_LOGO, String.valueOf(siteLogo)); preferences.store(); } catch (IOException | PortletException e) { throw new SystemException(e); } _clearCompanyCache(companyId); } protected void addAssetEntriesFacet(SearchContext searchContext) { Facet assetEntriesFacet = new AssetEntriesFacet(searchContext); assetEntriesFacet.setStatic(true); searchContext.addFacet(assetEntriesFacet); } protected void addScopeFacet(SearchContext searchContext) { Facet scopeFacet = new ScopeFacet(searchContext); scopeFacet.setStatic(true); searchContext.addFacet(scopeFacet); } protected Company checkLogo(long companyId) throws PortalException { Company company = companyPersistence.findByPrimaryKey(companyId); long logoId = company.getLogoId(); if (logoId <= 0) { logoId = counterLocalService.increment(); company.setLogoId(logoId); company = companyPersistence.update(company); } return company; } protected SearchContext createSearchContext( long companyId, long userId, String portletId, long groupId, String keywords, int start, int end) { SearchContext searchContext = new SearchContext(); searchContext.setCompanyId(companyId); searchContext.setEnd(end); searchContext.setEntryClassNames( SearchEngineHelperUtil.getEntryClassNames()); if (groupId > 0) { searchContext.setGroupIds(new long[] {groupId}); } searchContext.setKeywords(keywords); if (Validator.isNotNull(portletId)) { searchContext.setPortletIds(new String[] {portletId}); } searchContext.setStart(start); searchContext.setUserId(userId); return searchContext; } protected Company doDeleteCompany(final long companyId) throws PortalException { // Company final Company company = companyPersistence.remove(companyId); // Account accountLocalService.deleteAccount(company.getAccountId()); // Organizations DeleteOrganizationActionableDynamicQuery deleteOrganizationActionableDynamicQuery = new DeleteOrganizationActionableDynamicQuery(); deleteOrganizationActionableDynamicQuery.setCompanyId(companyId); deleteOrganizationActionableDynamicQuery.performActions(); // Groups DeleteGroupActionableDynamicQuery deleteGroupActionableDynamicQuery = new DeleteGroupActionableDynamicQuery(); deleteGroupActionableDynamicQuery.setCompanyId(companyId); deleteGroupActionableDynamicQuery.performActions(); String[] systemGroups = PortalUtil.getSystemGroups(); for (String groupName : systemGroups) { Group group = groupLocalService.getGroup(companyId, groupName); deleteGroupActionableDynamicQuery.deleteGroup(group); } Group companyGroup = groupLocalService.getCompanyGroup(companyId); deleteGroupActionableDynamicQuery.deleteGroup(companyGroup); // Layout prototype ActionableDynamicQuery layoutPrototypeActionableDynamicQuery = layoutPrototypeLocalService.getActionableDynamicQuery(); layoutPrototypeActionableDynamicQuery.setCompanyId(companyId); layoutPrototypeActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<LayoutPrototype>() { @Override public void performAction(LayoutPrototype layoutPrototype) throws PortalException { layoutPrototypeLocalService.deleteLayoutPrototype( layoutPrototype); } }); layoutPrototypeActionableDynamicQuery.performActions(); // Layout set prototype ActionableDynamicQuery layoutSetPrototypeActionableDynamicQuery = layoutSetPrototypeLocalService.getActionableDynamicQuery(); layoutSetPrototypeActionableDynamicQuery.setCompanyId(companyId); layoutSetPrototypeActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery. PerformActionMethod<LayoutSetPrototype>() { @Override public void performAction(LayoutSetPrototype layoutSetPrototype) throws PortalException { layoutSetPrototypeLocalService.deleteLayoutSetPrototype( layoutSetPrototype); } }); layoutSetPrototypeActionableDynamicQuery.performActions(); // Roles ActionableDynamicQuery roleActionableDynamicQuery = roleLocalService.getActionableDynamicQuery(); roleActionableDynamicQuery.setCompanyId(companyId); roleActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<Role>() { @Override public void performAction(Role role) throws PortalException { roleLocalService.deleteRole(role); } }); roleActionableDynamicQuery.performActions(); // User groups DeleteUserGroupActionableDynamicQuery deleteUserGroupActionableDynamicQuery = new DeleteUserGroupActionableDynamicQuery( company.getCompanyId()); deleteUserGroupActionableDynamicQuery.performActions(); // Password policy passwordPolicyLocalService.deleteNondefaultPasswordPolicies(companyId); PasswordPolicy defaultPasswordPolicy = passwordPolicyLocalService.getDefaultPasswordPolicy(companyId); if (defaultPasswordPolicy != null) { passwordPolicyLocalService.deletePasswordPolicy( defaultPasswordPolicy); } // Portal preferences PortalPreferences portalPreferences = portalPreferencesPersistence.findByO_O( companyId, PortletKeys.PREFS_OWNER_TYPE_COMPANY); portalPreferencesLocalService.deletePortalPreferences( portalPreferences); // Portlets List<Portlet> portlets = portletPersistence.findByCompanyId(companyId); for (Portlet portlet : portlets) { portletLocalService.deletePortlet(portlet.getId()); } portletLocalService.removeCompanyPortletsPool(companyId); // Users ActionableDynamicQuery userActionableDynamicQuery = userLocalService.getActionableDynamicQuery(); userActionableDynamicQuery.setCompanyId(companyId); userActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<User>() { @Override public void performAction(User user) throws PortalException { if (!user.isDefaultUser()) { userLocalService.deleteUser(user.getUserId()); } } }); userActionableDynamicQuery.performActions(); User defaultUser = userLocalService.getDefaultUser(companyId); userLocalService.deleteUser(defaultUser); // Virtual host VirtualHost companyVirtualHost = virtualHostLocalService.fetchVirtualHost(companyId, 0); virtualHostLocalService.deleteVirtualHost(companyVirtualHost); // Portal instance Callable<Void> callable = new Callable<Void>() { @Override public Void call() throws Exception { PortalInstances.removeCompany(companyId); unregisterCompany(company); return null; } }; TransactionCommitCallbackUtil.registerCallback(callable); return company; } protected void preregisterCompany(long companyId) { PortalInstanceLifecycleManager portalInstanceLifecycleManager = _serviceTracker.getService(); if (portalInstanceLifecycleManager != null) { portalInstanceLifecycleManager.preregisterCompany(companyId); } } protected void registerCompany(Company company) { PortalInstanceLifecycleManager portalInstanceLifecycleManager = _serviceTracker.getService(); if (portalInstanceLifecycleManager != null) { portalInstanceLifecycleManager.registerCompany(company); } else { synchronized (_pendingCompanies) { _pendingCompanies.add(company); } } } protected void unregisterCompany(Company company) { PortalInstanceLifecycleManager portalInstanceLifecycleManager = _serviceTracker.getService(); if (portalInstanceLifecycleManager != null) { portalInstanceLifecycleManager.unregisterCompany(company); } } protected void updateAccount( Company company, String name, String legalName, String legalId, String legalType, String sicCode, String tickerSymbol, String industry, String type, String size) { Account account = accountPersistence.fetchByPrimaryKey( company.getAccountId()); if (account == null) { long accountId = counterLocalService.increment(); account = accountPersistence.create(accountId); account.setCompanyId(company.getCompanyId()); account.setUserId(0); account.setUserName(StringPool.BLANK); company.setAccountId(accountId); companyPersistence.update(company); } account.setName(name); account.setLegalName(legalName); account.setLegalId(legalId); account.setLegalType(legalType); account.setSicCode(sicCode); account.setTickerSymbol(tickerSymbol); account.setIndustry(industry); account.setType(type); account.setSize(size); accountPersistence.update(account); } protected Company updateVirtualHostname( long companyId, String virtualHostname) throws CompanyVirtualHostException { if (Validator.isNotNull(virtualHostname)) { VirtualHost virtualHost = virtualHostPersistence.fetchByHostname( virtualHostname); if (virtualHost == null) { virtualHostLocalService.updateVirtualHost( companyId, 0, virtualHostname); } else { if ((virtualHost.getCompanyId() != companyId) || (virtualHost.getLayoutSetId() != 0)) { throw new CompanyVirtualHostException(); } } } else { VirtualHost virtualHost = virtualHostPersistence.fetchByC_L( companyId, 0); if (virtualHost != null) { virtualHostPersistence.remove(virtualHost); } } return companyPersistence.fetchByPrimaryKey(companyId); } protected void validateLanguageIds(String languageIds) throws PortalException { String[] languageIdsArray = StringUtil.split( languageIds, StringPool.COMMA); for (String languageId : languageIdsArray) { if (!ArrayUtil.contains(PropsValues.LOCALES, languageId)) { LocaleException le = new LocaleException( LocaleException.TYPE_DISPLAY_SETTINGS); le.setSourceAvailableLocales( Arrays.asList( LocaleUtil.fromLanguageIds(PropsValues.LOCALES))); le.setTargetAvailableLocales( Arrays.asList( LocaleUtil.fromLanguageIds(languageIdsArray))); throw le; } } } protected void validateMx(String mx) throws PortalException { if (Validator.isNull(mx) || !Validator.isDomain(mx)) { throw new CompanyMxException(); } } protected void validateName(long companyId, String name) throws PortalException { Group group = groupLocalService.fetchGroup(companyId, name); if ((group != null) || Validator.isNull(name)) { throw new AccountNameException(); } } protected void validateVirtualHost(String webId, String virtualHostname) throws PortalException { if (Validator.isNull(virtualHostname)) { throw new CompanyVirtualHostException(); } else if (virtualHostname.equals(_DEFAULT_VIRTUAL_HOST) && !webId.equals(PropsValues.COMPANY_DEFAULT_WEB_ID)) { throw new CompanyVirtualHostException(); } else if (!Validator.isDomain(virtualHostname)) { throw new CompanyVirtualHostException(); } else { try { VirtualHost virtualHost = virtualHostPersistence.findByHostname( virtualHostname); long companyId = virtualHost.getCompanyId(); Company virtualHostnameCompany = companyPersistence.findByPrimaryKey(companyId); if (!webId.equals(virtualHostnameCompany.getWebId())) { throw new CompanyVirtualHostException(); } } catch (NoSuchVirtualHostException nsvhe) { // LPS-52675 if (_log.isDebugEnabled()) { _log.debug(nsvhe, nsvhe); } } } } protected class DeleteGroupActionableDynamicQuery { protected DeleteGroupActionableDynamicQuery() { _actionableDynamicQuery = groupLocalService.getActionableDynamicQuery(); _actionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { Property parentGroupIdProperty = PropertyFactoryUtil.forName("parentGroupId"); dynamicQuery.add( parentGroupIdProperty.eq(_parentGroupId)); Property siteProperty = PropertyFactoryUtil.forName( "site"); dynamicQuery.add(siteProperty.eq(Boolean.TRUE)); } }); _actionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<Group>() { @Override public void performAction(Group group) throws PortalException { if (!PortalUtil.isSystemGroup(group.getGroupKey()) && !group.isCompany()) { deleteGroup(group); } } }); } protected void deleteGroup(Group group) throws PortalException { DeleteGroupActionableDynamicQuery deleteGroupActionableDynamicQuery = new DeleteGroupActionableDynamicQuery(); deleteGroupActionableDynamicQuery.setCompanyId( group.getCompanyId()); deleteGroupActionableDynamicQuery.setParentGroupId( group.getGroupId()); deleteGroupActionableDynamicQuery.performActions(); groupLocalService.deleteGroup(group); LiveUsers.deleteGroup(group.getCompanyId(), group.getGroupId()); } protected void performActions() throws PortalException { _actionableDynamicQuery.performActions(); } protected void setCompanyId(long companyId) { _actionableDynamicQuery.setCompanyId(companyId); } protected void setParentGroupId(long parentGroupId) { _parentGroupId = parentGroupId; } private ActionableDynamicQuery _actionableDynamicQuery; private long _parentGroupId = GroupConstants.DEFAULT_PARENT_GROUP_ID; } protected class DeleteOrganizationActionableDynamicQuery { public void setParentOrganizationId(long parentOrganizationId) { _parentOrganizationId = parentOrganizationId; } protected DeleteOrganizationActionableDynamicQuery() { _actionableDynamicQuery = organizationLocalService.getActionableDynamicQuery(); _actionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { Property property = PropertyFactoryUtil.forName( "parentOrganizationId"); dynamicQuery.add(property.eq(_parentOrganizationId)); } }); _actionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<Organization>() { @Override public void performAction(Organization organization) throws PortalException { deleteOrganization(organization); } }); } protected void deleteOrganization(Organization organization) throws PortalException { DeleteOrganizationActionableDynamicQuery deleteOrganizationActionableDynamicQuery = new DeleteOrganizationActionableDynamicQuery(); deleteOrganizationActionableDynamicQuery.setCompanyId( organization.getCompanyId()); deleteOrganizationActionableDynamicQuery.setParentOrganizationId( organization.getOrganizationId()); deleteOrganizationActionableDynamicQuery.performActions(); organizationLocalService.deleteOrganization(organization); } protected void performActions() throws PortalException { _actionableDynamicQuery.performActions(); } protected void setCompanyId(long companyId) { _actionableDynamicQuery.setCompanyId(companyId); } private ActionableDynamicQuery _actionableDynamicQuery; private long _parentOrganizationId = OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID; } protected class DeleteUserGroupActionableDynamicQuery { protected DeleteUserGroupActionableDynamicQuery(long companyId) { _actionableDynamicQuery = userGroupLocalService.getActionableDynamicQuery(); _actionableDynamicQuery.setCompanyId(companyId); _actionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<UserGroup>() { @Override public void performAction(UserGroup userGroup) throws PortalException { userGroupLocalService.deleteUserGroup(userGroup); } }); } protected void performActions() throws PortalException { _actionableDynamicQuery.performActions(); } private ActionableDynamicQuery _actionableDynamicQuery; } private void _clearCompanyCache(long companyId) { final Company company = companyPersistence.fetchByPrimaryKey(companyId); if (company != null) { TransactionCommitCallbackUtil.registerCallback( new Callable<Void>() { @Override public Void call() throws Exception { EntityCacheUtil.removeResult( company.isEntityCacheEnabled(), company.getClass(), company.getPrimaryKeyObj()); return null; } }); companyPersistence.clearCache(company); } } private static final String _DEFAULT_VIRTUAL_HOST = "localhost"; private static final Log _log = LogFactoryUtil.getLog( CompanyLocalServiceImpl.class); @BeanReference(type = CompanyProviderWrapper.class) private CompanyProviderWrapper _companyProviderWrapper; private final Set<Company> _pendingCompanies = new HashSet<>(); private final ServiceTracker <PortalInstanceLifecycleManager, PortalInstanceLifecycleManager> _serviceTracker; private static class CustomCompanyProvider implements CompanyProvider { public CustomCompanyProvider(long companyId) { _companyId = companyId; } @Override public long getCompanyId() { return _companyId; } @Override public String getCompanyIdName() { return "companyId"; } private final long _companyId; } private class PortalInstanceLifecycleManagerServiceTrackerCustomizer implements ServiceTrackerCustomizer <PortalInstanceLifecycleManager, PortalInstanceLifecycleManager> { @Override public PortalInstanceLifecycleManager addingService( ServiceReference<PortalInstanceLifecycleManager> serviceReference) { Registry registry = RegistryUtil.getRegistry(); PortalInstanceLifecycleManager portalInstanceLifecycleManager = registry.getService(serviceReference); synchronized (_pendingCompanies) { for (Company company : _pendingCompanies) { portalInstanceLifecycleManager.registerCompany(company); } _pendingCompanies.clear(); } return portalInstanceLifecycleManager; } @Override public void modifiedService( ServiceReference<PortalInstanceLifecycleManager> serviceReference, PortalInstanceLifecycleManager portalInstanceLifecycleManager) { removedService(serviceReference, portalInstanceLifecycleManager); addingService(serviceReference); } @Override public void removedService( ServiceReference<PortalInstanceLifecycleManager> serviceReference, PortalInstanceLifecycleManager portalInstanceLifecycleManager) { } } }