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