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