First round trip. A unit test instantiates an AVMService and creates a new empty

repository.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@2926 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-05-19 21:59:37 +00:00
parent f4980f8ddd
commit 72751fdedb
7 changed files with 121 additions and 12 deletions

View File

@@ -0,0 +1,67 @@
/*
* Copyright (C) 2006 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.repo.avm;
import org.alfresco.repo.avm.hibernate.HibernateHelper;
import org.alfresco.repo.avm.impl.AVMServiceImpl;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import junit.framework.TestCase;
/**
* Big test of AVM behavior.
* @author britt
*/
public class AVMServiceTest extends TestCase
{
/**
* The AVMService we are testing.
*/
private AVMService fService;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception
{
Configuration cfg = HibernateHelper.GetConfiguration();
SchemaExport se = new SchemaExport(cfg);
se.drop(false, true);
AVMServiceImpl service = new AVMServiceImpl();
service.setStorage("storage");
service.init(true);
fService = service;
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception
{
}
/**
* Test Nothing. Just make sure set up works.
*/
public void testNothing()
{
}
}

View File

@@ -19,8 +19,6 @@ package org.alfresco.repo.avm;
import org.alfresco.repo.avm.hibernate.BasicAttributesBean; import org.alfresco.repo.avm.hibernate.BasicAttributesBean;
import org.alfresco.repo.avm.hibernate.BasicAttributesBeanImpl; 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; import org.alfresco.repo.avm.hibernate.PlainFileNodeBean;
import org.alfresco.repo.avm.hibernate.PlainFileNodeBeanImpl; import org.alfresco.repo.avm.hibernate.PlainFileNodeBeanImpl;

View File

@@ -17,6 +17,8 @@
package org.alfresco.repo.avm.hibernate; package org.alfresco.repo.avm.hibernate;
import org.hibernate.Session;
/** /**
* This is a helper class that knows how to issue identifiers. * This is a helper class that knows how to issue identifiers.
* @author britt * @author britt
@@ -51,10 +53,11 @@ public class Issuer
* @param name The name of this issuer. * @param name The name of this issuer.
* @param next The next number to issue. * @param next The next number to issue.
*/ */
public Issuer(String name, long next) public Issuer(String name, long next, Session session)
{ {
fName = name; fName = name;
fNext = next; fNext = next;
session.save(this);
} }
// Bean methods. // Bean methods.

View File

@@ -76,9 +76,9 @@ public class TestPopulate extends TestCase
public void perform(Session session) public void perform(Session session)
{ {
// Set up issuers. // Set up issuers.
Issuer nodeIssuer = new Issuer("node", 0); Issuer nodeIssuer = new Issuer("node", 0, session);
Issuer contentIssuer = new Issuer("content", 0); Issuer contentIssuer = new Issuer("content", 0, session);
Issuer repositoryIssuer = new Issuer("repository", 0); Issuer repositoryIssuer = new Issuer("repository", 0, session);
// Make the initial root directory. // Make the initial root directory.
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt", BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt",
@@ -105,9 +105,6 @@ public class TestPopulate extends TestCase
session.save(rep); session.save(rep);
rep.getRoots().put(rep.getNextVersionID(), root); rep.getRoots().put(rep.getNextVersionID(), root);
rep.setNextVersionID(rep.getNextVersionID() + 1); rep.setNextVersionID(rep.getNextVersionID() + 1);
session.save(nodeIssuer);
session.save(contentIssuer);
session.save(repositoryIssuer);
root.setIsNew(false); root.setIsNew(false);
} }
}); });

View File

