001
014
015 package com.liferay.portlet.documentlibrary.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.util.ArrayUtil;
020 import com.liferay.portal.kernel.util.LocaleUtil;
021 import com.liferay.portal.kernel.util.LocalizationUtil;
022 import com.liferay.portal.kernel.util.OrderByComparator;
023 import com.liferay.portal.kernel.util.ParamUtil;
024 import com.liferay.portal.kernel.util.SortedArrayList;
025 import com.liferay.portal.kernel.util.Validator;
026 import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
027 import com.liferay.portal.model.User;
028 import com.liferay.portal.service.ServiceContext;
029 import com.liferay.portal.util.PortalUtil;
030 import com.liferay.portlet.documentlibrary.DuplicateFileEntryTypeException;
031 import com.liferay.portlet.documentlibrary.NoSuchFolderException;
032 import com.liferay.portlet.documentlibrary.NoSuchMetadataSetException;
033 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
034 import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
035 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
036 import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
037 import com.liferay.portlet.documentlibrary.model.DLFileVersion;
038 import com.liferay.portlet.documentlibrary.model.DLFolder;
039 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
040 import com.liferay.portlet.documentlibrary.service.base.DLFileEntryTypeLocalServiceBaseImpl;
041 import com.liferay.portlet.documentlibrary.util.DLUtil;
042 import com.liferay.portlet.dynamicdatamapping.StructureXsdException;
043 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
044 import com.liferay.portlet.dynamicdatamapping.model.DDMStructureConstants;
045
046 import java.util.ArrayList;
047 import java.util.Date;
048 import java.util.HashMap;
049 import java.util.List;
050 import java.util.Locale;
051 import java.util.Map;
052
053
057 public class DLFileEntryTypeLocalServiceImpl
058 extends DLFileEntryTypeLocalServiceBaseImpl {
059
060 @Override
061 public DLFileEntryType addFileEntryType(
062 long userId, long groupId, String name, String description,
063 long[] ddmStructureIds, ServiceContext serviceContext)
064 throws PortalException, SystemException {
065
066 User user = userPersistence.findByPrimaryKey(userId);
067
068 String fileEntryTypeUuid = serviceContext.getUuid();
069
070 if (Validator.isNull(fileEntryTypeUuid)) {
071 fileEntryTypeUuid = PortalUUIDUtil.generate();
072 }
073
074 long fileEntryTypeId = counterLocalService.increment();
075
076 long ddmStructureId = updateDDMStructure(
077 userId, fileEntryTypeUuid, fileEntryTypeId, groupId, name,
078 description, serviceContext);
079
080 if (ddmStructureId > 0) {
081 ddmStructureIds = ArrayUtil.append(ddmStructureIds, ddmStructureId);
082 }
083
084 Date now = new Date();
085
086 validate(fileEntryTypeId, groupId, name, ddmStructureIds);
087
088 DLFileEntryType dlFileEntryType = dlFileEntryTypePersistence.create(
089 fileEntryTypeId);
090
091 dlFileEntryType.setUuid(fileEntryTypeUuid);
092 dlFileEntryType.setGroupId(groupId);
093 dlFileEntryType.setCompanyId(user.getCompanyId());
094 dlFileEntryType.setUserId(user.getUserId());
095 dlFileEntryType.setUserName(user.getFullName());
096 dlFileEntryType.setCreateDate(serviceContext.getCreateDate(now));
097 dlFileEntryType.setModifiedDate(serviceContext.getModifiedDate(now));
098 dlFileEntryType.setName(name);
099 dlFileEntryType.setDescription(description);
100
101 dlFileEntryTypePersistence.update(dlFileEntryType, false);
102
103 dlFileEntryTypePersistence.addDDMStructures(
104 fileEntryTypeId, ddmStructureIds);
105
106 if (serviceContext.isAddGroupPermissions() ||
107 serviceContext.isAddGuestPermissions()) {
108
109 addFileEntryTypeResources(
110 dlFileEntryType, serviceContext.isAddGroupPermissions(),
111 serviceContext.isAddGuestPermissions());
112 }
113 else {
114 addFileEntryTypeResources(
115 dlFileEntryType, serviceContext.getGroupPermissions(),
116 serviceContext.getGuestPermissions());
117 }
118
119 return dlFileEntryType;
120 }
121
122 @Override
123 public void cascadeFileEntryTypes(long userId, DLFolder dlFolder)
124 throws PortalException, SystemException {
125
126 List<DLFileEntryType> dlFileEntryTypes = getFolderFileEntryTypes(
127 new long[] {dlFolder.getGroupId()}, dlFolder.getFolderId(), true);
128
129 List<Long> fileEntryTypeIds = getFileEntryTypeIds(dlFileEntryTypes);
130
131 long defaultFileEntryTypeId = getDefaultFileEntryTypeId(
132 dlFolder.getFolderId());
133
134 ServiceContext serviceContext = new ServiceContext();
135
136 serviceContext.setCompanyId(dlFolder.getCompanyId());
137 serviceContext.setScopeGroupId(dlFolder.getGroupId());
138 serviceContext.setUserId(userId);
139
140 cascadeFileEntryTypes(
141 dlFolder.getGroupId(), dlFolder.getFolderId(),
142 defaultFileEntryTypeId, fileEntryTypeIds, serviceContext);
143 }
144
145 @Override
146 public void deleteFileEntryType(DLFileEntryType dlFileEntryType)
147 throws PortalException, SystemException {
148
149 DDMStructure ddmStructure = ddmStructureLocalService.fetchStructure(
150 dlFileEntryType.getGroupId(),
151 DLUtil.getDDMStructureKey(dlFileEntryType));
152
153 if (ddmStructure == null) {
154 ddmStructure = ddmStructureLocalService.fetchStructure(
155 dlFileEntryType.getGroupId(),
156 DLUtil.getDeprecatedDDMStructureKey(dlFileEntryType));
157 }
158
159 if (ddmStructure != null) {
160 ddmStructureLocalService.deleteStructure(
161 ddmStructure.getStructureId());
162 }
163
164 dlFileEntryTypePersistence.remove(dlFileEntryType);
165 }
166
167 @Override
168 public void deleteFileEntryType(long fileEntryTypeId)
169 throws PortalException, SystemException {
170
171 DLFileEntryType dlFileEntryType =
172 dlFileEntryTypePersistence.findByPrimaryKey(fileEntryTypeId);
173
174 deleteFileEntryType(dlFileEntryType);
175 }
176
177 @Override
178 public void deleteFileEntryTypes(long groupId)
179 throws PortalException, SystemException {
180
181 List<DLFileEntryType> dlFileEntryTypes =
182 dlFileEntryTypePersistence.findByGroupId(groupId);
183
184 for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
185 deleteFileEntryType(dlFileEntryType);
186 }
187 }
188
189 @Override
190 public DLFileEntryType fetchFileEntryType(long fileEntryTypeId)
191 throws SystemException {
192
193 return dlFileEntryTypePersistence.fetchByPrimaryKey(fileEntryTypeId);
194 }
195
196 @Override
197 public long getDefaultFileEntryTypeId(long folderId)
198 throws PortalException, SystemException {
199
200 folderId = getFileEntryTypesPrimaryFolderId(folderId);
201
202 if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
203 DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(folderId);
204
205 return dlFolder.getDefaultFileEntryTypeId();
206 }
207 else {
208 return 0;
209 }
210 }
211
212 @Override
213 public DLFileEntryType getFileEntryType(long fileEntryTypeId)
214 throws PortalException, SystemException {
215
216 return dlFileEntryTypePersistence.findByPrimaryKey(fileEntryTypeId);
217 }
218
219 @Override
220 public DLFileEntryType getFileEntryType(long groupId, String name)
221 throws PortalException, SystemException {
222
223 return dlFileEntryTypePersistence.findByG_N(groupId, name);
224 }
225
226 @Override
227 public List<DLFileEntryType> getFileEntryTypes(long[] groupIds)
228 throws SystemException {
229
230 return dlFileEntryTypePersistence.findByGroupId(groupIds);
231 }
232
233 @Override
234 public List<DLFileEntryType> getFolderFileEntryTypes(
235 long[] groupIds, long folderId, boolean inherited)
236 throws PortalException, SystemException {
237
238 if (!inherited) {
239 return dlFolderPersistence.getDLFileEntryTypes(folderId);
240 }
241
242 List<DLFileEntryType> dlFileEntryTypes = null;
243
244 folderId = getFileEntryTypesPrimaryFolderId(folderId);
245
246 if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
247 dlFileEntryTypes = dlFolderPersistence.getDLFileEntryTypes(
248 folderId);
249 }
250
251 if ((dlFileEntryTypes == null) || dlFileEntryTypes.isEmpty()) {
252 dlFileEntryTypes = new ArrayList<DLFileEntryType>(
253 getFileEntryTypes(groupIds));
254
255 DLFileEntryType dlFileEntryType =
256 dlFileEntryTypePersistence.fetchByPrimaryKey(
257 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
258
259 dlFileEntryTypes.add(0, dlFileEntryType);
260 }
261
262 return dlFileEntryTypes;
263 }
264
265 @Override
266 public List<DLFileEntryType> search(
267 long companyId, long[] groupIds, String keywords,
268 boolean includeBasicFileEntryType, int start, int end,
269 OrderByComparator orderByComparator)
270 throws SystemException {
271
272 return dlFileEntryTypeFinder.findByKeywords(
273 companyId, groupIds, keywords, includeBasicFileEntryType, start,
274 end, orderByComparator);
275 }
276
277 @Override
278 public int searchCount(
279 long companyId, long[] groupIds, String keywords,
280 boolean includeBasicFileEntryType)
281 throws SystemException {
282
283 return dlFileEntryTypeFinder.countByKeywords(
284 companyId, groupIds, keywords, includeBasicFileEntryType);
285 }
286
287 @Override
288 public void unsetFolderFileEntryTypes(long folderId)
289 throws SystemException {
290
291 List<DLFileEntryType> dlFileEntryTypes =
292 dlFolderPersistence.getDLFileEntryTypes(folderId);
293
294 for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
295 dlFolderPersistence.removeDLFileEntryType(
296 folderId, dlFileEntryType);
297 }
298 }
299
300 @Override
301 public DLFileEntry updateFileEntryFileEntryType(
302 DLFileEntry dlFileEntry, ServiceContext serviceContext)
303 throws PortalException, SystemException {
304
305 long groupId = serviceContext.getScopeGroupId();
306 long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
307
308 DLFolder dlFolder = dlFolderPersistence.fetchByPrimaryKey(
309 dlFileEntry.getFolderId());
310
311 if (dlFolder != null) {
312 groupId = dlFolder.getGroupId();
313 folderId = dlFolder.getFolderId();
314 }
315
316 List<DLFileEntryType> dlFileEntryTypes = getFolderFileEntryTypes(
317 DLUtil.getGroupIds(groupId), folderId, true);
318
319 List<Long> fileEntryTypeIds = getFileEntryTypeIds(dlFileEntryTypes);
320
321 if (fileEntryTypeIds.contains(dlFileEntry.getFileEntryTypeId())) {
322 return dlFileEntry;
323 }
324
325 long defaultFileEntryTypeId = getDefaultFileEntryTypeId(folderId);
326
327 DLFileVersion dlFileVersion =
328 dlFileVersionLocalService.getLatestFileVersion(
329 dlFileEntry.getFileEntryId(), true);
330
331 if (dlFileVersion.isPending()) {
332 workflowInstanceLinkLocalService.deleteWorkflowInstanceLink(
333 dlFileVersion.getCompanyId(), dlFileEntry.getGroupId(),
334 DLFileEntry.class.getName(), dlFileVersion.getFileVersionId());
335 }
336
337 return dlFileEntryLocalService.updateFileEntry(
338 serviceContext.getUserId(), dlFileEntry.getFileEntryId(), null,
339 null, null, null, null, false, defaultFileEntryTypeId, null, null,
340 null, 0, serviceContext);
341 }
342
343 @Override
344 public void updateFileEntryType(
345 long userId, long fileEntryTypeId, String name, String description,
346 long[] ddmStructureIds, ServiceContext serviceContext)
347 throws PortalException, SystemException {
348
349 DLFileEntryType dlFileEntryType =
350 dlFileEntryTypePersistence.findByPrimaryKey(fileEntryTypeId);
351
352 long ddmStructureId = updateDDMStructure(
353 userId, dlFileEntryType.getUuid(), fileEntryTypeId,
354 dlFileEntryType.getGroupId(), name, description, serviceContext);
355
356 if (ddmStructureId > 0) {
357 ddmStructureIds = ArrayUtil.append(ddmStructureIds, ddmStructureId);
358 }
359
360 validate(
361 fileEntryTypeId, dlFileEntryType.getGroupId(), name,
362 ddmStructureIds);
363
364 dlFileEntryType.setModifiedDate(serviceContext.getModifiedDate(null));
365 dlFileEntryType.setName(name);
366 dlFileEntryType.setDescription(description);
367
368 dlFileEntryTypePersistence.update(dlFileEntryType, false);
369
370 dlFileEntryTypePersistence.setDDMStructures(
371 fileEntryTypeId, ddmStructureIds);
372 }
373
374 @Override
375 public void updateFolderFileEntryTypes(
376 DLFolder dlFolder, List<Long> fileEntryTypeIds,
377 long defaultFileEntryTypeId, ServiceContext serviceContext)
378 throws PortalException, SystemException {
379
380 List<Long> originalFileEntryTypeIds = getFileEntryTypeIds(
381 dlFolderPersistence.getDLFileEntryTypes(dlFolder.getFolderId()));
382
383 if (fileEntryTypeIds.equals(originalFileEntryTypeIds)) {
384 return;
385 }
386
387 for (Long fileEntryTypeId : fileEntryTypeIds) {
388 if (!originalFileEntryTypeIds.contains(fileEntryTypeId)) {
389 dlFolderPersistence.addDLFileEntryType(
390 dlFolder.getFolderId(), fileEntryTypeId);
391 }
392 }
393
394 for (Long originalFileEntryTypeId : originalFileEntryTypeIds) {
395 if (!fileEntryTypeIds.contains(originalFileEntryTypeId)) {
396 dlFolderPersistence.removeDLFileEntryType(
397 dlFolder.getFolderId(), originalFileEntryTypeId);
398
399 workflowDefinitionLinkLocalService.deleteWorkflowDefinitionLink(
400 dlFolder.getCompanyId(), dlFolder.getGroupId(),
401 DLFolder.class.getName(), dlFolder.getFolderId(),
402 originalFileEntryTypeId);
403 }
404 }
405 }
406
407 protected void addFileEntryTypeResources(
408 DLFileEntryType dlFileEntryType, boolean addGroupPermissions,
409 boolean addGuestPermissions)
410 throws PortalException, SystemException {
411
412 resourceLocalService.addResources(
413 dlFileEntryType.getCompanyId(), dlFileEntryType.getGroupId(),
414 dlFileEntryType.getUserId(), DLFileEntryType.class.getName(),
415 dlFileEntryType.getFileEntryTypeId(), false, addGroupPermissions,
416 addGuestPermissions);
417 }
418
419 protected void addFileEntryTypeResources(
420 DLFileEntryType dlFileEntryType, String[] groupPermissions,
421 String[] guestPermissions)
422 throws PortalException, SystemException {
423
424 resourceLocalService.addModelResources(
425 dlFileEntryType.getCompanyId(), dlFileEntryType.getGroupId(),
426 dlFileEntryType.getUserId(), DLFileEntryType.class.getName(),
427 dlFileEntryType.getFileEntryTypeId(), groupPermissions,
428 guestPermissions);
429 }
430
431 protected void cascadeFileEntryTypes(
432 long groupId, long folderId, long defaultFileEntryTypeId,
433 List<Long> fileEntryTypeIds, ServiceContext serviceContext)
434 throws PortalException, SystemException {
435
436 List<DLFileEntry> dlFileEntries = dlFileEntryPersistence.findByG_F(
437 groupId, folderId);
438
439 for (DLFileEntry dlFileEntry : dlFileEntries) {
440 Long fileEntryTypeId = dlFileEntry.getFileEntryTypeId();
441
442 if (fileEntryTypeIds.contains(fileEntryTypeId)) {
443 continue;
444 }
445
446 DLFileVersion dlFileVersion =
447 dlFileVersionLocalService.getLatestFileVersion(
448 dlFileEntry.getFileEntryId(), true);
449
450 if (dlFileVersion.isPending()) {
451 workflowInstanceLinkLocalService.deleteWorkflowInstanceLink(
452 dlFileVersion.getCompanyId(), groupId,
453 DLFileEntry.class.getName(),
454 dlFileVersion.getFileVersionId());
455 }
456
457 dlFileEntryService.updateFileEntry(
458 dlFileEntry.getFileEntryId(), null, null, null, null, null,
459 false, defaultFileEntryTypeId, null, null, null, 0,
460 serviceContext);
461 }
462
463 List<DLFolder> subFolders = dlFolderPersistence.findByG_P_M(
464 groupId, folderId, false);
465
466 for (DLFolder subFolder : subFolders) {
467 long subFolderId = subFolder.getFolderId();
468
469 if (subFolder.isOverrideFileEntryTypes()) {
470 continue;
471 }
472
473 cascadeFileEntryTypes(
474 groupId, subFolderId, defaultFileEntryTypeId, fileEntryTypeIds,
475 serviceContext);
476 }
477 }
478
479 protected void fixDDMStructureKey(
480 String fileEntryTypeUuid, long fileEntryTypeId, long groupId)
481 throws SystemException {
482
483 DDMStructure ddmStructure = ddmStructureLocalService.fetchStructure(
484 groupId, DLUtil.getDeprecatedDDMStructureKey(fileEntryTypeId));
485
486 if (ddmStructure != null) {
487 ddmStructure.setStructureKey(
488 DLUtil.getDDMStructureKey(fileEntryTypeUuid));
489
490 ddmStructureLocalService.updateDDMStructure(ddmStructure);
491 }
492 }
493
494 protected List<Long> getFileEntryTypeIds(
495 List<DLFileEntryType> dlFileEntryTypes) {
496
497 List<Long> fileEntryTypeIds = new SortedArrayList<Long>();
498
499 for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
500 fileEntryTypeIds.add(dlFileEntryType.getFileEntryTypeId());
501 }
502
503 return fileEntryTypeIds;
504 }
505
506 protected long getFileEntryTypesPrimaryFolderId(long folderId)
507 throws NoSuchFolderException, SystemException {
508
509 while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
510 DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(folderId);
511
512 if (dlFolder.isOverrideFileEntryTypes()) {
513 break;
514 }
515
516 folderId = dlFolder.getParentFolderId();
517 }
518
519 return folderId;
520 }
521
522 protected long updateDDMStructure(
523 long userId, String fileEntryTypeUuid, long fileEntryTypeId,
524 long groupId, String name, String description,
525 ServiceContext serviceContext)
526 throws PortalException, SystemException {
527
528 fixDDMStructureKey(fileEntryTypeUuid, fileEntryTypeId, groupId);
529
530 String ddmStructureKey = DLUtil.getDDMStructureKey(fileEntryTypeUuid);
531
532 Map<Locale, String> nameMap = new HashMap<Locale, String>();
533
534 Locale locale = serviceContext.getLocale();
535
536 nameMap.put(locale, name);
537
538 Locale defaultLocale = LocaleUtil.getDefault();
539
540 nameMap.put(defaultLocale, name);
541
542 Map<Locale, String> descriptionMap = new HashMap<Locale, String>();
543
544 descriptionMap.put(locale, description);
545 descriptionMap.put(defaultLocale, description);
546
547 String xsd = ParamUtil.getString(serviceContext, "xsd");
548
549 DDMStructure ddmStructure = ddmStructureLocalService.fetchStructure(
550 groupId, ddmStructureKey);
551
552 if ((ddmStructure != null) && Validator.isNull(xsd)) {
553 xsd = ddmStructure.getXsd();
554 }
555
556 Locale[] contentAvailableLocales = LocaleUtil.fromLanguageIds(
557 LocalizationUtil.getAvailableLocales(xsd));
558
559 for (Locale contentAvailableLocale : contentAvailableLocales) {
560 nameMap.put(contentAvailableLocale, name);
561
562 descriptionMap.put(contentAvailableLocale, description);
563 }
564
565 try {
566 if (ddmStructure == null) {
567 ddmStructure = ddmStructureLocalService.addStructure(
568 userId, groupId,
569 PortalUtil.getClassNameId(DLFileEntryMetadata.class),
570 ddmStructureKey, nameMap, descriptionMap, xsd, "xml",
571 DDMStructureConstants.TYPE_AUTO, serviceContext);
572 }
573 else {
574 ddmStructure = ddmStructureLocalService.updateStructure(
575 ddmStructure.getStructureId(), nameMap, descriptionMap, xsd,
576 serviceContext);
577 }
578
579 return ddmStructure.getStructureId();
580 }
581 catch (StructureXsdException sxe) {
582 if (ddmStructure != null) {
583 ddmStructureLocalService.deleteStructure(
584 ddmStructure.getStructureId());
585 }
586 }
587
588 return 0;
589 }
590
591 protected void validate(
592 long fileEntryTypeId, long groupId, String fileEntryTypeName,
593 long[] ddmStructureIds)
594 throws PortalException, SystemException {
595
596 DLFileEntryType dlFileEntryType = dlFileEntryTypePersistence.fetchByG_N(
597 groupId, fileEntryTypeName);
598
599 if ((dlFileEntryType != null) &&
600 (dlFileEntryType.getFileEntryTypeId() != fileEntryTypeId)) {
601
602 throw new DuplicateFileEntryTypeException(fileEntryTypeName);
603 }
604
605 if (ddmStructureIds.length == 0) {
606 throw new NoSuchMetadataSetException();
607 }
608
609 for (long ddmStructureId : ddmStructureIds) {
610 DDMStructure ddmStructure =
611 ddmStructurePersistence.fetchByPrimaryKey(ddmStructureId);
612
613 if (ddmStructure == null) {
614 throw new NoSuchMetadataSetException();
615 }
616 }
617 }
618
619 }