001    /**
002     * Copyright (c) 2000-present 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.dynamicdatalists.service.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.systemevent.SystemEvent;
019    import com.liferay.portal.kernel.util.LocaleUtil;
020    import com.liferay.portal.kernel.util.OrderByComparator;
021    import com.liferay.portal.kernel.util.Validator;
022    import com.liferay.portal.model.ResourceConstants;
023    import com.liferay.portal.model.SystemEventConstants;
024    import com.liferay.portal.model.User;
025    import com.liferay.portal.service.ServiceContext;
026    import com.liferay.portlet.dynamicdatalists.RecordSetDDMStructureIdException;
027    import com.liferay.portlet.dynamicdatalists.RecordSetDuplicateRecordSetKeyException;
028    import com.liferay.portlet.dynamicdatalists.RecordSetNameException;
029    import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
030    import com.liferay.portlet.dynamicdatalists.service.base.DDLRecordSetLocalServiceBaseImpl;
031    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
032    import com.liferay.portlet.dynamicdatamapping.model.DDMStructureLink;
033    
034    import java.util.Date;
035    import java.util.List;
036    import java.util.Locale;
037    import java.util.Map;
038    
039    /**
040     * Provides the local service for accessing, adding, deleting, and updating
041     * dynamic data list (DDL) record sets.
042     *
043     * @author Brian Wing Shun Chan
044     * @author Marcellus Tavares
045     */
046    public class DDLRecordSetLocalServiceImpl
047            extends DDLRecordSetLocalServiceBaseImpl {
048    
049            @Override
050            public DDLRecordSet addRecordSet(
051                            long userId, long groupId, long ddmStructureId, String recordSetKey,
052                            Map<Locale, String> nameMap, Map<Locale, String> descriptionMap,
053                            int minDisplayRows, int scope, ServiceContext serviceContext)
054                    throws PortalException {
055    
056                    // Record set
057    
058                    User user = userPersistence.findByPrimaryKey(userId);
059    
060                    if (Validator.isNull(recordSetKey)) {
061                            recordSetKey = String.valueOf(counterLocalService.increment());
062                    }
063    
064                    Date now = new Date();
065    
066                    validate(groupId, ddmStructureId, recordSetKey, nameMap);
067    
068                    long recordSetId = counterLocalService.increment();
069    
070                    DDLRecordSet recordSet = ddlRecordSetPersistence.create(recordSetId);
071    
072                    recordSet.setUuid(serviceContext.getUuid());
073                    recordSet.setGroupId(groupId);
074                    recordSet.setCompanyId(user.getCompanyId());
075                    recordSet.setUserId(user.getUserId());
076                    recordSet.setUserName(user.getFullName());
077                    recordSet.setCreateDate(serviceContext.getCreateDate(now));
078                    recordSet.setModifiedDate(serviceContext.getModifiedDate(now));
079                    recordSet.setDDMStructureId(ddmStructureId);
080                    recordSet.setRecordSetKey(recordSetKey);
081                    recordSet.setNameMap(nameMap);
082                    recordSet.setDescriptionMap(descriptionMap);
083                    recordSet.setMinDisplayRows(minDisplayRows);
084                    recordSet.setScope(scope);
085    
086                    ddlRecordSetPersistence.update(recordSet);
087    
088                    // Resources
089    
090                    if (serviceContext.isAddGroupPermissions() ||
091                            serviceContext.isAddGuestPermissions()) {
092    
093                            addRecordSetResources(
094                                    recordSet, serviceContext.isAddGroupPermissions(),
095                                    serviceContext.isAddGuestPermissions());
096                    }
097                    else {
098                            addRecordSetResources(
099                                    recordSet, serviceContext.getGroupPermissions(),
100                                    serviceContext.getGuestPermissions());
101                    }
102    
103                    // Dynamic data mapping structure link
104    
105                    long classNameId = classNameLocalService.getClassNameId(
106                            DDLRecordSet.class);
107    
108                    ddmStructureLinkLocalService.addStructureLink(
109                            classNameId, recordSetId, ddmStructureId, serviceContext);
110    
111                    return recordSet;
112            }
113    
114            @Override
115            public void addRecordSetResources(
116                            DDLRecordSet recordSet, boolean addGroupPermissions,
117                            boolean addGuestPermissions)
118                    throws PortalException {
119    
120                    resourceLocalService.addResources(
121                            recordSet.getCompanyId(), recordSet.getGroupId(),
122                            recordSet.getUserId(), DDLRecordSet.class.getName(),
123                            recordSet.getRecordSetId(), false, addGroupPermissions,
124                            addGuestPermissions);
125            }
126    
127            @Override
128            public void addRecordSetResources(
129                            DDLRecordSet recordSet, String[] groupPermissions,
130                            String[] guestPermissions)
131                    throws PortalException {
132    
133                    resourceLocalService.addModelResources(
134                            recordSet.getCompanyId(), recordSet.getGroupId(),
135                            recordSet.getUserId(), DDLRecordSet.class.getName(),
136                            recordSet.getRecordSetId(), groupPermissions, guestPermissions);
137            }
138    
139            @Override
140            @SystemEvent(
141                    action = SystemEventConstants.ACTION_SKIP,
142                    type = SystemEventConstants.TYPE_DELETE)
143            public void deleteRecordSet(DDLRecordSet recordSet) throws PortalException {
144    
145                    // Record set
146    
147                    ddlRecordSetPersistence.remove(recordSet);
148    
149                    // Resources
150    
151                    resourceLocalService.deleteResource(
152                            recordSet.getCompanyId(), DDLRecordSet.class.getName(),
153                            ResourceConstants.SCOPE_INDIVIDUAL, recordSet.getRecordSetId());
154    
155                    // Records
156    
157                    ddlRecordLocalService.deleteRecords(recordSet.getRecordSetId());
158    
159                    // Dynamic data mapping structure link
160    
161                    ddmStructureLinkLocalService.deleteClassStructureLink(
162                            recordSet.getRecordSetId());
163    
164                    // Workflow
165    
166                    workflowDefinitionLinkLocalService.deleteWorkflowDefinitionLink(
167                            recordSet.getCompanyId(), recordSet.getGroupId(),
168                            DDLRecordSet.class.getName(), recordSet.getRecordSetId(), 0);
169            }
170    
171            @Override
172            public void deleteRecordSet(long recordSetId) throws PortalException {
173                    DDLRecordSet recordSet = ddlRecordSetPersistence.findByPrimaryKey(
174                            recordSetId);
175    
176                    ddlRecordSetLocalService.deleteRecordSet(recordSet);
177            }
178    
179            @Override
180            public void deleteRecordSet(long groupId, String recordSetKey)
181                    throws PortalException {
182    
183                    DDLRecordSet recordSet = ddlRecordSetPersistence.findByG_R(
184                            groupId, recordSetKey);
185    
186                    ddlRecordSetLocalService.deleteRecordSet(recordSet);
187            }
188    
189            @Override
190            public void deleteRecordSets(long groupId) throws PortalException {
191                    List<DDLRecordSet> recordSets = ddlRecordSetPersistence.findByGroupId(
192                            groupId);
193    
194                    for (DDLRecordSet recordSet : recordSets) {
195                            ddlRecordSetLocalService.deleteRecordSet(recordSet);
196                    }
197            }
198    
199            @Override
200            public DDLRecordSet fetchRecordSet(long recordSetId) {
201                    return ddlRecordSetPersistence.fetchByPrimaryKey(recordSetId);
202            }
203    
204            @Override
205            public DDLRecordSet fetchRecordSet(long groupId, String recordSetKey) {
206                    return ddlRecordSetPersistence.fetchByG_R(groupId, recordSetKey);
207            }
208    
209            @Override
210            public DDLRecordSet getRecordSet(long recordSetId) throws PortalException {
211                    return ddlRecordSetPersistence.findByPrimaryKey(recordSetId);
212            }
213    
214            @Override
215            public DDLRecordSet getRecordSet(long groupId, String recordSetKey)
216                    throws PortalException {
217    
218                    return ddlRecordSetPersistence.findByG_R(groupId, recordSetKey);
219            }
220    
221            @Override
222            public List<DDLRecordSet> getRecordSets(long groupId) {
223                    return ddlRecordSetPersistence.findByGroupId(groupId);
224            }
225    
226            @Override
227            public int getRecordSetsCount(long groupId) {
228                    return ddlRecordSetPersistence.countByGroupId(groupId);
229            }
230    
231            @Override
232            public List<DDLRecordSet> search(
233                    long companyId, long groupId, String keywords, int scope, int start,
234                    int end, OrderByComparator<DDLRecordSet> orderByComparator) {
235    
236                    return ddlRecordSetFinder.findByKeywords(
237                            companyId, groupId, keywords, scope, start, end, orderByComparator);
238            }
239    
240            @Override
241            public List<DDLRecordSet> search(
242                    long companyId, long groupId, String name, String description,
243                    int scope, boolean andOperator, int start, int end,
244                    OrderByComparator<DDLRecordSet> orderByComparator) {
245    
246                    return ddlRecordSetFinder.findByC_G_N_D_S(
247                            companyId, groupId, name, description, scope, andOperator, start,
248                            end, orderByComparator);
249            }
250    
251            @Override
252            public int searchCount(
253                    long companyId, long groupId, String keywords, int scope) {
254    
255                    return ddlRecordSetFinder.countByKeywords(
256                            companyId, groupId, keywords, scope);
257            }
258    
259            @Override
260            public int searchCount(
261                    long companyId, long groupId, String name, String description,
262                    int scope, boolean andOperator) {
263    
264                    return ddlRecordSetFinder.countByC_G_N_D_S(
265                            companyId, groupId, name, description, scope, andOperator);
266            }
267    
268            @Override
269            public DDLRecordSet updateMinDisplayRows(
270                            long recordSetId, int minDisplayRows, ServiceContext serviceContext)
271                    throws PortalException {
272    
273                    DDLRecordSet recordSet = ddlRecordSetPersistence.findByPrimaryKey(
274                            recordSetId);
275    
276                    recordSet.setModifiedDate(serviceContext.getModifiedDate(null));
277                    recordSet.setMinDisplayRows(minDisplayRows);
278    
279                    ddlRecordSetPersistence.update(recordSet);
280    
281                    return recordSet;
282            }
283    
284            @Override
285            public DDLRecordSet updateRecordSet(
286                            long recordSetId, long ddmStructureId, Map<Locale, String> nameMap,
287                            Map<Locale, String> descriptionMap, int minDisplayRows,
288                            ServiceContext serviceContext)
289                    throws PortalException {
290    
291                    DDLRecordSet recordSet = ddlRecordSetPersistence.findByPrimaryKey(
292                            recordSetId);
293    
294                    return doUpdateRecordSet(
295                            ddmStructureId, nameMap, descriptionMap, minDisplayRows,
296                            serviceContext, recordSet);
297            }
298    
299            @Override
300            public DDLRecordSet updateRecordSet(
301                            long groupId, long ddmStructureId, String recordSetKey,
302                            Map<Locale, String> nameMap, Map<Locale, String> descriptionMap,
303                            int minDisplayRows, ServiceContext serviceContext)
304                    throws PortalException {
305    
306                    DDLRecordSet recordSet = ddlRecordSetPersistence.findByG_R(
307                            groupId, recordSetKey);
308    
309                    return doUpdateRecordSet(
310                            ddmStructureId, nameMap, descriptionMap, minDisplayRows,
311                            serviceContext, recordSet);
312            }
313    
314            protected DDLRecordSet doUpdateRecordSet(
315                            long ddmStructureId, Map<Locale, String> nameMap,
316                            Map<Locale, String> descriptionMap, int minDisplayRows,
317                            ServiceContext serviceContext, DDLRecordSet recordSet)
318                    throws PortalException {
319    
320                    // Record set
321    
322                    validateDDMStructureId(ddmStructureId);
323                    validateName(nameMap);
324    
325                    long oldDDMStructureId = recordSet.getDDMStructureId();
326    
327                    recordSet.setModifiedDate(serviceContext.getModifiedDate(null));
328                    recordSet.setDDMStructureId(ddmStructureId);
329                    recordSet.setNameMap(nameMap);
330                    recordSet.setDescriptionMap(descriptionMap);
331                    recordSet.setMinDisplayRows(minDisplayRows);
332    
333                    ddlRecordSetPersistence.update(recordSet);
334    
335                    if (oldDDMStructureId != ddmStructureId) {
336    
337                            // Records
338    
339                            ddlRecordLocalService.deleteRecords(recordSet.getRecordSetId());
340    
341                            // Dynamic data mapping structure link
342    
343                            DDMStructureLink ddmStructureLink =
344                                    ddmStructureLinkLocalService.getClassStructureLink(
345                                            recordSet.getRecordSetId());
346    
347                            long classNameId = classNameLocalService.getClassNameId(
348                                    DDLRecordSet.class);
349    
350                            ddmStructureLinkLocalService.updateStructureLink(
351                                    ddmStructureLink.getStructureLinkId(), classNameId,
352                                    recordSet.getRecordSetId(), ddmStructureId);
353                    }
354    
355                    return recordSet;
356            }
357    
358            protected void validate(
359                            long groupId, long ddmStructureId, String recordSetKey,
360                            Map<Locale, String> nameMap)
361                    throws PortalException {
362    
363                    validateDDMStructureId(ddmStructureId);
364    
365                    if (Validator.isNotNull(recordSetKey)) {
366                            DDLRecordSet recordSet = ddlRecordSetPersistence.fetchByG_R(
367                                    groupId, recordSetKey);
368    
369                            if (recordSet != null) {
370                                    RecordSetDuplicateRecordSetKeyException rsdrske =
371                                            new RecordSetDuplicateRecordSetKeyException();
372    
373                                    rsdrske.setRecordSetKey(recordSet.getRecordSetKey());
374    
375                                    throw rsdrske;
376                            }
377                    }
378    
379                    validateName(nameMap);
380            }
381    
382            protected void validateDDMStructureId(long ddmStructureId)
383                    throws PortalException {
384    
385                    DDMStructure ddmStructure = ddmStructurePersistence.fetchByPrimaryKey(
386                            ddmStructureId);
387    
388                    if (ddmStructure == null) {
389                            throw new RecordSetDDMStructureIdException();
390                    }
391            }
392    
393            protected void validateName(Map<Locale, String> nameMap)
394                    throws PortalException {
395    
396                    String name = nameMap.get(LocaleUtil.getSiteDefault());
397    
398                    if (Validator.isNull(name)) {
399                            throw new RecordSetNameException();
400                    }
401            }
402    
403    }