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.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 DLFileEntryMetadata getFileEntryMetadata(long fileEntryMetadataId)
052                    throws PortalException, SystemException {
053    
054                    return dlFileEntryMetadataPersistence.findByPrimaryKey(
055                            fileEntryMetadataId);
056            }
057    
058            public DLFileEntryMetadata getFileEntryMetadata(
059                            long ddmStructureId, long fileVersionId)
060                    throws PortalException, SystemException {
061    
062                    return dlFileEntryMetadataPersistence.findByD_F(
063                            ddmStructureId, fileVersionId);
064            }
065    
066            public long getFileEntryMetadataCount(long fileEntryId, long fileVersionId)
067                    throws SystemException {
068    
069                    return dlFileEntryMetadataPersistence.countByF_V(
070                            fileEntryId, fileVersionId);
071            }
072    
073            public void updateFileEntryMetadata(
074                            long companyId, List<DDMStructure> ddmStructures,
075                            long fileEntryTypeId, long fileEntryId, long fileVersionId,
076                            Map<String, Fields> fieldsMap, ServiceContext serviceContext)
077                    throws PortalException, SystemException {
078    
079                    for (DDMStructure ddmStructure : ddmStructures) {
080                            Fields fields = fieldsMap.get(ddmStructure.getStructureKey());
081    
082                            if (fields != null) {
083                                    updateFileEntryMetadata(
084                                            companyId, ddmStructure, fileEntryTypeId, fileEntryId,
085                                            fileVersionId, fields, serviceContext);
086                            }
087                    }
088            }
089    
090            public void updateFileEntryMetadata(
091                            long fileEntryTypeId, long fileEntryId, long fileVersionId,
092                            Map<String, Fields> fieldsMap, ServiceContext serviceContext)
093                    throws PortalException, SystemException {
094    
095                    DLFileEntryType fileEntryType =
096                            dlFileEntryTypeLocalService.getFileEntryType(fileEntryTypeId);
097    
098                    List<DDMStructure> ddmStructures = fileEntryType.getDDMStructures();
099    
100                    updateFileEntryMetadata(
101                            fileEntryType.getCompanyId(), ddmStructures, fileEntryTypeId,
102                            fileEntryId, fileVersionId, fieldsMap, serviceContext);
103            }
104    
105            protected void deleteFileEntryMetadata(
106                            DLFileEntryMetadata fileEntryMetadata)
107                    throws PortalException, SystemException {
108    
109                    // FileEntry metadata
110    
111                    dlFileEntryMetadataPersistence.remove(fileEntryMetadata);
112    
113                    // Dynamic data mapping storage
114    
115                    StorageEngineUtil.deleteByClass(fileEntryMetadata.getDDMStorageId());
116    
117                    // Dynamic data mapping structure link
118    
119                    ddmStructureLinkLocalService.deleteClassStructureLink(
120                            fileEntryMetadata.getFileEntryMetadataId());
121            }
122    
123            protected void updateFileEntryMetadata(
124                            long companyId, DDMStructure ddmStructure, long fileEntryTypeId,
125                            long fileEntryId, long fileVersionId, Fields fields,
126                            ServiceContext serviceContext)
127                    throws StorageException, SystemException {
128    
129                    DLFileEntryMetadata fileEntryMetadata =
130                            dlFileEntryMetadataPersistence.fetchByD_F(
131                                    ddmStructure.getStructureId(), fileVersionId);
132    
133                    if (fileEntryMetadata != null) {
134                            StorageEngineUtil.update(
135                                    fileEntryMetadata.getDDMStorageId(), fields, serviceContext);
136                    }
137                    else {
138    
139                            // File entry metadata
140    
141                            long fileEntryMetadataId = counterLocalService.increment();
142    
143                            fileEntryMetadata = dlFileEntryMetadataPersistence.create(
144                                    fileEntryMetadataId);
145    
146                            long ddmStorageId = StorageEngineUtil.create(
147                                    companyId, ddmStructure.getStructureId(), fields,
148                                    serviceContext);
149    
150                            fileEntryMetadata.setDDMStorageId(ddmStorageId);
151    
152                            fileEntryMetadata.setDDMStructureId(ddmStructure.getStructureId());
153                            fileEntryMetadata.setFileEntryTypeId(fileEntryTypeId);
154                            fileEntryMetadata.setFileEntryId(fileEntryId);
155                            fileEntryMetadata.setFileVersionId(fileVersionId);
156    
157                            dlFileEntryMetadataPersistence.update(fileEntryMetadata, false);
158    
159                            // Dynamic data mapping structure link
160    
161                            long classNameId = PortalUtil.getClassNameId(
162                                    DLFileEntryMetadata.class);
163    
164                            ddmStructureLinkLocalService.addStructureLink(
165                                    classNameId, fileEntryMetadata.getFileEntryMetadataId(),
166                                    ddmStructure.getStructureId(), serviceContext);
167                    }
168    
169                    try {
170                            String namespace = String.valueOf(ddmStructure.getStructureId());
171    
172                            for (String fieldName : ddmStructure.getFieldNames()) {
173                                    String fieldDataType = ddmStructure.getFieldDataType(fieldName);
174    
175                                    if (fieldDataType.equals(FieldConstants.FILE_UPLOAD)) {
176                                            DDMUtil.uploadFieldFile(
177                                                    fileEntryMetadata.getDDMStructureId(),
178                                                    fileEntryMetadata.getDDMStorageId(), fileEntryMetadata,
179                                                    fieldName, namespace, serviceContext);
180                                    }
181                            }
182                    }
183                    catch (Exception e) {
184                    }
185            }
186    
187    }