001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.verify;
016    
017    import com.liferay.counter.service.CounterLocalServiceUtil;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.kernel.log.Log;
021    import com.liferay.portal.kernel.log.LogFactoryUtil;
022    import com.liferay.portal.kernel.repository.model.FileEntry;
023    import com.liferay.portal.kernel.repository.model.FileVersion;
024    import com.liferay.portal.kernel.util.ContentTypes;
025    import com.liferay.portal.kernel.util.GetterUtil;
026    import com.liferay.portal.kernel.util.ListUtil;
027    import com.liferay.portal.kernel.util.MimeTypesUtil;
028    import com.liferay.portal.kernel.workflow.WorkflowConstants;
029    import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
030    import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion;
031    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
032    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
033    import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
034    import com.liferay.portlet.documentlibrary.model.DLFileVersion;
035    import com.liferay.portlet.documentlibrary.service.DLAppHelperLocalServiceUtil;
036    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
037    import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
038    import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalServiceUtil;
039    import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
040    import com.liferay.portlet.documentlibrary.util.DLUtil;
041    import com.liferay.portlet.documentlibrary.util.comparator.FileVersionVersionComparator;
042    
043    import java.io.InputStream;
044    
045    import java.util.Collections;
046    import java.util.Date;
047    import java.util.List;
048    
049    /**
050     * @author Raymond Augé
051     * @author Douglas Wong
052     * @author Alexander Chow
053     */
054    public class VerifyDocumentLibrary extends VerifyProcess {
055    
056            protected void addDLFileVersion(DLFileEntry dlFileEntry)
057                    throws SystemException {
058    
059                    long fileVersionId = CounterLocalServiceUtil.increment();
060    
061                    DLFileVersion dlFileVersion =
062                            DLFileVersionLocalServiceUtil.createDLFileVersion(fileVersionId);
063    
064                    dlFileVersion.setGroupId(dlFileEntry.getGroupId());
065                    dlFileVersion.setCompanyId(dlFileEntry.getCompanyId());
066    
067                    long versionUserId = dlFileEntry.getVersionUserId();
068    
069                    if (versionUserId <= 0) {
070                            versionUserId = dlFileEntry.getUserId();
071                    }
072    
073                    dlFileVersion.setUserId(versionUserId);
074    
075                    String versionUserName = GetterUtil.getString(
076                            dlFileEntry.getVersionUserName(), dlFileEntry.getUserName());
077    
078                    dlFileVersion.setUserName(versionUserName);
079    
080                    dlFileVersion.setCreateDate(dlFileEntry.getModifiedDate());
081                    dlFileVersion.setModifiedDate(dlFileEntry.getModifiedDate());
082                    dlFileVersion.setRepositoryId(dlFileEntry.getRepositoryId());
083                    dlFileVersion.setFolderId(dlFileEntry.getFolderId());
084                    dlFileVersion.setFileEntryId(dlFileEntry.getFileEntryId());
085                    dlFileVersion.setExtension(dlFileEntry.getExtension());
086                    dlFileVersion.setMimeType(dlFileEntry.getMimeType());
087                    dlFileVersion.setTitle(dlFileEntry.getTitle());
088                    dlFileVersion.setDescription(dlFileEntry.getDescription());
089                    dlFileVersion.setExtraSettings(dlFileEntry.getExtraSettings());
090                    dlFileVersion.setFileEntryTypeId(dlFileEntry.getFileEntryTypeId());
091                    dlFileVersion.setVersion(dlFileEntry.getVersion());
092                    dlFileVersion.setSize(dlFileEntry.getSize());
093                    dlFileVersion.setStatus(WorkflowConstants.STATUS_APPROVED);
094                    dlFileVersion.setStatusByUserId(versionUserId);
095                    dlFileVersion.setStatusByUserName(versionUserName);
096                    dlFileVersion.setStatusDate(new Date());
097    
098                    DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion);
099            }
100    
101            protected void checkDLFileEntryType() throws Exception {
102                    DLFileEntryType dlFileEntryType =
103                            DLFileEntryTypeLocalServiceUtil.fetchDLFileEntryType(
104                                    DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
105    
106                    if (dlFileEntryType != null) {
107                            return;
108                    }
109    
110                    Date now = new Date();
111    
112                    dlFileEntryType = DLFileEntryTypeLocalServiceUtil.createDLFileEntryType(
113                            DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
114    
115                    dlFileEntryType.setCreateDate(now);
116                    dlFileEntryType.setModifiedDate(now);
117                    dlFileEntryType.setName(DLFileEntryTypeConstants.NAME_BASIC_DOCUMENT);
118    
119                    DLFileEntryTypeLocalServiceUtil.updateDLFileEntryType(dlFileEntryType);
120            }
121    
122            protected void checkMimeTypes() throws Exception {
123                    List<DLFileEntry> dlFileEntries =
124                            DLFileEntryLocalServiceUtil.getFileEntriesByMimeType(
125                                    ContentTypes.APPLICATION_OCTET_STREAM);
126    
127                    if (_log.isDebugEnabled()) {
128                            _log.debug(
129                                    "Processing " + dlFileEntries.size() + " file entries with " +
130                                            ContentTypes.APPLICATION_OCTET_STREAM);
131                    }
132    
133                    for (DLFileEntry dlFileEntry : dlFileEntries) {
134                            InputStream inputStream =
135                                    DLFileEntryLocalServiceUtil.getFileAsStream(
136                                            dlFileEntry.getUserId(), dlFileEntry.getFileEntryId(),
137                                            dlFileEntry.getVersion(), false);
138    
139                            String title = DLUtil.getTitleWithExtension(
140                                    dlFileEntry.getTitle(), dlFileEntry.getExtension());
141    
142                            String mimeType = MimeTypesUtil.getContentType(inputStream, title);
143    
144                            if (mimeType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {
145                                    continue;
146                            }
147    
148                            dlFileEntry.setMimeType(mimeType);
149    
150                            DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry);
151    
152                            DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
153    
154                            dlFileVersion.setMimeType(mimeType);
155    
156                            DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion);
157                    }
158    
159                    if (_log.isDebugEnabled()) {
160                            _log.debug("Fixed file entries with invalid mime types");
161                    }
162            }
163    
164            protected void checkMisversionedDLFileEntries() throws Exception {
165                    List<DLFileEntry> dlFileEntries =
166                            DLFileEntryLocalServiceUtil.getMisversionedFileEntries();
167    
168                    if (_log.isDebugEnabled()) {
169                            _log.debug(
170                                    "Processing " + dlFileEntries.size() +
171                                            " file entries with invalid version");
172                    }
173    
174                    for (DLFileEntry dlFileEntry : dlFileEntries) {
175                            copyDLFileEntry(dlFileEntry);
176    
177                            addDLFileVersion(dlFileEntry);
178                    }
179    
180                    if (_log.isDebugEnabled()) {
181                            _log.debug("Fixed misversioned file entries");
182                    }
183            }
184    
185            protected void copyDLFileEntry(DLFileEntry dlFileEntry)
186                    throws PortalException, SystemException {
187    
188                    long companyId = dlFileEntry.getCompanyId();
189                    long dataRepositoryId = dlFileEntry.getDataRepositoryId();
190                    String name = dlFileEntry.getName();
191                    String version = dlFileEntry.getVersion();
192    
193                    if (DLStoreUtil.hasFile(companyId, dataRepositoryId, name, version)) {
194                            return;
195                    }
196    
197                    FileVersionVersionComparator comparator =
198                            new FileVersionVersionComparator();
199    
200                    List<DLFileVersion> dlFileVersions = dlFileEntry.getFileVersions(
201                            WorkflowConstants.STATUS_APPROVED);
202    
203                    if (dlFileVersions.isEmpty()) {
204                            dlFileVersions = dlFileEntry.getFileVersions(
205                                    WorkflowConstants.STATUS_ANY);
206                    }
207    
208                    if (dlFileVersions.isEmpty()) {
209                            DLStoreUtil.addFile(companyId, dataRepositoryId, name, new byte[0]);
210    
211                            return;
212                    }
213    
214                    dlFileVersions = ListUtil.copy(dlFileVersions);
215    
216                    Collections.sort(dlFileVersions, comparator);
217    
218                    DLFileVersion dlFileVersion = dlFileVersions.get(0);
219    
220                    DLStoreUtil.copyFileVersion(
221                            companyId, dataRepositoryId, name, dlFileVersion.getVersion(),
222                            version);
223            }
224    
225            @Override
226            protected void doVerify() throws Exception {
227                    checkMisversionedDLFileEntries();
228    
229                    checkDLFileEntryType();
230                    checkMimeTypes();
231                    removeOrphanedDLFileEntries();
232                    updateAssets();
233            }
234    
235            protected void removeOrphanedDLFileEntries() throws Exception {
236                    List<DLFileEntry> dlFileEntries =
237                            DLFileEntryLocalServiceUtil.getOrphanedFileEntries();
238    
239                    if (_log.isDebugEnabled()) {
240                            _log.debug(
241                                    "Processing " + dlFileEntries.size() +
242                                            " file entries with no group");
243                    }
244    
245                    for (DLFileEntry dlFileEntry : dlFileEntries) {
246                            try {
247                                    DLFileEntryLocalServiceUtil.deleteFileEntry(
248                                            dlFileEntry.getFileEntryId());
249                            }
250                            catch (Exception e) {
251                                    if (_log.isWarnEnabled()) {
252                                            _log.warn(
253                                                    "Unable to remove file entry " +
254                                                            dlFileEntry.getFileEntryId() + ": " +
255                                                                    e.getMessage());
256                                    }
257                            }
258                    }
259    
260                    if (_log.isDebugEnabled()) {
261                            _log.debug("Removed orphaned file entries");
262                    }
263            }
264    
265            protected void updateAssets() throws Exception {
266                    List<DLFileEntry> dlFileEntries =
267                            DLFileEntryLocalServiceUtil.getNoAssetFileEntries();
268    
269                    if (_log.isDebugEnabled()) {
270                            _log.debug(
271                                    "Processing " + dlFileEntries.size() +
272                                            " file entries with no asset");
273                    }
274    
275                    for (DLFileEntry dlFileEntry : dlFileEntries) {
276                            FileEntry fileEntry = new LiferayFileEntry(dlFileEntry);
277                            FileVersion fileVersion = new LiferayFileVersion(
278                                    dlFileEntry.getFileVersion());
279    
280                            try {
281                                    DLAppHelperLocalServiceUtil.updateAsset(
282                                            dlFileEntry.getUserId(), fileEntry, fileVersion, null, null,
283                                            null);
284                            }
285                            catch (Exception e) {
286                                    if (_log.isWarnEnabled()) {
287                                            _log.warn(
288                                                    "Unable to update asset for file entry " +
289                                                            dlFileEntry.getFileEntryId() + ": " +
290                                                                    e.getMessage());
291                                    }
292                            }
293                    }
294    
295                    if (_log.isDebugEnabled()) {
296                            _log.debug("Assets verified for file entries");
297                    }
298            }
299    
300            private static Log _log = LogFactoryUtil.getLog(
301                    VerifyDocumentLibrary.class);
302    
303    }