diff --git a/source/java/hibernate.cfg.xml b/source/java/hibernate.cfg.xml index c2047ebd79..c80394e933 100644 --- a/source/java/hibernate.cfg.xml +++ b/source/java/hibernate.cfg.xml @@ -19,18 +19,20 @@ false false 2 + + 4 32 60 0 60 16 - false - 0 + true + 15 true true diff --git a/source/java/org/alfresco/repo/avm/AVMNodeUnwrapper.java b/source/java/org/alfresco/repo/avm/AVMNodeUnwrapper.java new file mode 100644 index 0000000000..1d68a18149 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/AVMNodeUnwrapper.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2006 Alfresco, Inc. + * + * Licensed under the Mozilla Public License version 1.1 + * with a permitted attribution clause. You may obtain a + * copy of the License at + * + * http://www.alfresco.org/legal/license.txt + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + */ + +package org.alfresco.repo.avm; + +import org.hibernate.proxy.HibernateProxy; + +/** + * Utility for unwrapping (getting the actual instance of) an AVMNode from what + * may be a HibernateProxy. Bitter Hibernate note: Hibernate proxies for polymorphic + * types are fundamentally broken. The Hibernate schmucks claim its a CGLIB problem. + * The CGLIB villains dither unintelligibly. + * @author britt + */ +class AVMNodeUnwrapper +{ + public static AVMNode Unwrap(AVMNode node) + { + if (node instanceof HibernateProxy) + { + return (AVMNode)((HibernateProxy)node).getHibernateLazyInitializer().getImplementation(); + } + return node; + } +} diff --git a/source/java/org/alfresco/repo/avm/AVMService.java b/source/java/org/alfresco/repo/avm/AVMService.java index 3610ae9461..1b1d2cba99 100644 --- a/source/java/org/alfresco/repo/avm/AVMService.java +++ b/source/java/org/alfresco/repo/avm/AVMService.java @@ -20,9 +20,9 @@ package org.alfresco.repo.avm; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; +import java.util.Date; import java.util.List; import java.util.Map; -import java.util.Set; /** * This is the service interface for the [Alfresco|Addled|Advanced|Apotheosed] Versioning @@ -175,11 +175,21 @@ public interface AVMService public void createSnapshot(String repository); /** - * Get the set of version IDs in a Repository + * Get the set of versions in a Repository * @param name The name of the Repository. * @return A Set of version IDs */ - public Set getRepositoryVersions(String name); + public List getRepositoryVersions(String name); + + /** + * Get Repository version IDs by creation date. Either from or + * to can be null but not both. + * @param name The name of the repository. + * @param from Earliest date of version to include. + * @param to Latest date of version to include. + * @return The Set of version IDs that match. + */ + public List getRepositoryVersions(String name, Date from, Date to); /** * Get the names of all repositories. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index c74cda73d7..2fa4e65d2a 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -21,9 +21,9 @@ import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; +import java.util.Date; import java.util.List; import java.util.Map; -import java.util.Set; import org.alfresco.repo.avm.SuperRepository; import org.alfresco.repo.avm.hibernate.HibernateHelper; @@ -645,7 +645,7 @@ public class AVMServiceImpl implements AVMService /* (non-Javadoc) * @see org.alfresco.repo.avm.AVMService#getRepositoryVersions(java.lang.String) */ - public Set getRepositoryVersions(final String name) + public List getRepositoryVersions(final String name) { if (name == null) { @@ -653,7 +653,7 @@ public class AVMServiceImpl implements AVMService } class HTxnCallback implements HibernateTxnCallback { - public Set versions; + public List versions; public void perform(Session session) { @@ -666,6 +666,35 @@ public class AVMServiceImpl implements AVMService return doit.versions; } + /** + * Get version IDs by creation date. From or to may be null but not + * both. + * @param name The name of the repository to search. + * @param from The earliest versions to return. + * @param to The latest versions to return. + * @return The Set of matching version IDs. + */ + public List getRepositoryVersions(final String name, final Date from, final Date to) + { + if (name == null || (from == null && to == null)) + { + throw new AVMBadArgumentException("Illegal null argument."); + } + class HTxnCallback implements HibernateTxnCallback + { + public List versions; + + public void perform(Session session) + { + fSuperRepository.setSession(session); + versions = fSuperRepository.getRepositoryVersions(name, from, to); + } + } + HTxnCallback doit = new HTxnCallback(); + fTransaction.perform(doit, false); + return doit.versions; + } + /** * Change what a layered directory points to. */ diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index f0172d2b0f..3bc2d162b8 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -22,10 +22,12 @@ import java.io.InputStreamReader; import java.io.PrintStream; import java.io.RandomAccessFile; import java.util.ArrayList; +import java.util.Date; import java.util.List; -import java.util.Set; import java.util.TreeMap; +import org.alfresco.repo.avm.util.BulkLoad; + /** * Big test of AVM behavior. * @author britt @@ -667,11 +669,11 @@ public class AVMServiceTest extends AVMServiceTestBase out.println("This is testfile2"); out.close(); fService.createSnapshot("main"); - Set versions = fService.getRepositoryVersions("main"); - for (Integer version : versions) + List versions = fService.getRepositoryVersions("main"); + for (VersionDescriptor version : versions) { - System.out.println("V:" + version); - System.out.println(recursiveList("main", version, true)); + System.out.println("V:" + version.getVersionID()); + System.out.println(recursiveList("main", version.getVersionID(), true)); } BufferedReader reader = new BufferedReader(new InputStreamReader(fService.getFileInputStream(-1, "main:/testdir/testfile"))); @@ -700,11 +702,11 @@ public class AVMServiceTest extends AVMServiceTestBase setupBasicTree(); fService.createBranch(-1, "main:/a", "main:/d/e", "abranch"); fService.createSnapshot("main"); - Set versions = fService.getRepositoryVersions("main"); - for (Integer version : versions) + List versions = fService.getRepositoryVersions("main"); + for (VersionDescriptor version : versions) { - System.out.println("V:" + version); - System.out.println(recursiveList("main", version, true)); + System.out.println("V:" + version.getVersionID()); + System.out.println(recursiveList("main", version.getVersionID(), true)); } String original = recursiveList("main:/a", -1, 0, true); original = original.substring(original.indexOf('\n')); @@ -1800,20 +1802,27 @@ public class AVMServiceTest extends AVMServiceTestBase } /** - * Test purging. + * Test version by date lookup. */ - public void testPurge() + public void testVersionByDate() { try { - setupBasicTree(); - fService.purgeRepository("main"); - OrphanReaper reaper = new OrphanReaper(); - reaper.doBatch(); - reaper.doBatch(); - reaper.doBatch(); - reaper.doBatch(); - reaper.doBatch(); + ArrayList times = new ArrayList(); + BulkLoad loader = new BulkLoad(fService); + loader.recursiveLoad("source/java/org/alfresco/repo", "main:/"); + times.add(System.currentTimeMillis()); + fService.createSnapshot("main"); + loader.recursiveLoad("source/java/org/alfresco/service", "main:/"); + times.add(System.currentTimeMillis()); + fService.createSnapshot("main"); + loader.recursiveLoad("source/java/org/alfresco/filesys", "main:/"); + times.add(System.currentTimeMillis()); + fService.createSnapshot("main"); + assertEquals(1, fService.getRepositoryVersions("main", null, new Date(times.get(0))).size()); + assertEquals(3, fService.getRepositoryVersions("main", new Date(times.get(0)), null).size()); + assertEquals(2, fService.getRepositoryVersions("main", new Date(times.get(1)), + new Date(System.currentTimeMillis())).size()); } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/avm/AVMStressTest.java b/source/java/org/alfresco/repo/avm/AVMStressTest.java index 0251dbfa96..c81dcb8c5f 100644 --- a/source/java/org/alfresco/repo/avm/AVMStressTest.java +++ b/source/java/org/alfresco/repo/avm/AVMStressTest.java @@ -39,7 +39,7 @@ public class AVMStressTest extends AVMServiceTestBase loader.recursiveLoad("source", "main:/"); List testers = new ArrayList(); List threads = new ArrayList(); - for (int i = 0; i < 1; i++) + for (int i = 0; i < 8; i++) { AVMTester tester = new AVMTester(400, // create file. @@ -51,7 +51,7 @@ public class AVMStressTest extends AVMServiceTestBase 20, // modify file. 3600, // read file 10, // snapshot - 80000, // # ops + 10000, // # ops fService, "" + i); tester.Refresh(); @@ -64,12 +64,12 @@ public class AVMStressTest extends AVMServiceTestBase thread.start(); } int exited = 0; - while (exited != 1) + while (exited != 8) { try { Thread.sleep(2000); - for (int i = 0; i < 1; i++) + for (int i = 0; i < 8; i++) { if (threads.get(i) == null) { diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java index f48501f3ec..53dc00a181 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java @@ -23,10 +23,8 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.Session; -import org.hibernate.proxy.HibernateProxy; /** * A layered directory node. A layered directory node points at @@ -441,13 +439,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec ChildEntry entry = getChild(name); if (entry != null) { - AVMNode child = entry.getChild(); - if (child instanceof HibernateProxy) - { - HibernateProxy proxy = (HibernateProxy)child; - return (AVMNode)proxy.getHibernateLazyInitializer().getImplementation(); - } - return child; + return AVMNodeUnwrapper.Unwrap(entry.getChild()); } // Not here so check our indirection. try diff --git a/source/java/org/alfresco/repo/avm/Lookup.java b/source/java/org/alfresco/repo/avm/Lookup.java index 428f3788b1..5e2a75ed69 100644 --- a/source/java/org/alfresco/repo/avm/Lookup.java +++ b/source/java/org/alfresco/repo/avm/Lookup.java @@ -20,9 +20,6 @@ package org.alfresco.repo.avm; import java.util.ArrayList; import java.util.List; -import org.hibernate.LockMode; -import org.hibernate.Session; - /** * This holds all the information necessary to perform operations * on AVMNodes, and is internall structured as a list of path components diff --git a/source/java/org/alfresco/repo/avm/OrphanReaper.java b/source/java/org/alfresco/repo/avm/OrphanReaper.java index 3cd8689bba..0a490afbbb 100644 --- a/source/java/org/alfresco/repo/avm/OrphanReaper.java +++ b/source/java/org/alfresco/repo/avm/OrphanReaper.java @@ -24,7 +24,6 @@ import org.alfresco.repo.avm.hibernate.HibernateTxn; import org.alfresco.repo.avm.hibernate.HibernateTxnCallback; import org.hibernate.Query; import org.hibernate.Session; -import org.hibernate.proxy.HibernateProxy; /** * This is the background thread for reaping no longer referenced nodes @@ -200,7 +199,7 @@ class OrphanReaper implements Runnable AVMNode ancestor = node.getAncestor(); AVMNode mergedFrom = node.getMergedFrom(); // Get all the nodes that have this node as ancestor. - query = session.createQuery("from AVMNodeImpl an where an.ancestor = :node"); + query = session.getNamedQuery("AVMNode.GetDescendents"); query.setEntity("node", node); List descendents = (List)query.list(); for (AVMNode desc : descendents) @@ -212,28 +211,24 @@ class OrphanReaper implements Runnable } } // Get all the nodes that have this node as mergedFrom - query = session.createQuery("from AVMNodeImpl an where an.mergedFrom = :merged"); + query = session.getNamedQuery("AVMNode.GetMergedTo"); query.setEntity("merged", node); List merged = (List)query.list(); for (AVMNode merge : merged) { merge.setMergedFrom(ancestor); } - // Work around Bitter Hibernate. - if (node instanceof HibernateProxy) - { - node = (AVMNode)((HibernateProxy)node).getHibernateLazyInitializer().getImplementation(); - } + node = AVMNodeUnwrapper.Unwrap(node); // Extra work for directories. if (node instanceof DirectoryNode) { // First get rid of all child entries for the node. - Query delete = session.createQuery("delete ChildEntryImpl ce where ce.parent = :parent"); + Query delete = session.getNamedQuery("ChildEntry.DeleteByParent"); delete.setEntity("parent", node); delete.executeUpdate(); // Now find all the nodes that point to this node as their // canonical parent and null that reference out. - query = session.createQuery("from AVMNodeImpl an where an.parent = :parent"); + query = session.getNamedQuery("AVMNode.GetByParent"); query.setEntity("parent", node); List children = (List)query.list(); for (AVMNode child : children) @@ -243,7 +238,7 @@ class OrphanReaper implements Runnable if (node instanceof LayeredDirectoryNode) { // More special work for layered directories. - delete = session.createQuery("delete DeletedChildImpl dc where dc.parent = :parent"); + delete = session.getNamedQuery("DeletedChild.DeleteByParent"); delete.setEntity("parent", node); delete.executeUpdate(); } diff --git a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java index ed4fcccb9c..d37a180b3b 100644 --- a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java @@ -22,9 +22,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.hibernate.LockMode; import org.hibernate.Session; -import org.hibernate.proxy.HibernateProxy; /** * A plain directory. No monkey tricks except for possiblyCopy. @@ -34,11 +32,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory { static final long serialVersionUID = 9423813734583003L; - /** - * Whether this is a root node. - */ - private boolean fIsRoot; - /** * Make up a new directory with nothing in it. * @param repo @@ -46,7 +39,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory public PlainDirectoryNodeImpl(Repository repo) { super(repo.getSuperRepository().issueID(), repo); - fIsRoot = false; repo.getSuperRepository().getSession().save(this); SuperRepository.GetInstance().getSession().flush(); } @@ -168,13 +160,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory { return null; } - AVMNode child = entry.getChild(); - if (child instanceof HibernateProxy) - { - HibernateProxy proxy = (HibernateProxy)child; - return (AVMNode)proxy.getHibernateLazyInitializer().getImplementation(); - } - return child; + return AVMNodeUnwrapper.Unwrap(entry.getChild()); } /** diff --git a/source/java/org/alfresco/repo/avm/PurgeTest.java b/source/java/org/alfresco/repo/avm/PurgeTest.java index 1ad70845c3..652445acf2 100644 --- a/source/java/org/alfresco/repo/avm/PurgeTest.java +++ b/source/java/org/alfresco/repo/avm/PurgeTest.java @@ -25,6 +25,84 @@ import org.alfresco.repo.avm.util.BulkLoad; */ public class PurgeTest extends AVMServiceTestBase { + /** + * Test purging a version. + */ + public void testPurgeVersion() + { + try + { + OrphanReaper reaper = new OrphanReaper(); + reaper.init(); + setupBasicTree(); + BulkLoad loader = new BulkLoad(fService); + long start = System.currentTimeMillis(); + loader.recursiveLoad("source", "main:/"); + System.err.println("Load time: " + (System.currentTimeMillis() - start) + "ms"); + fService.createSnapshot("main"); + System.err.println("Load time + snapshot: " + (System.currentTimeMillis() - start) + "ms"); + fService.purgeVersion(2, "main"); + reaper.activate(); + while (reaper.isActive()) + { + try + { + Thread.sleep(2000); + } + catch (InterruptedException e) + { + // Do nothing. + } + } + reaper.shutDown(); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } + + /** + * Test purging a version that's not the latest. + */ + public void testPurgeOlderVersion() + { + try + { + OrphanReaper reaper = new OrphanReaper(); + reaper.init(); + setupBasicTree(); + BulkLoad loader = new BulkLoad(fService); + long start = System.currentTimeMillis(); + loader.recursiveLoad("source", "main:/"); + System.err.println("Load time: " + (System.currentTimeMillis() - start) + "ms"); + fService.createSnapshot("main"); + System.err.println("Load time + snapshot: " + (System.currentTimeMillis() - start) + "ms"); + fService.removeNode("main:/source/java/org/alfresco", "repo"); + fService.createSnapshot("main"); + fService.purgeVersion(2, "main"); + reaper.activate(); + while (reaper.isActive()) + { + try + { + Thread.sleep(2000); + } + catch (InterruptedException e) + { + // Do nothing. + } + } + reaper.shutDown(); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } + /** * Test purging an entire repository. */ @@ -36,7 +114,14 @@ public class PurgeTest extends AVMServiceTestBase reaper.init(); setupBasicTree(); BulkLoad loader = new BulkLoad(fService); + long start = System.currentTimeMillis(); loader.recursiveLoad("source", "main:/"); + System.err.println("Load time: " + (System.currentTimeMillis() - start) + "ms"); + fService.createSnapshot("main"); + System.err.println("Load time + snapshot: " + (System.currentTimeMillis() - start) + "ms"); + fService.createLayeredDirectory("main:/source", "main:/", "layer"); + fService.removeNode("main:/layer/java/org/alfresco", "repo"); + fService.createFile("main:/layer/java/org/alfresco", "goofy").close(); fService.createSnapshot("main"); fService.purgeRepository("main"); reaper.activate(); @@ -59,39 +144,4 @@ public class PurgeTest extends AVMServiceTestBase fail(); } } - - /** - * Test purging an entire repository. - */ - public void testPurgeVersion() - { - try - { - OrphanReaper reaper = new OrphanReaper(); - reaper.init(); - setupBasicTree(); - BulkLoad loader = new BulkLoad(fService); - loader.recursiveLoad("source", "main:/"); - fService.createSnapshot("main"); - fService.purgeVersion(2, "main"); - reaper.activate(); - while (reaper.isActive()) - { - try - { - Thread.sleep(2000); - } - catch (InterruptedException e) - { - // Do nothing. - } - } - reaper.shutDown(); - } - catch (Exception e) - { - e.printStackTrace(System.err); - fail(); - } - } } diff --git a/source/java/org/alfresco/repo/avm/Repository.java b/source/java/org/alfresco/repo/avm/Repository.java index 23b4b0f681..6a15154bf9 100644 --- a/source/java/org/alfresco/repo/avm/Repository.java +++ b/source/java/org/alfresco/repo/avm/Repository.java @@ -19,8 +19,8 @@ package org.alfresco.repo.avm; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; +import java.util.Date; import java.util.List; -import java.util.Set; /** * The repository interface. Methods for filesystem like, versioning, @@ -131,10 +131,19 @@ interface Repository // provide methods for getting versions by date range, n most // recent etc. /** - * Get all the version ids for this repository. + * Get all the version for this repository. * @return A Set of all versions. */ - public Set getVersions(); + public List getVersions(); + + /** + * Get the versions from between the given dates. From or to + * may be null but not both. + * @param from The earliest date. + * @param to The latest date. + * @return The Set of matching version IDs. + */ + public List getVersions(Date from, Date to); /** * Get the super repository. diff --git a/source/java/org/alfresco/repo/avm/RepositoryImpl.java b/source/java/org/alfresco/repo/avm/RepositoryImpl.java index b498f44559..913f3ec088 100644 --- a/source/java/org/alfresco/repo/avm/RepositoryImpl.java +++ b/source/java/org/alfresco/repo/avm/RepositoryImpl.java @@ -22,14 +22,11 @@ import java.io.OutputStream; import java.io.RandomAccessFile; import java.io.Serializable; import java.util.ArrayList; -import java.util.Iterator; +import java.util.Date; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.TreeSet; import org.hibernate.Query; -import org.hibernate.proxy.HibernateProxy; /** * A Repository contains a current root directory and a list of @@ -390,14 +387,74 @@ class RepositoryImpl implements Repository, Serializable // provide methods for getting versions by date range, n most // recent etc. /** - * Get the set of all extant version ids for this Repository. + * Get the set of all extant versions for this Repository. * @return A Set of version ids. */ @SuppressWarnings("unchecked") - public Set getVersions() + public List getVersions() { - Query query = fSuper.getSession().createQuery("select v.versionID from VersionRootImpl v"); - return new TreeSet((List)query.list()); + Query query = fSuper.getSession().createQuery("from VersionRootImpl v order by v.versionID"); + List versions = (List)query.list(); + List descs = new ArrayList(); + for (VersionRoot vr : versions) + { + VersionDescriptor desc = + new VersionDescriptor(fName, + vr.getVersionID(), + vr.getCreator(), + vr.getCreateDate()); + descs.add(desc); + } + return descs; + } + + /** + * Get the versions between the given dates (inclusive). From or + * to may be null but not both. + * @param from The earliest date. + * @param to The latest date. + * @return The Set of matching version IDs. + */ + @SuppressWarnings("unchecked") + public List getVersions(Date from, Date to) + { + Query query; + if (from == null) + { + query = + fSuper.getSession().createQuery("from VersionRootImpl vr where vr.createDate <= :to " + + "order by vr.versionID"); + query.setLong("to", to.getTime()); + } + else if (to == null) + { + query = + fSuper.getSession().createQuery("from VersionRootImpl vr " + + "where vr.createDate >= :from " + + "order by vr.versionID"); + query.setLong("from", from.getTime()); + } + else + { + query = + fSuper.getSession().createQuery("from VersionRootImpl vr "+ + "where vr.createDate between :from and :to " + + "order by vr.versionID"); + query.setLong("from", from.getTime()); + query.setLong("to", to.getTime()); + } + List versions = (List)query.list(); + List descs = new ArrayList(); + for (VersionRoot vr : versions) + { + VersionDescriptor desc = + new VersionDescriptor(fName, + vr.getVersionID(), + vr.getCreator(), + vr.getCreateDate()); + descs.add(desc); + } + return descs; } /** @@ -433,14 +490,7 @@ class RepositoryImpl implements Repository, Serializable // Versions less than 0 mean get current. if (version < 0) { - if (fRoot instanceof HibernateProxy) - { - dir = (DirectoryNode)((HibernateProxy)fRoot).getHibernateLazyInitializer().getImplementation(); - } - else - { - dir = fRoot; - } + dir = (DirectoryNode)AVMNodeUnwrapper.Unwrap(fRoot); } else { @@ -448,11 +498,7 @@ class RepositoryImpl implements Repository, Serializable fSuper.getSession().getNamedQuery("VersionRoot.GetVersionRoot"); query.setEntity("rep", this); query.setInteger("version", version); - dir = (DirectoryNode)query.uniqueResult(); - if (dir == null) - { - throw new AVMException("Invalid version: " + version); - } + dir = (DirectoryNode)AVMNodeUnwrapper.Unwrap((AVMNode)query.uniqueResult()); } // fSuper.getSession().lock(dir, LockMode.READ); // Add an entry for the root. diff --git a/source/java/org/alfresco/repo/avm/SuperRepository.java b/source/java/org/alfresco/repo/avm/SuperRepository.java index e478726de9..513466df6a 100644 --- a/source/java/org/alfresco/repo/avm/SuperRepository.java +++ b/source/java/org/alfresco/repo/avm/SuperRepository.java @@ -20,10 +20,10 @@ package org.alfresco.repo.avm; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; +import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import org.hibernate.LockMode; import org.hibernate.Query; @@ -553,17 +553,32 @@ class SuperRepository } /** - * Get all version ids for a given repository. + * Get all version for a given repository. * @param name The name of the repository. * @return A Set will all the version ids. */ - public Set getRepositoryVersions(String name) + public List getRepositoryVersions(String name) { Repository rep = getRepositoryByName(name); fSession.get().lock(rep, LockMode.READ); return rep.getVersions(); } + /** + * Get the set of versions between (inclusive) of the given dates. + * From or to may be null but not both. + * @param name The name of the repository. + * @param from The earliest date. + * @param to The latest date. + * @return The Set of version IDs. + */ + public List getRepositoryVersions(String name, Date from, Date to) + { + Repository rep = getRepositoryByName(name); + fSession.get().lock(rep, LockMode.READ); + return rep.getVersions(from, to); + } + /** * Issue a node id. * @return The new id. diff --git a/source/java/org/alfresco/repo/avm/VersionDescriptor.java b/source/java/org/alfresco/repo/avm/VersionDescriptor.java new file mode 100644 index 0000000000..3dfa428093 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/VersionDescriptor.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2006 Alfresco, Inc. + * + * Licensed under the Mozilla Public License version 1.1 + * with a permitted attribution clause. You may obtain a + * copy of the License at + * + * http://www.alfresco.org/legal/license.txt + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + */ + +package org.alfresco.repo.avm; + +/** + * All the information about a particular version. + * @author britt + */ +public class VersionDescriptor +{ + /** + * The name of the repository this version belongs to. + */ + private String fRepositoryName; + + /** + * The version id. + */ + private int fVersionID; + + /** + * The creator of this version. + */ + private String fCreator; + + /** + * The date of this version's creation. + */ + private long fCreateDate; + + /** + * New one up. + * @param repName The repository name. + * @param versionID The version id. + * @param creator The creator. + * @param createDate The create date. + */ + public VersionDescriptor(String repName, + int versionID, + String creator, + long createDate) + { + fRepositoryName = repName; + fVersionID = versionID; + fCreator = creator; + fCreateDate = createDate; + } + + /** + * Get the repository name. + * @return The repository name. + */ + public String getRepositoryName() + { + return fRepositoryName; + } + + /** + * Get the version ID + * @return The version ID + */ + public int getVersionID() + { + return fVersionID; + } + + /** + * Get the creator of this version. + * @return The creator. + */ + public String getCreator() + { + return fCreator; + } + + /** + * Get the creation date. + * @return The creation date. + */ + public long getCreateDate() + { + return fCreateDate; + } +} diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml index f26acb1f31..3a817dbc7c 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml +++ b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml @@ -199,6 +199,12 @@ ce.child = :child and ce.parent = :parent ]]> + + + + + + + + + + + + + + +