/** * 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.users.admin.internal.exportimport.data.handler; import com.liferay.exportimport.data.handler.base.BaseStagedModelDataHandler; import com.liferay.exportimport.kernel.lar.ExportImportPathUtil; import com.liferay.exportimport.kernel.lar.PortletDataContext; import com.liferay.exportimport.kernel.lar.StagedModelDataHandler; import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil; 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.Group; 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.PasswordPolicy; import com.liferay.portal.kernel.model.PasswordPolicyRel; import com.liferay.portal.kernel.model.Phone; import com.liferay.portal.kernel.model.Website; import com.liferay.portal.kernel.service.AddressLocalService; import com.liferay.portal.kernel.service.EmailAddressLocalService; import com.liferay.portal.kernel.service.GroupLocalService; import com.liferay.portal.kernel.service.OrgLaborLocalService; import com.liferay.portal.kernel.service.OrganizationLocalService; import com.liferay.portal.kernel.service.PasswordPolicyLocalService; import com.liferay.portal.kernel.service.PasswordPolicyRelLocalService; import com.liferay.portal.kernel.service.PhoneLocalService; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.WebsiteLocalService; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.xml.Element; import com.liferay.users.admin.kernel.util.UsersAdminUtil; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author David Mendez Gonzalez */ @Component(immediate = true, service = StagedModelDataHandler.class) public class OrganizationStagedModelDataHandler extends BaseStagedModelDataHandler<Organization> { public static final String[] CLASS_NAMES = {Organization.class.getName()}; @Override public void deleteStagedModel(Organization organization) throws PortalException { _organizationLocalService.deleteOrganization(organization); } @Override public void deleteStagedModel( String uuid, long groupId, String className, String extraData) throws PortalException { Group group = _groupLocalService.getGroup(groupId); Organization organization = _organizationLocalService.fetchOrganizationByUuidAndCompanyId( uuid, group.getCompanyId()); if (organization != null) { deleteStagedModel(organization); } } @Override public List<Organization> fetchStagedModelsByUuidAndCompanyId( String uuid, long companyId) { List<Organization> organizations = new ArrayList<>(); organizations.add( _organizationLocalService.fetchOrganizationByUuidAndCompanyId( uuid, companyId)); return organizations; } @Override public String[] getClassNames() { return CLASS_NAMES; } @Override public String getDisplayName(Organization organization) { return organization.getName(); } @Override protected void doExportStagedModel( PortletDataContext portletDataContext, Organization organization) throws Exception { Queue<Organization> organizations = new LinkedList<>(); organizations.add(organization); while (!organizations.isEmpty()) { Organization exportedOrganization = organizations.remove(); if (exportedOrganization.getParentOrganizationId() != OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) { StagedModelDataHandlerUtil.exportReferenceStagedModel( portletDataContext, exportedOrganization, exportedOrganization.getParentOrganization(), PortletDataContext.REFERENCE_TYPE_PARENT); } exportAddresses(portletDataContext, exportedOrganization); exportEmailAddresses(portletDataContext, exportedOrganization); exportOrgLabors(portletDataContext, exportedOrganization); exportPasswordPolicyRel(portletDataContext, exportedOrganization); exportPhones(portletDataContext, exportedOrganization); exportWebsites(portletDataContext, exportedOrganization); Element organizationElement = portletDataContext.getExportDataElement(exportedOrganization); portletDataContext.addClassedModel( organizationElement, ExportImportPathUtil.getModelPath(exportedOrganization), exportedOrganization); organizations.addAll(exportedOrganization.getSuborganizations()); } } @Override protected void doImportStagedModel( PortletDataContext portletDataContext, Organization organization) throws Exception { long userId = portletDataContext.getUserId(organization.getUserUuid()); Map<Long, Long> organizationIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( Organization.class); long parentOrganizationId = MapUtil.getLong( organizationIds, organization.getParentOrganizationId(), organization.getParentOrganizationId()); ServiceContext serviceContext = portletDataContext.createServiceContext( organization); serviceContext.setUserId(userId); Organization existingOrganization = _organizationLocalService.fetchOrganizationByUuidAndCompanyId( organization.getUuid(), portletDataContext.getGroupId()); if (existingOrganization == null) { existingOrganization = _organizationLocalService.fetchOrganization( portletDataContext.getCompanyId(), organization.getName()); } Organization importedOrganization = null; if (existingOrganization == null) { serviceContext.setUuid(organization.getUuid()); importedOrganization = _organizationLocalService.addOrganization( userId, parentOrganizationId, organization.getName(), organization.getType(), organization.getRegionId(), organization.getCountryId(), organization.getStatusId(), organization.getComments(), false, serviceContext); } else { importedOrganization = _organizationLocalService.updateOrganization( portletDataContext.getCompanyId(), existingOrganization.getOrganizationId(), parentOrganizationId, organization.getName(), organization.getType(), organization.getRegionId(), organization.getCountryId(), organization.getStatusId(), organization.getComments(), true, null, false, serviceContext); } importAddresses(portletDataContext, organization, importedOrganization); importEmailAddresses( portletDataContext, organization, importedOrganization); importOrgLabors(portletDataContext, organization, importedOrganization); importPasswordPolicyRel( portletDataContext, organization, importedOrganization); importPhones(portletDataContext, organization, importedOrganization); importWebsites(portletDataContext, organization, importedOrganization); portletDataContext.importClassedModel( organization, importedOrganization); } protected void exportAddresses( PortletDataContext portletDataContext, Organization organization) throws PortalException { List<Address> addresses = _addressLocalService.getAddresses( organization.getCompanyId(), organization.getModelClassName(), organization.getOrganizationId()); for (Address address : addresses) { StagedModelDataHandlerUtil.exportReferenceStagedModel( portletDataContext, organization, address, PortletDataContext.REFERENCE_TYPE_EMBEDDED); } } protected void exportEmailAddresses( PortletDataContext portletDataContext, Organization organization) throws PortalException { List<EmailAddress> emailAddresses = _emailAddressLocalService.getEmailAddresses( organization.getCompanyId(), organization.getModelClassName(), organization.getOrganizationId()); for (EmailAddress emailAddress : emailAddresses) { StagedModelDataHandlerUtil.exportReferenceStagedModel( portletDataContext, organization, emailAddress, PortletDataContext.REFERENCE_TYPE_EMBEDDED); } } protected void exportOrgLabors( PortletDataContext portletDataContext, Organization organization) { List<OrgLabor> orgLabors = _orgLaborLocalService.getOrgLabors( organization.getOrganizationId()); String path = ExportImportPathUtil.getModelPath( organization, OrgLabor.class.getSimpleName()); portletDataContext.addZipEntry(path, orgLabors); } protected void exportPasswordPolicyRel( PortletDataContext portletDataContext, Organization organization) throws PortalException { PasswordPolicyRel passwordPolicyRel = _passwordPolicyRelLocalService.fetchPasswordPolicyRel( Organization.class.getName(), organization.getOrganizationId()); if (passwordPolicyRel == null) { return; } PasswordPolicy passwordPolicy = _passwordPolicyLocalService.getPasswordPolicy( passwordPolicyRel.getPasswordPolicyId()); StagedModelDataHandlerUtil.exportReferenceStagedModel( portletDataContext, organization, passwordPolicy, PortletDataContext.REFERENCE_TYPE_STRONG); } protected void exportPhones( PortletDataContext portletDataContext, Organization organization) throws PortalException { List<Phone> phones = _phoneLocalService.getPhones( organization.getCompanyId(), organization.getModelClassName(), organization.getOrganizationId()); for (Phone phone : phones) { StagedModelDataHandlerUtil.exportReferenceStagedModel( portletDataContext, organization, phone, PortletDataContext.REFERENCE_TYPE_EMBEDDED); } } protected void exportWebsites( PortletDataContext portletDataContext, Organization organization) throws PortalException { List<Website> websites = _websiteLocalService.getWebsites( organization.getCompanyId(), organization.getModelClassName(), organization.getOrganizationId()); for (Website website : websites) { StagedModelDataHandlerUtil.exportReferenceStagedModel( portletDataContext, organization, website, PortletDataContext.REFERENCE_TYPE_EMBEDDED); } } protected void importAddresses( PortletDataContext portletDataContext, Organization organization, Organization importedOrganization) throws PortalException { List<Element> addressElements = portletDataContext.getReferenceDataElements( organization, Address.class); List<Address> addresses = new ArrayList<>(addressElements.size()); for (Element addressElement : addressElements) { String addressPath = addressElement.attributeValue("path"); Address address = (Address)portletDataContext.getZipEntryAsObject( addressElement, addressPath); address.setClassPK(importedOrganization.getOrganizationId()); StagedModelDataHandlerUtil.importStagedModel( portletDataContext, address); Map<Long, Long> addressIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( Address.class); long addressId = addressIds.get(address.getPrimaryKey()); address.setAddressId(addressId); addresses.add(address); } UsersAdminUtil.updateAddresses( Organization.class.getName(), importedOrganization.getOrganizationId(), addresses); } protected void importEmailAddresses( PortletDataContext portletDataContext, Organization organization, Organization importedOrganization) throws PortalException { List<Element> emailAddressElements = portletDataContext.getReferenceDataElements( organization, EmailAddress.class); List<EmailAddress> emailAddresses = new ArrayList<>( emailAddressElements.size()); for (Element emailAddressElement : emailAddressElements) { String emailAddressPath = emailAddressElement.attributeValue( "path"); EmailAddress emailAddress = (EmailAddress)portletDataContext.getZipEntryAsObject( emailAddressElement, emailAddressPath); emailAddress.setClassPK(importedOrganization.getOrganizationId()); StagedModelDataHandlerUtil.importStagedModel( portletDataContext, emailAddress); Map<Long, Long> emailAddressIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( EmailAddress.class); long emailAddressId = emailAddressIds.get( emailAddress.getPrimaryKey()); emailAddress.setEmailAddressId(emailAddressId); emailAddresses.add(emailAddress); } UsersAdminUtil.updateEmailAddresses( Organization.class.getName(), importedOrganization.getOrganizationId(), emailAddresses); } protected void importOrgLabors( PortletDataContext portletDataContext, Organization organization, Organization importedOrganization) throws PortalException { String path = ExportImportPathUtil.getModelPath( organization, OrgLabor.class.getSimpleName()); List<OrgLabor> orgLabors = (List<OrgLabor>)portletDataContext.getZipEntryAsObject(path); for (OrgLabor orgLabor : orgLabors) { orgLabor.setOrgLaborId(0); } UsersAdminUtil.updateOrgLabors( importedOrganization.getOrganizationId(), orgLabors); } protected void importPasswordPolicyRel( PortletDataContext portletDataContext, Organization organization, Organization importedOrganization) throws PortalException { List<Element> passwordPolicyElements = portletDataContext.getReferenceDataElements( organization, PasswordPolicy.class); if (passwordPolicyElements.isEmpty()) { return; } Element passwordPolicyElement = passwordPolicyElements.get(0); String passwordPolicyPath = passwordPolicyElement.attributeValue( "path"); PasswordPolicy passwordPolicy = (PasswordPolicy)portletDataContext.getZipEntryAsObject( passwordPolicyPath); StagedModelDataHandlerUtil.importStagedModel( portletDataContext, passwordPolicy); Map<Long, Long> passwordPolicyIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( PasswordPolicy.class); long passwordPolicyId = passwordPolicyIds.get( passwordPolicy.getPrimaryKey()); _organizationLocalService.addPasswordPolicyOrganizations( passwordPolicyId, new long[] {importedOrganization.getOrganizationId()}); } protected void importPhones( PortletDataContext portletDataContext, Organization organization, Organization importedOrganization) throws PortalException { List<Element> phoneElements = portletDataContext.getReferenceDataElements( organization, Phone.class); List<Phone> phones = new ArrayList<>(phoneElements.size()); for (Element phoneElement : phoneElements) { String phonePath = phoneElement.attributeValue("path"); Phone phone = (Phone)portletDataContext.getZipEntryAsObject( phoneElement, phonePath); phone.setClassPK(importedOrganization.getOrganizationId()); StagedModelDataHandlerUtil.importStagedModel( portletDataContext, phone); Map<Long, Long> phoneIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( Phone.class); long phoneId = phoneIds.get(phone.getPrimaryKey()); phone.setPhoneId(phoneId); phones.add(phone); } UsersAdminUtil.updatePhones( Organization.class.getName(), importedOrganization.getOrganizationId(), phones); } @Override protected void importReferenceStagedModels( PortletDataContext portletDataContext, Organization organization) { } protected void importWebsites( PortletDataContext portletDataContext, Organization organization, Organization importedOrganization) throws PortalException { List<Element> websiteElements = portletDataContext.getReferenceDataElements( organization, Website.class); List<Website> websites = new ArrayList<>(websiteElements.size()); for (Element websiteElement : websiteElements) { String websitePath = websiteElement.attributeValue("path"); Website website = (Website)portletDataContext.getZipEntryAsObject( websiteElement, websitePath); website.setClassPK(importedOrganization.getOrganizationId()); StagedModelDataHandlerUtil.importStagedModel( portletDataContext, website); Map<Long, Long> websiteIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( Website.class); long websiteId = websiteIds.get(website.getPrimaryKey()); website.setWebsiteId(websiteId); websites.add(website); } UsersAdminUtil.updateWebsites( Organization.class.getName(), importedOrganization.getOrganizationId(), websites); } @Reference(unbind = "-") protected void setAddressLocalService( AddressLocalService addressLocalService) { _addressLocalService = addressLocalService; } @Reference(unbind = "-") protected void setEmailAddressLocalService( EmailAddressLocalService emailAddressLocalService) { _emailAddressLocalService = emailAddressLocalService; } @Reference(unbind = "-") protected void setGroupLocalService(GroupLocalService groupLocalService) { _groupLocalService = groupLocalService; } @Reference(unbind = "-") protected void setOrganizationLocalService( OrganizationLocalService organizationLocalService) { _organizationLocalService = organizationLocalService; } @Reference(unbind = "-") protected void setOrgLaborLocalService( OrgLaborLocalService orgLaborLocalService) { _orgLaborLocalService = orgLaborLocalService; } @Reference(unbind = "-") protected void setPasswordPolicyLocalService( PasswordPolicyLocalService passwordPolicyLocalService) { _passwordPolicyLocalService = passwordPolicyLocalService; } @Reference(unbind = "-") protected void setPasswordPolicyRelLocalService( PasswordPolicyRelLocalService passwordPolicyRelLocalService) { _passwordPolicyRelLocalService = passwordPolicyRelLocalService; } @Reference(unbind = "-") protected void setPhoneLocalService(PhoneLocalService phoneLocalService) { _phoneLocalService = phoneLocalService; } @Reference(unbind = "-") protected void setWebsiteLocalService( WebsiteLocalService websiteLocalService) { _websiteLocalService = websiteLocalService; } private AddressLocalService _addressLocalService; private EmailAddressLocalService _emailAddressLocalService; private GroupLocalService _groupLocalService; private OrganizationLocalService _organizationLocalService; private OrgLaborLocalService _orgLaborLocalService; private PasswordPolicyLocalService _passwordPolicyLocalService; private PasswordPolicyRelLocalService _passwordPolicyRelLocalService; private PhoneLocalService _phoneLocalService; private WebsiteLocalService _websiteLocalService; }