This brings the AVM implementation to the 'it compiles so it should work"

state.  It's hooked up to nothing right now.  First will be a basic test harness 
for it, then...


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@2891 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-05-15 17:51:37 +00:00
parent 1d601e1be7
commit 0241371dd6
23 changed files with 615 additions and 38 deletions

View File

@@ -154,7 +154,7 @@ public interface AVMService
* @param name The name of the Repository. * @param name The name of the Repository.
* @return A Set of version IDs * @return A Set of version IDs
*/ */
public Set<Integer> getRepositoryVersions(String name); public Set<Long> getRepositoryVersions(String name);
/** /**
* Lookup a node by version ids and path. Note that an AVMNode is essentially * Lookup a node by version ids and path. Note that an AVMNode is essentially

View File

@@ -0,0 +1,20 @@
/**
*
*/
package org.alfresco.repo.avm;
/**
* Layered nodes share this method.
* @author britt
*/
public interface Layered
{
/**
* Get the indirection, or underlying path that this
* node points to.
* @param lookup The lookup path. Needed for most nodes to determine
* underlying path.
* @return
*/
public String getUnderlying(Lookup lookup);
}

View File

@@ -23,6 +23,8 @@ import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.avm.hibernate.BasicAttributesBean;
import org.alfresco.repo.avm.hibernate.BasicAttributesBeanImpl;
import org.alfresco.repo.avm.hibernate.DirectoryEntry; import org.alfresco.repo.avm.hibernate.DirectoryEntry;
import org.alfresco.repo.avm.hibernate.LayeredDirectoryNodeBean; import org.alfresco.repo.avm.hibernate.LayeredDirectoryNodeBean;
import org.alfresco.repo.avm.hibernate.LayeredDirectoryNodeBeanImpl; import org.alfresco.repo.avm.hibernate.LayeredDirectoryNodeBeanImpl;
@@ -31,7 +33,7 @@ import org.alfresco.repo.avm.hibernate.LayeredDirectoryNodeBeanImpl;
* Interface for a layered directory node. Stub. * Interface for a layered directory node. Stub.
* @author britt * @author britt
*/ */
public class LayeredDirectoryNode extends DirectoryNode public class LayeredDirectoryNode extends DirectoryNode implements Layered
{ {
/** /**
* The underlying bean data. * The underlying bean data.
@@ -55,6 +57,14 @@ public class LayeredDirectoryNode extends DirectoryNode
*/ */
public LayeredDirectoryNode(String indirection, Repository repos) public LayeredDirectoryNode(String indirection, Repository repos)
{ {
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
"britt",
"britt",
time,
time,
time);
repos.getSuperRepository().getSession().save(attrs);
fData = new LayeredDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(), fData = new LayeredDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(),
-1, -1,
-1, -1,
@@ -62,6 +72,7 @@ public class LayeredDirectoryNode extends DirectoryNode
null, null,
null, null,
repos.getDataBean(), repos.getDataBean(),
attrs,
-1, -1,
indirection); indirection);
setDataBean(fData); setDataBean(fData);
@@ -76,6 +87,13 @@ public class LayeredDirectoryNode extends DirectoryNode
public LayeredDirectoryNode(LayeredDirectoryNode other, public LayeredDirectoryNode(LayeredDirectoryNode other,
Repository repos) Repository repos)
{ {
LayeredDirectoryNodeBean thatBean = (LayeredDirectoryNodeBean)other.getDataBean();
BasicAttributesBean attrs = new BasicAttributesBeanImpl(thatBean.getBasicAttributes());
long time = System.currentTimeMillis();
attrs.setModDate(time);
attrs.setAccessDate(time);
attrs.setLastModifier("britt");
repos.getSuperRepository().getSession().save(attrs);
fData = new LayeredDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(), fData = new LayeredDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(),
-1, -1,
-1, -1,
@@ -83,11 +101,12 @@ public class LayeredDirectoryNode extends DirectoryNode
null, null,
null, null,
repos.getDataBean(), repos.getDataBean(),
attrs,
-1, -1,
other.getUnderlying()); other.getUnderlying());
fData.setAdded(((LayeredDirectoryNodeBean)other.getDataBean()).getAdded()); fData.setAdded(thatBean.getAdded());
fData.setDeleted(((LayeredDirectoryNodeBean)other.getDataBean()).getDeleted()); fData.setDeleted(thatBean.getDeleted());
fData.setPrimaryIndirection(((LayeredDirectoryNodeBean)other.getDataBean()).getPrimaryIndirection()); fData.setPrimaryIndirection(thatBean.getPrimaryIndirection());
repos.getSuperRepository().getSession().save(fData); repos.getSuperRepository().getSession().save(fData);
} }
@@ -101,6 +120,12 @@ public class LayeredDirectoryNode extends DirectoryNode
Repository repos, Repository repos,
Lookup lPath) Lookup lPath)
{ {
BasicAttributesBean attrs = new BasicAttributesBeanImpl(other.getDataBean().getBasicAttributes());
long time = System.currentTimeMillis();
attrs.setModDate(time);
attrs.setAccessDate(time);
attrs.setLastModifier("britt");
repos.getSuperRepository().getSession().save(attrs);
fData = new LayeredDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(), fData = new LayeredDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(),
-1, -1,
-1, -1,
@@ -108,6 +133,7 @@ public class LayeredDirectoryNode extends DirectoryNode
null, null,
null, null,
repos.getDataBean(), repos.getDataBean(),
attrs,
-1, -1,
null); null);
// TODO Is this right? // TODO Is this right?
@@ -116,6 +142,7 @@ public class LayeredDirectoryNode extends DirectoryNode
repos.getSuperRepository().getSession().save(fData); repos.getSuperRepository().getSession().save(fData);
} }
// TODO Something.
public LayeredDirectoryNode(DirectoryNode dir, public LayeredDirectoryNode(DirectoryNode dir,
Repository repo, Repository repo,
Lookup srcLookup, Lookup srcLookup,

View File

@@ -18,6 +18,8 @@
package org.alfresco.repo.avm; package org.alfresco.repo.avm;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.avm.hibernate.BasicAttributesBean;
import org.alfresco.repo.avm.hibernate.BasicAttributesBeanImpl;
import org.alfresco.repo.avm.hibernate.LayeredFileNodeBean; import org.alfresco.repo.avm.hibernate.LayeredFileNodeBean;
import org.alfresco.repo.avm.hibernate.LayeredFileNodeBeanImpl; import org.alfresco.repo.avm.hibernate.LayeredFileNodeBeanImpl;
@@ -25,7 +27,7 @@ import org.alfresco.repo.avm.hibernate.LayeredFileNodeBeanImpl;
* A LayeredFileNode behaves like a copy on write symlink. * A LayeredFileNode behaves like a copy on write symlink.
* @author britt * @author britt
*/ */
public class LayeredFileNode extends FileNode public class LayeredFileNode extends FileNode implements Layered
{ {
/** /**
* The data bean. * The data bean.
@@ -66,6 +68,14 @@ public class LayeredFileNode extends FileNode
*/ */
public LayeredFileNode(String indirection, Repository repo) public LayeredFileNode(String indirection, Repository repo)
{ {
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
"britt",
"britt",
time,
time,
time);
repo.getSuperRepository().getSession().save(attrs);
fData = new LayeredFileNodeBeanImpl(repo.getSuperRepository().issueID(), fData = new LayeredFileNodeBeanImpl(repo.getSuperRepository().issueID(),
-1L, -1L,
-1L, -1L,
@@ -73,6 +83,7 @@ public class LayeredFileNode extends FileNode
null, null,
null, null,
repo.getDataBean(), repo.getDataBean(),
attrs,
indirection); indirection);
repo.getSuperRepository().getSession().save(fData); repo.getSuperRepository().getSession().save(fData);
setDataBean(fData); setDataBean(fData);
@@ -135,4 +146,12 @@ public class LayeredFileNode extends FileNode
assert false : "Never happens"; assert false : "Never happens";
return null; return null;
} }
/* (non-Javadoc)
* @see org.alfresco.repo.avm.Layered#getUnderlying(org.alfresco.repo.avm.Lookup)
*/
public String getUnderlying(Lookup lookup)
{
return fData.getIndirection();
}
} }

View File

@@ -21,6 +21,8 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import org.alfresco.repo.avm.hibernate.BasicAttributesBean;
import org.alfresco.repo.avm.hibernate.BasicAttributesBeanImpl;
import org.alfresco.repo.avm.hibernate.DirectoryEntry; import org.alfresco.repo.avm.hibernate.DirectoryEntry;
import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBean; import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBean;
import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBeanImpl; import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBeanImpl;
@@ -42,6 +44,14 @@ public class PlainDirectoryNode extends DirectoryNode
*/ */
public PlainDirectoryNode(Repository repo) public PlainDirectoryNode(Repository repo)
{ {
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
"britt",
"britt",
time,
time,
time);
repo.getSuperRepository().getSession().save(attrs);
fData = new PlainDirectoryNodeBeanImpl(repo.getSuperRepository().issueID(), fData = new PlainDirectoryNodeBeanImpl(repo.getSuperRepository().issueID(),
repo.getLatestVersion(), repo.getLatestVersion(),
0L, 0L,
@@ -49,6 +59,7 @@ public class PlainDirectoryNode extends DirectoryNode
null, null,
null, null,
repo.getDataBean(), repo.getDataBean(),
attrs,
false); false);
repo.getSuperRepository().getSession().save(fData); repo.getSuperRepository().getSession().save(fData);
} }
@@ -71,6 +82,12 @@ public class PlainDirectoryNode extends DirectoryNode
public PlainDirectoryNode(PlainDirectoryNode other, public PlainDirectoryNode(PlainDirectoryNode other,
Repository repos) Repository repos)
{ {
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl(other.getDataBean().getBasicAttributes());
attrs.setModDate(time);
attrs.setCreateDate(time);
attrs.setAccessDate(time);
repos.getSuperRepository().getSession().save(attrs);
fData = new PlainDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(), fData = new PlainDirectoryNodeBeanImpl(repos.getSuperRepository().issueID(),
-1, -1,
-1, -1,
@@ -78,6 +95,7 @@ public class PlainDirectoryNode extends DirectoryNode
null, null,
null, null,
repos.getDataBean(), repos.getDataBean(),
attrs,
false); false);
setDataBean(fData); setDataBean(fData);
fData.setChildren(new HashMap<String, DirectoryEntry>(((PlainDirectoryNodeBean)other.getDataBean()).getChildren())); fData.setChildren(new HashMap<String, DirectoryEntry>(((PlainDirectoryNodeBean)other.getDataBean()).getChildren()));

View File

@@ -17,6 +17,8 @@
package org.alfresco.repo.avm; package org.alfresco.repo.avm;
import org.alfresco.repo.avm.hibernate.BasicAttributesBean;
import org.alfresco.repo.avm.hibernate.BasicAttributesBeanImpl;
import org.alfresco.repo.avm.hibernate.ContentBean; import org.alfresco.repo.avm.hibernate.ContentBean;
import org.alfresco.repo.avm.hibernate.ContentBeanImpl; import org.alfresco.repo.avm.hibernate.ContentBeanImpl;
import org.alfresco.repo.avm.hibernate.PlainFileNodeBean; import org.alfresco.repo.avm.hibernate.PlainFileNodeBean;
@@ -50,6 +52,14 @@ public class PlainFileNode extends FileNode
public PlainFileNode(Repository repos) public PlainFileNode(Repository repos)
{ {
ContentBean content = new ContentBeanImpl(repos.getSuperRepository().issueContentID()); ContentBean content = new ContentBeanImpl(repos.getSuperRepository().issueContentID());
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
"britt",
"britt",
time,
time,
time);
repos.getSuperRepository().getSession().save(attrs);
fData = new PlainFileNodeBeanImpl(repos.getSuperRepository().issueID(), fData = new PlainFileNodeBeanImpl(repos.getSuperRepository().issueID(),
-1, -1,
-1, -1,
@@ -57,6 +67,7 @@ public class PlainFileNode extends FileNode
null, null,
null, null,
repos.getDataBean(), repos.getDataBean(),
attrs,
content); content);
content.setRefCount(1); content.setRefCount(1);
// Transitive persistence should take care of content. // Transitive persistence should take care of content.
@@ -72,6 +83,12 @@ public class PlainFileNode extends FileNode
public PlainFileNode(PlainFileNode other, public PlainFileNode(PlainFileNode other,
Repository repos) Repository repos)
{ {
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl(other.getDataBean().getBasicAttributes());
attrs.setCreateDate(time);
attrs.setModDate(time);
attrs.setAccessDate(time);
repos.getSuperRepository().getSession().save(attrs);
fData = new PlainFileNodeBeanImpl(repos.getSuperRepository().issueID(), fData = new PlainFileNodeBeanImpl(repos.getSuperRepository().issueID(),
-1, -1,
-1, -1,
@@ -79,6 +96,7 @@ public class PlainFileNode extends FileNode
null, null,
null, null,
repos.getDataBean(), repos.getDataBean(),
attrs,
other.fData.getContent()); other.fData.getContent());
repos.getSuperRepository().getSession().save(fData); repos.getSuperRepository().getSession().save(fData);
fData.getContent().setRefCount(fData.getContent().getRefCount() + 1); fData.getContent().setRefCount(fData.getContent().getRefCount() + 1);

View File

@@ -131,7 +131,7 @@ public interface Repository
* Get the version ids that this Repository has. * Get the version ids that this Repository has.
* @return A Set of Version IDs. * @return A Set of Version IDs.
*/ */
public Set<Integer> getVersions(); public Set<Long> getVersions();
/** /**
* Get the data bean. * Get the data bean.

View File

@@ -165,7 +165,7 @@ public interface SuperRepository
* @param name The name of the repository. * @param name The name of the repository.
* @return A Set of IDs. * @return A Set of IDs.
*/ */
public Set<Integer> getRepositoryVersions(String name); public Set<Long> getRepositoryVersions(String name);
/** /**
* Issue a unique identifier for a new node. * Issue a unique identifier for a new node.

View File

@@ -10,6 +10,9 @@
</id> </id>
<discriminator column="class_type" type="string" length="20"></discriminator> <discriminator column="class_type" type="string" length="20"></discriminator>
<version column="vers" name="vers" type="long"></version> <version column="vers" name="vers" type="long"></version>
<many-to-one name="basicAttributes" column="basic_attrs"
class="BasicAttributesBeanImpl" unique="true" cascade="all">
</many-to-one>
<many-to-one name="ancestor" column="ancestor_id" <many-to-one name="ancestor" column="ancestor_id"
class="AVMNodeBeanImpl"> class="AVMNodeBeanImpl">
</many-to-one> </many-to-one>
@@ -95,4 +98,17 @@
</subclass> </subclass>
</subclass> </subclass>
</class> </class>
<class name="BasicAttributesBeanImpl" proxy="BasicAttributesBean"
lazy="true" optimistic-lock="version" table="basic_attributes">
<id name="id" type="long">
<generator class="native"></generator>
</id>
<version column="vers" name="vers" type="long"></version>
<property name="creator" type="string" not-null="true"></property>
<property name="owner" type="string" not-null="true"></property>
<property name="lastModifier" type="string" not-null="true"></property>
<property name="createDate" type="long" not-null="true"></property>
<property name="modDate" type="long" not-null="true"></property>
<property name="accessDate" type="long" not-null="true"></property>
</class>
</hibernate-mapping> </hibernate-mapping>

View File

@@ -131,4 +131,16 @@ public interface AVMNodeBean
* @return The version. * @return The version.
*/ */
public long getVers(); public long getVers();
/**
* Set the basic attributes.
* @param attrs The attributes to set.
*/
public void setBasicAttributes(BasicAttributesBean attrs);
/**
* Get the basic attributes.
* @return The attributes.
*/
public BasicAttributesBean getBasicAttributes();
} }

View File

@@ -58,6 +58,11 @@ public class AVMNodeBeanImpl implements AVMNodeBean
*/ */
private RepositoryBean fRepository; private RepositoryBean fRepository;
/**
* The BasicAttributes.
*/
private BasicAttributesBean fBasicAttributes;
/** /**
* Whether this node is new (and should therefore not be COWed). * Whether this node is new (and should therefore not be COWed).
*/ */
@@ -91,7 +96,8 @@ public class AVMNodeBeanImpl implements AVMNodeBean
AVMNodeBean ancestor, AVMNodeBean ancestor,
AVMNodeBean mergedFrom, AVMNodeBean mergedFrom,
DirectoryNodeBean parent, DirectoryNodeBean parent,
RepositoryBean repository) RepositoryBean repository,
BasicAttributesBean attrs)
{ {
fID = id; fID = id;
fVersionID = versionID; fVersionID = versionID;
@@ -101,6 +107,7 @@ public class AVMNodeBeanImpl implements AVMNodeBean
fParent = parent; fParent = parent;
fRepository = repository; fRepository = repository;
fIsNew = true; fIsNew = true;
fBasicAttributes = attrs;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -272,4 +279,20 @@ public class AVMNodeBeanImpl implements AVMNodeBean
{ {
fVers = vers; fVers = vers;
} }
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.AVMNodeBean#getBasicAttributes()
*/
public BasicAttributesBean getBasicAttributes()
{
return fBasicAttributes;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.AVMNodeBean#setBasicAttributes(org.alfresco.repo.avm.hibernate.BasicAttributesBean)
*/
public void setBasicAttributes(BasicAttributesBean attrs)
{
fBasicAttributes = attrs;
}
} }

View File

@@ -0,0 +1,105 @@
/**
*
*/
package org.alfresco.repo.avm.hibernate;
/**
* Ownership, timestamps, later perhaps ACLs
* @author britt
*/
public interface BasicAttributesBean
{
/**
* Set the id.
* @param id
*/
public void setId(Long id);
/**
* Get the id.
* @return The id.
*/
public Long getId();
/**
* Set the version (for concurrency control.)
*/
public void setVers(long vers);
/**
* Get the version (for concurrency control.)
*/
public long getVers();
/**
* Set the creator of the node.
* @param creator The creator to set.
*/
public void setCreator(String creator);
/**
* Get the creator of the node.
* @return The creator.
*/
public String getCreator();
/**
* Set the owner of the node.
* @param owner The owner to set.
*/
public void setOwner(String owner);
/**
* Get the owner of the node.
* @return The owner.
*/
public String getOwner();
/**
* Set the last modifier of the node.
* @param lastModifier
*/
public void setLastModifier(String lastModifier);
/**
* Get the last modifier of the node.
* @return The last modifier.
*/
public String getLastModifier();
/**
* Set the create date.
* @param createDate The date to set.
*/
public void setCreateDate(long createDate);
/**
* Get the create date.
* @return The create date.
*/
public long getCreateDate();
/**
* Set the modification date.
* @param modDate The date to set.
*/
public void setModDate(long modDate);
/**
* Get the modification date.
* @return The modification date.
*/
public long getModDate();
/**
* Set the access date of the node.
* @param accessDate The access date.
*/
public void setAccessDate(long accessDate);
/**
* Get the access date of the node.
* @return The access date.
*/
public long getAccessDate();
}

View File

@@ -0,0 +1,225 @@
/**
*
*/
package org.alfresco.repo.avm.hibernate;
/**
* Implementation of the BasicAttributesBean.
* @author britt
*
*/
public class BasicAttributesBeanImpl implements BasicAttributesBean
{
/**
* The id.
*/
private Long fID;
/**
* The version for concurrency control.
*/
private long fVers;
/**
* The creator.
*/
private String fCreator;
/**
* The owner.
*/
private String fOwner;
/**
* The last modifier.
*/
private String fLastModifier;
/**
* The creation date.
*/
private long fCreateDate;
/**
* The modification date.
*/
private long fModDate;
/**
* The access date.
*/
private long fAccessDate;
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getId()
*/
public Long getId()
{
return fID;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setId(java.lang.Long)
*/
public void setId(Long id)
{
fID = id;
}
/**
* Default constructor.
*/
public BasicAttributesBeanImpl()
{
}
/**
* A Copy constructor.
* @param other
*/
public BasicAttributesBeanImpl(BasicAttributesBean other)
{
fCreator = other.getCreator();
fOwner = other.getOwner();
fLastModifier = other.getLastModifier();
fCreateDate = other.getCreateDate();
fModDate = other.getModDate();
fAccessDate = other.getAccessDate();
}
/**
* Fill in the blanks constructor.
* @param creator
* @param owner
* @param modifier
* @param createDate
* @param modDate
* @param accessDate
*/
public BasicAttributesBeanImpl(String creator,
String owner,
String modifier,
long createDate,
long modDate,
long accessDate)
{
fCreator = creator;
fOwner = owner;
fLastModifier = modifier;
fCreateDate = createDate;
fModDate = modDate;
fAccessDate = accessDate;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getVers()
*/
public long getVers()
{
return fVers;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setVers(long)
*/
public void setVers(long vers)
{
fVers = vers;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setCreator(java.lang.String)
*/
public void setCreator(String creator)
{
fCreator = creator;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getCreator()
*/
public String getCreator()
{
return fCreator;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setOwner(java.lang.String)
*/
public void setOwner(String owner)
{
fOwner = owner;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getOwner()
*/
public String getOwner()
{
return fOwner;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setLastModifier(java.lang.String)
*/
public void setLastModifier(String lastModifier)
{
fLastModifier = lastModifier;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getLastModifier()
*/
public String getLastModifier()
{
return fLastModifier;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setCreateDate(long)
*/
public void setCreateDate(long createDate)
{
fCreateDate = createDate;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getCreateDate()
*/
public long getCreateDate()
{
return fCreateDate;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setModDate(long)
*/
public void setModDate(long modDate)
{
fModDate = modDate;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getModDate()
*/
public long getModDate()
{
return fModDate;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#setAccessDate(long)
*/
public void setAccessDate(long accessDate)
{
fAccessDate = accessDate;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.hibernate.BasicAttributesBean#getAccessDate()
*/
public long getAccessDate()
{
return fAccessDate;
}
}

View File

@@ -46,8 +46,9 @@ public class DirectoryNodeBeanImpl extends AVMNodeBeanImpl implements DirectoryN
AVMNodeBean ancestor, AVMNodeBean ancestor,
AVMNodeBean mergedFrom, AVMNodeBean mergedFrom,
DirectoryNodeBean parent, DirectoryNodeBean parent,
RepositoryBean repository) RepositoryBean repository,
BasicAttributesBean attrs)
{ {
super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs);
} }
} }

View File

@@ -47,8 +47,9 @@ public class FileNodeBeanImpl extends AVMNodeBeanImpl implements FileNodeBean
AVMNodeBean ancestor, AVMNodeBean ancestor,
AVMNodeBean mergedFrom, AVMNodeBean mergedFrom,
DirectoryNodeBean parent, DirectoryNodeBean parent,
RepositoryBean repository) RepositoryBean repository,
BasicAttributesBean attrs)
{ {
super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs);
} }
} }

View File

@@ -81,10 +81,11 @@ public class LayeredDirectoryNodeBeanImpl extends DirectoryNodeBeanImpl implemen
AVMNodeBean mergedFrom, AVMNodeBean mergedFrom,
DirectoryNodeBean parent, DirectoryNodeBean parent,
RepositoryBean repository, RepositoryBean repository,
BasicAttributesBean attrs,
long layerID, long layerID,
String indirection) String indirection)
{ {
super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs);
fLayerID = layerID; fLayerID = layerID;
fIndirection = indirection; fIndirection = indirection;
fAdded = new HashMap<String, DirectoryEntry>(); fAdded = new HashMap<String, DirectoryEntry>();

View File

@@ -54,9 +54,10 @@ public class LayeredFileNodeBeanImpl extends FileNodeBeanImpl implements
AVMNodeBean mergedFrom, AVMNodeBean mergedFrom,
DirectoryNodeBean parent, DirectoryNodeBean parent,
RepositoryBean repository, RepositoryBean repository,
BasicAttributesBean attrs,
String indirection) String indirection)
{ {
super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs);
fIndirection = indirection; fIndirection = indirection;
} }

View File

@@ -61,9 +61,10 @@ public class PlainDirectoryNodeBeanImpl extends DirectoryNodeBeanImpl implements
AVMNodeBean mergedFrom, AVMNodeBean mergedFrom,
DirectoryNodeBean parent, DirectoryNodeBean parent,
RepositoryBean repository, RepositoryBean repository,
BasicAttributesBean attrs,
boolean isRoot) boolean isRoot)
{ {
super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs);
fChildren = new HashMap<String, DirectoryEntry>(); fChildren = new HashMap<String, DirectoryEntry>();
fIsRoot = isRoot; fIsRoot = isRoot;
} }

