/**
* 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.asset.kernel.model.AssetCategory;
import com.liferay.asset.kernel.model.AssetTag;
import com.liferay.expando.kernel.model.ExpandoBridge;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Address;
import com.liferay.portal.kernel.model.EmailAddress;
import com.liferay.portal.kernel.model.OrgLabor;
import com.liferay.portal.kernel.model.Organization;
import com.liferay.portal.kernel.model.OrganizationConstants;
import com.liferay.portal.kernel.model.Phone;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.model.Website;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistryUtil;
import com.liferay.portal.kernel.security.membershippolicy.OrganizationMembershipPolicyUtil;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.permission.GroupPermissionUtil;
import com.liferay.portal.kernel.service.permission.OrganizationPermissionUtil;
import com.liferay.portal.kernel.service.permission.PasswordPolicyPermissionUtil;
import com.liferay.portal.kernel.service.permission.PortalPermissionUtil;
import com.liferay.portal.kernel.service.permission.UserPermissionUtil;
import com.liferay.portal.service.base.OrganizationServiceBaseImpl;
import com.liferay.users.admin.kernel.util.UsersAdminUtil;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* Provides the remote service for accessing, adding, deleting, and updating
* organizations. Its methods include permission checks.
*
* @author Brian Wing Shun Chan
* @author Jorge Ferrer
* @author Julio Camarero
*/
public class OrganizationServiceImpl extends OrganizationServiceBaseImpl {
/**
* Adds the organizations to the group.
*
* @param groupId the primary key of the group
* @param organizationIds the primary keys of the organizations
*/
@Override
public void addGroupOrganizations(long groupId, long[] organizationIds)
throws PortalException {
GroupPermissionUtil.check(
getPermissionChecker(), groupId, ActionKeys.ASSIGN_MEMBERS);
organizationLocalService.addGroupOrganizations(
groupId, organizationIds);
}
/**
* Adds an organization with additional parameters.
*
* <p>
* This method handles the creation and bookkeeping of the organization
* including its resources, metadata, and internal data structures.
* </p>
*
* @param parentOrganizationId the primary key of the organization's parent
* organization
* @param name the organization's name
* @param type the organization's type
* @param regionId the primary key of the organization's region
* @param countryId the primary key of the organization's country
* @param statusId the organization's workflow status
* @param comments the comments about the organization
* @param site whether the organization is to be associated with a main
* site
* @param addresses the organization's addresses
* @param emailAddresses the organization's email addresses
* @param orgLabors the organization's hours of operation
* @param phones the organization's phone numbers
* @param websites the organization's websites
* @param serviceContext the service context to be applied (optionally
* <code>null</code>). Can set asset category IDs, asset tag names,
* and expando bridge attributes for the organization.
* @return the organization
*/
@Override
public Organization addOrganization(
long parentOrganizationId, String name, String type, long regionId,
long countryId, long statusId, String comments, boolean site,
List<Address> addresses, List<EmailAddress> emailAddresses,
List<OrgLabor> orgLabors, List<Phone> phones,
List<Website> websites, ServiceContext serviceContext)
throws PortalException {
boolean indexingEnabled = true;
if (serviceContext != null) {
indexingEnabled = serviceContext.isIndexingEnabled();
serviceContext.setIndexingEnabled(false);
}
try {
Organization organization = addOrganization(
parentOrganizationId, name, type, regionId, countryId, statusId,
comments, site, serviceContext);
UsersAdminUtil.updateAddresses(
Organization.class.getName(), organization.getOrganizationId(),
addresses);
UsersAdminUtil.updateEmailAddresses(
Organization.class.getName(), organization.getOrganizationId(),
emailAddresses);
UsersAdminUtil.updateOrgLabors(
organization.getOrganizationId(), orgLabors);
UsersAdminUtil.updatePhones(
Organization.class.getName(), organization.getOrganizationId(),
phones);
UsersAdminUtil.updateWebsites(
Organization.class.getName(), organization.getOrganizationId(),
websites);
if (indexingEnabled) {
Indexer<Organization> indexer =
IndexerRegistryUtil.nullSafeGetIndexer(Organization.class);
indexer.reindex(organization);
}
return organization;
}
finally {
if (serviceContext != null) {
serviceContext.setIndexingEnabled(indexingEnabled);
}
}
}
/**
* Adds an organization.
*
* <p>
* This method handles the creation and bookkeeping of the organization
* including its resources, metadata, and internal data structures.
* </p>
*
* @param parentOrganizationId the primary key of the organization's parent
* organization
* @param name the organization's name
* @param type the organization's type
* @param regionId the primary key of the organization's region
* @param countryId the primary key of the organization's country
* @param statusId the organization's workflow status
* @param comments the comments about the organization
* @param site whether the organization is to be associated with a main
* site
* @param serviceContext the service context to be applied (optionally
* <code>null</code>). Can set asset category IDs, asset tag names,
* and expando bridge attributes for the organization.
* @return the organization
*/
@Override
public Organization addOrganization(
long parentOrganizationId, String name, String type, long regionId,
long countryId, long statusId, String comments, boolean site,
ServiceContext serviceContext)
throws PortalException {
if (parentOrganizationId ==
OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) {
PortalPermissionUtil.check(
getPermissionChecker(), ActionKeys.ADD_ORGANIZATION);
}
else {
OrganizationPermissionUtil.check(
getPermissionChecker(), parentOrganizationId,
ActionKeys.ADD_ORGANIZATION);
}
Organization organization = organizationLocalService.addOrganization(
getUserId(), parentOrganizationId, name, type, regionId, countryId,
statusId, comments, site, serviceContext);
OrganizationMembershipPolicyUtil.verifyPolicy(organization);
return organization;
}
/**
* Assigns the password policy to the organizations, removing any other
* currently assigned password policies.
*
* @param passwordPolicyId the primary key of the password policy
* @param organizationIds the primary keys of the organizations
*/
@Override
public void addPasswordPolicyOrganizations(
long passwordPolicyId, long[] organizationIds)
throws PortalException {
PasswordPolicyPermissionUtil.check(
getPermissionChecker(), passwordPolicyId, ActionKeys.UPDATE);
organizationLocalService.addPasswordPolicyOrganizations(
passwordPolicyId, organizationIds);
}
/**
* Deletes the organization's logo.
*
* @param organizationId the primary key of the organization
*/
@Override
public void deleteLogo(long organizationId) throws PortalException {
OrganizationPermissionUtil.check(
getPermissionChecker(), organizationId, ActionKeys.UPDATE);
organizationLocalService.deleteLogo(organizationId);
}
/**
* Deletes the organization. The organization's associated resources and
* assets are also deleted.
*
* @param organizationId the primary key of the organization
*/
@Override
public void deleteOrganization(long organizationId) throws PortalException {
OrganizationPermissionUtil.check(
getPermissionChecker(), organizationId, ActionKeys.DELETE);
organizationLocalService.deleteOrganization(organizationId);
}
/**
* Returns the organization with the primary key.
*
* @param organizationId the primary key of the organization
* @return the organization with the primary key, or <code>null</code> if an
* organization with the primary key could not be found or if the
* user did not have permission to view the organization
*/
@Override
public Organization fetchOrganization(long organizationId)
throws PortalException {
Organization organization = organizationLocalService.fetchOrganization(
organizationId);
if (organization != null) {
OrganizationPermissionUtil.check(
getPermissionChecker(), organization, ActionKeys.VIEW);
}
return organization;
}
/**
* Returns the organization with the primary key.
*
* @param organizationId the primary key of the organization
* @return the organization with the primary key
*/
@Override
public Organization getOrganization(long organizationId)
throws PortalException {
Organization organization = organizationLocalService.getOrganization(
organizationId);
OrganizationPermissionUtil.check(
getPermissionChecker(), organization, ActionKeys.VIEW);
return organization;
}
/**
* Returns the primary key of the organization with the name.
*
* @param companyId the primary key of the organization's company
* @param name the organization's name
* @return the primary key of the organization with the name, or
* <code>0</code> if the organization could not be found
*/
@Override
public long getOrganizationId(long companyId, String name)
throws PortalException {
long organizationId = organizationLocalService.getOrganizationId(
companyId, name);
OrganizationPermissionUtil.check(
getPermissionChecker(), organizationId, ActionKeys.VIEW);
return organizationId;
}
/**
* Returns all the organizations belonging to the parent organization.
*
* @param companyId the primary key of the organizations' company
* @param parentOrganizationId the primary key of the organizations' parent
* organization
* @return the organizations belonging to the parent organization
*/
@Override
public List<Organization> getOrganizations(
long companyId, long parentOrganizationId) {
if (parentOrganizationId ==
OrganizationConstants.ANY_PARENT_ORGANIZATION_ID) {
return organizationPersistence.filterFindByCompanyId(companyId);
}
return organizationPersistence.filterFindByC_P(
companyId, parentOrganizationId);
}
/**
* Returns a range of all the organizations belonging to the parent
* organization.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link
* com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param companyId the primary key of the organizations' company
* @param parentOrganizationId the primary key of the organizations' parent
* organization
* @param start the lower bound of the range of organizations to return
* @param end the upper bound of the range of organizations to return (not
* inclusive)
* @return the range of organizations belonging to the parent organization
*/
@Override
public List<Organization> getOrganizations(
long companyId, long parentOrganizationId, int start, int end) {
if (parentOrganizationId ==
OrganizationConstants.ANY_PARENT_ORGANIZATION_ID) {
return organizationPersistence.filterFindByCompanyId(
companyId, start, end);
}
return organizationPersistence.filterFindByC_P(
companyId, parentOrganizationId, start, end);
}
/**
* Returns the number of organizations belonging to the parent organization.
*
* @param companyId the primary key of the organizations' company
* @param parentOrganizationId the primary key of the organizations' parent
* organization
* @return the number of organizations belonging to the parent organization
*/
@Override
public int getOrganizationsCount(
long companyId, long parentOrganizationId) {
if (parentOrganizationId ==
OrganizationConstants.ANY_PARENT_ORGANIZATION_ID) {
return organizationPersistence.filterCountByCompanyId(companyId);
}
return organizationPersistence.filterCountByC_P(
companyId, parentOrganizationId);
}
/**
* Returns all the organizations with which the user is explicitly
* associated.
*
* <p>
* A user is considered to be <i>explicitly</i> associated with an
* organization if his account is individually created within the
* organization or if the user is later added as a member.
* </p>
*
* @param userId the primary key of the user
* @return the organizations with which the user is explicitly associated
*/
@Override
public List<Organization> getUserOrganizations(long userId)
throws PortalException {
UserPermissionUtil.check(
getPermissionChecker(), userId, ActionKeys.VIEW);
return organizationLocalService.getUserOrganizations(userId);
}
/**
* Sets the organizations in the group, removing and adding organizations to
* the group as necessary.
*
* @param groupId the primary key of the group
* @param organizationIds the primary keys of the organizations
*/
@Override
public void setGroupOrganizations(long groupId, long[] organizationIds)
throws PortalException {
GroupPermissionUtil.check(
getPermissionChecker(), groupId, ActionKeys.ASSIGN_MEMBERS);
organizationLocalService.setGroupOrganizations(
groupId, organizationIds);
}
/**
* Removes the organizations from the group.
*
* @param groupId the primary key of the group
* @param organizationIds the primary keys of the organizations
*/
@Override
public void unsetGroupOrganizations(long groupId, long[] organizationIds)
throws PortalException {
GroupPermissionUtil.check(
getPermissionChecker(), groupId, ActionKeys.ASSIGN_MEMBERS);
organizationLocalService.unsetGroupOrganizations(
groupId, organizationIds);
}
/**
* Removes the organizations from the password policy.
*
* @param passwordPolicyId the primary key of the password policy
* @param organizationIds the primary keys of the organizations
*/
@Override
public void unsetPasswordPolicyOrganizations(
long passwordPolicyId, long[] organizationIds)
throws PortalException {
PasswordPolicyPermissionUtil.check(
getPermissionChecker(), passwordPolicyId, ActionKeys.UPDATE);
organizationLocalService.unsetPasswordPolicyOrganizations(
passwordPolicyId, organizationIds);
}
/**
* Updates the organization with additional parameters.
*
* @param organizationId the primary key of the organization
* @param parentOrganizationId the primary key of the organization's parent
* organization
* @param name the organization's name
* @param type the organization's type
* @param regionId the primary key of the organization's region
* @param countryId the primary key of the organization's country
* @param statusId the organization's workflow status
* @param comments the comments about the organization
* @param logo whether to update the ogranization's logo
* @param logoBytes the new logo image data
* @param site whether the organization is to be associated with a main
* site
* @param addresses the organization's addresses
* @param emailAddresses the organization's email addresses
* @param orgLabors the organization's hours of operation
* @param phones the organization's phone numbers
* @param websites the organization's websites
* @param serviceContext the service context to be applied (optionally
* <code>null</code>). Can set asset category IDs and asset tag
* names for the organization, and merge expando bridge attributes
* for the organization.
* @return the organization
*/
@Override
public Organization updateOrganization(
long organizationId, long parentOrganizationId, String name,
String type, long regionId, long countryId, long statusId,
String comments, boolean logo, byte[] logoBytes, boolean site,
List<Address> addresses, List<EmailAddress> emailAddresses,
List<OrgLabor> orgLabors, List<Phone> phones,
List<Website> websites, ServiceContext serviceContext)
throws PortalException {
Organization organization = organizationPersistence.findByPrimaryKey(
organizationId);
OrganizationPermissionUtil.check(
getPermissionChecker(), organization, ActionKeys.UPDATE);
if (organization.getParentOrganizationId() != parentOrganizationId) {
if (parentOrganizationId ==
OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) {
PortalPermissionUtil.check(
getPermissionChecker(), ActionKeys.ADD_ORGANIZATION);
}
else {
OrganizationPermissionUtil.check(
getPermissionChecker(), parentOrganizationId,
ActionKeys.ADD_ORGANIZATION);
}
}
if (addresses != null) {
UsersAdminUtil.updateAddresses(
Organization.class.getName(), organizationId, addresses);
}
if (emailAddresses != null) {
UsersAdminUtil.updateEmailAddresses(
Organization.class.getName(), organizationId, emailAddresses);
}
if (orgLabors != null) {
UsersAdminUtil.updateOrgLabors(organizationId, orgLabors);
}
if (phones != null) {
UsersAdminUtil.updatePhones(
Organization.class.getName(), organizationId, phones);
}
if (websites != null) {
UsersAdminUtil.updateWebsites(
Organization.class.getName(), organizationId, websites);
}
User user = getUser();
Organization oldOrganization = organization;
List<AssetCategory> oldAssetCategories =
assetCategoryLocalService.getCategories(
Organization.class.getName(), organizationId);
List<AssetTag> oldAssetTags = assetTagLocalService.getTags(
Organization.class.getName(), organizationId);
ExpandoBridge oldExpandoBridge = oldOrganization.getExpandoBridge();
Map<String, Serializable> oldExpandoAttributes =
oldExpandoBridge.getAttributes();
organization = organizationLocalService.updateOrganization(
user.getCompanyId(), organizationId, parentOrganizationId, name,
type, regionId, countryId, statusId, comments, logo, logoBytes,
site, serviceContext);
OrganizationMembershipPolicyUtil.verifyPolicy(
organization, oldOrganization, oldAssetCategories, oldAssetTags,
oldExpandoAttributes);
return organization;
}
/**
* Updates the organization with additional parameters.
*
* @param organizationId the primary key of the organization
* @param parentOrganizationId the primary key of the organization's
* parent organization
* @param name the organization's name
* @param type the organization's type
* @param regionId the primary key of the organization's region
* @param countryId the primary key of the organization's country
* @param statusId the organization's workflow status
* @param comments the comments about the organization
* @param site whether the organization is to be associated with a main
* site
* @param addresses the organization's addresses
* @param emailAddresses the organization's email addresses
* @param orgLabors the organization's hours of operation
* @param phones the organization's phone numbers
* @param websites the organization's websites
* @param serviceContext the service context to be applied (optionally
* <code>null</code>). Can set asset category IDs and asset tag
* names for the organization, and merge expando bridge
* attributes for the organization.
* @return the organization
* @deprecated As of 7.0.0, replaced by {@link #updateOrganization(long,
* long, String, String, long, long, long, String, boolean,
* byte[], boolean, List, List, List, List, List,
* ServiceContext)}
*/
@Deprecated
@Override
public Organization updateOrganization(
long organizationId, long parentOrganizationId, String name,
String type, long regionId, long countryId, long statusId,
String comments, boolean site, List<Address> addresses,
List<EmailAddress> emailAddresses, List<OrgLabor> orgLabors,
List<Phone> phones, List<Website> websites,
ServiceContext serviceContext)
throws PortalException {
return updateOrganization(
organizationId, parentOrganizationId, name, type, regionId,
countryId, statusId, comments, true, null, site, addresses,
emailAddresses, orgLabors, phones, websites, serviceContext);
}
/**
* Updates the organization.
*
* @param organizationId the primary key of the organization
* @param parentOrganizationId the primary key of the organization's parent
* organization
* @param name the organization's name
* @param type the organization's type
* @param regionId the primary key of the organization's region
* @param countryId the primary key of the organization's country
* @param statusId the organization's workflow status
* @param comments the comments about the organization
* @param site whether the organization is to be associated with a main
* site
* @param serviceContext the service context to be applied (optionally
* <code>null</code>). Can set asset category IDs and asset tag
* names for the organization, and merge expando bridge attributes
* for the organization.
* @return the organization
*/
@Override
public Organization updateOrganization(
long organizationId, long parentOrganizationId, String name,
String type, long regionId, long countryId, long statusId,
String comments, boolean site, ServiceContext serviceContext)
throws PortalException {
return updateOrganization(
organizationId, parentOrganizationId, name, type, regionId,
countryId, statusId, comments, true, null, site, null, null, null,
null, null, serviceContext);
}
}