001
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
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 }