001
014
015 package com.liferay.portlet.dynamicdatalists.service.impl;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.language.LanguageUtil;
020 import com.liferay.portal.kernel.search.Hits;
021 import com.liferay.portal.kernel.search.Indexable;
022 import com.liferay.portal.kernel.search.IndexableType;
023 import com.liferay.portal.kernel.search.Indexer;
024 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
025 import com.liferay.portal.kernel.search.SearchContext;
026 import com.liferay.portal.kernel.util.ContentTypes;
027 import com.liferay.portal.kernel.util.ListUtil;
028 import com.liferay.portal.kernel.util.OrderByComparator;
029 import com.liferay.portal.kernel.util.StringPool;
030 import com.liferay.portal.kernel.util.StringUtil;
031 import com.liferay.portal.kernel.util.Validator;
032 import com.liferay.portal.kernel.workflow.WorkflowConstants;
033 import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;
034 import com.liferay.portal.model.User;
035 import com.liferay.portal.service.ServiceContext;
036 import com.liferay.portlet.documentlibrary.util.DLUtil;
037 import com.liferay.portlet.dynamicdatalists.NoSuchRecordVersionException;
038 import com.liferay.portlet.dynamicdatalists.model.DDLRecord;
039 import com.liferay.portlet.dynamicdatalists.model.DDLRecordConstants;
040 import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
041 import com.liferay.portlet.dynamicdatalists.model.DDLRecordVersion;
042 import com.liferay.portlet.dynamicdatalists.service.base.DDLRecordLocalServiceBaseImpl;
043 import com.liferay.portlet.dynamicdatalists.util.comparator.DDLRecordVersionVersionComparator;
044 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
045 import com.liferay.portlet.dynamicdatamapping.storage.Field;
046 import com.liferay.portlet.dynamicdatamapping.storage.Fields;
047 import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
048 import com.liferay.portlet.dynamicdatamapping.util.DDMUtil;
049
050 import java.io.Serializable;
051
052 import java.util.Collections;
053 import java.util.Date;
054 import java.util.List;
055 import java.util.Locale;
056 import java.util.Map;
057
058
065 public class DDLRecordLocalServiceImpl extends DDLRecordLocalServiceBaseImpl {
066
067 @Indexable(type = IndexableType.REINDEX)
068 @Override
069 public DDLRecord addRecord(
070 long userId, long groupId, long recordSetId, int displayIndex,
071 Fields fields, ServiceContext serviceContext)
072 throws PortalException, SystemException {
073
074
075
076 User user = userPersistence.findByPrimaryKey(userId);
077 Date now = new Date();
078
079 DDLRecordSet recordSet = ddlRecordSetPersistence.findByPrimaryKey(
080 recordSetId);
081
082 long recordId = counterLocalService.increment();
083
084 DDLRecord record = ddlRecordPersistence.create(recordId);
085
086 record.setUuid(serviceContext.getUuid());
087 record.setGroupId(groupId);
088 record.setCompanyId(user.getCompanyId());
089 record.setUserId(user.getUserId());
090 record.setUserName(user.getFullName());
091 record.setVersionUserId(user.getUserId());
092 record.setVersionUserName(user.getFullName());
093 record.setCreateDate(serviceContext.getCreateDate(now));
094 record.setModifiedDate(serviceContext.getModifiedDate(now));
095
096 long ddmStorageId = StorageEngineUtil.create(
097 recordSet.getCompanyId(), recordSet.getDDMStructureId(), fields,
098 serviceContext);
099
100 record.setDDMStorageId(ddmStorageId);
101
102 record.setRecordSetId(recordSetId);
103 record.setVersion(DDLRecordConstants.VERSION_DEFAULT);
104 record.setDisplayIndex(displayIndex);
105
106 ddlRecordPersistence.update(record);
107
108
109
110 DDLRecordVersion recordVersion = addRecordVersion(
111 user, record, ddmStorageId, DDLRecordConstants.VERSION_DEFAULT,
112 displayIndex, WorkflowConstants.STATUS_DRAFT);
113
114
115
116 Locale locale = serviceContext.getLocale();
117
118 updateAsset(
119 userId, record, recordVersion, serviceContext.getAssetCategoryIds(),
120 serviceContext.getAssetTagNames(), locale);
121
122
123
124 WorkflowHandlerRegistryUtil.startWorkflowInstance(
125 user.getCompanyId(), groupId, userId, DDLRecord.class.getName(),
126 recordVersion.getRecordVersionId(), recordVersion, serviceContext);
127
128 return record;
129 }
130
131 @Override
132 public DDLRecord addRecord(
133 long userId, long groupId, long recordSetId, int displayIndex,
134 Map<String, Serializable> fieldsMap, ServiceContext serviceContext)
135 throws PortalException, SystemException {
136
137 DDLRecordSet recordSet = ddlRecordSetPersistence.findByPrimaryKey(
138 recordSetId);
139
140 DDMStructure ddmStructure = recordSet.getDDMStructure();
141
142 Fields fields = toFields(ddmStructure.getStructureId(), fieldsMap);
143
144 return ddlRecordLocalService.addRecord(
145 userId, groupId, recordSetId, displayIndex, fields, serviceContext);
146 }
147
148 @Override
149 public void deleteRecord(DDLRecord record)
150 throws PortalException, SystemException {
151
152
153
154 ddlRecordPersistence.remove(record);
155
156
157
158 List<DDLRecordVersion> recordVersions =
159 ddlRecordVersionPersistence.findByRecordId(record.getRecordId());
160
161 for (DDLRecordVersion recordVersion : recordVersions) {
162 ddlRecordVersionPersistence.remove(recordVersion);
163
164
165
166 StorageEngineUtil.deleteByClass(recordVersion.getDDMStorageId());
167
168
169
170 workflowInstanceLinkLocalService.deleteWorkflowInstanceLinks(
171 record.getCompanyId(), record.getGroupId(),
172 DDLRecord.class.getName(), recordVersion.getPrimaryKey());
173 }
174
175
176
177 Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(
178 DDLRecord.class);
179
180 indexer.delete(record);
181 }
182
183 @Override
184 public void deleteRecord(long recordId)
185 throws PortalException, SystemException {
186
187 DDLRecord record = ddlRecordPersistence.findByPrimaryKey(recordId);
188
189 deleteRecord(record);
190 }
191
192 @Override
193 public DDLRecord deleteRecordLocale(
194 long recordId, Locale locale, ServiceContext serviceContext)
195 throws PortalException, SystemException {
196
197 DDLRecord record = ddlRecordPersistence.findByPrimaryKey(recordId);
198
199 Fields fields = StorageEngineUtil.getFields(record.getDDMStorageId());
200
201 for (Field field : fields) {
202 Map<Locale, List<Serializable>> valuesMap = field.getValuesMap();
203
204 valuesMap.remove(locale);
205 }
206
207 return ddlRecordLocalService.updateRecord(
208 serviceContext.getUserId(), recordId, false,
209 DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fields, false,
210 serviceContext);
211 }
212
213 @Override
214 public void deleteRecords(long recordSetId)
215 throws PortalException, SystemException {
216
217 List<DDLRecord> records = ddlRecordPersistence.findByRecordSetId(
218 recordSetId);
219
220 for (DDLRecord record : records) {
221 deleteRecord(record);
222 }
223 }
224
225 @Override
226 public DDLRecord fetchRecord(long recordId) throws SystemException {
227 return ddlRecordPersistence.fetchByPrimaryKey(recordId);
228 }
229
230 @Override
231 public List<DDLRecord> getCompanyRecords(
232 long companyId, int status, int scope, int start, int end,
233 OrderByComparator orderByComparator)
234 throws SystemException {
235
236 return ddlRecordFinder.findByC_S_S(
237 companyId, status, scope, start, end, orderByComparator);
238 }
239
240
244 @Override
245 public List<DDLRecord> getCompanyRecords(
246 long companyId, int scope, int start, int end,
247 OrderByComparator orderByComparator)
248 throws SystemException {
249
250 return getCompanyRecords(
251 companyId, WorkflowConstants.STATUS_ANY, scope, start, end,
252 orderByComparator);
253 }
254
255
259 @Override
260 public int getCompanyRecordsCount(long companyId, int scope)
261 throws SystemException {
262
263 return getCompanyRecordsCount(
264 companyId, WorkflowConstants.STATUS_ANY, scope);
265 }
266
267 @Override
268 public int getCompanyRecordsCount(long companyId, int status, int scope)
269 throws SystemException {
270
271 return ddlRecordFinder.countByC_S_S(companyId, status, scope);
272 }
273
274 @Override
275 public DDLRecordVersion getLatestRecordVersion(long recordId)
276 throws PortalException, SystemException {
277
278 List<DDLRecordVersion> recordVersions =
279 ddlRecordVersionPersistence.findByRecordId(recordId);
280
281 if (recordVersions.isEmpty()) {
282 throw new NoSuchRecordVersionException(
283 "No record versions found for recordId " + recordId);
284 }
285
286 recordVersions = ListUtil.copy(recordVersions);
287
288 Collections.sort(
289 recordVersions, new DDLRecordVersionVersionComparator());
290
291 return recordVersions.get(0);
292 }
293
294 @Override
295 public Long[] getMinAndMaxCompanyRecordIds(
296 long companyId, int status, int scope)
297 throws SystemException {
298
299 return ddlRecordFinder.findByC_S_S_MinAndMax(companyId, status, scope);
300 }
301
302 @Override
303 public List<DDLRecord> getMinAndMaxCompanyRecords(
304 long companyId, int status, int scope, long minRecordId,
305 long maxRecordId)
306 throws SystemException {
307
308 return ddlRecordFinder.findByC_S_S_MinAndMax(
309 companyId, status, scope, minRecordId, maxRecordId);
310 }
311
312 @Override
313 public DDLRecord getRecord(long recordId)
314 throws PortalException, SystemException {
315
316 return ddlRecordPersistence.findByPrimaryKey(recordId);
317 }
318
319 @Override
320 public List<DDLRecord> getRecords(long recordSetId) throws SystemException {
321 return ddlRecordPersistence.findByRecordSetId(recordSetId);
322 }
323
324 @Override
325 public List<DDLRecord> getRecords(
326 long recordSetId, int status, int start, int end,
327 OrderByComparator orderByComparator)
328 throws SystemException {
329
330 return ddlRecordFinder.findByR_S(
331 recordSetId, status, start, end, orderByComparator);
332 }
333
334 @Override
335 public List<DDLRecord> getRecords(long recordSetId, long userId)
336 throws SystemException {
337
338 return ddlRecordPersistence.findByR_U(recordSetId, userId);
339 }
340
341 @Override
342 public int getRecordsCount(long recordSetId, int status)
343 throws SystemException {
344
345 return ddlRecordFinder.countByR_S(recordSetId, status);
346 }
347
348 @Override
349 public DDLRecordVersion getRecordVersion(long recordVersionId)
350 throws PortalException, SystemException {
351
352 return ddlRecordVersionPersistence.findByPrimaryKey(recordVersionId);
353 }
354
355 @Override
356 public DDLRecordVersion getRecordVersion(long recordId, String version)
357 throws PortalException, SystemException {
358
359 return ddlRecordVersionPersistence.findByR_V(recordId, version);
360 }
361
362 @Override
363 public List<DDLRecordVersion> getRecordVersions(
364 long recordId, int start, int end,
365 OrderByComparator orderByComparator)
366 throws SystemException {
367
368 return ddlRecordVersionPersistence.findByRecordId(
369 recordId, start, end, orderByComparator);
370 }
371
372 @Override
373 public int getRecordVersionsCount(long recordId) throws SystemException {
374 return ddlRecordVersionPersistence.countByRecordId(recordId);
375 }
376
377 @Override
378 public void revertRecordVersion(
379 long userId, long recordId, String version,
380 ServiceContext serviceContext)
381 throws PortalException, SystemException {
382
383 DDLRecordVersion recordVersion = getRecordVersion(recordId, version);
384
385 if (!recordVersion.isApproved()) {
386 return;
387 }
388
389 Fields fields = StorageEngineUtil.getFields(
390 recordVersion.getDDMStorageId());
391
392 ddlRecordLocalService.updateRecord(
393 userId, recordId, true, recordVersion.getDisplayIndex(), fields,
394 false, serviceContext);
395 }
396
397 @Override
398 public Hits search(SearchContext searchContext) throws SystemException {
399 try {
400 Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(
401 DDLRecord.class);
402
403 return indexer.search(searchContext);
404 }
405 catch (Exception e) {
406 throw new SystemException(e);
407 }
408 }
409
410 @Override
411 public void updateAsset(
412 long userId, DDLRecord record, DDLRecordVersion recordVersion,
413 long[] assetCategoryIds, String[] assetTagNames, Locale locale)
414 throws PortalException, SystemException {
415
416 boolean addDraftAssetEntry = false;
417 boolean visible = true;
418
419 if ((recordVersion != null) && !recordVersion.isApproved()) {
420 String version = recordVersion.getVersion();
421
422 if (!version.equals(DDLRecordConstants.VERSION_DEFAULT)) {
423 int approvedRecordVersionsCount =
424 ddlRecordVersionPersistence.countByR_S(
425 record.getRecordId(),
426 WorkflowConstants.STATUS_APPROVED);
427
428 if (approvedRecordVersionsCount > 0) {
429 addDraftAssetEntry = true;
430 }
431 }
432
433 visible = false;
434 }
435
436 DDLRecordSet recordSet = record.getRecordSet();
437
438 DDMStructure ddmStructure = recordSet.getDDMStructure();
439
440 String ddmStructureName = ddmStructure.getName(locale);
441
442 String recordSetName = recordSet.getName(locale);
443
444 String title = LanguageUtil.format(
445 locale, "new-x-for-list-x",
446 new Object[] {ddmStructureName, recordSetName});
447
448 if (addDraftAssetEntry) {
449 assetEntryLocalService.updateEntry(
450 userId, record.getGroupId(), record.getCreateDate(),
451 record.getModifiedDate(), DDLRecordConstants.getClassName(),
452 recordVersion.getRecordVersionId(), record.getUuid(), 0,
453 assetCategoryIds, assetTagNames, false, null, null, null,
454 ContentTypes.TEXT_HTML, title, null, StringPool.BLANK, null,
455 null, 0, 0, null, false);
456 }
457 else {
458 assetEntryLocalService.updateEntry(
459 userId, record.getGroupId(), record.getCreateDate(),
460 record.getModifiedDate(), DDLRecordConstants.getClassName(),
461 record.getRecordId(), record.getUuid(), 0, assetCategoryIds,
462 assetTagNames, visible, null, null, null,
463 ContentTypes.TEXT_HTML, title, null, StringPool.BLANK, null,
464 null, 0, 0, null, false);
465 }
466 }
467
468 @Indexable(type = IndexableType.REINDEX)
469 @Override
470 public DDLRecord updateRecord(
471 long userId, long recordId, boolean majorVersion, int displayIndex,
472 Fields fields, boolean mergeFields, ServiceContext serviceContext)
473 throws PortalException, SystemException {
474
475
476
477 User user = userPersistence.findByPrimaryKey(userId);
478
479 DDLRecord record = ddlRecordPersistence.findByPrimaryKey(recordId);
480
481 record.setModifiedDate(serviceContext.getModifiedDate(null));
482
483 ddlRecordPersistence.update(record);
484
485
486
487 DDLRecordVersion recordVersion = record.getLatestRecordVersion();
488
489 if (recordVersion.isApproved()) {
490 DDLRecordSet recordSet = record.getRecordSet();
491
492 if (mergeFields) {
493 Fields existingFields = StorageEngineUtil.getFields(
494 recordVersion.getDDMStorageId());
495
496 fields = DDMUtil.mergeFields(fields, existingFields);
497 }
498
499 long ddmStorageId = StorageEngineUtil.create(
500 recordSet.getCompanyId(), recordSet.getDDMStructureId(), fields,
501 serviceContext);
502 String version = getNextVersion(
503 recordVersion.getVersion(), majorVersion,
504 serviceContext.getWorkflowAction());
505
506 recordVersion = addRecordVersion(
507 user, record, ddmStorageId, version, displayIndex,
508 WorkflowConstants.STATUS_DRAFT);
509 }
510 else {
511 StorageEngineUtil.update(
512 recordVersion.getDDMStorageId(), fields, mergeFields,
513 serviceContext);
514
515 String version = recordVersion.getVersion();
516
517 updateRecordVersion(
518 user, recordVersion, version, displayIndex,
519 recordVersion.getStatus(), serviceContext);
520 }
521
522
523
524 WorkflowHandlerRegistryUtil.startWorkflowInstance(
525 user.getCompanyId(), record.getGroupId(), userId,
526 DDLRecord.class.getName(), recordVersion.getRecordVersionId(),
527 recordVersion, serviceContext);
528
529 return record;
530 }
531
532 @Override
533 public DDLRecord updateRecord(
534 long userId, long recordId, int displayIndex,
535 Map<String, Serializable> fieldsMap, boolean mergeFields,
536 ServiceContext serviceContext)
537 throws PortalException, SystemException {
538
539 DDLRecord record = ddlRecordPersistence.findByPrimaryKey(recordId);
540
541 DDLRecordSet recordSet = record.getRecordSet();
542
543 DDMStructure ddmStructure = recordSet.getDDMStructure();
544
545 Fields fields = toFields(ddmStructure.getStructureId(), fieldsMap);
546
547 return ddlRecordLocalService.updateRecord(
548 userId, recordId, false, displayIndex, fields, mergeFields,
549 serviceContext);
550 }
551
552 @Indexable(type = IndexableType.REINDEX)
553 @Override
554 public DDLRecord updateStatus(
555 long userId, long recordVersionId, int status,
556 ServiceContext serviceContext)
557 throws PortalException, SystemException {
558
559
560
561 User user = userPersistence.findByPrimaryKey(userId);
562
563 DDLRecordVersion recordVersion =
564 ddlRecordVersionPersistence.findByPrimaryKey(recordVersionId);
565
566 recordVersion.setStatus(status);
567 recordVersion.setStatusByUserId(user.getUserId());
568 recordVersion.setStatusByUserName(user.getFullName());
569 recordVersion.setStatusDate(new Date());
570
571 ddlRecordVersionPersistence.update(recordVersion);
572
573
574
575 DDLRecord record = ddlRecordPersistence.findByPrimaryKey(
576 recordVersion.getRecordId());
577
578 if (status == WorkflowConstants.STATUS_APPROVED) {
579 if (DLUtil.compareVersions(
580 record.getVersion(), recordVersion.getVersion()) <= 0) {
581
582 record.setDDMStorageId(recordVersion.getDDMStorageId());
583 record.setVersion(recordVersion.getVersion());
584 record.setRecordSetId(recordVersion.getRecordSetId());
585 record.setDisplayIndex(recordVersion.getDisplayIndex());
586 record.setVersion(recordVersion.getVersion());
587 record.setVersionUserId(recordVersion.getUserId());
588 record.setVersionUserName(recordVersion.getUserName());
589 record.setModifiedDate(recordVersion.getCreateDate());
590
591 ddlRecordPersistence.update(record);
592 }
593 }
594 else {
595 if (Validator.equals(
596 record.getVersion(), recordVersion.getVersion())) {
597
598 String newVersion = DDLRecordConstants.VERSION_DEFAULT;
599
600 List<DDLRecordVersion> approvedRecordVersions =
601 ddlRecordVersionPersistence.findByR_S(
602 record.getRecordId(),
603 WorkflowConstants.STATUS_APPROVED);
604
605 if (!approvedRecordVersions.isEmpty()) {
606 newVersion = approvedRecordVersions.get(0).getVersion();
607 }
608
609 record.setVersion(newVersion);
610
611 ddlRecordPersistence.update(record);
612 }
613 }
614
615 return record;
616 }
617
618 protected DDLRecordVersion addRecordVersion(
619 User user, DDLRecord record, long ddmStorageId, String version,
620 int displayIndex, int status)
621 throws SystemException {
622
623 long recordVersionId = counterLocalService.increment();
624
625 DDLRecordVersion recordVersion = ddlRecordVersionPersistence.create(
626 recordVersionId);
627
628 recordVersion.setGroupId(record.getGroupId());
629 recordVersion.setCompanyId(record.getCompanyId());
630 recordVersion.setUserId(user.getUserId());
631 recordVersion.setUserName(user.getFullName());
632 recordVersion.setCreateDate(record.getModifiedDate());
633 recordVersion.setDDMStorageId(ddmStorageId);
634 recordVersion.setRecordSetId(record.getRecordSetId());
635 recordVersion.setRecordId(record.getRecordId());
636 recordVersion.setVersion(version);
637 recordVersion.setDisplayIndex(displayIndex);
638 recordVersion.setStatus(status);
639 recordVersion.setStatusByUserId(user.getUserId());
640 recordVersion.setStatusByUserName(user.getFullName());
641 recordVersion.setStatusDate(record.getModifiedDate());
642
643 ddlRecordVersionPersistence.update(recordVersion);
644
645 return recordVersion;
646 }
647
648 protected String getNextVersion(
649 String version, boolean majorVersion, int workflowAction) {
650
651 if (workflowAction == WorkflowConstants.ACTION_SAVE_DRAFT) {
652 majorVersion = false;
653 }
654
655 int[] versionParts = StringUtil.split(version, StringPool.PERIOD, 0);
656
657 if (majorVersion) {
658 versionParts[0]++;
659 versionParts[1] = 0;
660 }
661 else {
662 versionParts[1]++;
663 }
664
665 return versionParts[0] + StringPool.PERIOD + versionParts[1];
666 }
667
668 protected Fields toFields(
669 long ddmStructureId, Map<String, Serializable> fieldsMap) {
670
671 Fields fields = new Fields();
672
673 for (String name : fieldsMap.keySet()) {
674 String value = String.valueOf(fieldsMap.get(name));
675
676 Field field = new Field(ddmStructureId, name, value);
677
678 fields.put(field);
679 }
680
681 return fields;
682 }
683
684 protected void updateRecordVersion(
685 User user, DDLRecordVersion recordVersion, String version,
686 int displayIndex, int status, ServiceContext serviceContext)
687 throws SystemException {
688
689 recordVersion.setUserId(user.getUserId());
690 recordVersion.setUserName(user.getFullName());
691 recordVersion.setVersion(version);
692 recordVersion.setDisplayIndex(displayIndex);
693 recordVersion.setStatus(status);
694 recordVersion.setStatusByUserId(user.getUserId());
695 recordVersion.setStatusByUserName(user.getFullName());
696 recordVersion.setStatusDate(serviceContext.getModifiedDate(null));
697
698 ddlRecordVersionPersistence.update(recordVersion);
699 }
700
701 }