diff --git a/source/java/org/alfresco/repo/avm/AVMService.java b/source/java/org/alfresco/repo/avm/AVMService.java index 680fabc669..37d0a32997 100644 --- a/source/java/org/alfresco/repo/avm/AVMService.java +++ b/source/java/org/alfresco/repo/avm/AVMService.java @@ -154,7 +154,7 @@ public interface AVMService * @param name The name of the Repository. * @return A Set of version IDs */ - public Set getRepositoryVersions(String name); + public Set getRepositoryVersions(String name); /** * Lookup a node by version ids and path. Note that an AVMNode is essentially diff --git a/source/java/org/alfresco/repo/avm/Layered.java b/source/java/org/alfresco/repo/avm/Layered.java new file mode 100644 index 0000000000..d527451e26 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/Layered.java @@ -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); +} diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java index 2b3d9d7424..1934913eb6 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java @@ -23,6 +23,8 @@ import java.util.Map; import java.util.TreeMap; 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.LayeredDirectoryNodeBean; 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. * @author britt */ -public class LayeredDirectoryNode extends DirectoryNode +public class LayeredDirectoryNode extends DirectoryNode implements Layered { /** * The underlying bean data. @@ -55,6 +57,14 @@ public class LayeredDirectoryNode extends DirectoryNode */ 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(), -1, -1, @@ -62,6 +72,7 @@ public class LayeredDirectoryNode extends DirectoryNode null, null, repos.getDataBean(), + attrs, -1, indirection); setDataBean(fData); @@ -74,8 +85,15 @@ public class LayeredDirectoryNode extends DirectoryNode * @param repos The Repository object we use. */ 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(), -1, -1, @@ -83,11 +101,12 @@ public class LayeredDirectoryNode extends DirectoryNode null, null, repos.getDataBean(), + attrs, -1, other.getUnderlying()); - fData.setAdded(((LayeredDirectoryNodeBean)other.getDataBean()).getAdded()); - fData.setDeleted(((LayeredDirectoryNodeBean)other.getDataBean()).getDeleted()); - fData.setPrimaryIndirection(((LayeredDirectoryNodeBean)other.getDataBean()).getPrimaryIndirection()); + fData.setAdded(thatBean.getAdded()); + fData.setDeleted(thatBean.getDeleted()); + fData.setPrimaryIndirection(thatBean.getPrimaryIndirection()); repos.getSuperRepository().getSession().save(fData); } @@ -101,6 +120,12 @@ public class LayeredDirectoryNode extends DirectoryNode Repository repos, 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(), -1, -1, @@ -108,6 +133,7 @@ public class LayeredDirectoryNode extends DirectoryNode null, null, repos.getDataBean(), + attrs, -1, null); // TODO Is this right? @@ -116,6 +142,7 @@ public class LayeredDirectoryNode extends DirectoryNode repos.getSuperRepository().getSession().save(fData); } + // TODO Something. public LayeredDirectoryNode(DirectoryNode dir, Repository repo, Lookup srcLookup, diff --git a/source/java/org/alfresco/repo/avm/LayeredFileNode.java b/source/java/org/alfresco/repo/avm/LayeredFileNode.java index 57e047737c..ddb69497e8 100644 --- a/source/java/org/alfresco/repo/avm/LayeredFileNode.java +++ b/source/java/org/alfresco/repo/avm/LayeredFileNode.java @@ -18,6 +18,8 @@ package org.alfresco.repo.avm; 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.LayeredFileNodeBeanImpl; @@ -25,7 +27,7 @@ import org.alfresco.repo.avm.hibernate.LayeredFileNodeBeanImpl; * A LayeredFileNode behaves like a copy on write symlink. * @author britt */ -public class LayeredFileNode extends FileNode +public class LayeredFileNode extends FileNode implements Layered { /** * The data bean. @@ -66,6 +68,14 @@ public class LayeredFileNode extends FileNode */ 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(), -1L, -1L, @@ -73,6 +83,7 @@ public class LayeredFileNode extends FileNode null, null, repo.getDataBean(), + attrs, indirection); repo.getSuperRepository().getSession().save(fData); setDataBean(fData); @@ -135,4 +146,12 @@ public class LayeredFileNode extends FileNode assert false : "Never happens"; return null; } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.Layered#getUnderlying(org.alfresco.repo.avm.Lookup) + */ + public String getUnderlying(Lookup lookup) + { + return fData.getIndirection(); + } } diff --git a/source/java/org/alfresco/repo/avm/PlainDirectoryNode.java b/source/java/org/alfresco/repo/avm/PlainDirectoryNode.java index e0fdc28cc7..7c7ec9b1aa 100644 --- a/source/java/org/alfresco/repo/avm/PlainDirectoryNode.java +++ b/source/java/org/alfresco/repo/avm/PlainDirectoryNode.java @@ -21,6 +21,8 @@ import java.util.HashMap; import java.util.Map; 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.PlainDirectoryNodeBean; import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBeanImpl; @@ -42,6 +44,14 @@ public class PlainDirectoryNode extends DirectoryNode */ 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(), repo.getLatestVersion(), 0L, @@ -49,6 +59,7 @@ public class PlainDirectoryNode extends DirectoryNode null, null, repo.getDataBean(), + attrs, false); repo.getSuperRepository().getSession().save(fData); } @@ -71,6 +82,12 @@ public class PlainDirectoryNode extends DirectoryNode public PlainDirectoryNode(PlainDirectoryNode other, 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(), -1, -1, @@ -78,6 +95,7 @@ public class PlainDirectoryNode extends DirectoryNode null, null, repos.getDataBean(), + attrs, false); setDataBean(fData); fData.setChildren(new HashMap(((PlainDirectoryNodeBean)other.getDataBean()).getChildren())); diff --git a/source/java/org/alfresco/repo/avm/PlainFileNode.java b/source/java/org/alfresco/repo/avm/PlainFileNode.java index a3c83c76d5..9158baf3f2 100644 --- a/source/java/org/alfresco/repo/avm/PlainFileNode.java +++ b/source/java/org/alfresco/repo/avm/PlainFileNode.java @@ -17,6 +17,8 @@ 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.ContentBeanImpl; import org.alfresco.repo.avm.hibernate.PlainFileNodeBean; @@ -50,6 +52,14 @@ public class PlainFileNode extends FileNode public PlainFileNode(Repository repos) { 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(), -1, -1, @@ -57,6 +67,7 @@ public class PlainFileNode extends FileNode null, null, repos.getDataBean(), + attrs, content); content.setRefCount(1); // Transitive persistence should take care of content. @@ -72,6 +83,12 @@ public class PlainFileNode extends FileNode public PlainFileNode(PlainFileNode other, 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(), -1, -1, @@ -79,6 +96,7 @@ public class PlainFileNode extends FileNode null, null, repos.getDataBean(), + attrs, other.fData.getContent()); repos.getSuperRepository().getSession().save(fData); fData.getContent().setRefCount(fData.getContent().getRefCount() + 1); diff --git a/source/java/org/alfresco/repo/avm/Repository.java b/source/java/org/alfresco/repo/avm/Repository.java index 7dc1ea28b8..105d6dde43 100644 --- a/source/java/org/alfresco/repo/avm/Repository.java +++ b/source/java/org/alfresco/repo/avm/Repository.java @@ -131,7 +131,7 @@ public interface Repository * Get the version ids that this Repository has. * @return A Set of Version IDs. */ - public Set getVersions(); + public Set getVersions(); /** * Get the data bean. diff --git a/source/java/org/alfresco/repo/avm/SuperRepository.java b/source/java/org/alfresco/repo/avm/SuperRepository.java index b484c33e28..82c225dfa0 100644 --- a/source/java/org/alfresco/repo/avm/SuperRepository.java +++ b/source/java/org/alfresco/repo/avm/SuperRepository.java @@ -165,7 +165,7 @@ public interface SuperRepository * @param name The name of the repository. * @return A Set of IDs. */ - public Set getRepositoryVersions(String name); + public Set getRepositoryVersions(String name); /** * Issue a unique identifier for a new node. diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNode.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/AVMNode.hbm.xml index 1a943c71a3..187bbfa48b 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNode.hbm.xml +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMNode.hbm.xml @@ -10,6 +10,9 @@ + + @@ -95,4 +98,17 @@ + + + + + + + + + + + + diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBean.java b/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBean.java index 330080b585..18a2c3f00c 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBean.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBean.java @@ -131,4 +131,16 @@ public interface AVMNodeBean * @return The version. */ 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(); } \ No newline at end of file diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBeanImpl.java index 82445f3db4..894bbe62a8 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBeanImpl.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMNodeBeanImpl.java @@ -58,6 +58,11 @@ public class AVMNodeBeanImpl implements AVMNodeBean */ private RepositoryBean fRepository; + /** + * The BasicAttributes. + */ + private BasicAttributesBean fBasicAttributes; + /** * Whether this node is new (and should therefore not be COWed). */ @@ -91,7 +96,8 @@ public class AVMNodeBeanImpl implements AVMNodeBean AVMNodeBean ancestor, AVMNodeBean mergedFrom, DirectoryNodeBean parent, - RepositoryBean repository) + RepositoryBean repository, + BasicAttributesBean attrs) { fID = id; fVersionID = versionID; @@ -101,6 +107,7 @@ public class AVMNodeBeanImpl implements AVMNodeBean fParent = parent; fRepository = repository; fIsNew = true; + fBasicAttributes = attrs; } /* (non-Javadoc) @@ -272,4 +279,20 @@ public class AVMNodeBeanImpl implements AVMNodeBean { 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; + } } diff --git a/source/java/org/alfresco/repo/avm/hibernate/BasicAttributesBean.java b/source/java/org/alfresco/repo/avm/hibernate/BasicAttributesBean.java new file mode 100644 index 0000000000..98868fa375 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/hibernate/BasicAttributesBean.java @@ -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(); +} diff --git a/source/java/org/alfresco/repo/avm/hibernate/BasicAttributesBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/BasicAttributesBeanImpl.java new file mode 100644 index 0000000000..b24a7249a1 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/hibernate/BasicAttributesBeanImpl.java @@ -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; + } +} diff --git a/source/java/org/alfresco/repo/avm/hibernate/DirectoryNodeBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/DirectoryNodeBeanImpl.java index 129e971c8e..8f03ee82a7 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/DirectoryNodeBeanImpl.java +++ b/source/java/org/alfresco/repo/avm/hibernate/DirectoryNodeBeanImpl.java @@ -46,8 +46,9 @@ public class DirectoryNodeBeanImpl extends AVMNodeBeanImpl implements DirectoryN AVMNodeBean ancestor, AVMNodeBean mergedFrom, 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); } } diff --git a/source/java/org/alfresco/repo/avm/hibernate/FileNodeBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/FileNodeBeanImpl.java index cf32eb2457..9eb85c0c42 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/FileNodeBeanImpl.java +++ b/source/java/org/alfresco/repo/avm/hibernate/FileNodeBeanImpl.java @@ -47,8 +47,9 @@ public class FileNodeBeanImpl extends AVMNodeBeanImpl implements FileNodeBean AVMNodeBean ancestor, AVMNodeBean mergedFrom, 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); } } diff --git a/source/java/org/alfresco/repo/avm/hibernate/LayeredDirectoryNodeBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/LayeredDirectoryNodeBeanImpl.java index 2f20297b60..d2476fb3eb 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/LayeredDirectoryNodeBeanImpl.java +++ b/source/java/org/alfresco/repo/avm/hibernate/LayeredDirectoryNodeBeanImpl.java @@ -81,10 +81,11 @@ public class LayeredDirectoryNodeBeanImpl extends DirectoryNodeBeanImpl implemen AVMNodeBean mergedFrom, DirectoryNodeBean parent, RepositoryBean repository, + BasicAttributesBean attrs, long layerID, String indirection) { - super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); + super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs); fLayerID = layerID; fIndirection = indirection; fAdded = new HashMap(); diff --git a/source/java/org/alfresco/repo/avm/hibernate/LayeredFileNodeBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/LayeredFileNodeBeanImpl.java index a033e69eb9..5fe835b0de 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/LayeredFileNodeBeanImpl.java +++ b/source/java/org/alfresco/repo/avm/hibernate/LayeredFileNodeBeanImpl.java @@ -54,9 +54,10 @@ public class LayeredFileNodeBeanImpl extends FileNodeBeanImpl implements AVMNodeBean mergedFrom, DirectoryNodeBean parent, RepositoryBean repository, + BasicAttributesBean attrs, String indirection) { - super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); + super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs); fIndirection = indirection; } diff --git a/source/java/org/alfresco/repo/avm/hibernate/PlainDirectoryNodeBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/PlainDirectoryNodeBeanImpl.java index aa302146be..7877f611e5 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/PlainDirectoryNodeBeanImpl.java +++ b/source/java/org/alfresco/repo/avm/hibernate/PlainDirectoryNodeBeanImpl.java @@ -61,9 +61,10 @@ public class PlainDirectoryNodeBeanImpl extends DirectoryNodeBeanImpl implements AVMNodeBean mergedFrom, DirectoryNodeBean parent, RepositoryBean repository, + BasicAttributesBean attrs, boolean isRoot) { - super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); + super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs); fChildren = new HashMap(); fIsRoot = isRoot; } diff --git a/source/java/org/alfresco/repo/avm/hibernate/PlainFileNodeBeanImpl.java b/source/java/org/alfresco/repo/avm/hibernate/PlainFileNodeBeanImpl.java index 2837cbbffb..932009ce33 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/PlainFileNodeBeanImpl.java +++ b/source/java/org/alfresco/repo/avm/hibernate/PlainFileNodeBeanImpl.java @@ -54,9 +54,10 @@ public class PlainFileNodeBeanImpl extends FileNodeBeanImpl implements PlainFile AVMNodeBean mergedFrom, DirectoryNodeBean parent, RepositoryBean repository, + BasicAttributesBean attrs, ContentBean content) { - super(id, versionID, branchID, ancestor, mergedFrom, parent, repository); + super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs); fContent = content; } diff --git a/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java b/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java index 0d5a1d20fb..1f2d2189e8 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java @@ -80,7 +80,15 @@ public class TestPopulate extends TestCase Issuer contentIssuer = new Issuer("content", 0); Issuer repositoryIssuer = new Issuer("repository", 0); // Make the initial root directory. - PlainDirectoryNodeBean root = + long time = System.currentTimeMillis(); + BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt", + "britt", + "britt", + time, + time, + time); + session.save(attrs); + PlainDirectoryNodeBean root = new PlainDirectoryNodeBeanImpl(nodeIssuer.issue(), 0, 0, @@ -88,6 +96,7 @@ public class TestPopulate extends TestCase null, null, null, + attrs, true); // Make a new repository. RepositoryBean rep = @@ -112,11 +121,19 @@ public class TestPopulate extends TestCase // Now read some things back, and modify some stuff. Issuer nodeIssuer = (Issuer)session.get(Issuer.class, "node"); 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(); rep.setNextVersionID(version + 1); assertTrue(rep != null); 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(), version, 0L, @@ -124,8 +141,11 @@ public class TestPopulate extends TestCase null, null, rep, + attrs, true); ContentBean content = new ContentBeanImpl(contentIssuer.issue()); + attrs = new BasicAttributesBeanImpl(attrs); + session.save(attrs); PlainFileNodeBean file = new PlainFileNodeBeanImpl(nodeIssuer.issue(), version, 0L, @@ -133,6 +153,7 @@ public class TestPopulate extends TestCase null, newRoot, rep, + attrs, content); content.setRefCount(content.getRefCount() + 1); 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.setRefCount(content.getRefCount() + 1); file.setIsNew(false); + attrs = new BasicAttributesBeanImpl(attrs); + session.save(attrs); file = new PlainFileNodeBeanImpl(nodeIssuer.issue(), version, 0L, @@ -148,6 +171,7 @@ public class TestPopulate extends TestCase null, newRoot, rep, + attrs, content); session.save(content); file.setIsNew(false); @@ -187,11 +211,11 @@ public class TestPopulate extends TestCase { 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 prev = (PlainDirectoryNodeBean)root.getAncestor(); + rep.getRoots().remove(rep.getRoot().getId()); rep.setRoot(prev); - rep.getRoots().remove(1); for (String name : root.getChildren().keySet()) { AVMNodeBean child = root.getChildren().get(name).getChild(); diff --git a/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java index eae37355ea..3af00463b8 100644 --- a/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java @@ -393,11 +393,11 @@ public class AVMServiceImpl implements AVMService /* (non-Javadoc) * @see org.alfresco.repo.avm.AVMService#getRepositoryVersions(java.lang.String) */ - public Set getRepositoryVersions(final String name) + public Set getRepositoryVersions(final String name) { class HTxnCallback implements HibernateTxnCallback { - public Set versions; + public Set versions; public void perform(Session session) { diff --git a/source/java/org/alfresco/repo/avm/impl/RepositoryImpl.java b/source/java/org/alfresco/repo/avm/impl/RepositoryImpl.java index 152da9d45f..23241f56e9 100644 --- a/source/java/org/alfresco/repo/avm/impl/RepositoryImpl.java +++ b/source/java/org/alfresco/repo/avm/impl/RepositoryImpl.java @@ -26,10 +26,12 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.avm.AVMNode; +import org.alfresco.repo.avm.AVMNodeFactory; import org.alfresco.repo.avm.DirectoryNode; import org.alfresco.repo.avm.FileContent; import org.alfresco.repo.avm.FileNode; import org.alfresco.repo.avm.FolderEntry; +import org.alfresco.repo.avm.Layered; import org.alfresco.repo.avm.LayeredDirectoryNode; import org.alfresco.repo.avm.LayeredFileNode; 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.SuperRepository; 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.DirectoryNodeBean; import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBean; @@ -71,6 +75,14 @@ public class RepositoryImpl implements Repository fSuper = superRepo; fData = new RepositoryBeanImpl(name, null); fSuper.getSession().save(fData); + long time = System.currentTimeMillis(); + BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt", + "britt", + "britt", + time, + time, + time); + superRepo.getSession().save(attrs); PlainDirectoryNodeBean rootBean = new PlainDirectoryNodeBeanImpl(fSuper.issueID(), fData.getNextVersionID(), @@ -79,6 +91,7 @@ public class RepositoryImpl implements Repository null, null, fData, + attrs, true // is root ); fSuper.getSession().save(rootBean); @@ -349,13 +362,13 @@ public class RepositoryImpl implements Repository dstDir.addChild(dstName, dstNode, dPath); } + // TODO Should this be propagated out to SuperRepository. /* (non-Javadoc) * @see org.alfresco.repo.avm.Repository#getVersions() */ - public Set getVersions() + public Set getVersions() { - // TODO Auto-generated method stub - return null; + return fData.getRoots().keySet(); } /* (non-Javadoc) @@ -363,8 +376,7 @@ public class RepositoryImpl implements Repository */ public RepositoryBean getDataBean() { - // TODO Auto-generated method stub - return null; + return fData; } /* (non-Javadoc) @@ -372,8 +384,7 @@ public class RepositoryImpl implements Repository */ public SuperRepository getSuperRepository() { - // TODO Auto-generated method stub - return null; + return fSuper; } /* (non-Javadoc) @@ -381,8 +392,52 @@ public class RepositoryImpl implements Repository */ public Lookup lookup(int version, String path) { - // TODO Auto-generated method stub - return null; + Lookup result = new Lookup(this, fData.getName()); + 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) @@ -390,8 +445,12 @@ public class RepositoryImpl implements Repository */ public Lookup lookupDirectory(int version, String path) { - // TODO Auto-generated method stub - return null; + Lookup lPath = lookup(version, path); + if (!(lPath.getCurrentNode() instanceof DirectoryNode)) + { + throw new AlfrescoRuntimeException("Not a directory: " + path); + } + return lPath; } /* (non-Javadoc) @@ -399,7 +458,12 @@ public class RepositoryImpl implements Repository */ public String getIndirectionPath(int version, String path) { - // TODO Auto-generated method stub - return null; + Lookup lPath = lookup(version, path); + AVMNode node = lPath.getCurrentNode(); + if (node instanceof Layered) + { + return ((Layered)node).getUnderlying(lPath); + } + throw new AlfrescoRuntimeException("Not a layered node: " + path); } } diff --git a/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java b/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java index 706c73ee76..0bbc68c490 100644 --- a/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java +++ b/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java @@ -374,7 +374,7 @@ public class SuperRepositoryImpl implements SuperRepository /* (non-Javadoc) * @see org.alfresco.repo.avm.SuperRepository#getRepositoryVersions(java.lang.String) */ - public Set getRepositoryVersions(String name) + public Set getRepositoryVersions(String name) { Repository rep = getRepositoryByName(name); return rep.getVersions();