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.service.ServiceContext;
020    import com.liferay.portal.util.PortalUtil;
021    import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
022    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
023    import com.liferay.portlet.documentlibrary.service.base.DLFileEntryMetadataLocalServiceBaseImpl;
024    import com.liferay.portlet.dynamicdatamapping.StorageException;
025    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
026    import com.liferay.portlet.dynamicdatamapping.storage.FieldConstants;
027    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
028    import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
029    import com.liferay.portlet.dynamicdatamapping.util.DDMUtil;
030    
031    import java.util.List;
032    import java.util.Map;
033    
034    /**
035     * @author Alexander Chow
036     */
037    public class DLFileEntryMetadataLocalServiceImpl
038            extends DLFileEntryMetadataLocalServiceBaseImpl {
039    
040            public void deleteFileEntryMetadata(long fileEntryId)
041                    throws PortalException, SystemException {
042    
043                    List<DLFileEntryMetadata> fileEntryMetadatas =
044                            dlFileEntryMetadataPersistence.findByFileEntryId(fileEntryId);
045    
046                    for (DLFileEntryMetadata fileEntryMetadata : fileEntryMetadatas) {
047                            deleteFileEntryMetadata(fileEntryMetadata);
048                    }
049            }
050    
051            public void deleteFileVersionFileEntryMetadata(long fileVersionId)
052                    throws PortalException, SystemException {
053    
054                    List<DLFileEntryMetadata> fileEntryMetadatas =
055                            dlFileEntryMetadataPersistence.findByFileVersionId(fileVersionId);
056    
057                    for (DLFileEntryMetadata fileEntryMetadata : fileEntryMetadatas) {
058                            deleteFileEntryMetadata(fileEntryMetadata);
059                    }
060            }
061    
062            public DLFileEntryMetadata getFileEntryMetadata(long fileEntryMetadataId)
063                    throws PortalException, SystemException {
064    
065                    return dlFileEntryMetadataPersistence.findByPrimaryKey(
066                            fileEntryMetadataId);
067            }
068    
069            public DLFileEntryMetadata getFileEntryMetadata(
070                            long ddmStructureId, long fileVersionId)
071                    throws PortalException, SystemException {
072    
073                    return dlFileEntryMetadataPersistence.findByD_F(
074                            ddmStructureId, fileVersionId);
075            }
076    
077            /**
078             * @deprecated As of 6.2.0, replaced by {@link
079             *             #getFileVersionFileEntryMetadatasCount(long)}
080             */
081            public long getFileEntryMetadataCount(long fileEntryId, long fileVersionId)
082                    throws SystemException {
083    
084                    return getFileVersionFileEntryMetadatasCount(fileVersionId);
085            }
086    
087            public List<DLFileEntryMetadata> getFileVersionFileEntryMetadatas(
088                            long fileVersionId)
089                    throws SystemException {
090    
091                    return dlFileEntryMetadataPersistence.findByFileVersionId(
092                            fileVersionId);
093            }
094    
095            public long getFileVersionFileEntryMetadatasCount(long fileVersionId)
096                    throws SystemException {
097    
098                    return dlFileEntryMetadataPersistence.countByFileVersionId(
099                            fileVersionId);
100            }
101    
102            public void updateFileEntryMetadata(
103                            long companyId, List<DDMStructure> ddmStructures,
104                            long fileEntryTypeId, long fileEntryId, long fileVersionId,
105                            Map<String, Fields> fieldsMap, ServiceContext serviceContext)
106                    throws PortalException, SystemException {
107    
108                    for (DDMStructure ddmStructure : ddmStructures) {
109                            Fields fields = fieldsMap.get(ddmStructure.getStructureKey());
110    
111                            if (fields != null) {
112                                    updateFileEntryMetadata(
113                                            companyId, ddmStructure, fileEntryTypeId, fileEntryId,
114                                            fileVersionId, fields, serviceContext);
115                            }
116                    }
117            }
118    
119            public void updateFileEntryMetadata(
120                            long fileEntryTypeId, long fileEntryId, long fileVersionId,
121                            Map<String, Fields> fieldsMap, ServiceContext serviceContext)
122                    throws PortalException, SystemException {
123    
124                    DLFileEntryType fileEntryType =
125                            dlFileEntryTypeLocalService.getFileEntryType(fileEntryTypeId);
126    
127                    List<DDMStructure> ddmStructures = fileEntryType.getDDMStructures();
128    
129                    updateFileEntryMetadata(
130                            fileEntryType.getCompanyId(), ddmStructures, fileEntryTypeId,
131                            fileEntryId, fileVersionId, fieldsMap, serviceContext);
132            }
133    
134            protected void deleteFileEntryMetadata(
135                            DLFileEntryMetadata fileEntryMetadata)
136                    throws PortalException, SystemException {
137    
138                    // FileEntry metadata
139    
140                    dlFileEntryMetadataPersistence.remove(fileEntryMetadata);
141    
142                    // Dynamic data mapping storage
143    
144                    StorageEngineUtil.deleteByClass(fileEntryMetadata.getDDMStorageId());
145    
146                    // Dynamic data mapping structure link
147    
148                    ddmStructureLinkLocalService.deleteClassStructureLink(
149                            fileEntryMetadata.getFileEntryMetadataId());
150            }
151    
152            protected void updateFileEntryMetadata(
153                            long companyId, DDMStructure ddmStructure, long fileEntryTypeId,
154                            long fileEntryId, long fileVersionId, Fields fields,
155                            ServiceContext serviceContext)
156                    throws StorageException, SystemException {
157    
158                    DLFileEntryMetadata fileEntryMetadata =
159                            dlFileEntryMetadataPersistence.fetchByD_F(
160                                    ddmStructure.getStructureId(), fileVersionId);
161    
162                    if (fileEntryMetadata != null) {
163                            StorageEngineUtil.update(
164                                    fileEntryMetadata.getDDMStorageId(), fields, true,
165                                    serviceContext);
166                    }
167                    else {
168    
169                            // File entry metadata
170    
171                            long fileEntryMetadataId = counterLocalService.increment();
172    
173                            fileEntryMetadata = dlFileEntryMetadataPersistence.create(
174                                    fileEntryMetadataId);
175    
176                            long ddmStorageId = StorageEngineUtil.create(
177                                    companyId, ddmStructure.getStructureId(), fields,
178                                    serviceContext);
179    
180                            fileEntryMetadata.setDDMStorageId(ddmStorageId);
181    
182                            fileEntryMetadata.setDDMStructureId(ddmStructure.getStructureId());
183                            fileEntryMetadata.setFileEntryTypeId(fileEntryTypeId);
184                            fileEntryMetadata.setFileEntryId(fileEntryId);
185                            fileEntryMetadata.setFileVersionId(fileVersionId);
186    
187                            dlFileEntryMetadataPersistence.update(fileEntryMetadata);
188    
189                            // Dynamic data mapping structure link
190    
191                            long classNameId = PortalUtil.getClassNameId(
192                                    DLFileEntryMetadata.class);
193    
194                            ddmStructureLinkLocalService.addStructureLink(
195                                    classNameId, fileEntryMetadata.getFileEntryMetadataId(),
196                                    ddmStructure.getStructureId(), serviceContext);
197                    }
198    
199                    try {
200                            String namespace = String.valueOf(ddmStructure.getStructureId());
201    
202                            for (String fieldName : ddmStructure.getFieldNames()) {
203                                    String fieldDataType = ddmStructure.getFieldDataType(fieldName);
204    
205                                    if (fieldDataType.equals(FieldConstants.FILE_UPLOAD)) {
206                                            DDMUtil.uploadFieldFile(
207                                                    fileEntryMetadata.getDDMStructureId(),
208                                                    fileEntryMetadata.getDDMStorageId(), fileEntryMetadata,
209                                                    fieldName, namespace, serviceContext);
210                                    }
211                            }
212                    }
213                    catch (Exception e) {
214                    }
215            }
216    
217    }