001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.usersadmin.lar;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler;
020    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
021    import com.liferay.portal.kernel.lar.PortletDataContext;
022    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
023    import com.liferay.portal.kernel.util.MapUtil;
024    import com.liferay.portal.kernel.xml.Element;
025    import com.liferay.portal.model.Address;
026    import com.liferay.portal.model.EmailAddress;
027    import com.liferay.portal.model.Group;
028    import com.liferay.portal.model.OrgLabor;
029    import com.liferay.portal.model.Organization;
030    import com.liferay.portal.model.OrganizationConstants;
031    import com.liferay.portal.model.PasswordPolicy;
032    import com.liferay.portal.model.PasswordPolicyRel;
033    import com.liferay.portal.model.Phone;
034    import com.liferay.portal.model.Website;
035    import com.liferay.portal.service.AddressLocalServiceUtil;
036    import com.liferay.portal.service.EmailAddressLocalServiceUtil;
037    import com.liferay.portal.service.GroupLocalServiceUtil;
038    import com.liferay.portal.service.OrgLaborLocalServiceUtil;
039    import com.liferay.portal.service.OrganizationLocalServiceUtil;
040    import com.liferay.portal.service.PasswordPolicyLocalServiceUtil;
041    import com.liferay.portal.service.PasswordPolicyRelLocalServiceUtil;
042    import com.liferay.portal.service.PhoneLocalServiceUtil;
043    import com.liferay.portal.service.ServiceContext;
044    import com.liferay.portal.service.WebsiteLocalServiceUtil;
045    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
046    
047    import java.util.ArrayList;
048    import java.util.LinkedList;
049    import java.util.List;
050    import java.util.Map;
051    import java.util.Queue;
052    
053    /**
054     * @author David Mendez Gonzalez
055     */
056    public class OrganizationStagedModelDataHandler
057            extends BaseStagedModelDataHandler<Organization> {
058    
059            public static final String[] CLASS_NAMES = {Organization.class.getName()};
060    
061            @Override
062            public void deleteStagedModel(
063                            String uuid, long groupId, String className, String extraData)
064                    throws PortalException, SystemException {
065    
066                    Group group = GroupLocalServiceUtil.getGroup(groupId);
067    
068                    Organization organization =
069                            OrganizationLocalServiceUtil.fetchOrganizationByUuidAndCompanyId(
070                                    uuid, group.getCompanyId());
071    
072                    if (organization != null) {
073                            OrganizationLocalServiceUtil.deleteOrganization(organization);
074                    }
075            }
076    
077            @Override
078            public String[] getClassNames() {
079                    return CLASS_NAMES;
080            }
081    
082            @Override
083            public String getDisplayName(Organization organization) {
084                    return organization.getName();
085            }
086    
087            @Override
088            protected void doExportStagedModel(
089                            PortletDataContext portletDataContext, Organization organization)
090                    throws Exception {
091    
092                    Queue<Organization> organizations = new LinkedList<Organization>();
093    
094                    organizations.add(organization);
095    
096                    while (!organizations.isEmpty()) {
097                            Organization exportedOrganization = organizations.remove();
098    
099                            Element organizationElement =
100                                    portletDataContext.getExportDataElement(exportedOrganization);
101    
102                            exportAddresses(
103                                    portletDataContext, exportedOrganization, organizationElement);
104                            exportEmailAddresses(
105                                    portletDataContext, exportedOrganization, organizationElement);
106                            exportOrgLabors(portletDataContext, exportedOrganization);
107                            exportPasswordPolicyRel(
108                                    portletDataContext, exportedOrganization, organizationElement);
109                            exportPhones(
110                                    portletDataContext, exportedOrganization, organizationElement);
111                            exportWebsites(
112                                    portletDataContext, exportedOrganization, organizationElement);
113    
114                            portletDataContext.addClassedModel(
115                                    organizationElement,
116                                    ExportImportPathUtil.getModelPath(exportedOrganization),
117                                    exportedOrganization, UsersAdminPortletDataHandler.NAMESPACE);
118    
119                            organizations.addAll(exportedOrganization.getSuborganizations());
120                    }
121            }
122    
123            @Override
124            protected void doImportStagedModel(
125                            PortletDataContext portletDataContext, Organization organization)
126                    throws Exception {
127    
128                    long userId = portletDataContext.getUserId(organization.getUserUuid());
129    
130                    Map<Long, Long> organizationIds =
131                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
132                                    Organization.class);
133    
134                    long parentOrganizationId = MapUtil.getLong(
135                            organizationIds, organization.getParentOrganizationId(),
136                            organization.getParentOrganizationId());
137    
138                    if ((parentOrganizationId !=
139                                    OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) &&
140                            (parentOrganizationId == organization.getParentOrganizationId())) {
141    
142                            String parentOrganizationPath = ExportImportPathUtil.getModelPath(
143                                    portletDataContext, Organization.class.getName(),
144                                    parentOrganizationId);
145    
146                            Organization parentOrganization =
147                                    (Organization)portletDataContext.getZipEntryAsObject(
148                                            parentOrganizationPath);
149    
150                            StagedModelDataHandlerUtil.importStagedModel(
151                                    portletDataContext, parentOrganization);
152    
153                            parentOrganizationId = MapUtil.getLong(
154                                    organizationIds, organization.getParentOrganizationId(),
155                                    organization.getParentOrganizationId());
156                    }
157    
158                    ServiceContext serviceContext = portletDataContext.createServiceContext(
159                            organization, UsersAdminPortletDataHandler.NAMESPACE);
160    
161                    serviceContext.setUserId(userId);
162    
163                    Organization existingOrganization =
164                            OrganizationLocalServiceUtil.fetchOrganizationByUuidAndCompanyId(
165                                    organization.getUuid(), portletDataContext.getCompanyId());
166    
167                    if (existingOrganization == null) {
168                            existingOrganization =
169                                    OrganizationLocalServiceUtil.fetchOrganization(
170                                            portletDataContext.getCompanyId(), organization.getName());
171                    }
172    
173                    Organization importedOrganization = null;
174    
175                    if (existingOrganization == null) {
176                            serviceContext.setUuid(organization.getUuid());
177    
178                            importedOrganization =
179                                    OrganizationLocalServiceUtil.addOrganization(
180                                            userId, parentOrganizationId, organization.getName(),
181                                            organization.getType(), organization.getRegionId(),
182                                            organization.getCountryId(), organization.getStatusId(),
183                                            organization.getComments(), false, serviceContext);
184                    }
185                    else {
186                            importedOrganization =
187                                    OrganizationLocalServiceUtil.updateOrganization(
188                                            portletDataContext.getCompanyId(),
189                                            existingOrganization.getOrganizationId(),
190                                            parentOrganizationId, organization.getName(),
191                                            organization.getType(), organization.getRegionId(),
192                                            organization.getCountryId(), organization.getStatusId(),
193                                            organization.getComments(), false, serviceContext);
194                    }
195    
196                    importAddresses(portletDataContext, organization, importedOrganization);
197                    importEmailAddresses(
198                            portletDataContext, organization, importedOrganization);
199                    importOrgLabors(portletDataContext, organization, importedOrganization);
200                    importPasswordPolicyRel(
201                            portletDataContext, organization, importedOrganization);
202                    importPhones(portletDataContext, organization, importedOrganization);
203                    importWebsites(portletDataContext, organization, importedOrganization);
204    
205                    portletDataContext.importClassedModel(
206                            organization, importedOrganization,
207                            UsersAdminPortletDataHandler.NAMESPACE);
208            }
209    
210            protected void exportAddresses(
211                            PortletDataContext portletDataContext, Organization organization,
212                            Element organizationElement)
213                    throws PortalException, SystemException {
214    
215                    List<Address> addresses = AddressLocalServiceUtil.getAddresses(
216                            organization.getCompanyId(), organization.getModelClassName(),
217                            organization.getOrganizationId());
218    
219                    for (Address address : addresses) {
220                            portletDataContext.addReferenceElement(
221                                    organization, organizationElement, address,
222                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED, false);
223    
224                            StagedModelDataHandlerUtil.exportStagedModel(
225                                    portletDataContext, address);
226                    }
227            }
228    
229            protected void exportEmailAddresses(
230                            PortletDataContext portletDataContext, Organization organization,
231                            Element organizationElement)
232                    throws PortalException, SystemException {
233    
234                    List<EmailAddress> emailAddresses =
235                            EmailAddressLocalServiceUtil.getEmailAddresses(
236                                    organization.getCompanyId(), organization.getModelClassName(),
237                                    organization.getOrganizationId());
238    
239                    for (EmailAddress emailAddress : emailAddresses) {
240                            portletDataContext.addReferenceElement(
241                                    organization, organizationElement, emailAddress,
242                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED, false);
243    
244                            StagedModelDataHandlerUtil.exportStagedModel(
245                                    portletDataContext, emailAddress);
246                    }
247            }
248    
249            protected void exportOrgLabors(
250                            PortletDataContext portletDataContext, Organization organization)
251                    throws SystemException {
252    
253                    List<OrgLabor> orgLabors = OrgLaborLocalServiceUtil.getOrgLabors(
254                            organization.getOrganizationId());
255    
256                    String path = ExportImportPathUtil.getModelPath(
257                            organization, OrgLabor.class.getSimpleName());
258    
259                    portletDataContext.addZipEntry(path, orgLabors);
260            }
261    
262            protected void exportPasswordPolicyRel(
263                            PortletDataContext portletDataContext, Organization organization,
264                            Element organizationElement)
265                    throws PortalException, SystemException {
266    
267                    PasswordPolicyRel passwordPolicyRel =
268                            PasswordPolicyRelLocalServiceUtil.fetchPasswordPolicyRel(
269                                    Organization.class.getName(), organization.getOrganizationId());
270    
271                    if (passwordPolicyRel == null) {
272                            return;
273                    }
274    
275                    PasswordPolicy passwordPolicy =
276                            PasswordPolicyLocalServiceUtil.getPasswordPolicy(
277                                    passwordPolicyRel.getPasswordPolicyId());
278    
279                    portletDataContext.addReferenceElement(
280                            organization, organizationElement, passwordPolicy,
281                            PortletDataContext.REFERENCE_TYPE_STRONG, false);
282    
283                    StagedModelDataHandlerUtil.exportStagedModel(
284                            portletDataContext, passwordPolicy);
285            }
286    
287            protected void exportPhones(
288                            PortletDataContext portletDataContext, Organization organization,
289                            Element organizationElement)
290                    throws PortalException, SystemException {
291    
292                    List<Phone> phones = PhoneLocalServiceUtil.getPhones(
293                            organization.getCompanyId(), organization.getModelClassName(),
294                            organization.getOrganizationId());
295    
296                    for (Phone phone : phones) {
297                            portletDataContext.addReferenceElement(
298                                    organization, organizationElement, phone,
299                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED, false);
300    
301                            StagedModelDataHandlerUtil.exportStagedModel(
302                                    portletDataContext, phone);
303                    }
304            }
305    
306            protected void exportWebsites(
307                            PortletDataContext portletDataContext, Organization organization,
308                            Element organizationElement)
309                    throws PortalException, SystemException {
310    
311                    List<Website> websites = WebsiteLocalServiceUtil.getWebsites(
312                            organization.getCompanyId(), organization.getModelClassName(),
313                            organization.getOrganizationId());
314    
315                    for (Website website : websites) {
316                            portletDataContext.addReferenceElement(
317                                    organization, organizationElement, website,
318                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED, false);
319    
320                            StagedModelDataHandlerUtil.exportStagedModel(
321                                    portletDataContext, website);
322                    }
323            }
324    
325            protected void importAddresses(
326                            PortletDataContext portletDataContext, Organization organization,
327                            Organization importedOrganization)
328                    throws PortalException, SystemException {
329    
330                    List<Element> addressElements =
331                            portletDataContext.getReferenceDataElements(
332                                    organization, Address.class);
333    
334                    List<Address> addresses = new ArrayList<Address>(
335                            addressElements.size());
336    
337                    for (Element addressElement : addressElements) {
338                            String addressPath = addressElement.attributeValue("path");
339    
340                            Address address = (Address)portletDataContext.getZipEntryAsObject(
341                                    addressPath);
342    
343                            address.setClassPK(importedOrganization.getOrganizationId());
344    
345                            StagedModelDataHandlerUtil.importStagedModel(
346                                    portletDataContext, address);
347    
348                            Map<Long, Long> addressIds =
349                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
350                                            Address.class);
351    
352                            long addressId = addressIds.get(address.getPrimaryKey());
353    
354                            address.setAddressId(addressId);
355    
356                            addresses.add(address);
357                    }
358    
359                    UsersAdminUtil.updateAddresses(
360                            Organization.class.getName(),
361                            importedOrganization.getOrganizationId(), addresses);
362            }
363    
364            protected void importEmailAddresses(
365                            PortletDataContext portletDataContext, Organization organization,
366                            Organization importedOrganization)
367                    throws PortalException, SystemException {
368    
369                    List<Element> emailAddressElements =
370                            portletDataContext.getReferenceDataElements(
371                                    organization, EmailAddress.class);
372    
373                    List<EmailAddress> emailAddresses = new ArrayList<EmailAddress>(
374                            emailAddressElements.size());
375    
376                    for (Element emailAddressElement : emailAddressElements) {
377                            String emailAddressPath = emailAddressElement.attributeValue(
378                                    "path");
379    
380                            EmailAddress emailAddress =
381                                    (EmailAddress)portletDataContext.getZipEntryAsObject(
382                                            emailAddressPath);
383    
384                            emailAddress.setClassPK(importedOrganization.getOrganizationId());
385    
386                            StagedModelDataHandlerUtil.importStagedModel(
387                                    portletDataContext, emailAddress);
388    
389                            Map<Long, Long> emailAddressIds =
390                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
391                                            EmailAddress.class);
392    
393                            long emailAddressId = emailAddressIds.get(
394                                    emailAddress.getPrimaryKey());
395    
396                            emailAddress.setEmailAddressId(emailAddressId);
397    
398                            emailAddresses.add(emailAddress);
399                    }
400    
401                    UsersAdminUtil.updateEmailAddresses(
402                            Organization.class.getName(),
403                            importedOrganization.getOrganizationId(), emailAddresses);
404            }
405    
406            protected void importOrgLabors(
407                            PortletDataContext portletDataContext, Organization organization,
408                            Organization importedOrganization)
409                    throws PortalException, SystemException {
410    
411                    String path = ExportImportPathUtil.getModelPath(
412                            organization, OrgLabor.class.getSimpleName());
413    
414                    List<OrgLabor> orgLabors =
415                            (List<OrgLabor>)portletDataContext.getZipEntryAsObject(path);
416    
417                    for (OrgLabor orgLabor : orgLabors) {
418                            orgLabor.setOrgLaborId(0);
419                    }
420    
421                    UsersAdminUtil.updateOrgLabors(
422                            importedOrganization.getOrganizationId(), orgLabors);
423            }
424    
425            protected void importPasswordPolicyRel(
426                            PortletDataContext portletDataContext, Organization organization,
427                            Organization importedOrganization)
428                    throws PortalException, SystemException {
429    
430                    List<Element> passwordPolicyElements =
431                            portletDataContext.getReferenceDataElements(
432                                    organization, PasswordPolicy.class);
433    
434                    if (passwordPolicyElements.isEmpty()) {
435                            return;
436                    }
437    
438                    Element passwordPolicyElement = passwordPolicyElements.get(0);
439    
440                    String passwordPolicyPath = passwordPolicyElement.attributeValue(
441                            "path");
442    
443                    PasswordPolicy passwordPolicy =
444                            (PasswordPolicy)portletDataContext.getZipEntryAsObject(
445                                    passwordPolicyPath);
446    
447                    StagedModelDataHandlerUtil.importStagedModel(
448                            portletDataContext, passwordPolicy);
449    
450                    Map<Long, Long> passwordPolicyIds =
451                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
452                                    PasswordPolicy.class);
453    
454                    long passwordPolicyId = passwordPolicyIds.get(
455                            passwordPolicy.getPrimaryKey());
456    
457                    OrganizationLocalServiceUtil.addPasswordPolicyOrganizations(
458                            passwordPolicyId,
459                            new long[] {importedOrganization.getOrganizationId()});
460            }
461    
462            protected void importPhones(
463                            PortletDataContext portletDataContext, Organization organization,
464                            Organization importedOrganization)
465                    throws PortalException, SystemException {
466    
467                    List<Element> phoneElements =
468                            portletDataContext.getReferenceDataElements(
469                                    organization, Phone.class);
470    
471                    List<Phone> phones = new ArrayList<Phone>(phoneElements.size());
472    
473                    for (Element phoneElement : phoneElements) {
474                            String phonePath = phoneElement.attributeValue("path");
475    
476                            Phone phone = (Phone)portletDataContext.getZipEntryAsObject
477                                    (phonePath);
478    
479                            phone.setClassPK(importedOrganization.getOrganizationId());
480    
481                            StagedModelDataHandlerUtil.importStagedModel(
482                                    portletDataContext, phone);
483    
484                            Map<Long, Long> phoneIds =
485                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
486                                            Phone.class);
487    
488                            long phoneId = phoneIds.get(phone.getPrimaryKey());
489    
490                            phone.setPhoneId(phoneId);
491    
492                            phones.add(phone);
493                    }
494    
495                    UsersAdminUtil.updatePhones(
496                            Organization.class.getName(),
497                            importedOrganization.getOrganizationId(), phones);
498            }
499    
500            protected void importWebsites(
501                            PortletDataContext portletDataContext, Organization organization,
502                            Organization importedOrganization)
503                    throws PortalException, SystemException {
504    
505                    List<Element> websiteElements =
506                            portletDataContext.getReferenceDataElements(
507                                    organization, Website.class);
508    
509                    List<Website> websites = new ArrayList<Website>(websiteElements.size());
510    
511                    for (Element websiteElement : websiteElements) {
512                            String websitePath = websiteElement.attributeValue("path");
513    
514                            Website website = (Website)portletDataContext.getZipEntryAsObject(
515                                    websitePath);
516    
517                            website.setClassPK(importedOrganization.getOrganizationId());
518    
519                            StagedModelDataHandlerUtil.importStagedModel(
520                                    portletDataContext, website);
521    
522                            Map<Long, Long> websiteIds =
523                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
524                                            Website.class);
525    
526                            long websiteId = websiteIds.get(website.getPrimaryKey());
527    
528                            website.setWebsiteId(websiteId);
529    
530                            websites.add(website);
531                    }
532    
533                    UsersAdminUtil.updateWebsites(
534                            Organization.class.getName(),
535                            importedOrganization.getOrganizationId(), websites);
536            }
537    
538            @Override
539            protected boolean validateMissingReference(
540                            String uuid, long companyId, long groupId)
541                    throws Exception {
542    
543                    Organization organization =
544                            OrganizationLocalServiceUtil.fetchOrganizationByUuidAndCompanyId(
545                                    uuid, companyId);
546    
547                    if (organization == null) {
548                            return false;
549                    }
550    
551                    return true;
552            }
553    
554    }