001
014
015 package com.liferay.portal.verify;
016
017 import com.liferay.counter.service.CounterLocalServiceUtil;
018 import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
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.log.Log;
024 import com.liferay.portal.kernel.log.LogFactoryUtil;
025 import com.liferay.portal.kernel.repository.model.FileEntry;
026 import com.liferay.portal.kernel.repository.model.FileVersion;
027 import com.liferay.portal.kernel.repository.model.Folder;
028 import com.liferay.portal.kernel.util.ContentTypes;
029 import com.liferay.portal.kernel.util.FileUtil;
030 import com.liferay.portal.kernel.util.ListUtil;
031 import com.liferay.portal.kernel.util.LocaleUtil;
032 import com.liferay.portal.kernel.util.MimeTypesUtil;
033 import com.liferay.portal.kernel.util.StreamUtil;
034 import com.liferay.portal.kernel.util.StringBundler;
035 import com.liferay.portal.kernel.util.StringPool;
036 import com.liferay.portal.kernel.util.StringUtil;
037 import com.liferay.portal.kernel.util.Validator;
038 import com.liferay.portal.kernel.workflow.WorkflowConstants;
039 import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
040 import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion;
041 import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
042 import com.liferay.portal.util.PortalInstances;
043 import com.liferay.portlet.documentlibrary.DuplicateFileException;
044 import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
045 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
046 import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
047 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
048 import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
049 import com.liferay.portlet.documentlibrary.model.DLFileVersion;
050 import com.liferay.portlet.documentlibrary.model.DLFolder;
051 import com.liferay.portlet.documentlibrary.service.DLAppHelperLocalServiceUtil;
052 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
053 import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;
054 import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
055 import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalServiceUtil;
056 import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
057 import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
058 import com.liferay.portlet.documentlibrary.util.DLUtil;
059 import com.liferay.portlet.documentlibrary.util.comparator.FileVersionVersionComparator;
060 import com.liferay.portlet.documentlibrary.webdav.DLWebDAVStorageImpl;
061 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
062 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLinkLocalServiceUtil;
063 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
064 import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
065 import com.liferay.portlet.trash.model.TrashEntry;
066 import com.liferay.portlet.trash.service.TrashEntryLocalServiceUtil;
067
068 import java.io.InputStream;
069
070 import java.util.Collections;
071 import java.util.Date;
072 import java.util.List;
073
074
079 public class VerifyDocumentLibrary extends VerifyProcess {
080
081 protected void addDLFileVersion(DLFileEntry dlFileEntry) {
082 long fileVersionId = CounterLocalServiceUtil.increment();
083
084 DLFileVersion dlFileVersion =
085 DLFileVersionLocalServiceUtil.createDLFileVersion(fileVersionId);
086
087 dlFileVersion.setGroupId(dlFileEntry.getGroupId());
088 dlFileVersion.setCompanyId(dlFileEntry.getCompanyId());
089
090 long userId = dlFileEntry.getUserId();
091
092 dlFileVersion.setUserId(userId);
093
094 String userName = dlFileEntry.getUserName();
095
096 dlFileVersion.setUserName(userName);
097
098 dlFileVersion.setCreateDate(dlFileEntry.getModifiedDate());
099 dlFileVersion.setModifiedDate(dlFileEntry.getModifiedDate());
100 dlFileVersion.setRepositoryId(dlFileEntry.getRepositoryId());
101 dlFileVersion.setFolderId(dlFileEntry.getFolderId());
102 dlFileVersion.setFileEntryId(dlFileEntry.getFileEntryId());
103 dlFileVersion.setExtension(dlFileEntry.getExtension());
104 dlFileVersion.setMimeType(dlFileEntry.getMimeType());
105 dlFileVersion.setTitle(dlFileEntry.getTitle());
106 dlFileVersion.setDescription(dlFileEntry.getDescription());
107 dlFileVersion.setExtraSettings(dlFileEntry.getExtraSettings());
108 dlFileVersion.setFileEntryTypeId(dlFileEntry.getFileEntryTypeId());
109 dlFileVersion.setVersion(dlFileEntry.getVersion());
110 dlFileVersion.setSize(dlFileEntry.getSize());
111 dlFileVersion.setStatus(WorkflowConstants.STATUS_APPROVED);
112 dlFileVersion.setStatusByUserId(userId);
113 dlFileVersion.setStatusByUserName(userName);
114 dlFileVersion.setStatusDate(new Date());
115
116 DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion);
117 }
118
119 protected void checkDLFileEntryMetadata() throws Exception {
120 ActionableDynamicQuery actionableDynamicQuery =
121 DLFileEntryMetadataLocalServiceUtil.getActionableDynamicQuery();
122
123 actionableDynamicQuery.setPerformActionMethod(
124 new ActionableDynamicQuery.PerformActionMethod() {
125
126 @Override
127 public void performAction(Object object) {
128 DLFileEntryMetadata dlFileEntryMetadata =
129 (DLFileEntryMetadata)object;
130
131 try {
132 DLFileEntry dlFileEntry =
133 DLFileEntryLocalServiceUtil.getFileEntry(
134 dlFileEntryMetadata.getFileEntryId());
135
136 DDMStructure ddmStructure =
137 DDMStructureLocalServiceUtil.fetchStructure(
138 dlFileEntryMetadata.getDDMStructureId());
139
140 if (ddmStructure == null) {
141 deleteUnusedDLFileEntryMetadata(
142 dlFileEntryMetadata);
143
144 return;
145 }
146
147 if (dlFileEntry.getCompanyId() !=
148 ddmStructure.getCompanyId()) {
149
150 deleteUnusedDLFileEntryMetadata(
151 dlFileEntryMetadata);
152 }
153 }
154 catch (Exception e) {
155 if (_log.isWarnEnabled()) {
156 _log.warn(
157 "Unable to delete unused metadata for file " +
158 "entry " +
159 dlFileEntryMetadata.getFileEntryId(),
160 e);
161 }
162 }
163 }
164
165 });
166
167 actionableDynamicQuery.performActions();
168 }
169
170 protected void checkDLFileEntryType() throws Exception {
171 DLFileEntryType dlFileEntryType =
172 DLFileEntryTypeLocalServiceUtil.fetchDLFileEntryType(
173 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
174
175 if (dlFileEntryType != null) {
176 return;
177 }
178
179 Date now = new Date();
180
181 dlFileEntryType = DLFileEntryTypeLocalServiceUtil.createDLFileEntryType(
182 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
183
184 dlFileEntryType.setCreateDate(now);
185 dlFileEntryType.setModifiedDate(now);
186 dlFileEntryType.setFileEntryTypeKey(
187 StringUtil.toUpperCase(
188 DLFileEntryTypeConstants.NAME_BASIC_DOCUMENT));
189 dlFileEntryType.setName(
190 DLFileEntryTypeConstants.NAME_BASIC_DOCUMENT,
191 LocaleUtil.getDefault());
192
193 DLFileEntryTypeLocalServiceUtil.updateDLFileEntryType(dlFileEntryType);
194 }
195
196 protected void checkDuplicateTitles() throws Exception {
197 ActionableDynamicQuery actionableDynamicQuery =
198 DLFileEntryLocalServiceUtil.getActionableDynamicQuery();
199
200 actionableDynamicQuery.setPerformActionMethod(
201 new ActionableDynamicQuery.PerformActionMethod() {
202
203 @Override
204 public void performAction(Object object) {
205 DLFileEntry dlFileEntry = (DLFileEntry)object;
206
207 if (dlFileEntry.isInTrash()) {
208 return;
209 }
210
211 try {
212 DLFileEntryLocalServiceUtil.validateFile(
213 dlFileEntry.getGroupId(), dlFileEntry.getFolderId(),
214 dlFileEntry.getFileEntryId(),
215 dlFileEntry.getFileName(), dlFileEntry.getTitle());
216 }
217 catch (PortalException pe) {
218 if (!(pe instanceof DuplicateFileException) &&
219 !(pe instanceof DuplicateFolderNameException)) {
220
221 return;
222 }
223
224 try {
225 renameDuplicateTitle(dlFileEntry);
226 }
227 catch (Exception e) {
228 if (_log.isWarnEnabled()) {
229 _log.warn(
230 "Unable to rename duplicate title for " +
231 "file entry " +
232 dlFileEntry.getFileEntryId() +
233 ": " + e.getMessage(),
234 e);
235 }
236 }
237 }
238 }
239
240 });
241
242 actionableDynamicQuery.performActions();
243 }
244
245 protected void checkFileEntryMimeTypes(final String originalMimeType)
246 throws Exception {
247
248 ActionableDynamicQuery actionableDynamicQuery =
249 DLFileEntryLocalServiceUtil.getActionableDynamicQuery();
250
251 actionableDynamicQuery.setPerformActionMethod(
252 new ActionableDynamicQuery.PerformActionMethod() {
253
254 @Override
255 public void performAction(Object object)
256 throws PortalException {
257
258 DLFileEntry dlFileEntry = (DLFileEntry)object;
259
260 InputStream inputStream = null;
261
262 try {
263 inputStream =
264 DLFileEntryLocalServiceUtil.getFileAsStream(
265 dlFileEntry.getFileEntryId(),
266 dlFileEntry.getVersion(), false);
267 }
268 catch (Exception e) {
269 if (_log.isWarnEnabled()) {
270 _log.warn(
271 "Unable to find file entry " +
272 dlFileEntry.getName(),
273 e);
274 }
275
276 return;
277 }
278
279 String title = DLUtil.getTitleWithExtension(
280 dlFileEntry.getTitle(), dlFileEntry.getExtension());
281
282 String mimeType = getMimeType(inputStream, title);
283
284 if (mimeType.equals(originalMimeType)) {
285 return;
286 }
287
288 dlFileEntry.setMimeType(mimeType);
289
290 DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry);
291
292 DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
293
294 dlFileVersion.setMimeType(mimeType);
295
296 DLFileVersionLocalServiceUtil.updateDLFileVersion(
297 dlFileVersion);
298 }
299
300 });
301
302 actionableDynamicQuery.performActions();
303 }
304
305 protected void checkFileVersionMimeTypes(final String originalMimeType)
306 throws Exception {
307
308 ActionableDynamicQuery actionableDynamicQuery =
309 DLFileVersionLocalServiceUtil.getActionableDynamicQuery();
310
311 actionableDynamicQuery.setPerformActionMethod(
312 new ActionableDynamicQuery.PerformActionMethod() {
313
314 @Override
315 public void performAction(Object object) {
316 DLFileVersion dlFileVersion = (DLFileVersion)object;
317
318 InputStream inputStream = null;
319
320 try {
321 inputStream =
322 DLFileEntryLocalServiceUtil.getFileAsStream(
323 dlFileVersion.getFileEntryId(),
324 dlFileVersion.getVersion(), false);
325 }
326 catch (Exception e) {
327 if (_log.isWarnEnabled()) {
328 DLFileEntry dlFileEntry =
329 DLFileEntryLocalServiceUtil.fetchDLFileEntry(
330 dlFileVersion.getFileEntryId());
331
332 if (dlFileEntry == null) {
333 _log.warn(
334 "Unable to find file entry associated " +
335 "with file version " +
336 dlFileVersion.getFileVersionId(),
337 e);
338 }
339 else {
340 StringBundler sb = new StringBundler(4);
341
342 sb.append("Unable to find file version ");
343 sb.append(dlFileVersion.getVersion());
344 sb.append(" for file entry ");
345 sb.append(dlFileEntry.getName());
346
347 _log.warn(sb.toString(), e);
348 }
349 }
350
351 return;
352 }
353
354 String title = DLUtil.getTitleWithExtension(
355 dlFileVersion.getTitle(), dlFileVersion.getExtension());
356
357 String mimeType = getMimeType(inputStream, title);
358
359 if (mimeType.equals(originalMimeType)) {
360 return;
361 }
362
363 dlFileVersion.setMimeType(mimeType);
364
365 DLFileVersionLocalServiceUtil.updateDLFileVersion(
366 dlFileVersion);
367 }
368
369 });
370
371 actionableDynamicQuery.performActions();
372 }
373
374 protected void checkMimeTypes() throws Exception {
375 String[] mimeTypes = {
376 ContentTypes.APPLICATION_OCTET_STREAM,
377 DLWebDAVStorageImpl.MS_OFFICE_2010_TEXT_XML_UTF8
378 };
379
380 for (String mimeType : mimeTypes) {
381 checkFileEntryMimeTypes(mimeType);
382 checkFileVersionMimeTypes(mimeType);
383 }
384
385 if (_log.isDebugEnabled()) {
386 _log.debug("Fixed file entries with invalid mime types");
387 }
388 }
389
390 protected void checkMisversionedDLFileEntries() throws Exception {
391 List<DLFileEntry> dlFileEntries =
392 DLFileEntryLocalServiceUtil.getMisversionedFileEntries();
393
394 if (_log.isDebugEnabled()) {
395 _log.debug(
396 "Processing " + dlFileEntries.size() +
397 " misversioned file entries");
398 }
399
400 for (DLFileEntry dlFileEntry : dlFileEntries) {
401 copyDLFileEntry(dlFileEntry);
402
403 addDLFileVersion(dlFileEntry);
404 }
405
406 if (_log.isDebugEnabled()) {
407 _log.debug("Fixed misversioned file entries");
408 }
409 }
410
411 protected void checkTitles() throws Exception {
412 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
413 DLFileEntry.class);
414
415 dynamicQuery.add(RestrictionsFactoryUtil.like("title", "%\\\\%"));
416
417 List<DLFileEntry> dlFileEntries =
418 DLFileEntryLocalServiceUtil.dynamicQuery(dynamicQuery);
419
420 for (DLFileEntry dlFileEntry : dlFileEntries) {
421 TrashEntry trashEntry = TrashEntryLocalServiceUtil.fetchEntry(
422 dlFileEntry.getModelClassName(), dlFileEntry.getFileEntryId());
423
424 if (trashEntry != null) {
425 continue;
426 }
427
428 String title = dlFileEntry.getTitle();
429
430 String newTitle = title.replace(
431 StringPool.BACK_SLASH, StringPool.UNDERLINE);
432
433 renameTitle(dlFileEntry, newTitle);
434 }
435
436 checkDuplicateTitles();
437 }
438
439 protected void copyDLFileEntry(DLFileEntry dlFileEntry)
440 throws PortalException {
441
442 long companyId = dlFileEntry.getCompanyId();
443 long dataRepositoryId = dlFileEntry.getDataRepositoryId();
444 String name = dlFileEntry.getName();
445 String version = dlFileEntry.getVersion();
446
447 if (DLStoreUtil.hasFile(companyId, dataRepositoryId, name, version)) {
448 return;
449 }
450
451 FileVersionVersionComparator comparator =
452 new FileVersionVersionComparator();
453
454 List<DLFileVersion> dlFileVersions = dlFileEntry.getFileVersions(
455 WorkflowConstants.STATUS_APPROVED);
456
457 if (dlFileVersions.isEmpty()) {
458 dlFileVersions = dlFileEntry.getFileVersions(
459 WorkflowConstants.STATUS_ANY);
460 }
461
462 if (dlFileVersions.isEmpty()) {
463 DLStoreUtil.addFile(companyId, dataRepositoryId, name, new byte[0]);
464
465 return;
466 }
467
468 dlFileVersions = ListUtil.copy(dlFileVersions);
469
470 Collections.sort(dlFileVersions, comparator);
471
472 DLFileVersion dlFileVersion = dlFileVersions.get(0);
473
474 DLStoreUtil.copyFileVersion(
475 companyId, dataRepositoryId, name, dlFileVersion.getVersion(),
476 version);
477 }
478
479 protected void deleteOrphanedDLFileEntries() throws Exception {
480 List<DLFileEntry> dlFileEntries =
481 DLFileEntryLocalServiceUtil.getOrphanedFileEntries();
482
483 if (_log.isDebugEnabled()) {
484 _log.debug(
485 "Processing " + dlFileEntries.size() +
486 " file entries with no group");
487 }
488
489 for (DLFileEntry dlFileEntry : dlFileEntries) {
490 try {
491 DLFileEntryLocalServiceUtil.deleteFileEntry(
492 dlFileEntry.getFileEntryId());
493 }
494 catch (Exception e) {
495 if (_log.isWarnEnabled()) {
496 _log.warn(
497 "Unable to remove file entry " +
498 dlFileEntry.getFileEntryId() + ": " +
499 e.getMessage());
500 }
501 }
502 }
503
504 if (_log.isDebugEnabled()) {
505 _log.debug("Removed orphaned file entries");
506 }
507 }
508
509 protected void deleteUnusedDLFileEntryMetadata(
510 DLFileEntryMetadata dlFileEntryMetadata)
511 throws Exception {
512
513 DLFileEntryMetadataLocalServiceUtil.deleteDLFileEntryMetadata(
514 dlFileEntryMetadata);
515
516 StorageEngineUtil.deleteByClass(dlFileEntryMetadata.getDDMStorageId());
517
518 DDMStructureLinkLocalServiceUtil.deleteClassStructureLink(
519 dlFileEntryMetadata.getFileEntryMetadataId());
520 }
521
522 @Override
523 protected void doVerify() throws Exception {
524 checkMisversionedDLFileEntries();
525
526 checkDLFileEntryType();
527 checkDLFileEntryMetadata();
528 checkMimeTypes();
529 checkTitles();
530 deleteOrphanedDLFileEntries();
531 updateClassNameId();
532 updateFileEntryAssets();
533 updateFolderAssets();
534 verifyTree();
535 }
536
537 protected String getMimeType(InputStream inputStream, String title) {
538 String mimeType = null;
539
540 try {
541 mimeType = MimeTypesUtil.getContentType(inputStream, title);
542 }
543 finally {
544 StreamUtil.cleanUp(inputStream);
545 }
546
547 return mimeType;
548 }
549
550 protected void renameDuplicateTitle(DLFileEntry dlFileEntry)
551 throws PortalException {
552
553 String title = dlFileEntry.getTitle();
554 String titleExtension = StringPool.BLANK;
555 String titleWithoutExtension = dlFileEntry.getTitle();
556
557 if (title.endsWith(
558 StringPool.PERIOD.concat(dlFileEntry.getExtension()))) {
559
560 titleExtension = dlFileEntry.getExtension();
561 titleWithoutExtension = FileUtil.stripExtension(title);
562 }
563
564 for (int i = 1;;) {
565 String uniqueTitle =
566 titleWithoutExtension + StringPool.UNDERLINE +
567 String.valueOf(i);
568
569 if (Validator.isNotNull(titleExtension)) {
570 uniqueTitle = uniqueTitle.concat(
571 StringPool.PERIOD.concat(titleExtension));
572 }
573
574 String uniqueFileName = DLUtil.getSanitizedFileName(
575 uniqueTitle, dlFileEntry.getExtension());
576
577 try {
578 DLFileEntryLocalServiceUtil.validateFile(
579 dlFileEntry.getGroupId(), dlFileEntry.getFolderId(),
580 dlFileEntry.getFileEntryId(), uniqueFileName, uniqueTitle);
581
582 renameTitle(dlFileEntry, uniqueTitle);
583
584 return;
585 }
586 catch (PortalException pe) {
587 if (!(pe instanceof DuplicateFolderNameException) &&
588 !(pe instanceof DuplicateFileException)) {
589
590 throw pe;
591 }
592
593 i++;
594 }
595 }
596 }
597
598 protected void renameTitle(DLFileEntry dlFileEntry, String newTitle)
599 throws PortalException {
600
601 String title = dlFileEntry.getTitle();
602
603 dlFileEntry.setTitle(newTitle);
604
605 String fileName = DLUtil.getSanitizedFileName(
606 newTitle, dlFileEntry.getExtension());
607
608 dlFileEntry.setFileName(fileName);
609
610 DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry);
611
612 DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
613
614 dlFileVersion.setTitle(newTitle);
615 dlFileVersion.setFileName(fileName);
616
617 DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion);
618
619 if (_log.isDebugEnabled()) {
620 _log.debug(
621 "Invalid title " + title + " renamed to " + newTitle +
622 " for file entry " + dlFileEntry.getFileEntryId());
623 }
624 }
625
626 protected void updateClassNameId() {
627 try {
628 runSQL(
629 "update DLFileEntry set classNameId = 0 where classNameId is " +
630 "null");
631 }
632 catch (Exception e) {
633 if (_log.isWarnEnabled()) {
634 _log.warn(
635 "Unable to fix file entries where class name ID is null",
636 e);
637 }
638 }
639 }
640
641 protected void updateFileEntryAssets() throws Exception {
642 List<DLFileEntry> dlFileEntries =
643 DLFileEntryLocalServiceUtil.getNoAssetFileEntries();
644
645 if (_log.isDebugEnabled()) {
646 _log.debug(
647 "Processing " + dlFileEntries.size() +
648 " file entries with no asset");
649 }
650
651 for (DLFileEntry dlFileEntry : dlFileEntries) {
652 FileEntry fileEntry = new LiferayFileEntry(dlFileEntry);
653 FileVersion fileVersion = new LiferayFileVersion(
654 dlFileEntry.getFileVersion());
655
656 try {
657 DLAppHelperLocalServiceUtil.updateAsset(
658 dlFileEntry.getUserId(), fileEntry, fileVersion, null, null,
659 null);
660 }
661 catch (Exception e) {
662 if (_log.isWarnEnabled()) {
663 _log.warn(
664 "Unable to update asset for file entry " +
665 dlFileEntry.getFileEntryId() + ": " +
666 e.getMessage());
667 }
668 }
669 }
670
671 if (_log.isDebugEnabled()) {
672 _log.debug("Assets verified for file entries");
673 }
674 }
675
676 protected void updateFolderAssets() throws Exception {
677 List<DLFolder> dlFolders = DLFolderLocalServiceUtil.getNoAssetFolders();
678
679 if (_log.isDebugEnabled()) {
680 _log.debug(
681 "Processing " + dlFolders.size() + " folders with no asset");
682 }
683
684 for (DLFolder dlFolder : dlFolders) {
685 Folder folder = new LiferayFolder(dlFolder);
686
687 try {
688 DLAppHelperLocalServiceUtil.updateAsset(
689 dlFolder.getUserId(), folder, null, null, null);
690 }
691 catch (Exception e) {
692 if (_log.isWarnEnabled()) {
693 _log.warn(
694 "Unable to update asset for folder " +
695 dlFolder.getFolderId() + ": " + e.getMessage());
696 }
697 }
698 }
699
700 if (_log.isDebugEnabled()) {
701 _log.debug("Assets verified for folders");
702 }
703 }
704
705 protected void verifyTree() throws Exception {
706 long[] companyIds = PortalInstances.getCompanyIdsBySQL();
707
708 for (long companyId : companyIds) {
709 DLFolderLocalServiceUtil.rebuildTree(companyId);
710 }
711 }
712
713 private static Log _log = LogFactoryUtil.getLog(
714 VerifyDocumentLibrary.class);
715
716 }