From 9c17cfa1e071d32802cb317a587870861773461d Mon Sep 17 00:00:00 2001 From: Britt Park Date: Sat, 17 Jun 2006 18:48:44 +0000 Subject: [PATCH] Purge tests cover more now. Moved purging queries into mapping file. Added call to AVMService to get Versions by creation date. GetRepositoryVersions methods now return Lists of VersionDescriptors, value objects with the attributes of a version. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3131 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- source/java/hibernate.cfg.xml | 6 +- .../alfresco/repo/avm/AVMNodeUnwrapper.java | 39 ++++++ .../org/alfresco/repo/avm/AVMService.java | 16 ++- .../org/alfresco/repo/avm/AVMServiceImpl.java | 35 ++++- .../org/alfresco/repo/avm/AVMServiceTest.java | 47 ++++--- .../org/alfresco/repo/avm/AVMStressTest.java | 8 +- .../repo/avm/LayeredDirectoryNodeImpl.java | 10 +- source/java/org/alfresco/repo/avm/Lookup.java | 3 - .../org/alfresco/repo/avm/OrphanReaper.java | 17 +-- .../repo/avm/PlainDirectoryNodeImpl.java | 16 +-- .../java/org/alfresco/repo/avm/PurgeTest.java | 120 +++++++++++++----- .../org/alfresco/repo/avm/Repository.java | 15 ++- .../org/alfresco/repo/avm/RepositoryImpl.java | 88 ++++++++++--- .../alfresco/repo/avm/SuperRepository.java | 21 ++- .../alfresco/repo/avm/VersionDescriptor.java | 99 +++++++++++++++ .../alfresco/repo/avm/hibernate/AVM.hbm.xml | 30 +++++ 16 files changed, 439 insertions(+), 131 deletions(-) create mode 100644 source/java/org/alfresco/repo/avm/AVMNodeUnwrapper.java create mode 100644 source/java/org/alfresco/repo/avm/VersionDescriptor.java 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 ]]> + + + + + + + + + + + + + + +