private Versions readVersions(VFSLeaf leaf, VFSLeaf fVersions) { if (fVersions == null) { return new NotVersioned(); } 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); } return versions; } catch (Exception e) { log.warn("This file is not a versions XML file: " + fVersions, e); fVersions.delete(); VersionsFileImpl versions = new VersionsFileImpl(); versions.setCurrentVersion((Versionable) leaf); versions.setVersioned(isVersioned(leaf)); versions.setRevisionNr(getNextRevisionNr(versions)); log.warn("Deleted corrupt version XML file and created new version XML file: " + versions); // the old revisions can not be restored automatically. They are still on disk, you could // recover them // manually. This is not a perfect solution, but at least the user does not get an RS return versions; } }
/** * Get the canonical path to the file's meta file. * * @param bcPath * @return String */ private VFSLeaf getCanonicalVersionXmlFile(VFSItem item, boolean create) { File f = getOriginFile(item); if (!f.exists()) { return null; } String relPath = getRelPath(item); if (relPath == null) { // cannot handle return null; } File fVersion = new File(getRootVersionsFile(), relPath + ".xml"); File fParentVersion = fVersion.getParentFile(); if (!fParentVersion.exists() && create) { fParentVersion.mkdirs(); } if (fVersion.exists()) { LocalFolderImpl localVersionContainer = new LocalFolderImpl(fParentVersion); return (VFSLeaf) localVersionContainer.resolve(fVersion.getName()); } else if (create) { LocalFolderImpl localVersionContainer = new LocalFolderImpl(fParentVersion); VersionsFileImpl versions = new VersionsFileImpl(); versions.setVersioned(isVersioned(item)); versions.setRevisionNr(getNextRevisionNr(versions)); VFSLeaf fVersions = localVersionContainer.createChildLeaf(fVersion.getName()); XStreamHelper.writeObject(mystream, fVersions, versions); return fVersions; } return null; }
private Versions readVersions(VFSLeaf leaf, boolean create) { VFSLeaf fVersions = getCanonicalVersionXmlFile(leaf, create); if (!create && fVersions == null) { VersionsFileImpl versions = new VersionsFileImpl(); versions.setCurrentVersion((Versionable) leaf); versions.setVersioned(isVersioned(leaf)); versions.setRevisionNr(getNextRevisionNr(versions)); return versions; } return readVersions(leaf, fVersions); }