001
014
015 package com.liferay.portal.verify;
016
017 import com.liferay.counter.service.CounterLocalServiceUtil;
018 import com.liferay.portal.kernel.dao.orm.Criterion;
019 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
020 import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
021 import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
022 import com.liferay.portal.kernel.exception.PortalException;
023 import com.liferay.portal.kernel.exception.SystemException;
024 import com.liferay.portal.kernel.log.Log;
025 import com.liferay.portal.kernel.log.LogFactoryUtil;
026 import com.liferay.portal.kernel.repository.model.FileEntry;
027 import com.liferay.portal.kernel.repository.model.FileVersion;
028 import com.liferay.portal.kernel.util.ContentTypes;
029 import com.liferay.portal.kernel.util.GetterUtil;
030 import com.liferay.portal.kernel.util.ListUtil;
031 import com.liferay.portal.kernel.util.MimeTypesUtil;
032 import com.liferay.portal.kernel.util.StringPool;
033 import com.liferay.portal.kernel.workflow.WorkflowConstants;
034 import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
035 import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion;
036 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
037 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
038 import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
039 import com.liferay.portlet.documentlibrary.model.DLFileVersion;
040 import com.liferay.portlet.documentlibrary.service.DLAppHelperLocalServiceUtil;
041 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
042 import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
043 import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalServiceUtil;
044 import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
045 import com.liferay.portlet.documentlibrary.util.DLUtil;
046 import com.liferay.portlet.documentlibrary.util.comparator.FileVersionVersionComparator;
047
048 import java.io.InputStream;
049
050 import java.util.Collections;
051 import java.util.Date;
052 import java.util.List;
053
054
059 public class VerifyDocumentLibrary extends VerifyProcess {
060
061 protected void addDLFileVersion(DLFileEntry dlFileEntry)
062 throws SystemException {
063
064 long fileVersionId = CounterLocalServiceUtil.increment();
065
066 DLFileVersion dlFileVersion =
067 DLFileVersionLocalServiceUtil.createDLFileVersion(fileVersionId);
068
069 dlFileVersion.setGroupId(dlFileEntry.getGroupId());
070 dlFileVersion.setCompanyId(dlFileEntry.getCompanyId());
071
072 long versionUserId = dlFileEntry.getVersionUserId();
073
074 if (versionUserId <= 0) {
075 versionUserId = dlFileEntry.getUserId();
076 }
077
078 dlFileVersion.setUserId(versionUserId);
079
080 String versionUserName = GetterUtil.getString(
081 dlFileEntry.getVersionUserName(), dlFileEntry.getUserName());
082
083 dlFileVersion.setUserName(versionUserName);
084
085 dlFileVersion.setCreateDate(dlFileEntry.getModifiedDate());
086 dlFileVersion.setModifiedDate(dlFileEntry.getModifiedDate());
087 dlFileVersion.setRepositoryId(dlFileEntry.getRepositoryId());
088 dlFileVersion.setFolderId(dlFileEntry.getFolderId());
089 dlFileVersion.setFileEntryId(dlFileEntry.getFileEntryId());
090 dlFileVersion.setExtension(dlFileEntry.getExtension());
091 dlFileVersion.setMimeType(dlFileEntry.getMimeType());
092 dlFileVersion.setTitle(dlFileEntry.getTitle());
093 dlFileVersion.setDescription(dlFileEntry.getDescription());
094 dlFileVersion.setExtraSettings(dlFileEntry.getExtraSettings());
095 dlFileVersion.setFileEntryTypeId(dlFileEntry.getFileEntryTypeId());
096 dlFileVersion.setVersion(dlFileEntry.getVersion());
097 dlFileVersion.setSize(dlFileEntry.getSize());
098 dlFileVersion.setStatus(WorkflowConstants.STATUS_APPROVED);
099 dlFileVersion.setStatusByUserId(versionUserId);
100 dlFileVersion.setStatusByUserName(versionUserName);
101 dlFileVersion.setStatusDate(new Date());
102
103 DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion);
104 }
105
106 protected void checkDLFileEntryType() throws Exception {
107 DLFileEntryType dlFileEntryType =
108 DLFileEntryTypeLocalServiceUtil.fetchDLFileEntryType(
109 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
110
111 if (dlFileEntryType != null) {
112 return;
113 }
114
115 Date now = new Date();
116
117 dlFileEntryType = DLFileEntryTypeLocalServiceUtil.createDLFileEntryType(
118 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
119
120 dlFileEntryType.setCreateDate(now);
121 dlFileEntryType.setModifiedDate(now);
122 dlFileEntryType.setName(DLFileEntryTypeConstants.NAME_BASIC_DOCUMENT);
123
124 DLFileEntryTypeLocalServiceUtil.updateDLFileEntryType(dlFileEntryType);
125 }
126
127 protected void checkMimeTypes() throws Exception {
128 List<DLFileEntry> dlFileEntries =
129 DLFileEntryLocalServiceUtil.getFileEntriesByMimeType(
130 ContentTypes.APPLICATION_OCTET_STREAM);
131
132 if (_log.isDebugEnabled()) {
133 _log.debug(
134 "Processing " + dlFileEntries.size() + " file entries with " +
135 ContentTypes.APPLICATION_OCTET_STREAM);
136 }
137
138 for (DLFileEntry dlFileEntry : dlFileEntries) {
139 InputStream inputStream =
140 DLFileEntryLocalServiceUtil.getFileAsStream(
141 dlFileEntry.getUserId(), dlFileEntry.getFileEntryId(),
142 dlFileEntry.getVersion(), false);
143
144 String title = DLUtil.getTitleWithExtension(
145 dlFileEntry.getTitle(), dlFileEntry.getExtension());
146
147 String mimeType = MimeTypesUtil.getContentType(inputStream, title);
148
149 if (mimeType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {
150 continue;
151 }
152
153 dlFileEntry.setMimeType(mimeType);
154
155 DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry);
156
157 DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
158
159 dlFileVersion.setMimeType(mimeType);
160
161 DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion);
162 }
163
164 if (_log.isDebugEnabled()) {
165 _log.debug("Fixed file entries with invalid mime types");
166 }
167 }
168
169 protected void checkMisversionedDLFileEntries() throws Exception {
170 List<DLFileEntry> dlFileEntries =
171 DLFileEntryLocalServiceUtil.getMisversionedFileEntries();
172
173 if (_log.isDebugEnabled()) {
174 _log.debug(
175 "Processing " + dlFileEntries.size() +
176 " file entries with invalid version");
177 }
178
179 for (DLFileEntry dlFileEntry : dlFileEntries) {
180 copyDLFileEntry(dlFileEntry);
181
182 addDLFileVersion(dlFileEntry);
183 }
184
185 if (_log.isDebugEnabled()) {
186 _log.debug("Fixed misversioned file entries");
187 }
188 }
189
190 protected void checkTitles() throws Exception {
191 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
192 DLFileEntry.class);
193
194 Criterion criterion1 = RestrictionsFactoryUtil.like("title", "%/%");
195 Criterion criterion2 = RestrictionsFactoryUtil.like("title", "%\\\\%");
196
197 dynamicQuery.add(RestrictionsFactoryUtil.or(criterion1, criterion2));
198
199 List<DLFileEntry> dlFileEntries =
200 DLFileEntryLocalServiceUtil.dynamicQuery(dynamicQuery);
201
202 for (DLFileEntry dlFileEntry : dlFileEntries) {
203 String title = dlFileEntry.getTitle();
204
205 String newTitle = title.replace(StringPool.SLASH, StringPool.BLANK);
206
207 newTitle = newTitle.replace(
208 StringPool.BACK_SLASH, StringPool.UNDERLINE);
209
210 dlFileEntry.setTitle(newTitle);
211
212 DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry);
213
214 DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
215
216 dlFileVersion.setTitle(newTitle);
217
218 DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion);
219
220 if (_log.isDebugEnabled()) {
221 _log.debug(
222 "Invalid document title " + title + "renamed to " +
223 newTitle);
224 }
225 }
226 }
227
228 protected void copyDLFileEntry(DLFileEntry dlFileEntry)
229 throws PortalException, SystemException {
230
231 long companyId = dlFileEntry.getCompanyId();
232 long dataRepositoryId = dlFileEntry.getDataRepositoryId();
233 String name = dlFileEntry.getName();
234 String version = dlFileEntry.getVersion();
235
236 if (DLStoreUtil.hasFile(companyId, dataRepositoryId, name, version)) {
237 return;
238 }
239
240 FileVersionVersionComparator comparator =
241 new FileVersionVersionComparator();
242
243 List<DLFileVersion> dlFileVersions = dlFileEntry.getFileVersions(
244 WorkflowConstants.STATUS_APPROVED);
245
246 if (dlFileVersions.isEmpty()) {
247 dlFileVersions = dlFileEntry.getFileVersions(
248 WorkflowConstants.STATUS_ANY);
249 }
250
251 if (dlFileVersions.isEmpty()) {
252 DLStoreUtil.addFile(companyId, dataRepositoryId, name, new byte[0]);
253
254 return;
255 }
256
257 dlFileVersions = ListUtil.copy(dlFileVersions);
258
259 Collections.sort(dlFileVersions, comparator);
260
261 DLFileVersion dlFileVersion = dlFileVersions.get(0);
262
263 DLStoreUtil.copyFileVersion(
264 companyId, dataRepositoryId, name, dlFileVersion.getVersion(),
265 version);
266 }
267
268 @Override
269 protected void doVerify() throws Exception {
270 checkMisversionedDLFileEntries();
271
272 checkDLFileEntryType();
273 checkMimeTypes();
274 checkTitles();
275 removeOrphanedDLFileEntries();
276 updateAssets();
277 }
278
279 protected void removeOrphanedDLFileEntries() throws Exception {
280 List<DLFileEntry> dlFileEntries =
281 DLFileEntryLocalServiceUtil.getOrphanedFileEntries();
282
283 if (_log.isDebugEnabled()) {
284 _log.debug(
285 "Processing " + dlFileEntries.size() +
286 " file entries with no group");
287 }
288
289 for (DLFileEntry dlFileEntry : dlFileEntries) {
290 try {
291 DLFileEntryLocalServiceUtil.deleteFileEntry(
292 dlFileEntry.getFileEntryId());
293 }
294 catch (Exception e) {
295 if (_log.isWarnEnabled()) {
296 _log.warn(
297 "Unable to remove file entry " +
298 dlFileEntry.getFileEntryId() + ": " +
299 e.getMessage());
300 }
301 }
302 }
303
304 if (_log.isDebugEnabled()) {
305 _log.debug("Removed orphaned file entries");
306 }
307 }
308
309 protected void updateAssets() throws Exception {
310 List<DLFileEntry> dlFileEntries =
311 DLFileEntryLocalServiceUtil.getNoAssetFileEntries();
312
313 if (_log.isDebugEnabled()) {
314 _log.debug(
315 "Processing " + dlFileEntries.size() +
316 " file entries with no asset");
317 }
318
319 for (DLFileEntry dlFileEntry : dlFileEntries) {
320 FileEntry fileEntry = new LiferayFileEntry(dlFileEntry);
321 FileVersion fileVersion = new LiferayFileVersion(
322 dlFileEntry.getFileVersion());
323
324 try {
325 DLAppHelperLocalServiceUtil.updateAsset(
326 dlFileEntry.getUserId(), fileEntry, fileVersion, null, null,
327 null);
328 }
329 catch (Exception e) {
330 if (_log.isWarnEnabled()) {
331 _log.warn(
332 "Unable to update asset for file entry " +
333 dlFileEntry.getFileEntryId() + ": " +
334 e.getMessage());
335 }
336 }
337 }
338
339 if (_log.isDebugEnabled()) {
340 _log.debug("Assets verified for file entries");
341 }
342 }
343
344 private static Log _log = LogFactoryUtil.getLog(
345 VerifyDocumentLibrary.class);
346
347 }