View File

@@ -54,9 +54,10 @@ public class PlainFileNodeBeanImpl extends FileNodeBeanImpl implements PlainFile
AVMNodeBean mergedFrom, AVMNodeBean mergedFrom,
DirectoryNodeBean parent, DirectoryNodeBean parent,
RepositoryBean repository, RepositoryBean repository,
BasicAttributesBean attrs,
ContentBean content) ContentBean content)
{ {
super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs);
fContent = content; fContent = content;
} }

View File

@@ -80,6 +80,14 @@ public class TestPopulate extends TestCase
Issuer contentIssuer = new Issuer("content", 0); Issuer contentIssuer = new Issuer("content", 0);
Issuer repositoryIssuer = new Issuer("repository", 0); Issuer repositoryIssuer = new Issuer("repository", 0);
// Make the initial root directory. // Make the initial root directory.
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
"britt",
"britt",
time,
time,
time);
session.save(attrs);
PlainDirectoryNodeBean root = PlainDirectoryNodeBean root =
new PlainDirectoryNodeBeanImpl(nodeIssuer.issue(), new PlainDirectoryNodeBeanImpl(nodeIssuer.issue(),
0, 0,
@@ -88,6 +96,7 @@ public class TestPopulate extends TestCase
null, null,
null, null,
null, null,
attrs,
true); true);
// Make a new repository. // Make a new repository.
RepositoryBean rep = RepositoryBean rep =
@@ -112,11 +121,19 @@ public class TestPopulate extends TestCase
// Now read some things back, and modify some stuff. // Now read some things back, and modify some stuff.
Issuer nodeIssuer = (Issuer)session.get(Issuer.class, "node"); Issuer nodeIssuer = (Issuer)session.get(Issuer.class, "node");
Issuer contentIssuer = (Issuer)session.get(Issuer.class, "content"); Issuer contentIssuer = (Issuer)session.get(Issuer.class, "content");
RepositoryBean rep = (RepositoryBean)session.get(RepositoryBeanImpl.class, 0L); RepositoryBean rep = (RepositoryBean)session.get(RepositoryBeanImpl.class, "main");
long version = rep.getNextVersionID(); long version = rep.getNextVersionID();
rep.setNextVersionID(version + 1); rep.setNextVersionID(version + 1);
assertTrue(rep != null); assertTrue(rep != null);
PlainDirectoryNodeBean root = (PlainDirectoryNodeBean)rep.getRoot(); PlainDirectoryNodeBean root = (PlainDirectoryNodeBean)rep.getRoot();
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
"britt",
"britt",
time,
time,
time);
session.save(attrs);
PlainDirectoryNodeBean newRoot = new PlainDirectoryNodeBeanImpl(nodeIssuer.issue(), PlainDirectoryNodeBean newRoot = new PlainDirectoryNodeBeanImpl(nodeIssuer.issue(),
version, version,
0L, 0L,
@@ -124,8 +141,11 @@ public class TestPopulate extends TestCase
null, null,
null, null,
rep, rep,
attrs,
true); true);
ContentBean content = new ContentBeanImpl(contentIssuer.issue()); ContentBean content = new ContentBeanImpl(contentIssuer.issue());
attrs = new BasicAttributesBeanImpl(attrs);
session.save(attrs);
PlainFileNodeBean file = new PlainFileNodeBeanImpl(nodeIssuer.issue(), PlainFileNodeBean file = new PlainFileNodeBeanImpl(nodeIssuer.issue(),
version, version,
0L, 0L,
@@ -133,6 +153,7 @@ public class TestPopulate extends TestCase
null, null,
newRoot, newRoot,
rep, rep,
attrs,
content); content);
content.setRefCount(content.getRefCount() + 1); content.setRefCount(content.getRefCount() + 1);
newRoot.getChildren().put("foo", new DirectoryEntry(AVMNodeType.PLAIN_FILE, file)); newRoot.getChildren().put("foo", new DirectoryEntry(AVMNodeType.PLAIN_FILE, file));
@@ -141,6 +162,8 @@ public class TestPopulate extends TestCase
content = new ContentBeanImpl(contentIssuer.issue()); content = new ContentBeanImpl(contentIssuer.issue());
content.setRefCount(content.getRefCount() + 1); content.setRefCount(content.getRefCount() + 1);
file.setIsNew(false); file.setIsNew(false);
attrs = new BasicAttributesBeanImpl(attrs);
session.save(attrs);
file = new PlainFileNodeBeanImpl(nodeIssuer.issue(), file = new PlainFileNodeBeanImpl(nodeIssuer.issue(),
version, version,
0L, 0L,
@@ -148,6 +171,7 @@ public class TestPopulate extends TestCase
null, null,
newRoot, newRoot,
rep, rep,
attrs,
content); content);
session.save(content); session.save(content);
file.setIsNew(false); file.setIsNew(false);
@@ -187,11 +211,11 @@ public class TestPopulate extends TestCase
{ {
public void perform(Session session) public void perform(Session session)
{ {
RepositoryBean rep = (RepositoryBean)session.get(RepositoryBeanImpl.class, 0L); RepositoryBean rep = (RepositoryBean)session.get(RepositoryBeanImpl.class, "main");
PlainDirectoryNodeBean root = (PlainDirectoryNodeBean)rep.getRoot(); PlainDirectoryNodeBean root = (PlainDirectoryNodeBean)rep.getRoot();
PlainDirectoryNodeBean prev = (PlainDirectoryNodeBean)root.getAncestor(); PlainDirectoryNodeBean prev = (PlainDirectoryNodeBean)root.getAncestor();
rep.getRoots().remove(rep.getRoot().getId());
rep.setRoot(prev); rep.setRoot(prev);
rep.getRoots().remove(1);
for (String name : root.getChildren().keySet()) for (String name : root.getChildren().keySet())
{ {
AVMNodeBean child = root.getChildren().get(name).getChild(); AVMNodeBean child = root.getChildren().get(name).getChild();

View File

@@ -393,11 +393,11 @@ public class AVMServiceImpl implements AVMService
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMService#getRepositoryVersions(java.lang.String) * @see org.alfresco.repo.avm.AVMService#getRepositoryVersions(java.lang.String)
*/ */
public Set<Integer> getRepositoryVersions(final String name) public Set<Long> getRepositoryVersions(final String name)
{ {
class HTxnCallback implements HibernateTxnCallback class HTxnCallback implements HibernateTxnCallback
{ {
public Set<Integer> versions; public Set<Long> versions;
public void perform(Session session) public void perform(Session session)
{ {

View File

@@ -26,10 +26,12 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.avm.AVMNode; import org.alfresco.repo.avm.AVMNode;
import org.alfresco.repo.avm.AVMNodeFactory;
import org.alfresco.repo.avm.DirectoryNode; import org.alfresco.repo.avm.DirectoryNode;
import org.alfresco.repo.avm.FileContent; import org.alfresco.repo.avm.FileContent;
import org.alfresco.repo.avm.FileNode; import org.alfresco.repo.avm.FileNode;
import org.alfresco.repo.avm.FolderEntry; import org.alfresco.repo.avm.FolderEntry;
import org.alfresco.repo.avm.Layered;
import org.alfresco.repo.avm.LayeredDirectoryNode; import org.alfresco.repo.avm.LayeredDirectoryNode;
import org.alfresco.repo.avm.LayeredFileNode; import org.alfresco.repo.avm.LayeredFileNode;
import org.alfresco.repo.avm.Lookup; import org.alfresco.repo.avm.Lookup;
@@ -38,6 +40,8 @@ import org.alfresco.repo.avm.PlainFileNode;
import org.alfresco.repo.avm.Repository; import org.alfresco.repo.avm.Repository;
import org.alfresco.repo.avm.SuperRepository; import org.alfresco.repo.avm.SuperRepository;
import org.alfresco.repo.avm.hibernate.AVMNodeBean; import org.alfresco.repo.avm.hibernate.AVMNodeBean;
import org.alfresco.repo.avm.hibernate.BasicAttributesBean;
import org.alfresco.repo.avm.hibernate.BasicAttributesBeanImpl;
import org.alfresco.repo.avm.hibernate.DirectoryEntry; import org.alfresco.repo.avm.hibernate.DirectoryEntry;
import org.alfresco.repo.avm.hibernate.DirectoryNodeBean; import org.alfresco.repo.avm.hibernate.DirectoryNodeBean;
import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBean; import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBean;
@@ -71,6 +75,14 @@ public class RepositoryImpl implements Repository
fSuper = superRepo; fSuper = superRepo;
fData = new RepositoryBeanImpl(name, null); fData = new RepositoryBeanImpl(name, null);
fSuper.getSession().save(fData); fSuper.getSession().save(fData);
long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
"britt",
"britt",
time,
time,
time);
superRepo.getSession().save(attrs);
PlainDirectoryNodeBean rootBean = PlainDirectoryNodeBean rootBean =
new PlainDirectoryNodeBeanImpl(fSuper.issueID(), new PlainDirectoryNodeBeanImpl(fSuper.issueID(),
fData.getNextVersionID(), fData.getNextVersionID(),
@@ -79,6 +91,7 @@ public class RepositoryImpl implements Repository
null, null,
null, null,
fData, fData,
attrs,
true // is root true // is root
); );
fSuper.getSession().save(rootBean); fSuper.getSession().save(rootBean);
@@ -349,13 +362,13 @@ public class RepositoryImpl implements Repository
dstDir.addChild(dstName, dstNode, dPath); dstDir.addChild(dstName, dstNode, dPath);
} }
// TODO Should this be propagated out to SuperRepository.
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.repo.avm.Repository#getVersions() * @see org.alfresco.repo.avm.Repository#getVersions()
*/ */
public Set<Integer> getVersions() public Set<Long> getVersions()
{ {
// TODO Auto-generated method stub return fData.getRoots().keySet();
return null;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -363,8 +376,7 @@ public class RepositoryImpl implements Repository
*/ */
public RepositoryBean getDataBean() public RepositoryBean getDataBean()
{ {
// TODO Auto-generated method stub return fData;
return null;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -372,8 +384,7 @@ public class RepositoryImpl implements Repository
*/ */
public SuperRepository getSuperRepository() public SuperRepository getSuperRepository()
{ {
// TODO Auto-generated method stub return fSuper;
return null;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -381,8 +392,52 @@ public class RepositoryImpl implements Repository
*/ */
public Lookup lookup(int version, String path) public Lookup lookup(int version, String path)
{ {
// TODO Auto-generated method stub Lookup result = new Lookup(this, fData.getName());
return null; if (path.length() == 0)
{
throw new AlfrescoRuntimeException("Invalid path: " + path);
}
String[] pathElements = path.split("/");
DirectoryNode dir = null;
if (version < 0)
{
dir = (DirectoryNode)AVMNodeFactory.CreateFromBean(fData.getRoot());
}
else
{
AVMNodeBean bean = fData.getRoots().get(version);
if (bean == null)
{
throw new AlfrescoRuntimeException("Invalid version: " + version);
}
dir = (DirectoryNode)AVMNodeFactory.CreateFromBean(bean);
}
result.add(dir, "");
if (pathElements.length == 0)
{
return result;
}
for (int i = 0; i < pathElements.length - 1; i++)
{
AVMNode child = dir.lookupChild(result, pathElements[i], version);
if (child == null)
{
throw new AlfrescoRuntimeException("Not found: " + pathElements[i]);
}
if (!(child instanceof DirectoryNode))
{
throw new AlfrescoRuntimeException("Not a directory: " + pathElements[i]);
}
dir = (DirectoryNode)child;
result.add(dir, pathElements[i]);
}
AVMNode child = dir.lookupChild(result, pathElements[pathElements.length - 1], version);
if (child == null)
{
throw new AlfrescoRuntimeException("Not found: " + pathElements[pathElements.length - 1]);
}
result.add(child, pathElements[pathElements.length - 1]);
return result;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -390,8 +445,12 @@ public class RepositoryImpl implements Repository
*/ */
public Lookup lookupDirectory(int version, String path) public Lookup lookupDirectory(int version, String path)
{ {
// TODO Auto-generated method stub Lookup lPath = lookup(version, path);
return null; if (!(lPath.getCurrentNode() instanceof DirectoryNode))
{
throw new AlfrescoRuntimeException("Not a directory: " + path);
}
return lPath;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -399,7 +458,12 @@ public class RepositoryImpl implements Repository
*/ */
public String getIndirectionPath(int version, String path) public String getIndirectionPath(int version, String path)
{ {
// TODO Auto-generated method stub Lookup lPath = lookup(version, path);
return null; AVMNode node = lPath.getCurrentNode();
if (node instanceof Layered)
{
return ((Layered)node).getUnderlying(lPath);
}
throw new AlfrescoRuntimeException("Not a layered node: " + path);
} }
} }

View File

@@ -374,7 +374,7 @@ public class SuperRepositoryImpl implements SuperRepository
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.repo.avm.SuperRepository#getRepositoryVersions(java.lang.String) * @see org.alfresco.repo.avm.SuperRepository#getRepositoryVersions(java.lang.String)
*/ */
public Set<Integer> getRepositoryVersions(String name) public Set<Long> getRepositoryVersions(String name)
{ {
Repository rep = getRepositoryByName(name); Repository rep = getRepositoryByName(name);
return rep.getVersions(); return rep.getVersions();