Retyped a counter so had to muck with many beans. Forced creation of layered directories

to work.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@2930 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-05-21 21:59:41 +00:00
parent dd585adedf
commit df28c98983
30 changed files with 349 additions and 384 deletions

View File

@@ -105,7 +105,7 @@ public abstract class AVMNode
* Set the version number.
* @param version The version number to set.
*/
public void setVersion(long version)
public void setVersion(int version)
{
fData.setVersionID(version);
}
@@ -212,15 +212,6 @@ public abstract class AVMNode
fData.setRepository(repo.getDataBean());
}
/**
* Get the Repository we 'belong' to.
* @return The Repository.
*/
public Repository getRepository()
{
return RepositoryFactory.GetInstance().createFromBean(fData.getRepository());
}
/**
* Get the data bean in this node.
* @return The data bean.
@@ -242,5 +233,11 @@ public abstract class AVMNode
/**
* Get the type of this node.
*/
public abstract AVMNodeType getType();
public abstract int getType();
/**
* Get a debugging string representation.
* @param lPath The Lookup.
*/
public abstract String toString(Lookup lPath);
}

View File

@@ -41,8 +41,11 @@ public class AVMNodeFactory
{
return null;
}
HibernateProxy proxy = (HibernateProxy)bean;
bean = (AVMNodeBean)proxy.getHibernateLazyInitializer().getImplementation();
if (bean instanceof HibernateProxy)
{
HibernateProxy proxy = (HibernateProxy)bean;
bean = (AVMNodeBean)proxy.getHibernateLazyInitializer().getImplementation();
}
if (bean instanceof PlainFileNodeBean)
{
return new PlainFileNode((PlainFileNodeBean)bean);

View File

@@ -21,10 +21,10 @@ package org.alfresco.repo.avm;
* This defines the different types of FolderEntrys.
* @author britt
*/
public enum AVMNodeType
public interface AVMNodeType
{
PLAIN_FILE,
LAYERED_FILE,
PLAIN_DIRECTORY,
LAYERED_DIRECTORY
public static final int PLAIN_FILE = 0;
public static final int LAYERED_FILE = 1;
public static final int PLAIN_DIRECTORY = 2;
public static final int LAYERED_DIRECTORY = 3;
}

View File

@@ -149,22 +149,26 @@ public interface AVMService
*/
public void createSnapshot(List<String> repositories);
/**
* Snapshot the given repository.
* @param repository The name of the repository to snapshot.
*/
public void createSnapshot(String repository);
/**
* Get the set of version IDs in a Repository
* @param name The name of the Repository.
* @return A Set of version IDs
*/
public Set<Long> getRepositoryVersions(String name);
public Set<Integer> getRepositoryVersions(String name);
/**
* Lookup a node by version ids and path. Note that an AVMNode is essentially
* informational only. There is very little you can do to an AVMNode in the absence
* of path information.
* Lookup a node by version ids and path.
* @param version The version id to look under.
* @param path The simple absolute path to the parent directory.
* @return An AVMNode.
* @return A Lookup object.
*/
public AVMNode lookup(int version, String path);
public Lookup lookup(int version, String path);
/**
* Get the indirection path for a layered file or directory.

View File

@@ -17,7 +17,10 @@
package org.alfresco.repo.avm;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.alfresco.repo.avm.hibernate.HibernateHelper;
import org.alfresco.repo.avm.impl.AVMServiceImpl;
@@ -76,10 +79,8 @@ public class AVMServiceTest extends TestCase
try
{
fService.createDirectory("main:/", "testdir");
ArrayList<String> toSnapshot = new ArrayList<String>();
toSnapshot.add("main");
fService.createSnapshot(toSnapshot);
AVMNode node = fService.lookup(-1, "main:/");
fService.createSnapshot("main");
AVMNode node = fService.lookup(-1, "main:/").getCurrentNode();
assertTrue(node instanceof PlainDirectoryNode);
}
catch (Exception e)
@@ -99,9 +100,20 @@ public class AVMServiceTest extends TestCase
testCreateDirectory();
fService.createFile("main:testdir", "testfile");
fService.createFile("main:/", "testfile2");
ArrayList<String> toSnapshot = new ArrayList<String>();
toSnapshot.add("main");
fService.createSnapshot(toSnapshot);
fService.createSnapshot("main");
PrintStream out = new PrintStream(fService.getFileOutputStream("main:testdir/testfile"));
out.println("This is testdir/testfile");
out.close();
out = new PrintStream(fService.getFileOutputStream("main:testfile2"));
out.println("This is testfile2");
out.close();
fService.createSnapshot("main");
Set<Integer> versions = fService.getRepositoryVersions("main");
for (Integer version : versions)
{
System.out.println("V:" + version);
System.out.println(recursiveList("main", version));
}
}
catch (Exception e)
{
@@ -109,4 +121,118 @@ public class AVMServiceTest extends TestCase
fail();
}
}
/**
* Test creating a branch.
*/
public void testCreateBranch()
{
try
{
setupBasicTree();
fService.createBranch(-1, "main:a", "main:d/e", "abranch");
fService.createSnapshot("main");
Set<Integer> versions = fService.getRepositoryVersions("main");
for (Integer version : versions)
{
System.out.println("V:" + version);
System.out.println(recursiveList("main", version));
}
List<FolderEntry> original = fService.getDirectoryListing(-1, "main:a");
List<FolderEntry> branch = fService.getDirectoryListing(-1, "main:d/e/abranch");
assertEquals(original, branch);
}
catch (Exception e)
{
e.printStackTrace(System.err);
fail();
}
}
/**
* Test creating a layer.
*/
public void testCreateLayer()
{
try
{
setupBasicTree();
fService.createLayeredDirectory("main:a", "main:d/e", "alayer");
fService.createSnapshot("main");
System.out.println(recursiveList("main", -1));
List<FolderEntry> original = fService.getDirectoryListing(-1, "main:a");
List<FolderEntry> layer = fService.getDirectoryListing(-1, "main:d/e/alayer");
assertEquals(original, layer);
}
catch (Exception e)
{
e.printStackTrace(System.err);
fail();
}
}
/**
* Helper to write a recursive listing of a repository at a given version.
* @param repoName The name of the repository.
* @param version The version to look under.
*/
private String recursiveList(String repoName, int version)
{
return recursiveList(repoName + ":/", version, 0);
}
/**
* Recursive list the given path.
* @param path The path.
* @param version The version.
* @param indent The current indent level.
*/
private String recursiveList(String path, int version, int indent)
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < indent; i++)
{
builder.append(' ');
}
builder.append(path);
builder.append(' ');
Lookup lookup = fService.lookup(version, path);
AVMNode node = lookup.getCurrentNode();
builder.append(node.toString(lookup));
builder.append('\n');
if (node instanceof DirectoryNode)
{
String basename = path.endsWith("/") ? path.substring(0, path.length() - 1) : path + "/";
List<FolderEntry> listing = fService.getDirectoryListing(version, path);
for (FolderEntry entry : listing)
{
builder.append(recursiveList(basename + entry.getName(), version, indent + 2));
}
}
return builder.toString();
}
/**
* Setup a basic tree.
*/
private void setupBasicTree()
{
fService.createDirectory("main:/", "a");
fService.createDirectory("main:a", "b");
fService.createDirectory("main:a/b", "c");
fService.createDirectory("main:/", "d");
fService.createDirectory("main:d", "e");
fService.createDirectory("main:d/e", "f");
fService.createFile("main:a/b/c", "foo");
PrintStream out = new PrintStream(fService.getFileOutputStream("main:a/b/c/foo"));
out.println("I am main:a/b/c/foo");
out.close();
fService.createFile("main:a/b/c", "bar");
out = new PrintStream(fService.getFileOutputStream("main:a/b/c/bar"));
out.println("I am main:a/b/c/bar");
out.close();
ArrayList<String> toSnapshot = new ArrayList<String>();
toSnapshot.add("main");
fService.createSnapshot(toSnapshot);
}
}

