001    /**
002     * Copyright (c) 2000-2011 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.service.ServiceContext;
020    import com.liferay.portal.util.PortalUtil;
021    import com.liferay.portlet.documentlibrary.NoSuchFileEntryMetadataException;
022    import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
023    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
024    import com.liferay.portlet.documentlibrary.service.base.DLFileEntryMetadataLocalServiceBaseImpl;
025    import com.liferay.portlet.dynamicdatamapping.StorageException;
026    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
027    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
028    import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
029    
030    import java.util.List;
031    import java.util.Map;
032    
033    /**
034     * @author Alexander Chow
035     */
036    public class DLFileEntryMetadataLocalServiceImpl
037            extends DLFileEntryMetadataLocalServiceBaseImpl {
038    
039            public void deleteFileEntryMetadata(long fileEntryId)
040                    throws PortalException, SystemException {
041    
042                    List<DLFileEntryMetadata> fileEntryMetadatas =
043                            dlFileEntryMetadataPersistence.findByFileEntryId(fileEntryId);
044    
045                    for (DLFileEntryMetadata fileEntryMetadata : fileEntryMetadatas) {
046                            deleteFileEntryMetadata(fileEntryMetadata);
047                    }
048            }
049    
050            public DLFileEntryMetadata getFileEntryMetadata(long fileEntryMetadataId)
051                    throws PortalException, SystemException {
052    
053                    return dlFileEntryMetadataPersistence.findByPrimaryKey(
054                            fileEntryMetadataId);
055            }
056    
057            public DLFileEntryMetadata getFileEntryMetadata(
058                            long ddmStructureId, long fileVersionId)
059                    throws PortalException, SystemException {
060    
061                    return dlFileEntryMetadataPersistence.findByD_F(
062                            ddmStructureId, fileVersionId);
063            }
064    
065            public long getFileEntryMetadataCount(long fileEntryId, long fileVersionId)
066                    throws SystemException {
067    
068                    return dlFileEntryMetadataPersistence.countByF_V(
069                            fileEntryId, fileVersionId);
070            }
071    
072            public void updateFileEntryMetadata(
073                            long companyId, List<DDMStructure> ddmStructures,
074                            long fileEntryTypeId, long fileEntryId, long fileVersionId,
075                            Map<String, Fields> fieldsMap, ServiceContext serviceContext)
076                    throws PortalException, SystemException {
077    
078                    for (DDMStructure ddmStructure : ddmStructures) {
079                            Fields fields = fieldsMap.get(ddmStructure.getStructureKey());
080    
081                            if (fields != null) {
082                                    updateFileEntryMetadata(
083                                            companyId, ddmStructure, fileEntryTypeId, fileEntryId,
084                                            fileVersionId, fields, serviceContext);
085                            }
086                    }
087            }
088    
089            public void updateFileEntryMetadata(
090                            long fileEntryTypeId, long fileEntryId, long fileVersionId,
091                            Map<String, Fields> fieldsMap, ServiceContext serviceContext)
092                    throws PortalException, SystemException {
093    
094                    DLFileEntryType fileEntryType =
095                            dlFileEntryTypeLocalService.getFileEntryType(fileEntryTypeId);
096    
097                    List<DDMStructure> ddmStructures = fileEntryType.getDDMStructures();
098    
099                    updateFileEntryMetadata(
100                            fileEntryType.getCompanyId(), ddmStructures, fileEntryTypeId,
101                            fileEntryId, fileVersionId, fieldsMap, serviceContext);
102            }
103    
104            protected void deleteFileEntryMetadata(
105                            DLFileEntryMetadata fileEntryMetadata)
106                    throws PortalException, SystemException {
107    
108                    // FileEntry metadata
109    
110                    dlFileEntryMetadataPersistence.remove(fileEntryMetadata);
111    
112                    // Dynamic data mapping storage
113    
114                    StorageEngineUtil.deleteByClass(fileEntryMetadata.getDDMStorageId());
115    
116                    // Dynamic data mapping structure link
117    
118                    ddmStructureLinkLocalService.deleteClassStructureLink(
119                            fileEntryMetadata.getFileEntryMetadataId());
120            }
121    
122            protected void updateFileEntryMetadata(
123                            long companyId, DDMStructure ddmStructure, long fileEntryTypeId,
124                            long fileEntryId, long fileVersionId, Fields fields,
125                            ServiceContext serviceContext)
126                    throws StorageException, SystemException {
127    
128                    try {
129                            DLFileEntryMetadata fileEntryMetadata =
130                                    dlFileEntryMetadataPersistence.findByD_F(
131                                            ddmStructure.getStructureId(), fileVersionId);
132    
133                            StorageEngineUtil.update(
134                                    fileEntryMetadata.getDDMStorageId(), fields, serviceContext);
135                    }
136                    catch (NoSuchFileEntryMetadataException nsdmse) {
137    
138                            // File entry metadata
139    
140                            long fileEntryMetadataId = counterLocalService.increment();
141    
142                            DLFileEntryMetadata fileEntryMetadata =
143                                    dlFileEntryMetadataPersistence.create(fileEntryMetadataId);
144    
145                            long ddmStorageId = StorageEngineUtil.create(
146                                    companyId, ddmStructure.getStructureId(), fields,
147                                    serviceContext);
148    
149                            fileEntryMetadata.setDDMStorageId(ddmStorageId);
150    
151                            fileEntryMetadata.setDDMStructureId(ddmStructure.getStructureId());
152                            fileEntryMetadata.setFileEntryTypeId(fileEntryTypeId);
153                            fileEntryMetadata.setFileEntryId(fileEntryId);
154                            fileEntryMetadata.setFileVersionId(fileVersionId);
155    
156                            dlFileEntryMetadataPersistence.update(fileEntryMetadata, false);
157    
158                            // Dynamic data mapping structure link
159    
160                            long classNameId = PortalUtil.getClassNameId(
161                                    DLFileEntryMetadata.class);
162    
163                            ddmStructureLinkLocalService.addStructureLink(
164                                    classNameId, fileEntryMetadata.getFileEntryMetadataId(),
165                                    ddmStructure.getStructureId(), serviceContext);
166                    }
167            }
168    
169    }