From 7bbd82cbf6b65613c3c73eedf5012f3fa783ddf3 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 12 Dec 2012 16:32:16 +0100 Subject: [PATCH] OO-464: check if the file has a high probability to be a versions file, catch the error if it's not case --- .../util/vfs/version/VersionsFileManager.java | 61 ++++++++++++++----- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java index d51544451c9..d7c8cfe9ab7 100644 --- a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java +++ b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java @@ -28,9 +28,12 @@ import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Scanner; import java.util.Set; import java.util.UUID; +import java.util.regex.Pattern; +import org.apache.commons.io.IOUtils; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.modules.bc.meta.MetaInfo; import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; @@ -74,6 +77,7 @@ public class VersionsFileManager extends VersionsManager implements Initializabl private static final OLog log = Tracing.createLoggerFor(VersionsFileManager.class); private static final Versions NOT_VERSIONED = new NotVersioned(); + private static final Pattern TAG_PATTERN = Pattern.compile("\\s*[<>]\\s*"); private static XStream mystream; @@ -118,11 +122,14 @@ public class VersionsFileManager extends VersionsManager implements Initializabl List<VFSItem> versionItems = versionContainer.getItems(new VFSItemSuffixFilter(new String[] { "xml" })); for (VFSItem versionItem : versionItems) { - if (versionItem instanceof VFSLeaf && !currentNames.contains(versionItem.getName())) { + String name = versionItem.getName(); + if (versionItem instanceof VFSLeaf && !currentNames.contains(name) && isVersionsXmlFile((VFSLeaf)versionItem)) { Versions versions = readVersions(null, (VFSLeaf) versionItem); - List<VFSRevision> revisions = versions.getRevisions(); - if (!revisions.isEmpty()) { - deletedRevisions.add(versions); + if(versions != null) { + List<VFSRevision> revisions = versions.getRevisions(); + if (!revisions.isEmpty()) { + deletedRevisions.add(versions); + } } } } @@ -141,23 +148,47 @@ public class VersionsFileManager extends VersionsManager implements Initializabl } return readVersions(leaf, fVersions); } + + private boolean isVersionsXmlFile(VFSLeaf fVersions) { + InputStream in = fVersions.getInputStream(); + Scanner scanner = new Scanner(in); + scanner.useDelimiter(TAG_PATTERN); + + boolean foundVersionsTag = false; + while (scanner.hasNext()) { + String tag = scanner.next(); + if("versions".equals(tag)) { + foundVersionsTag = true; + break; + } + } + + scanner.close(); + IOUtils.closeQuietly(in); + return foundVersionsTag; + } private Versions readVersions(VFSLeaf leaf, VFSLeaf fVersions) { if (fVersions == null) { return new NotVersioned(); } - VFSContainer fVersionContainer = fVersions.getParentContainer(); - VersionsFileImpl versions = (VersionsFileImpl) XStreamHelper.readObject(mystream, fVersions); - versions.setVersionFile(fVersions); - versions.setCurrentVersion((Versionable) leaf); - if (versions.getRevisionNr() == null || versions.getRevisionNr().length() == 0) { - versions.setRevisionNr(getNextRevisionNr(versions)); - } + try { + VFSContainer fVersionContainer = fVersions.getParentContainer(); + VersionsFileImpl versions = (VersionsFileImpl) XStreamHelper.readObject(mystream, fVersions); + versions.setVersionFile(fVersions); + versions.setCurrentVersion((Versionable) leaf); + if (versions.getRevisionNr() == null || versions.getRevisionNr().length() == 0) { + versions.setRevisionNr(getNextRevisionNr(versions)); + } - for (VFSRevision revision : versions.getRevisions()) { - RevisionFileImpl revisionImpl = (RevisionFileImpl) revision; - revisionImpl.setContainer(fVersionContainer); + for (VFSRevision revision : versions.getRevisions()) { + RevisionFileImpl revisionImpl = (RevisionFileImpl) revision; + revisionImpl.setContainer(fVersionContainer); + } + return versions; + } catch (Exception e) { + log.warn("This file is not a versions XML file: " + fVersions, e); + return null; } - return versions; } @Override -- GitLab