001    /**
002     * Copyright (c) 2000-2012 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.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    /**
054     * @author Alexander Chow
055     * @author Sergio González
056     */
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    }