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:
Britt Park
2006-06-17 18:48:44 +00:00
parent a215fb72b6
commit 9c17cfa1e0
16 changed files with 439 additions and 131 deletions

View 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;
}
}

View File

@@ -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.

View File

@@ -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.
*/

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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());
}
/**

View File

@@ -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();
}
}
}

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View 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;
}
}

View File

@@ -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