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
]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+