Added QNameDAO.updateNamespaceEntity and related tests

- To use directly, get the 'qnameDAO' bean; it implements the QNameDAO interface.
 - The new namespace must not exist
 - No reindexing is done


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@11002 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2008-09-24 12:02:10 +00:00
parent 2f5abd7e0d
commit 3b29abbe17
3 changed files with 60 additions and 0 deletions

View File

@@ -67,6 +67,16 @@ public interface QNameDAO
*/ */
NamespaceEntity newNamespaceEntity(String namespaceUri); NamespaceEntity newNamespaceEntity(String namespaceUri);
/**
* Modifies an existing namespace URI. If the new URI already exists, then no
* new entity is created and a concurrency
*
* @param oldNamespaceUri the old namespace URI
* @param newNamespaceUri the new namespace URI
* @throws AlfrescoRuntimeException if the new namespace is in use
*/
void updateNamespaceEntity(String oldNamespaceUri, String newNamespaceUri);
/** /**
* @param id the unique ID of the entity * @param id the unique ID of the entity
* @return the QName entity (never null) * @return the QName entity (never null)

View File

@@ -92,6 +92,34 @@ public class QNameDAOTest extends TestCase
retryingTransactionHelper.doInTransaction(callback); retryingTransactionHelper.doInTransaction(callback);
} }
public void testRenameNamespace() throws Exception
{
final String namespaceUriBefore = GUID.generate();
final QName qnameBefore = QName.createQName(namespaceUriBefore, "before");
final String namespaceUriAfter = GUID.generate();
final QName qnameAfter = QName.createQName(namespaceUriAfter, "before");
RetryingTransactionCallback<Object> callback = new RetryingTransactionCallback<Object>()
{
public Object execute() throws Throwable
{
dao.getOrCreateNamespaceEntity(namespaceUriBefore);
// Get a QName that has the URI
QNameEntity qnameEntityBefore = dao.getOrCreateQNameEntity(qnameBefore);
// Now modify the namespace
dao.updateNamespaceEntity(namespaceUriBefore, namespaceUriAfter);
// The old qname must be gone
assertNull("QName must be gone as the URI was renamed", dao.getQNameEntity(qnameBefore));
// The new QName must be present and with the same ID
QNameEntity qnameEntityAfter = dao.getQNameEntity(qnameAfter);
assertNotNull("Expected QName with new URI to exist.", qnameEntityAfter);
assertEquals("QName changed ID unexpectedly.", qnameEntityBefore.getId(), qnameEntityAfter.getId());
// Done
return null;
}
};
retryingTransactionHelper.doInTransaction(callback);
}
public void testNewQName() throws Exception public void testNewQName() throws Exception
{ {
final String namespaceUri = GUID.generate(); final String namespaceUri = GUID.generate();

View File

@@ -116,6 +116,28 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
return namespace; return namespace;
} }
public void updateNamespaceEntity(String oldNamespaceUri, String newNamespaceUri)
{
// First check for clashes
if (getNamespaceEntity(newNamespaceUri) != null)
{
throw new AlfrescoRuntimeException("Namespace URI '" + newNamespaceUri + "' already exists.");
}
// Get the old one
NamespaceEntity oldNamespaceEntity = getNamespaceEntity(oldNamespaceUri);
if (oldNamespaceEntity == null)
{
// Nothing to rename
return;
}
oldNamespaceEntity.setUri(newNamespaceUri);
// Flush to force early failure
getSession().flush();
// Trash the cache
qnameEntityCache.clear();
// Done
}
public QNameEntity getQNameEntity(Long id) public QNameEntity getQNameEntity(Long id)
{ {
QNameEntity qnameEntity = (QNameEntity) getSession().get(QNameEntityImpl.class, id); QNameEntity qnameEntity = (QNameEntity) getSession().get(QNameEntityImpl.class, id);