View File

@@ -28,7 +28,7 @@ public abstract class FileNode extends AVMNode
* @param version The version to get in.
* @return A FileContent object.
*/
public abstract FileContent getContentForRead(int version);
public abstract FileContent getContentForRead(int version, Repository repo);
/**
* Get the content object for writing. This will do COW

View File

@@ -32,7 +32,7 @@ public class FolderEntry
/**
* The type of the entry.
*/
private AVMNodeType fType;
private int fType;
/**
* @return the name
@@ -53,7 +53,7 @@ public class FolderEntry
/**
* @return the type
*/
public AVMNodeType getType()
public int getType()
{
return fType;
}
@@ -61,8 +61,35 @@ public class FolderEntry
/**
* @param type the type to set
*/
public void setType(AVMNodeType type)
public void setType(int type)
{
fType = type;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (!(obj instanceof FolderEntry))
{
return false;
}
FolderEntry other = (FolderEntry)obj;
return fName.equals(other.fName) && fType == other.fType;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
return fName.hashCode() + fType;
}
}

View File

@@ -78,6 +78,7 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
repos.getDataBean(),
attrs,
-1,
true,
indirection);
setDataBean(fData);
repos.getSuperRepository().getSession().save(fData);
@@ -108,11 +109,12 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
repos.getDataBean(),
attrs,
-1,
thatBean.getPrimaryIndirection(),
other.getUnderlying());
setDataBean(fData);
fData.setAdded(thatBean.getAdded());
fData.setDeleted(thatBean.getDeleted());
fData.setPrimaryIndirection(thatBean.getPrimaryIndirection());
// fData.setPrimaryIndirection(thatBean.getPrimaryIndirection());
repos.getSuperRepository().getSession().save(fData);
}
@@ -140,11 +142,12 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
repos.getDataBean(),
attrs,
-1,
false,
null);
setDataBean(fData);
// TODO Is this right? I don't think so.
// fData.setAdded(other.getListing(lPath, -1));
fData.setPrimaryIndirection(false);
// fData.setPrimaryIndirection(false);
repos.getSuperRepository().getSession().save(fData);
}
@@ -178,9 +181,9 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
repo.getDataBean(),
attrs,
-1,
true,
srcLookup.getIndirectionPath() + "/" + name);
setDataBean(fData);
fData.setPrimaryIndirection(true);
repo.getSuperRepository().getSession().save(fData);
}
@@ -252,7 +255,6 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
{
LayeredDirectoryNode dir = (LayeredDirectoryNode)parent;
setLayerID(dir.getLayerID());
setRepository(parent.getRepository());
}
}
@@ -324,7 +326,7 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
{
try
{
Lookup lookup = getRepository().getSuperRepository().lookupDirectory(-1, getUnderlying(lPath));
Lookup lookup = lPath.getRepository().getSuperRepository().lookupDirectory(-1, getUnderlying(lPath));
DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode();
if (dir.lookupChild(lookup, name, -1) != null)
{
@@ -339,7 +341,7 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
DirectoryNode toModify = (DirectoryNode)copyOnWrite(lPath);
toModify.putChild(name, child);
child.setParent(toModify);
child.setRepository(toModify.getRepository());
child.setRepository(lPath.getRepository());
return true;
}
@@ -359,7 +361,7 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
Map<String, DirectoryEntry> baseListing = null;
try
{
Lookup lookup = getRepository().getSuperRepository().lookupDirectory(version, getUnderlying(lPath));
Lookup lookup = lPath.getRepository().getSuperRepository().lookupDirectory(version, getUnderlying(lPath));
DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode();
baseListing = dir.getListing(lookup, version);
}
@@ -396,7 +398,7 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
AVMNode child = null;
try
{
Lookup lookup = getRepository().getSuperRepository().lookupDirectory(version, getUnderlying(lPath));
Lookup lookup = lPath.getRepository().getSuperRepository().lookupDirectory(version, getUnderlying(lPath));
DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode();
child = dir.lookupChild(lookup, name, version);
}
@@ -446,7 +448,7 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
{
try
{
Lookup lookup = getRepository().getSuperRepository().lookupDirectory(-1, getUnderlying(lPath));
Lookup lookup = lPath.getRepository().getSuperRepository().lookupDirectory(-1, getUnderlying(lPath));
DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode();
if (dir.lookupChild(lookup, name, -1) == null)
{
@@ -467,8 +469,16 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMNode#getType()
*/
public AVMNodeType getType()
public int getType()
{
return AVMNodeType.LAYERED_DIRECTORY;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString(Lookup lPath)
{
return "[LD:" + fData.getId() + ":" + getUnderlying(lPath) + "]";
}
}

View File

@@ -61,7 +61,7 @@ public class LayeredFileNode extends FileNode implements Layered
attrs.setLastModifier("britt");
fData =
new LayeredFileNodeBeanImpl(repo.getSuperRepository().issueID(),
-1L,
-1,
-1L,
null,
null,
@@ -98,7 +98,7 @@ public class LayeredFileNode extends FileNode implements Layered
attrs.setLastModifier("britt");
fData =
new LayeredFileNodeBeanImpl(repos.getSuperRepository().issueID(),
-1L,
-1,
-1L,
null,
null,
@@ -125,7 +125,7 @@ public class LayeredFileNode extends FileNode implements Layered
time,
time);
fData = new LayeredFileNodeBeanImpl(repo.getSuperRepository().issueID(),
-1L,
-1,
-1L,
null,
null,
@@ -143,10 +143,6 @@ public class LayeredFileNode extends FileNode implements Layered
*/
public void handlePostCopy(DirectoryNode parent)
{
if (parent != null)
{
setRepository(parent.getRepository());
}
}
/**
@@ -158,7 +154,7 @@ public class LayeredFileNode extends FileNode implements Layered
// LayeredFileNodes are always copied.
// TODO This is busted. Need to set the PlainFileNode contents
// to share with underlying file node.
PlainFileNode newMe = new PlainFileNode(getRepository());
PlainFileNode newMe = new PlainFileNode(lPath.getRepository());
newMe.setAncestor(this);
return newMe;
}
@@ -167,7 +163,7 @@ public class LayeredFileNode extends FileNode implements Layered
* Get the type of this node.
* @return The type.
*/
public AVMNodeType getType()
public int getType()
{
return AVMNodeType.LAYERED_FILE;
}
@@ -176,16 +172,16 @@ public class LayeredFileNode extends FileNode implements Layered
* Get the content of the specified version.
* @return A FileContent object.
*/
public FileContent getContentForRead(int version)
public FileContent getContentForRead(int version, Repository repo)
{
Lookup lookup = getRepository().getSuperRepository().lookup(version, fData.getIndirection());
Lookup lookup = repo.getSuperRepository().lookup(version, fData.getIndirection());
AVMNode node = lookup.getCurrentNode();
if (!(node instanceof FileNode))
{
throw new AlfrescoRuntimeException("Missing Link.");
}
FileNode file = (FileNode)node;
return file.getContentForRead(version);
return file.getContentForRead(version, repo);
}
/**
@@ -204,4 +200,12 @@ public class LayeredFileNode extends FileNode implements Layered
{
return fData.getIndirection();
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString(Lookup lPath)
{
return "[LF:" + fData.getId() + ":" + fData.getIndirection() + "]";
}
}

View File

@@ -277,7 +277,9 @@ public class Lookup
*/
public String getCurrentIndirection()
{
return fComponents.get(fPosition).getIndirection();
String value = fComponents.get(fPosition).getIndirection();
System.err.println(value);
return value;
}
/**

View File

@@ -216,10 +216,6 @@ public class PlainDirectoryNode extends DirectoryNode
*/
public void handlePostCopy(DirectoryNode parent)
{
if (parent != null)
{
setRepository(parent.getRepository());
}
}
/**
@@ -255,8 +251,17 @@ public class PlainDirectoryNode extends DirectoryNode
* Get the type of this node.
* @return The type of this node.
*/
public AVMNodeType getType()
public int getType()
{
return AVMNodeType.PLAIN_DIRECTORY;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMNode#toString(org.alfresco.repo.avm.Lookup)
*/
@Override
public String toString(Lookup lPath)
{
return "[PD:" + fData.getId() + "]";
}
}

View File

@@ -104,19 +104,6 @@ public class PlainFileNode extends FileNode
setDataBean(fData);
}
// TODO I believe this is unnecessary (bhp)
/**
* Handle setting repository after a COW.
* @param parent The possibly new parent directory.
*/
public void handlePostCopy(DirectoryNode parent)
{
if (parent != null)
{
setRepository(parent.getRepository());
}
}
/**
* Copy on write logic.
* @param lPath The lookup path.
@@ -127,7 +114,7 @@ public class PlainFileNode extends FileNode
{
return null;
}
PlainFileNode newMe = new PlainFileNode(this, getRepository());
PlainFileNode newMe = new PlainFileNode(this, lPath.getRepository());
newMe.setAncestor(this);
newMe.setBranchID(lPath.getHighestBranch());
return newMe;
@@ -137,7 +124,7 @@ public class PlainFileNode extends FileNode
* Get the type of this node.
* @return The type.
*/
public AVMNodeType getType()
public int getType()
{
return AVMNodeType.PLAIN_FILE;
}
@@ -145,7 +132,7 @@ public class PlainFileNode extends FileNode
/**
* Get content for reading.
*/
public FileContent getContentForRead(int version)
public FileContent getContentForRead(int version, Repository repo)
{
return new FileContent(fData.getContent());
}
@@ -164,4 +151,21 @@ public class PlainFileNode extends FileNode
}
return fc;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMNode#toString(org.alfresco.repo.avm.Lookup)
*/
@Override
public String toString(Lookup lPath)
{
return "[PF:" + fData.getId() + "]";
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMNode#handlePostCopy(org.alfresco.repo.avm.DirectoryNode)
*/
@Override
public void handlePostCopy(DirectoryNode parent)
{
}
}

View File

@@ -43,7 +43,7 @@ public interface Repository
* Get the latest version id.
* @return The latest version.
*/
public long getLatestVersion();
public int getLatestVersion();
/**
* Inform this Repository that the root node is new.
@@ -131,7 +131,7 @@ public interface Repository
* Get the version ids that this Repository has.
* @return A Set of Version IDs.
*/
public Set<Long> getVersions();
public Set<Integer> getVersions();
/**
* Get the data bean.

View File

@@ -114,6 +114,12 @@ public interface SuperRepository
*/
public void createSnapshot(List<String> repositories);
/**
* Create a snapshot of a single repository.
* @param repository The name of the repsository.
*/
public void createSnapshot(String repository);
// Different flavors of deletions.
/**
@@ -165,7 +171,7 @@ public interface SuperRepository
* @param name The name of the repository.
* @return A Set of IDs.
*/
public Set<Long> getRepositoryVersions(String name);
public Set<Integer> getRepositoryVersions(String name);
/**
* Issue a unique identifier for a new node.

View File

@@ -34,7 +34,7 @@
won't cause violations in the db during saves. -->
<many-to-one name="repository" column="repository"
class="RepositoryBeanImpl" cascade="save-update"/>
<property name="versionID" type="long" column="version_id"
<property name="versionID" type="int" column="version_id"
not-null="true"/>
<!-- The branch id is always 0 for nodes that are not part of
a branch. -->
@@ -80,8 +80,8 @@
<!-- A DirectoryEntry is a (node)type AVMNode reference pair.
Should probably convert type into an integer code. -->
<composite-element class="DirectoryEntry">
<property name="type" column="type_name"
type="string" length="30" not-null="true" />
<property name="type" column="type_code"
type="int" not-null="true" />
<many-to-one name="child"
class="AVMNodeBeanImpl" cascade="save-update"
not-null="true">
@@ -106,14 +106,14 @@
this probably wants to be in the base class. -->
<property name="isRoot" column="is_root" type="boolean" />
<!-- A map of names to DirectoryEntries. In the AVM world, it makes sense
that nodes don't know there own names, only there containers do. -->
that nodes don't know there own names, only their containers do. -->
<map name="children" cascade="all">
<key column="directory_id" />
<map-key type="string" column="name" />
<composite-element
class="org.alfresco.repo.avm.hibernate.DirectoryEntry">
<property name="type" type="string"
not-null="true" length="30" column="type_name" />
<property name="type" type="int"
not-null="true" column="type_code" />
<many-to-one name="child"
class="org.alfresco.repo.avm.hibernate.AVMNodeBeanImpl"
not-null="true" cascade="save-update">
@@ -176,7 +176,7 @@
<cache usage="read-write" />
<id name="name" column="name" type="string"/>
<version name="vers" column="vers" type="long"/>
<property type="long" name="nextVersionID"
<property type="int" name="nextVersionID"
column="next_version_id" not-null="true"/>
<!-- Every Repository has a root directory that is the current root directory. -->
<!-- This should be not-null but hibernate (or my own idiocy) makes that difficult. -->
@@ -187,7 +187,7 @@
of versioned root directories. -->
<map name="roots" table="repository_roots">
<key column="repository_id"/>
<map-key type="long" column="version_id"/>
<map-key type="int" column="version_id"/>
<many-to-many class="DirectoryNodeBeanImpl"
column="directory_id"/>
</map>

View File

@@ -39,13 +39,13 @@ public interface AVMNodeBean
* Set the version id.
* @param id The version id of the node.
*/
public void setVersionID(long id);
public void setVersionID(int id);
/**
* Get the version id of this node.
* @return The version id.
*/
public long getVersionID();
public int getVersionID();
/**
* Set the parent of this node. This is only a canonical parent,

View File

@@ -31,7 +31,7 @@ public class AVMNodeBeanImpl implements AVMNodeBean
/**
* The Version ID
*/
private long fVersionID;
private int fVersionID;
/**
* The Branch ID
@@ -91,7 +91,7 @@ public class AVMNodeBeanImpl implements AVMNodeBean
* @param repository The repository.
*/
public AVMNodeBeanImpl(long id,
long versionID,
int versionID,
long branchID,
AVMNodeBean ancestor,
AVMNodeBean mergedFrom,
@@ -155,7 +155,7 @@ public class AVMNodeBeanImpl implements AVMNodeBean
/* (non-Javadoc)
* @see org.alfresco.proto.avm.AVMNode#setVersionID(int)
*/
public void setVersionID(long id)
public void setVersionID(int id)
{
fVersionID = id;
}
@@ -163,7 +163,7 @@ public class AVMNodeBeanImpl implements AVMNodeBean
/* (non-Javadoc)
* @see org.alfresco.proto.avm.AVMNode#getVersionID()
*/
public long getVersionID()
public int getVersionID()
{
return fVersionID;
}

View File

@@ -28,7 +28,7 @@ public class DirectoryEntry
/**
* The type of entry a node is.
*/
private AVMNodeType fType;
private int fType;
/**
* This is the actual child Node.
@@ -47,31 +47,13 @@ public class DirectoryEntry
* @param type The type.
* @param child The child node.
*/
public DirectoryEntry(AVMNodeType type, AVMNodeBean child)
public DirectoryEntry(int type, AVMNodeBean child)
{
fType = type;
fChild = child;
}
/**
* Set the entry type.
* @param type The type to set.
*/
public void setEntryType(AVMNodeType type)
{
fType = type;
}
/**
* Get the entry type.
* @return The type.
*/
public AVMNodeType getEntryType()
{
return fType;
}
/**
/**
* Set the child.
* @param child The child to set.
*/
@@ -91,19 +73,19 @@ public class DirectoryEntry
/**
* Set the type by name.
* @param name The name of the type.
* @param type The type.
*/
public void setType(String name)
public void setType(int type)
{
fType = Enum.valueOf(AVMNodeType.class, name);
fType = type;
}
/**
* Get the type name.
* Get the type.
*/
public String getType()
public int getType()
{
return fType.name();
return fType;
}
/* (non-Javadoc)
@@ -138,6 +120,6 @@ public class DirectoryEntry
@Override
public String toString()
{
return "[" + fType.name() + "] " + fChild.getId();
return "[" + fType + "] " + fChild.getId();
}
}

View File

@@ -41,7 +41,7 @@ public class DirectoryNodeBeanImpl extends AVMNodeBeanImpl implements DirectoryN
* @param parent The parent.
*/
public DirectoryNodeBeanImpl(long id,
long versionID,
int versionID,
long branchID,
AVMNodeBean ancestor,
AVMNodeBean mergedFrom,

View File

@@ -42,7 +42,7 @@ public class FileNodeBeanImpl extends AVMNodeBeanImpl implements FileNodeBean
* @param parent The parent.
*/
public FileNodeBeanImpl(long id,
long versionID,
int versionID,
long branchID,
AVMNodeBean ancestor,
AVMNodeBean mergedFrom,

View File

@@ -72,10 +72,11 @@ public class LayeredDirectoryNodeBeanImpl extends DirectoryNodeBeanImpl implemen
* @param mergedFrom The node that merged into us.
* @param parent The parent node.
* @param layerID The layer id of this node.
* @param primary Whether this is a primary indirection node.
* @param indirection The indirection pointer of this.
*/
public LayeredDirectoryNodeBeanImpl(long id,
long versionID,
int versionID,
long branchID,
AVMNodeBean ancestor,
AVMNodeBean mergedFrom,
@@ -83,10 +84,12 @@ public class LayeredDirectoryNodeBeanImpl extends DirectoryNodeBeanImpl implemen
RepositoryBean repository,
BasicAttributesBean attrs,
long layerID,
boolean primary,
String indirection)
{
super(id, versionID, branchID, ancestor, mergedFrom, parent, repository, attrs);
fLayerID = layerID;
fPrimaryIndirection = primary;
fIndirection = indirection;
fAdded = new HashMap<String, DirectoryEntry>();
fDeleted = new HashSet<String>();

View File

@@ -48,7 +48,7 @@ public class LayeredFileNodeBeanImpl extends FileNodeBeanImpl implements
* @param indirection The indirection pointer.
*/
public LayeredFileNodeBeanImpl(long id,
long versionID,
int versionID,
long branchID,
AVMNodeBean ancestor,
AVMNodeBean mergedFrom,

View File

@@ -55,7 +55,7 @@ public class PlainDirectoryNodeBeanImpl extends DirectoryNodeBeanImpl implements
* @param isRoot Whether this is a root node.
*/
public PlainDirectoryNodeBeanImpl(long id,
long versionID,
int versionID,
long branchID,
AVMNodeBean ancestor,
AVMNodeBean mergedFrom,

View File

@@ -48,7 +48,7 @@ public class PlainFileNodeBeanImpl extends FileNodeBeanImpl implements PlainFile
* @param content The content object.
*/
public PlainFileNodeBeanImpl(long id,
long versionID,
int versionID,
long branchID,
AVMNodeBean ancestor,
AVMNodeBean mergedFrom,

View File

@@ -55,25 +55,25 @@ public interface RepositoryBean
* Set the roots map.
* @param roots The Map of version ids to roots.
*/
public void setRoots(Map<Long, DirectoryNodeBean> roots);
public void setRoots(Map<Integer, DirectoryNodeBean> roots);
/**
* Get the roots map.
* @return The roots map.
*/
public Map<Long, DirectoryNodeBean> getRoots();
public Map<Integer, DirectoryNodeBean> getRoots();
/**
* Set the next version id.
* @param nextVersionID The value to set.
*/
public void setNextVersionID(long nextVersionID);
public void setNextVersionID(int nextVersionID);
/**
* Get the next version id.
* @return The next version id.
*/
public long getNextVersionID();
public int getNextVersionID();
/**
* Set the new nodes.

View File

@@ -41,12 +41,12 @@ public class RepositoryBeanImpl implements RepositoryBean
/**
* The root directories for all versions.
*/
private Map<Long, DirectoryNodeBean> fRoots;
private Map<Integer, DirectoryNodeBean> fRoots;
/**
* The next version id.
*/
private long fNextVersionID;
private int fNextVersionID;
/**
* The nodes that are new since the last end operation.
@@ -76,7 +76,7 @@ public class RepositoryBeanImpl implements RepositoryBean
fName = name;
fNextVersionID = 0;
fRoot = root;
fRoots = new HashMap<Long, DirectoryNodeBean>();
fRoots = new HashMap<Integer, DirectoryNodeBean>();
fNewNodes = new HashSet<AVMNodeBean>();
}
@@ -115,7 +115,7 @@ public class RepositoryBeanImpl implements RepositoryBean
/* (non-Javadoc)
* @see org.alfresco.proto.avm.Repository#setRoots(java.util.Map)
*/
public void setRoots(Map<Long, DirectoryNodeBean> roots)
public void setRoots(Map<Integer, DirectoryNodeBean> roots)
{
fRoots = roots;
}
@@ -123,7 +123,7 @@ public class RepositoryBeanImpl implements RepositoryBean
/* (non-Javadoc)
* @see org.alfresco.proto.avm.Repository#getRoots()
*/
public Map<Long, DirectoryNodeBean> getRoots()
public Map<Integer, DirectoryNodeBean> getRoots()
{
return fRoots;
}
@@ -131,7 +131,7 @@ public class RepositoryBeanImpl implements RepositoryBean
/* (non-Javadoc)
* @see org.alfresco.proto.avm.Repository#setNextVersionID(int)
*/
public void setNextVersionID(long nextVersionID)
public void setNextVersionID(int nextVersionID)
{
fNextVersionID = nextVersionID;
}
@@ -139,7 +139,7 @@ public class RepositoryBeanImpl implements RepositoryBean
/* (non-Javadoc)
* @see org.alfresco.proto.avm.Repository#getNextVersionID()
*/
public long getNextVersionID()
public int getNextVersionID()
{
return fNextVersionID;
}

View File

@@ -1,233 +0,0 @@
/*
* 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.hibernate;
import org.alfresco.repo.avm.AVMNodeType;
import org.alfresco.repo.avm.hibernate.ContentBean;
import org.alfresco.repo.avm.hibernate.ContentBeanImpl;
import org.alfresco.repo.avm.hibernate.HibernateHelper;
import org.alfresco.repo.avm.hibernate.HibernateTxn;
import org.alfresco.repo.avm.hibernate.HibernateTxnCallback;
import org.alfresco.repo.avm.hibernate.Issuer;
import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBean;
import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBeanImpl;
import org.alfresco.repo.avm.hibernate.PlainFileNodeBean;
import org.alfresco.repo.avm.hibernate.PlainFileNodeBeanImpl;
import org.alfresco.repo.avm.hibernate.RepositoryBean;
import org.alfresco.repo.avm.hibernate.RepositoryBeanImpl;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import junit.framework.TestCase;
public class TestPopulate extends TestCase
{
/**
* The SessionFactory.
*/
private SessionFactory fSessionFactory;
public TestPopulate(String name)
{
super(name);
}
protected void setUp() throws Exception
{
fSessionFactory = HibernateHelper.GetSessionFactory();
Configuration cfg = HibernateHelper.GetConfiguration();
SchemaExport se = new SchemaExport(cfg);
se.drop(false, true);
se.create(false, true);
}
protected void tearDown() throws Exception
{
}
/**
* Add some data to persistent store.
*/
public void testPopulate()
{
try
{
HibernateTxn hTxn = new HibernateTxn(fSessionFactory);
boolean result = hTxn.perform(
new HibernateTxnCallback()
{
public void perform(Session session)
{
// Set up issuers.
Issuer nodeIssuer = new Issuer("node", 0, session);
new Issuer("content", 0, session);
new Issuer("repository", 0, session);
// Make the initial root directory.
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,
null,
null,
null,
null,
attrs,
true);
// Make a new repository.
RepositoryBean rep =
new RepositoryBeanImpl("main", root);
root.setRepository(rep);
session.save(rep);
rep.getRoots().put(rep.getNextVersionID(), root);
rep.setNextVersionID(rep.getNextVersionID() + 1);
root.setIsNew(false);
}
});
assertTrue(result);
System.out.println("--------------------------------------------");
result = hTxn.perform(
new HibernateTxnCallback()
{
public void perform(Session session)
{
// 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, "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,
root,
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,
null,
null,
newRoot,
rep,
attrs,
content);
content.setRefCount(content.getRefCount() + 1);
newRoot.getChildren().put("foo", new DirectoryEntry(AVMNodeType.PLAIN_FILE, file));
session.save(content);
session.save(newRoot);
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,
null,
null,
newRoot,
rep,
attrs,
content);
session.save(content);
file.setIsNew(false);
newRoot.getChildren().put("bar", new DirectoryEntry(AVMNodeType.PLAIN_FILE, file));
rep.setRoot(newRoot);
rep.getRoots().put(version, newRoot);
newRoot.setIsNew(false);
}
});
assertTrue(result);
System.out.println("-----------------------------------------------");
result = hTxn.perform(
new HibernateTxnCallback()
{
public void perform(Session session)
{
Query query = session.createQuery("from RepositoryBeanImpl r where r.name = :name");
query.setString("name", "main");
RepositoryBean rep = (RepositoryBean)query.uniqueResult();
PlainDirectoryNodeBean root = (PlainDirectoryNodeBean)rep.getRoot();
assertEquals(2, root.getChildren().size());
for (String name : root.getChildren().keySet())
{
System.out.println(name);
}
for (DirectoryEntry entry : root.getChildren().values())
{
assertEquals(AVMNodeType.PLAIN_FILE, entry.getEntryType());
}
assertEquals("britt", root.getBasicAttributes().getCreator());
}
});
assertTrue(result);
System.out.println("----------------------------------------------");
// Just check cascading deletes for the children of a directory.
result = hTxn.perform(
new HibernateTxnCallback()
{
public void perform(Session session)
{
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);
for (String name : root.getChildren().keySet())
{
AVMNodeBean child = root.getChildren().get(name).getChild();
child.setParent(null);
}
session.delete(root);
}
});
assertTrue(result);
}
catch (Exception e)
{
e.printStackTrace(System.err);
fail();
}
}
}

View File

@@ -22,7 +22,6 @@ import java.io.OutputStream;
import java.util.List;
import java.util.Set;
import org.alfresco.repo.avm.AVMNode;
import org.alfresco.repo.avm.AVMService;
import org.alfresco.repo.avm.FolderEntry;
import org.alfresco.repo.avm.Lookup;
@@ -363,10 +362,27 @@ public class AVMServiceImpl implements AVMService
fTransaction.perform(doit);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMService#createSnapshot(java.lang.String)
*/
public void createSnapshot(final String repository)
{
class HTxnCallback implements HibernateTxnCallback
{
public void perform(Session session)
{
fSuperRepository.set(new SuperRepositoryImpl(session, fStorage));
fSuperRepository.get().createSnapshot(repository);
}
}
HTxnCallback doit = new HTxnCallback();
fTransaction.perform(doit);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMService#lookup(int, java.lang.String)
*/
public AVMNode lookup(final int version, final String path)
public Lookup lookup(final int version, final String path)
{
class HTxnCallback implements HibernateTxnCallback
{
@@ -380,7 +396,7 @@ public class AVMServiceImpl implements AVMService
}
HTxnCallback doit = new HTxnCallback();
fTransaction.perform(doit);
return doit.lookup.getCurrentNode();
return doit.lookup;
}
/* (non-Javadoc)
@@ -440,11 +456,11 @@ public class AVMServiceImpl implements AVMService
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMService#getRepositoryVersions(java.lang.String)
*/
public Set<Long> getRepositoryVersions(final String name)
public Set<Integer> getRepositoryVersions(final String name)
{
class HTxnCallback implements HibernateTxnCallback
{
public Set<Long> versions;
public Set<Integer> versions;
public void perform(Session session)
{

View File

@@ -122,7 +122,7 @@ public class RepositoryImpl implements Repository
/* (non-Javadoc)
* @see org.alfresco.repo.avm.Repository#getLatestVersion()
*/
public long getLatestVersion()
public int getLatestVersion()
{
return fData.getNextVersionID();
}
@@ -261,7 +261,7 @@ public class RepositoryImpl implements Repository
throw new AlfrescoRuntimeException("Not a file: " + path + " r " + version);
}
FileNode file = (FileNode)node;
FileContent content = file.getContentForRead(version);
FileContent content = file.getContentForRead(version, this);
return content.getInputStream(fSuper);
}
@@ -278,7 +278,7 @@ public class RepositoryImpl implements Repository
{
FolderEntry item = new FolderEntry();
item.setName(name);
item.setType(listing.get(name).getEntryType());
item.setType(listing.get(name).getType());
results.add(item);
}
return results;
@@ -376,7 +376,7 @@ public class RepositoryImpl implements Repository
/* (non-Javadoc)
* @see org.alfresco.repo.avm.Repository#getVersions()
*/
public Set<Long> getVersions()
public Set<Integer> getVersions()
{
return fData.getRoots().keySet();
}

View File

@@ -335,6 +335,15 @@ public class SuperRepositoryImpl implements SuperRepository
}
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.SuperRepository#createSnapshot(java.lang.String)
*/
public void createSnapshot(String repository)
{
Repository repo = getRepositoryByName(repository);
repo.createSnapshot();
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.SuperRepository#remove(java.lang.String, java.lang.String)
*/
@@ -394,7 +403,7 @@ public class SuperRepositoryImpl implements SuperRepository
/* (non-Javadoc)
* @see org.alfresco.repo.avm.SuperRepository#getRepositoryVersions(java.lang.String)
*/
public Set<Long> getRepositoryVersions(String name)
public Set<Integer> getRepositoryVersions(String name)
{
Repository rep = getRepositoryByName(name);
return rep.getVersions();