From b8ff632f15151c9b9245f02ffa38da3c43d33c19 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Sat, 2 Dec 2006 20:03:20 +0000 Subject: [PATCH] AVM stores are renamable. Beware. Database schema has changed since I needed to introduce a synthetic primary key into the stores table. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4492 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../java/org/alfresco/repo/avm/AVMRemote.java | 7 +++++ .../org/alfresco/repo/avm/AVMRemoteLocal.java | 8 ++++++ .../alfresco/repo/avm/AVMRemoteTransport.java | 8 ++++++ .../repo/avm/AVMRemoteTransportService.java | 9 +++++++ .../org/alfresco/repo/avm/AVMRepository.java | 26 ++++++++++++++++++ .../org/alfresco/repo/avm/AVMServiceImpl.java | 16 +++++++++++ .../org/alfresco/repo/avm/AVMServiceTest.java | 17 ++++++++++++ .../java/org/alfresco/repo/avm/AVMStore.java | 11 ++++++++ .../org/alfresco/repo/avm/AVMStoreDAO.java | 7 +++++ .../org/alfresco/repo/avm/AVMStoreImpl.java | 27 +++++++++++++++++-- source/java/org/alfresco/repo/avm/Lookup.java | 4 +-- .../alfresco/repo/avm/clt/AVMRemoteImpl.java | 8 ++++++ .../alfresco/repo/avm/hibernate/AVM.hbm.xml | 5 +++- .../avm/hibernate/AVMStoreDAOHibernate.java | 13 ++++++++- .../alfresco/service/cmr/avm/AVMService.java | 9 +++++++ 15 files changed, 169 insertions(+), 6 deletions(-) diff --git a/source/java/org/alfresco/repo/avm/AVMRemote.java b/source/java/org/alfresco/repo/avm/AVMRemote.java index 5a400616e7..bb38ef6a7d 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemote.java +++ b/source/java/org/alfresco/repo/avm/AVMRemote.java @@ -391,4 +391,11 @@ public interface AVMRemote * @param name The name of the property. */ public void deleteStoreProperty(String store, QName name); + + /** + * Rename a store. + * @param sourceName The original name. + * @param destName The new name. + */ + public void renameStore(String sourceName, String destName); } diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java b/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java index 63f82f6e8d..28d7fa8a79 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java @@ -430,4 +430,12 @@ public class AVMRemoteLocal implements AVMRemote { fService.uncover(dirPath, name); } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMRemote#renameStore(java.lang.String, java.lang.String) + */ + public void renameStore(String sourceName, String destName) + { + fService.renameStore(sourceName, destName); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java b/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java index cc9e54ed0d..9eaef6ce21 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java @@ -408,4 +408,12 @@ public interface AVMRemoteTransport * @param name The name of the property. */ public void deleteStoreProperty(String ticket, String store, QName name); + + /** + * Rename a store. + * @param ticket The authentication ticket. + * @param sourceName The original name. + * @param destName The new name. + */ + public void renameStore(String ticket, String sourceName, String destName); } diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java b/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java index 53761dce16..f7470c417b 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java @@ -936,4 +936,13 @@ public class AVMRemoteTransportService implements AVMRemoteTransport, Runnable fAuthService.validate(ticket); fAVMService.deleteStoreProperty(store, name); } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMRemoteTransport#renameStore(java.lang.String, java.lang.String, java.lang.String) + */ + public void renameStore(String ticket, String sourceName, String destName) + { + fAuthService.validate(ticket); + fAVMService.renameStore(sourceName, destName); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 99be8f6d46..6e2324caa7 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -2236,4 +2236,30 @@ public class AVMRepository fLookupCount.set(null); } } + + /** + * Rename a store. + * @param sourceName The original name. + * @param destName The new name. + * @throws AVMNotFoundException + * @throws AVMExistsException + */ + public void renameStore(String sourceName, String destName) + { + AVMStore store = getAVMStoreByName(sourceName); + if (store == null) + { + throw new AVMNotFoundException("Store Not Found: " + sourceName); + } + if (getAVMStoreByName(destName) != null) + { + throw new AVMExistsException("Store Already Exists: " + destName); + } + if (!FileNameValidator.IsValid(destName)) + { + throw new AVMBadArgumentException("Bad store name: " + destName); + } + store.setName(destName); + fLookupCache.onDelete(sourceName); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index 6d8f96bbbf..26622cf3b2 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -1386,4 +1386,20 @@ public class AVMServiceImpl implements AVMService fAVMRepository.setACL(newPath, acl.getCopy()); } } + + /** + * Rename a store. + * @param sourceName The original name. + * @param destName The new name. + * @throws AVMNotFoundException + * @throws AVMExistsException + */ + public void renameStore(String sourceName, String destName) + { + if (sourceName == null || destName == null) + { + throw new AVMBadArgumentException("Illegal Null Argument."); + } + fAVMRepository.renameStore(sourceName, destName); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 8dc54f3142..f4915c798e 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -69,6 +69,23 @@ import org.alfresco.util.Pair; */ public class AVMServiceTest extends AVMServiceTestBase { + /** + * Test renaming a store. + */ + public void testRenameStore() + { + try + { + fService.renameStore("main", "foo"); + assertNotNull(fService.getAVMStore("foo")); + } + catch (Exception e) + { + e.printStackTrace(); + fail(); + } + } + /** * Test copy. */ diff --git a/source/java/org/alfresco/repo/avm/AVMStore.java b/source/java/org/alfresco/repo/avm/AVMStore.java index c82686de4a..b4677f3a2b 100644 --- a/source/java/org/alfresco/repo/avm/AVMStore.java +++ b/source/java/org/alfresco/repo/avm/AVMStore.java @@ -41,6 +41,11 @@ import org.alfresco.service.namespace.QName; */ public interface AVMStore { + /** + * Get the primary key. + */ + public long getId(); + /** * This returns the next version in this store that will be snapshotted. * @return The next version to be snapshotted. @@ -264,6 +269,12 @@ public interface AVMStore */ public String getName(); + /** + * Set the name of the store. + * @param name To Set. + */ + public void setName(String name); + /** * Purge all the nodes reachable only by the given version. * @param version diff --git a/source/java/org/alfresco/repo/avm/AVMStoreDAO.java b/source/java/org/alfresco/repo/avm/AVMStoreDAO.java index ca291fb0d0..db0d106909 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreDAO.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreDAO.java @@ -62,4 +62,11 @@ public interface AVMStoreDAO * @param rep The dirty AVMStore. */ public void update(AVMStore rep); + + /** + * Get A store by primary key. + * @param id The primary key. + * @return The store. + */ + public AVMStore getByID(long id); } diff --git a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java index 32b4dc738a..9145a32c7a 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java @@ -61,6 +61,11 @@ public class AVMStoreImpl implements AVMStore, Serializable { static final long serialVersionUID = -1485972568675732904L; + /** + * The primary key. + */ + private long fID; + /** * The name of this AVMStore. */ @@ -130,6 +135,24 @@ public class AVMStoreImpl implements AVMStore, Serializable AVMDAOs.Instance().fVersionRootDAO.save(versionRoot); } + /** + * Setter for hibernate. + * @param id The primary key. + */ + protected void setId(long id) + { + fID = id; + } + + /** + * Get the primary key. + * @return The primary key. + */ + public long getId() + { + return fID; + } + /** * Set a new root for this. * @param root @@ -704,10 +727,10 @@ public class AVMStoreImpl implements AVMStore, Serializable } /** - * Set the name of this AVMStore. Hibernate. + * Set the name of this AVMStore. * @param name */ - protected void setName(String name) + public void setName(String name) { fName = name; } diff --git a/source/java/org/alfresco/repo/avm/Lookup.java b/source/java/org/alfresco/repo/avm/Lookup.java index 4164beed81..63a639712b 100644 --- a/source/java/org/alfresco/repo/avm/Lookup.java +++ b/source/java/org/alfresco/repo/avm/Lookup.java @@ -92,7 +92,7 @@ class Lookup public Lookup(Lookup other, AVMNodeDAO nodeDAO, AVMStoreDAO storeDAO) { fValid = true; - fAVMStore = storeDAO.getByName(other.fAVMStore.getName()); + fAVMStore = storeDAO.getByID(other.fAVMStore.getId()); if (fAVMStore == null) { fValid = false; @@ -155,7 +155,7 @@ class Lookup } fComponents.add(newComp); } - fFinalStore = storeDAO.getByName(other.fFinalStore.getName()); + fFinalStore = storeDAO.getByID(other.fFinalStore.getId()); if (fFinalStore == null) { fValid = false; diff --git a/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java b/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java index 47a2c6a581..5ae14e066e 100644 --- a/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java +++ b/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java @@ -436,4 +436,12 @@ public class AVMRemoteImpl implements AVMRemote { fTransport.uncover(ClientTicketHolder.GetTicket(), dirPath, name); } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMRemote#renameStore(java.lang.String, java.lang.String) + */ + public void renameStore(String sourceName, String destName) + { + fTransport.renameStore(ClientTicketHolder.GetTicket(), sourceName, destName); + } } diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml index bcc62020cb..bd2be7ef8b 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml +++ b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml @@ -104,8 +104,11 @@ - + + + + diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java index 41b3476300..01f0246761 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java @@ -77,7 +77,10 @@ class AVMStoreDAOHibernate extends HibernateDaoSupport implements */ public AVMStore getByName(String name) { - return (AVMStore)getSession().get(AVMStoreImpl.class, name); + Query query = getSession().createQuery("from AVMStoreImpl st " + + "where st.name = :name"); + query.setParameter("name", name); + return (AVMStore)query.uniqueResult(); } /** @@ -101,4 +104,12 @@ class AVMStoreDAOHibernate extends HibernateDaoSupport implements { // No op in Hibernate. } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMStoreDAO#getByID(long) + */ + public AVMStore getByID(long id) + { + return (AVMStore)getSession().get(AVMStoreImpl.class, id); + } } diff --git a/source/java/org/alfresco/service/cmr/avm/AVMService.java b/source/java/org/alfresco/service/cmr/avm/AVMService.java index 525390f4b8..f98d96b994 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMService.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMService.java @@ -794,4 +794,13 @@ public interface AVMService * @throws AVMNotFoundException */ public void copy(int srcVersion, String srcPath, String dstPath, String name); + + /** + * Rename a store. + * @param sourceName The original name. + * @param destName The new name. + * @throws AVMNotFoundException + * @throws AVMExistsException + */ + public void renameStore(String sourceName, String destName); }