001    /**
002     * Copyright (c) 2000-present 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.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    /**
075     * @author Raymond Aug??
076     * @author Douglas Wong
077     * @author Alexander Chow
078     */
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    }