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