diff --git a/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java b/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java index 1af26259f65c9ff67befbf1bb20e2fda07fa6426..47121b2487c46b2a7e5a51edb758c1801562caf6 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java +++ b/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java @@ -60,7 +60,8 @@ public class FolderModule extends AbstractOLATModule { @Override protected void initDefaultProperties() { // Set folder root - String homesRoot = getStringConfigParameter(CONFIG_ROOT, System.getProperty("java.io.tmpdir")+"/olatdata/bcroot", false); + File defaultHome = new File(System.getProperty("java.io.tmpdir"), "olatdata/bcroot"); + String homesRoot = getStringConfigParameter(CONFIG_ROOT, defaultHome.getAbsolutePath() , false); if (Settings.isJUnitTest()) { // use dummy directory for junit testcases to not conflict with actual data // on current server. someone may start junit test and not realize that this diff --git a/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java b/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java index c70ff246e0b76a914896d8ac24c68bd54fb0c4b4..aac79bf36e673bfdad9c166ff8e5fc990cda81c4 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java +++ b/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java @@ -29,8 +29,6 @@ import java.util.Locale; import org.olat.core.commons.modules.bc.commands.FolderCommand; import org.olat.core.commons.modules.bc.commands.FolderCommandStatus; -import org.olat.core.commons.modules.bc.meta.MetaInfo; -import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.table.BaseTableDataModelWithoutFilter; @@ -90,6 +88,19 @@ public class RevisionListController extends BasicController { public RevisionListController(UserRequest ureq, WindowControl wControl, Versionable versionedFile, String title, String description) { super(ureq, wControl); + + //reload the file with all possible precautions + VFSLeaf versionedLeaf = null; + if(versionedFile instanceof VFSLeaf) { + versionedLeaf = (VFSLeaf)versionedFile; + } + if(versionedLeaf != null && versionedLeaf.getParentContainer() != null) { + //reload the file + versionedLeaf = (VFSLeaf)versionedLeaf.getParentContainer().resolve(((VFSLeaf) versionedFile).getName()); + if(versionedLeaf instanceof Versionable) { + versionedFile = (Versionable)versionedLeaf; + } + } this.versionedFile = versionedFile; TableGuiConfiguration summaryTableConfig = new TableGuiConfiguration(); @@ -127,8 +138,9 @@ public class RevisionListController extends BasicController { revisionListTableCtr.addMultiSelectAction("cancel", CMD_CANCEL); revisionListTableCtr.setMultiSelect(true); - List<VFSRevision> revisions = new ArrayList<VFSRevision>(versionedFile.getVersions().getRevisions()); - revisions.add(new CurrentRevision((VFSLeaf)versionedFile)); + Versions versions = versionedFile.getVersions(); + List<VFSRevision> revisions = new ArrayList<VFSRevision>(versions.getRevisions()); + revisions.add(new CurrentRevision(versionedLeaf, versions)); revisionListTableCtr.setTableDataModel(new RevisionListDataModel(revisions, ureq.getLocale())); listenTo(revisionListTableCtr); @@ -284,21 +296,18 @@ public class RevisionListController extends BasicController { public class CurrentRevision implements VFSRevision { private final VFSLeaf versionFile; + private final Versions versions; - public CurrentRevision(VFSLeaf versionFile) { + public CurrentRevision(VFSLeaf versionFile, Versions versions) { this.versionFile = versionFile; + this.versions = versions; } public String getAuthor() { - if(versionFile instanceof MetaTagged) { - MetaInfo info = ((MetaTagged)versionFile).getMetaInfo(); - return info.getAuthor(); - } - return "-"; + return versions.getAuthor(); } public String getComment() { - Versions versions = ((Versionable)versionFile).getVersions(); String comment = versions.getComment(); if (StringHelper.containsNonWhitespace(comment)) { return comment; @@ -321,7 +330,7 @@ public class RevisionListController extends BasicController { } public String getRevisionNr() { - return ((Versionable)versionFile).getVersions().getRevisionNr(); + return versions.getRevisionNr(); } public long getSize() { diff --git a/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java b/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java index 27706edf82f6a89be3163cf9021cd2fb958da4b5..dee434b379fcd29127d4b303bb8212a651fbe6fd 100644 --- a/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java +++ b/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java @@ -46,6 +46,11 @@ public class NotVersioned implements Versions { return Collections.emptyList(); } + @Override + public String getAuthor() { + return ""; + } + public String getCreator() { return ""; } diff --git a/src/main/java/org/olat/core/util/vfs/version/Versions.java b/src/main/java/org/olat/core/util/vfs/version/Versions.java index 5ae37235f0fc9905416a5ea5d2074ceea9bbe153..864215c993a3bcdb4d667b31834f0c0d8bd17ed1 100644 --- a/src/main/java/org/olat/core/util/vfs/version/Versions.java +++ b/src/main/java/org/olat/core/util/vfs/version/Versions.java @@ -45,6 +45,11 @@ public interface Versions { * @return the current version number */ public String getRevisionNr(); + + /** + * @return the current author of the file + */ + public String getAuthor(); /** * @return creator of the file diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java b/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java index cd5da89cc05d5eee763cb7946d75e24460911614..a1c478a4c9d40d043303c86ee6fc931a7ab350f9 100644 --- a/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java +++ b/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java @@ -113,6 +113,7 @@ public class VersionsFileImpl implements Versions { this.versioned = versioned; } + @Override public String getAuthor() { return author; } 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 ca20ea78642e4e6cf5ab623143198dc0ec3cacf1..a6f25b3410a28a89a1c375cd1edc9f8c428814a3 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 @@ -75,6 +75,7 @@ public class VersionsFileManager extends VersionsManager implements Initializabl private static XStream mystream; + private File rootFolder; private File rootVersionFolder; private VFSContainer rootVersionsContainer; @@ -547,7 +548,10 @@ public class VersionsFileManager extends VersionsManager implements Initializabl } public String getCanonicalRoot() { - return FolderConfig.getCanonicalRoot(); + if(rootFolder == null) { + rootFolder = new File(FolderConfig.getCanonicalRoot()); + } + return rootFolder.getAbsolutePath(); } public File getRootVersionsFile() { diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties index 502bfcd4986617bf87a53e6f7a94dcc01d60b49a..a00b7df4395cd389ef9aab8e74f9c9092904a1f7 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties @@ -233,7 +233,7 @@ details.entryinfoheader=Information on this entry details.extlinkheader=External link to this learning resource details.groups=Manage owners details.groups.participant=Manage participants -details.groups.tutor=Manage owners +details.groups.tutor=Manage coaches details.header=Detailed view details.launch=Show content details.members=Members management diff --git a/src/test/java/org/olat/core/util/vfs/VersionManagerTest.java b/src/test/java/org/olat/core/util/vfs/VersionManagerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..803cd5f9fbef8d4e47e2db0fa28af11fb55335b1 --- /dev/null +++ b/src/test/java/org/olat/core/util/vfs/VersionManagerTest.java @@ -0,0 +1,179 @@ +package org.olat.core.util.vfs; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.UUID; + +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.olat.core.CoreSpringFactory; +import org.olat.core.commons.modules.bc.meta.MetaInfo; +import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; +import org.olat.core.id.Identity; +import org.olat.core.util.vfs.version.SimpleVersionConfig; +import org.olat.core.util.vfs.version.VFSRevision; +import org.olat.core.util.vfs.version.Versionable; +import org.olat.core.util.vfs.version.Versions; +import org.olat.core.util.vfs.version.VersionsFileManager; +import org.olat.test.JunitTestHelper; +import org.olat.test.OlatTestCase; + +/** + * + * Description:<br> + * + * <P> + * Initial Date: 23 déc. 2011 <br> + * + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + */ +public class VersionManagerTest extends OlatTestCase { + + private static boolean setuped = false; + + private static Identity id1, id2; + + @Before + public void setUp() throws Exception { + if(setuped) return; + + //create identities + id1 = JunitTestHelper.createAndPersistIdentityAsUser("vm-one" + getRandomName()); + id2 = JunitTestHelper.createAndPersistIdentityAsUser("vm-two" + getRandomName()); + + SimpleVersionConfig versionConfig = (SimpleVersionConfig)CoreSpringFactory.getBean("versioningConfigurator"); + versionConfig.setMaxNumberOfVersionsProperty(new Long(10)); + + setuped = true; + } + + @Test + public void testVersionManager() throws IOException { + //create a file + OlatRootFolderImpl rootTest = new OlatRootFolderImpl("/test", null); + String filename = getRandomName(); + VFSLeaf file = rootTest.createChildLeaf(filename); + OutputStream out = file.getOutputStream(false); + InputStream in = VersionManagerTest.class.getResourceAsStream("test.txt"); + int byteCopied = IOUtils.copy(in, out); + IOUtils.closeQuietly(in); + assertFalse(byteCopied == 0); + assertTrue(file instanceof Versionable); + + //save a first version + Versionable versionedFile1 = (Versionable)file; + InputStream in1 = new ByteArrayInputStream("Hello version 1".getBytes()); + versionedFile1.getVersions().addVersion(id2, "Version 1", in1); + IOUtils.closeQuietly(in1); + + //save a second version + Versionable versionedFile2 = (Versionable)file; + InputStream in2 = new ByteArrayInputStream("Hello version 2".getBytes()); + versionedFile2.getVersions().addVersion(id2, "Version 2", in2); + IOUtils.closeQuietly(in2); + + //save a third version + Versionable versionedFile3 = (Versionable)file; + InputStream in3 = new ByteArrayInputStream("Hello version 3".getBytes()); + versionedFile3.getVersions().addVersion(id2, "Version 3", in3); + IOUtils.closeQuietly(in3); + + //make the checks + VFSItem retrievedFile = rootTest.resolve(filename); + assertTrue(retrievedFile instanceof Versionable); + Versions versions = VersionsFileManager.getInstance().createVersionsFor((VFSLeaf)retrievedFile); + List<VFSRevision> revisions = versions.getRevisions(); + assertNotNull(revisions); + assertEquals(3, revisions.size()); + + VFSRevision revision0 = revisions.get(0); + //we don't set an author for the original file + assertEquals("-", revision0.getAuthor()); + VFSRevision revision1 = revisions.get(1); + assertEquals(id2.getName(), revision1.getAuthor()); + VFSRevision revision2 = revisions.get(2); + assertEquals(id2.getName(), revision2.getAuthor()); + + //check the comments + assertNull(revision0.getComment()); + assertEquals("Version 1", revision1.getComment()); + assertEquals("Version 2", revision2.getComment()); + assertEquals("Version 3", versions.getComment()); + } + + @Test + public void testAuthorsAndCreators() throws IOException { + //create a file + OlatRootFolderImpl rootTest = new OlatRootFolderImpl("/test2", null); + String filename = getRandomName(); + VFSLeaf file = rootTest.createChildLeaf(filename); + OutputStream out = file.getOutputStream(false); + InputStream in = VersionManagerTest.class.getResourceAsStream("test.txt"); + int byteCopied = IOUtils.copy(in, out); + IOUtils.closeQuietly(in); + assertFalse(byteCopied == 0); + assertTrue(file instanceof Versionable); + assertTrue(file instanceof MetaTagged); + + //set the author + MetaTagged metaTagged = (MetaTagged)file; + MetaInfo metaInfo = metaTagged.getMetaInfo(); + metaInfo.setAuthor(id1.getName()); + metaInfo.setCreator(id1.getName()); + metaInfo.write(); + + //save a first version -> id2 + Versionable versionedFile1 = (Versionable)file; + InputStream in1 = new ByteArrayInputStream("Hello version 1".getBytes()); + versionedFile1.getVersions().addVersion(id2, "Version 1", in1); + IOUtils.closeQuietly(in1); + + //save a second version -> id1 + Versionable versionedFile2 = (Versionable)file; + InputStream in2 = new ByteArrayInputStream("Hello version 2".getBytes()); + versionedFile2.getVersions().addVersion(id1, "Version 2", in2); + IOUtils.closeQuietly(in2); + + //save a third version -> id2 + Versionable versionedFile3 = (Versionable)file; + InputStream in3 = new ByteArrayInputStream("Hello version 3".getBytes()); + versionedFile3.getVersions().addVersion(id2, "Version 3", in3); + IOUtils.closeQuietly(in3); + + + //make the checks + VFSItem retrievedFile = rootTest.resolve(filename); + assertTrue(retrievedFile instanceof Versionable); + Versions versions = VersionsFileManager.getInstance().createVersionsFor((VFSLeaf)retrievedFile); + List<VFSRevision> revisions = versions.getRevisions(); + assertNotNull(revisions); + assertEquals(3, revisions.size()); + assertTrue(retrievedFile instanceof MetaTagged); + + + VFSRevision revision0 = revisions.get(0); + //we don't set an author for the original file + assertEquals(id1.getName(), revision0.getAuthor()); + VFSRevision revision1 = revisions.get(1); + assertEquals(id2.getName(), revision1.getAuthor()); + VFSRevision revision2 = revisions.get(2); + assertEquals(id1.getName(), revision2.getAuthor()); + //current + assertEquals(id2.getName(), versions.getAuthor()); + } + + private String getRandomName() { + return UUID.randomUUID().toString().replace("-", ""); + } +} \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/vfs/test.txt b/src/test/java/org/olat/core/util/vfs/test.txt new file mode 100644 index 0000000000000000000000000000000000000000..5ab2f8a4323abafb10abb68657d9d39f1a775057 --- /dev/null +++ b/src/test/java/org/olat/core/util/vfs/test.txt @@ -0,0 +1 @@ +Hello \ No newline at end of file diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index f635ae0247b5015ac8b1952f2b02e8edc53785c8..1ac5448a34fc3820abe90d7d17d3147733a78676 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -131,6 +131,7 @@ import org.junit.runners.Suite; org.olat.resource.accesscontrol.ACOfferManagerTest.class, org.olat.resource.accesscontrol.ACOrderManagerTest.class, org.olat.resource.accesscontrol.ACTransactionManagerTest.class, + org.olat.core.util.vfs.VersionManagerTest.class, /** * * Place tests which load their own Spring context