mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
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
This commit is contained in:
39
source/java/org/alfresco/repo/avm/AVMNodeUnwrapper.java
Normal file
39
source/java/org/alfresco/repo/avm/AVMNodeUnwrapper.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
@@ -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<Integer> getRepositoryVersions(String name);
|
||||
public List<VersionDescriptor> 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<VersionDescriptor> getRepositoryVersions(String name, Date from, Date to);
|
||||
|
||||
/**
|
||||
* Get the names of all repositories.
|
||||
|
@@ -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<Integer> getRepositoryVersions(final String name)
|
||||
public List<VersionDescriptor> getRepositoryVersions(final String name)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
@@ -653,7 +653,7 @@ public class AVMServiceImpl implements AVMService
|
||||
}
|
||||
class HTxnCallback implements HibernateTxnCallback
|
||||
{
|
||||
public Set<Integer> versions;
|
||||
public List<VersionDescriptor> 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<VersionDescriptor> 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<VersionDescriptor> 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.
|
||||
*/
|
||||
|
@@ -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<Integer> versions = fService.getRepositoryVersions("main");
|
||||
for (Integer version : versions)
|
||||
List<VersionDescriptor> 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<Integer> versions = fService.getRepositoryVersions("main");
|
||||
for (Integer version : versions)
|
||||
List<VersionDescriptor> 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<Long> times = new ArrayList<Long>();
|
||||
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)
|
||||
{
|
||||
|
@@ -39,7 +39,7 @@ public class AVMStressTest extends AVMServiceTestBase
|
||||
loader.recursiveLoad("source", "main:/");
|
||||
List<AVMTester> testers = new ArrayList<AVMTester>();
|
||||
List<Thread> threads = new ArrayList<Thread>();
|
||||
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)
|
||||
{
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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<AVMNode> descendents = (List<AVMNode>)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<AVMNode> merged = (List<AVMNode>)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<AVMNode> children = (List<AVMNode>)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();
|
||||
}
|
||||
|
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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<Integer> getVersions();
|
||||
public List<VersionDescriptor> 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<VersionDescriptor> getVersions(Date from, Date to);
|
||||
|
||||
/**
|
||||
* Get the super repository.
|
||||
|
@@ -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<Integer> getVersions()
|
||||
public List<VersionDescriptor> getVersions()
|
||||
{
|
||||
Query query = fSuper.getSession().createQuery("select v.versionID from VersionRootImpl v");
|
||||
return new TreeSet<Integer>((List<Integer>)query.list());
|
||||
Query query = fSuper.getSession().createQuery("from VersionRootImpl v order by v.versionID");
|
||||
List<VersionRoot> versions = (List<VersionRoot>)query.list();
|
||||
List<VersionDescriptor> descs = new ArrayList<VersionDescriptor>();
|
||||
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<VersionDescriptor> 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<VersionRoot> versions = (List<VersionRoot>)query.list();
|
||||
List<VersionDescriptor> descs = new ArrayList<VersionDescriptor>();
|
||||
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.
|
||||
|
@@ -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<Integer> getRepositoryVersions(String name)
|
||||
public List<VersionDescriptor> 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<VersionDescriptor> 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.
|
||||
|
99
source/java/org/alfresco/repo/avm/VersionDescriptor.java
Normal file
99
source/java/org/alfresco/repo/avm/VersionDescriptor.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
@@ -199,6 +199,12 @@
|
||||
ce.child = :child and ce.parent = :parent
|
||||
]]>
|
||||
</query>
|
||||
<query name="ChildEntry.DeleteByParent">
|
||||
<![CDATA[
|
||||
delete ChildEntryImpl ce
|
||||
where ce.parent = :parent
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.ByNewInRepo">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl a
|
||||
@@ -206,6 +212,24 @@
|
||||
a.repository = :repo and a.isNew = true
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetDescendents">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
where an.ancestor = :node
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetMergedTo">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
where an.mergedFrom = :merged
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetByParent">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
where an.parent = :parent
|
||||
]]>
|
||||
</query>
|
||||
<query name="VersionRoot.GetVersionRoot">
|
||||
<![CDATA[
|
||||
select v.root
|
||||
@@ -235,6 +259,12 @@
|
||||
dc.parent = :parent
|
||||
]]>
|
||||
</query>
|
||||
<query name="DeletedChild.DeleteByParent">
|
||||
<![CDATA[
|
||||
delete DeletedChildImpl dc
|
||||
where dc.parent = :parent
|
||||
]]>
|
||||
</query>
|
||||
<query name="FindOrphans">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
|
Reference in New Issue
Block a user