@@ -30,8 +30,10 @@ import org.alfresco.repo.avm.SuperRepository;
import org.alfresco.repo.avm.hibernate.HibernateHelper; import org.alfresco.repo.avm.hibernate.HibernateHelper;
import org.alfresco.repo.avm.hibernate.HibernateTxn; import org.alfresco.repo.avm.hibernate.HibernateTxn;
import org.alfresco.repo.avm.hibernate.HibernateTxnCallback; import org.alfresco.repo.avm.hibernate.HibernateTxnCallback;
import org.alfresco.repo.avm.hibernate.Issuer;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/** /**
* Implements the AVMService. Stub. * Implements the AVMService. Stub.
@@ -61,13 +63,46 @@ public class AVMServiceImpl implements AVMService
/** /**
* Basic constructor for the service. * Basic constructor for the service.
* @param createTables Flag for whether tables should be created.
*/ */
public AVMServiceImpl() public AVMServiceImpl()
{ {
fSuperRepository = new ThreadLocal<SuperRepository>();
fSessionFactory = HibernateHelper.GetSessionFactory(); fSessionFactory = HibernateHelper.GetSessionFactory();
fTransaction = new HibernateTxn(fSessionFactory); fTransaction = new HibernateTxn(fSessionFactory);
} }
/**
* Final initialization of the service. Must be called only on a
* fully initialized instance.
* @param createTables Whether we should create tables, and a default
* repository.
*/
public void init(boolean createTables)
{
if (createTables)
{
SchemaExport se = new SchemaExport(HibernateHelper.GetConfiguration());
se.drop(false, true);
se.create(false, true);
class HTxnCallback implements HibernateTxnCallback
{
public InputStream in = null;
public void perform(Session session)
{
new Issuer("node", 0L, session);
new Issuer("content", 0L, session);
new Issuer("branch", 0L, session);
new Issuer("layer", 0L, session);
}
};
HTxnCallback doit = new HTxnCallback();
fTransaction.perform(doit);
createRepository("main");
}
}
/** /**
* Set the location of file storage. * Set the location of file storage.
* @param storage * @param storage

View File

@@ -98,7 +98,7 @@ public class RepositoryImpl implements Repository
fSuper.getSession().save(rootBean); fSuper.getSession().save(rootBean);
fData.setRoot(rootBean); fData.setRoot(rootBean);
fData.getRoots().put(fData.getNextVersionID(), rootBean); fData.getRoots().put(fData.getNextVersionID(), rootBean);
fData.setNextVersionID(fData.getNextVersionID() + 1); fData.setNextVersionID(fData.getNextVersionID());
} }
/** /**

View File

@@ -153,13 +153,16 @@ public class SuperRepositoryImpl implements SuperRepository
String [] pathParts = SplitPath(srcPath); String [] pathParts = SplitPath(srcPath);
Repository srcRepo = getRepositoryByName(pathParts[0]); Repository srcRepo = getRepositoryByName(pathParts[0]);
Lookup sPath = srcRepo.lookup(version, pathParts[1]); Lookup sPath = srcRepo.lookup(version, pathParts[1]);
// Lookup the destination direcctory. // Lookup the destination directory.
pathParts = SplitPath(dstPath); pathParts = SplitPath(dstPath);
Repository dstRepo = getRepositoryByName(pathParts[0]); Repository dstRepo = getRepositoryByName(pathParts[0]);
Lookup dPath = dstRepo.lookupDirectory(-1, pathParts[1]); Lookup dPath = dstRepo.lookupDirectory(-1, pathParts[1]);
DirectoryNode dirNode = (DirectoryNode)dPath.getCurrentNode(); DirectoryNode dirNode = (DirectoryNode)dPath.getCurrentNode();
AVMNode srcNode = sPath.getCurrentNode(); AVMNode srcNode = sPath.getCurrentNode();
AVMNode dstNode = null; AVMNode dstNode = null;
// We do different things depending on what kind of thing we're
// branching from. I'd be considerably happier if we disallowed
// certain scenarios, but Jon won't let me :P (bhp).
if (srcNode instanceof PlainDirectoryNode) if (srcNode instanceof PlainDirectoryNode)
{ {
dstNode = new PlainDirectoryNode((PlainDirectoryNode)srcNode, dstRepo); dstNode = new PlainDirectoryNode((PlainDirectoryNode)srcNode, dstRepo);
@@ -200,6 +203,7 @@ public class SuperRepositoryImpl implements SuperRepository
public void rename(String srcPath, String srcName, String dstPath, public void rename(String srcPath, String srcName, String dstPath,
String dstName) String dstName)
{ {
// This is about as ugly as it gets.
String [] pathParts = SplitPath(srcPath); String [] pathParts = SplitPath(srcPath);
Repository srcRepo = getRepositoryByName(pathParts[0]); Repository srcRepo = getRepositoryByName(pathParts[0]);
Lookup sPath = srcRepo.lookupDirectory(-1, pathParts[1]); Lookup sPath = srcRepo.lookupDirectory(-1, pathParts[1]);
@@ -246,6 +250,8 @@ public class SuperRepositoryImpl implements SuperRepository
} }
else if (srcNode instanceof LayeredDirectoryNode) else if (srcNode instanceof LayeredDirectoryNode)
{ {
// TODO I think I need to subdivide this logic again.
// based on whether the destination is a layer or not.
if (!sPath.isLayered() || (sPath.isInThisLayer() && if (!sPath.isLayered() || (sPath.isInThisLayer() &&
srcDir instanceof LayeredDirectoryNode && srcDir instanceof LayeredDirectoryNode &&
((LayeredDirectoryNode)srcDir).directlyContains(srcNode))) ((LayeredDirectoryNode)srcDir).directlyContains(srcNode)))
@@ -295,6 +301,9 @@ public class SuperRepositoryImpl implements SuperRepository
srcDir.removeChild(srcName, sPath); srcDir.removeChild(srcName, sPath);
} }
// TODO Should we allow cross-repository sliding. Tentatively no, because
// it serves no earthly purpose. God knows we need to trim the combinatorial
// tree of possibilities.
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.repo.avm.SuperRepository#slide(java.lang.String, java.lang.String, java.lang.String, java.lang.String) * @see org.alfresco.repo.avm.SuperRepository#slide(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/ */
@@ -502,7 +511,7 @@ public class SuperRepositoryImpl implements SuperRepository
} }
/** /**
* Utility to split a path, foo:/bar/baz into its repository and path parts. * Utility to split a path, foo:bar/baz into its repository and path parts.
* @param path The fully qualified path. * @param path The fully qualified path.
* @return The repository name and the repository path. * @return The repository name and the repository path.
*/ */