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                            if (organization.getParentOrganizationId() !=
100                                            OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) {
101    
102                                    StagedModelDataHandlerUtil.exportReferenceStagedModel(
103                                            portletDataContext, organization,
104                                            organization.getParentOrganization(),
105                                            PortletDataContext.REFERENCE_TYPE_PARENT);
106                            }
107    
108                            exportAddresses(portletDataContext, exportedOrganization);
109                            exportEmailAddresses(portletDataContext, exportedOrganization);
110                            exportOrgLabors(portletDataContext, exportedOrganization);
111                            exportPasswordPolicyRel(portletDataContext, exportedOrganization);
112                            exportPhones(portletDataContext, exportedOrganization);
113                            exportWebsites(portletDataContext, exportedOrganization);
114    
115                            Element organizationElement =
116                                    portletDataContext.getExportDataElement(exportedOrganization);
117    
118                            portletDataContext.addClassedModel(
119                                    organizationElement,
120                                    ExportImportPathUtil.getModelPath(exportedOrganization),
121                                    exportedOrganization);
122    
123                            organizations.addAll(exportedOrganization.getSuborganizations());
124                    }
125            }
126    
127            @Override
128            protected void doImportStagedModel(
129                            PortletDataContext portletDataContext, Organization organization)
130                    throws Exception {
131    
132                    long userId = portletDataContext.getUserId(organization.getUserUuid());
133    
134                    if (organization.getParentOrganizationId() !=
135                                    OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) {
136    
137                            StagedModelDataHandlerUtil.importReferenceStagedModel(
138                                    portletDataContext, organization, Organization.class,
139                                    organization.getParentOrganizationId());
140                    }
141    
142                    Map<Long, Long> organizationIds =
143                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
144                                    Organization.class);
145    
146                    long parentOrganizationId = MapUtil.getLong(
147                            organizationIds, organization.getParentOrganizationId(),
148                            organization.getParentOrganizationId());
149    
150                    ServiceContext serviceContext = portletDataContext.createServiceContext(
151                            organization);
152    
153                    serviceContext.setUserId(userId);
154    
155                    Organization existingOrganization =
156                            OrganizationLocalServiceUtil.fetchOrganizationByUuidAndCompanyId(
157                                    organization.getUuid(), portletDataContext.getCompanyId());
158    
159                    if (existingOrganization == null) {
160                            existingOrganization =
161                                    OrganizationLocalServiceUtil.fetchOrganization(
162                                            portletDataContext.getCompanyId(), organization.getName());
163                    }
164    
165                    Organization importedOrganization = null;
166    
167                    if (existingOrganization == null) {
168                            serviceContext.setUuid(organization.getUuid());
169    
170                            importedOrganization =
171                                    OrganizationLocalServiceUtil.addOrganization(
172                                            userId, parentOrganizationId, organization.getName(),
173                                            organization.getType(), organization.getRegionId(),
174                                            organization.getCountryId(), organization.getStatusId(),
175                                            organization.getComments(), false, serviceContext);
176                    }
177                    else {
178                            importedOrganization =
179                                    OrganizationLocalServiceUtil.updateOrganization(
180                                            portletDataContext.getCompanyId(),
181                                            existingOrganization.getOrganizationId(),
182                                            parentOrganizationId, organization.getName(),
183                                            organization.getType(), organization.getRegionId(),
184                                            organization.getCountryId(), organization.getStatusId(),
185                                            organization.getComments(), false, serviceContext);
186                    }
187    
188                    importAddresses(portletDataContext, organization, importedOrganization);
189                    importEmailAddresses(
190                            portletDataContext, organization, importedOrganization);
191                    importOrgLabors(portletDataContext, organization, importedOrganization);
192                    importPasswordPolicyRel(
193                            portletDataContext, organization, importedOrganization);
194                    importPhones(portletDataContext, organization, importedOrganization);
195                    importWebsites(portletDataContext, organization, importedOrganization);
196    
197                    portletDataContext.importClassedModel(
198                            organization, importedOrganization);
199            }
200    
201            protected void exportAddresses(
202                            PortletDataContext portletDataContext, Organization organization)
203                    throws PortalException, SystemException {
204    
205                    List<Address> addresses = AddressLocalServiceUtil.getAddresses(
206                            organization.getCompanyId(), organization.getModelClassName(),
207                            organization.getOrganizationId());
208    
209                    for (Address address : addresses) {
210                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
211                                    portletDataContext, organization, address,
212                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED);
213                    }
214            }
215    
216            protected void exportEmailAddresses(
217                            PortletDataContext portletDataContext, Organization organization)
218                    throws PortalException, SystemException {
219    
220                    List<EmailAddress> emailAddresses =
221                            EmailAddressLocalServiceUtil.getEmailAddresses(
222                                    organization.getCompanyId(), organization.getModelClassName(),
223                                    organization.getOrganizationId());
224    
225                    for (EmailAddress emailAddress : emailAddresses) {
226                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
227                                    portletDataContext, organization, emailAddress,
228                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED);
229                    }
230            }
231    
232            protected void exportOrgLabors(
233                            PortletDataContext portletDataContext, Organization organization)
234                    throws SystemException {
235    
236                    List<OrgLabor> orgLabors = OrgLaborLocalServiceUtil.getOrgLabors(
237                            organization.getOrganizationId());
238    
239                    String path = ExportImportPathUtil.getModelPath(
240                            organization, OrgLabor.class.getSimpleName());
241    
242                    portletDataContext.addZipEntry(path, orgLabors);
243            }
244    
245            protected void exportPasswordPolicyRel(
246                            PortletDataContext portletDataContext, Organization organization)
247                    throws PortalException, SystemException {
248    
249                    PasswordPolicyRel passwordPolicyRel =
250                            PasswordPolicyRelLocalServiceUtil.fetchPasswordPolicyRel(
251                                    Organization.class.getName(), organization.getOrganizationId());
252    
253                    if (passwordPolicyRel == null) {
254                            return;
255                    }
256    
257                    PasswordPolicy passwordPolicy =
258                            PasswordPolicyLocalServiceUtil.getPasswordPolicy(
259                                    passwordPolicyRel.getPasswordPolicyId());
260    
261                    StagedModelDataHandlerUtil.exportReferenceStagedModel(
262                            portletDataContext, organization, passwordPolicy,
263                            PortletDataContext.REFERENCE_TYPE_STRONG);
264            }
265    
266            protected void exportPhones(
267                            PortletDataContext portletDataContext, Organization organization)
268                    throws PortalException, SystemException {
269    
270                    List<Phone> phones = PhoneLocalServiceUtil.getPhones(
271                            organization.getCompanyId(), organization.getModelClassName(),
272                            organization.getOrganizationId());
273    
274                    for (Phone phone : phones) {
275                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
276                                    portletDataContext, organization, phone,
277                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED);
278                    }
279            }
280    
281            protected void exportWebsites(
282                            PortletDataContext portletDataContext, Organization organization)
283                    throws PortalException, SystemException {
284    
285                    List<Website> websites = WebsiteLocalServiceUtil.getWebsites(
286                            organization.getCompanyId(), organization.getModelClassName(),
287                            organization.getOrganizationId());
288    
289                    for (Website website : websites) {
290                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
291                                    portletDataContext, organization, website,
292                                    PortletDataContext.REFERENCE_TYPE_EMBEDDED);
293                    }
294            }
295    
296            protected void importAddresses(
297                            PortletDataContext portletDataContext, Organization organization,
298                            Organization importedOrganization)
299                    throws PortalException, SystemException {
300    
301                    List<Element> addressElements =
302                            portletDataContext.getReferenceDataElements(
303                                    organization, Address.class);
304    
305                    List<Address> addresses = new ArrayList<Address>(
306                            addressElements.size());
307    
308                    for (Element addressElement : addressElements) {
309                            String addressPath = addressElement.attributeValue("path");
310    
311                            Address address = (Address)portletDataContext.getZipEntryAsObject(
312                                    addressPath);
313    
314                            address.setClassPK(importedOrganization.getOrganizationId());
315    
316                            StagedModelDataHandlerUtil.importStagedModel(
317                                    portletDataContext, address);
318    
319                            Map<Long, Long> addressIds =
320                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
321                                            Address.class);
322    
323                            long addressId = addressIds.get(address.getPrimaryKey());
324    
325                            address.setAddressId(addressId);
326    
327                            addresses.add(address);
328                    }
329    
330                    UsersAdminUtil.updateAddresses(
331                            Organization.class.getName(),
332                            importedOrganization.getOrganizationId(), addresses);
333            }
334    
335            protected void importEmailAddresses(
336                            PortletDataContext portletDataContext, Organization organization,
337                            Organization importedOrganization)
338                    throws PortalException, SystemException {
339    
340                    List<Element> emailAddressElements =
341                            portletDataContext.getReferenceDataElements(
342                                    organization, EmailAddress.class);
343    
344                    List<EmailAddress> emailAddresses = new ArrayList<EmailAddress>(
345                            emailAddressElements.size());
346    
347                    for (Element emailAddressElement : emailAddressElements) {
348                            String emailAddressPath = emailAddressElement.attributeValue(
349                                    "path");
350    
351                            EmailAddress emailAddress =
352                                    (EmailAddress)portletDataContext.getZipEntryAsObject(
353                                            emailAddressPath);
354    
355                            emailAddress.setClassPK(importedOrganization.getOrganizationId());
356    
357                            StagedModelDataHandlerUtil.importStagedModel(
358                                    portletDataContext, emailAddress);
359    
360                            Map<Long, Long> emailAddressIds =
361                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
362                                            EmailAddress.class);
363    
364                            long emailAddressId = emailAddressIds.get(
365                                    emailAddress.getPrimaryKey());
366    
367                            emailAddress.setEmailAddressId(emailAddressId);
368    
369                            emailAddresses.add(emailAddress);
370                    }
371    
372                    UsersAdminUtil.updateEmailAddresses(
373                            Organization.class.getName(),
374                            importedOrganization.getOrganizationId(), emailAddresses);
375            }
376    
377            protected void importOrgLabors(
378                            PortletDataContext portletDataContext, Organization organization,
379                            Organization importedOrganization)
380                    throws PortalException, SystemException {
381    
382                    String path = ExportImportPathUtil.getModelPath(
383                            organization, OrgLabor.class.getSimpleName());
384    
385                    List<OrgLabor> orgLabors =
386                            (List<OrgLabor>)portletDataContext.getZipEntryAsObject(path);
387    
388                    for (OrgLabor orgLabor : orgLabors) {
389                            orgLabor.setOrgLaborId(0);
390                    }
391    
392                    UsersAdminUtil.updateOrgLabors(
393                            importedOrganization.getOrganizationId(), orgLabors);
394            }
395    
396            protected void importPasswordPolicyRel(
397                            PortletDataContext portletDataContext, Organization organization,
398                            Organization importedOrganization)
399                    throws PortalException, SystemException {
400    
401                    List<Element> passwordPolicyElements =
402                            portletDataContext.getReferenceDataElements(
403                                    organization, PasswordPolicy.class);
404    
405                    if (passwordPolicyElements.isEmpty()) {
406                            return;
407                    }
408    
409                    Element passwordPolicyElement = passwordPolicyElements.get(0);
410    
411                    String passwordPolicyPath = passwordPolicyElement.attributeValue(
412                            "path");
413    
414                    PasswordPolicy passwordPolicy =
415                            (PasswordPolicy)portletDataContext.getZipEntryAsObject(
416                                    passwordPolicyPath);
417    
418                    StagedModelDataHandlerUtil.importStagedModel(
419                            portletDataContext, passwordPolicy);
420    
421                    Map<Long, Long> passwordPolicyIds =
422                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
423                                    PasswordPolicy.class);
424    
425                    long passwordPolicyId = passwordPolicyIds.get(
426                            passwordPolicy.getPrimaryKey());
427    
428                    OrganizationLocalServiceUtil.addPasswordPolicyOrganizations(
429                            passwordPolicyId,
430                            new long[] {importedOrganization.getOrganizationId()});
431            }
432    
433            protected void importPhones(
434                            PortletDataContext portletDataContext, Organization organization,
435                            Organization importedOrganization)
436                    throws PortalException, SystemException {
437    
438                    List<Element> phoneElements =
439                            portletDataContext.getReferenceDataElements(
440                                    organization, Phone.class);
441    
442                    List<Phone> phones = new ArrayList<Phone>(phoneElements.size());
443    
444                    for (Element phoneElement : phoneElements) {
445                            String phonePath = phoneElement.attributeValue("path");
446    
447                            Phone phone = (Phone)portletDataContext.getZipEntryAsObject
448                                    (phonePath);
449    
450                            phone.setClassPK(importedOrganization.getOrganizationId());
451    
452                            StagedModelDataHandlerUtil.importStagedModel(
453                                    portletDataContext, phone);
454    
455                            Map<Long, Long> phoneIds =
456                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
457                                            Phone.class);
458    
459                            long phoneId = phoneIds.get(phone.getPrimaryKey());
460    
461                            phone.setPhoneId(phoneId);
462    
463                            phones.add(phone);
464                    }
465    
466                    UsersAdminUtil.updatePhones(
467                            Organization.class.getName(),
468                            importedOrganization.getOrganizationId(), phones);
469            }
470    
471            protected void importWebsites(
472                            PortletDataContext portletDataContext, Organization organization,
473                            Organization importedOrganization)
474                    throws PortalException, SystemException {
475    
476                    List<Element> websiteElements =
477                            portletDataContext.getReferenceDataElements(
478                                    organization, Website.class);
479    
480                    List<Website> websites = new ArrayList<Website>(websiteElements.size());
481    
482                    for (Element websiteElement : websiteElements) {
483                            String websitePath = websiteElement.attributeValue("path");
484    
485                            Website website = (Website)portletDataContext.getZipEntryAsObject(
486                                    websitePath);
487    
488                            website.setClassPK(importedOrganization.getOrganizationId());
489    
490                            StagedModelDataHandlerUtil.importStagedModel(
491                                    portletDataContext, website);
492    
493                            Map<Long, Long> websiteIds =
494                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
495                                            Website.class);
496    
497                            long websiteId = websiteIds.get(website.getPrimaryKey());
498    
499                            website.setWebsiteId(websiteId);
500    
501                            websites.add(website);
502                    }
503    
504                    UsersAdminUtil.updateWebsites(
505                            Organization.class.getName(),
506                            importedOrganization.getOrganizationId(), websites);
507            }
508    
509            @Override
510            protected boolean validateMissingReference(
511                            String uuid, long companyId, long groupId)
512                    throws Exception {
513    
514                    Organization organization =
515                            OrganizationLocalServiceUtil.fetchOrganizationByUuidAndCompanyId(
516                                    uuid, companyId);
517    
518                    if (organization == null) {
519                            return false;
520                    }
521    
522                    return true;
523            }
524    
525    }