diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 6427584fa1..30f41312df 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -1058,6 +1058,9 @@ + + + diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 51d94777b9..0f92e8aa58 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -105,8 +105,12 @@ public class AVMRepository { fLookupCount.set(1); String[] pathParts = SplitPath(path); - AVMStore rep = getAVMStoreByName(pathParts[0]); - return rep.createFile(pathParts[1], name); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + return store.createFile(pathParts[1], name); } /** @@ -119,8 +123,12 @@ public class AVMRepository { fLookupCount.set(1); String[] pathParts = SplitPath(path); - AVMStore rep = getAVMStoreByName(pathParts[0]); - rep.createFile(pathParts[1], name, data); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + store.createFile(pathParts[1], name, data); } /** @@ -132,8 +140,12 @@ public class AVMRepository { fLookupCount.set(1); String[] pathParts = SplitPath(path); - AVMStore rep = getAVMStoreByName(pathParts[0]); - rep.createDirectory(pathParts[1], name); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + store.createDirectory(pathParts[1], name); } /** @@ -157,6 +169,10 @@ public class AVMRepository // We need the store to do anything so... String [] pathParts = SplitPath(parent.getPath()); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } DirectoryNode dir = (DirectoryNode)node; DirectoryNode child = null; if (dir instanceof LayeredDirectoryNode) @@ -188,9 +204,12 @@ public class AVMRepository } fLookupCount.set(1); String[] pathParts = SplitPath(dstPath); - AVMStore rep = getAVMStoreByName(pathParts[0]); -// fSession.get().lock(rep, LockMode.UPGRADE); - rep.createLayeredDirectory(srcPath, pathParts[1], name); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + store.createLayeredDirectory(srcPath, pathParts[1], name); } /** @@ -203,8 +222,12 @@ public class AVMRepository { fLookupCount.set(1); String[] pathParts = SplitPath(dstPath); - AVMStore rep = getAVMStoreByName(pathParts[0]); - rep.createLayeredFile(srcPath, pathParts[1], name); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + store.createLayeredFile(srcPath, pathParts[1], name); } /** @@ -213,15 +236,10 @@ public class AVMRepository */ public void createAVMStore(String name) { - try + if (getAVMStoreByName(name) != null) { - getAVMStoreByName(name); throw new AVMExistsException("AVMStore exists: " + name); } - catch (AVMNotFoundException anf) - { - // Do nothing. - } // Newing up the object causes it to be written to the db. @SuppressWarnings("unused") AVMStore rep = new AVMStoreImpl(this, name); @@ -246,12 +264,32 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(srcPath); AVMStore srcRepo = getAVMStoreByName(pathParts[0]); + if (srcRepo == null) + { + throw new AVMNotFoundException("Store not found."); + } + if (version < 0) + { + version = srcRepo.createSnapshot(); + } Lookup sPath = srcRepo.lookup(version, pathParts[1], false, false); + if (sPath == null) + { + throw new AVMNotFoundException("Path not found."); + } // Lookup the destination directory. fLookupCount.set(1); pathParts = SplitPath(dstPath); AVMStore dstRepo = getAVMStoreByName(pathParts[0]); + if (dstRepo == null) + { + throw new AVMNotFoundException("Store not found."); + } Lookup dPath = dstRepo.lookupDirectory(-1, pathParts[1], true); + if (dPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dirNode = (DirectoryNode)dPath.getCurrentNode(); AVMNode srcNode = sPath.getCurrentNode(); AVMNode dstNode = null; @@ -291,8 +329,12 @@ public class AVMRepository { fLookupCount.set(1); String [] pathParts = SplitPath(path); - AVMStore rep = getAVMStoreByName(pathParts[0]); - return rep.getOutputStream(pathParts[1]); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + return store.getOutputStream(pathParts[1]); } /** @@ -313,7 +355,15 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(srcPath); AVMStore srcRepo = getAVMStoreByName(pathParts[0]); + if (srcRepo == null) + { + throw new AVMNotFoundException("Store not found."); + } Lookup sPath = srcRepo.lookupDirectory(-1, pathParts[1], true); + if (sPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode srcDir = (DirectoryNode)sPath.getCurrentNode(); AVMNode srcNode = srcDir.lookupChild(sPath, srcName, -1, true, false); if (srcNode == null) @@ -323,7 +373,15 @@ public class AVMRepository fLookupCount.set(1); pathParts = SplitPath(dstPath); AVMStore dstRepo = getAVMStoreByName(pathParts[0]); + if (dstRepo == null) + { + throw new AVMNotFoundException("Store not found."); + } Lookup dPath = dstRepo.lookupDirectory(-1, pathParts[1], true); + if (dPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dstDir = (DirectoryNode)dPath.getCurrentNode(); AVMNode dstNode = dstDir.lookupChild(dPath, dstName, -1, true, false); if (dstNode != null) @@ -425,8 +483,12 @@ public class AVMRepository { fLookupCount.set(1); String [] pathParts = SplitPath(dirPath); - AVMStore repo = getAVMStoreByName(pathParts[0]); - repo.uncover(pathParts[1], name); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + store.uncover(pathParts[1], name); } /** @@ -439,8 +501,12 @@ public class AVMRepository List result = new ArrayList(); for (String repName : repositories) { - AVMStore repo = getAVMStoreByName(repName); - result.add(repo.createSnapshot()); + AVMStore store = getAVMStoreByName(repName); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + result.add(store.createSnapshot()); } return result; } @@ -453,6 +519,10 @@ public class AVMRepository public int createSnapshot(String storeName) { AVMStore store = getAVMStoreByName(storeName); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.createSnapshot(); } @@ -466,6 +536,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.removeNode(pathParts[1], name); } @@ -478,6 +552,10 @@ public class AVMRepository public void purgeAVMStore(String name) { AVMStore store = getAVMStoreByName(name); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } AVMNode root = store.getRoot(); root.setIsRoot(false); VersionRootDAO vrDAO = AVMContext.fgInstance.fVersionRootDAO; @@ -505,6 +583,10 @@ public class AVMRepository public void purgeVersion(String name, int version) { AVMStore store = getAVMStoreByName(name); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.purgeVersion(version); } @@ -519,6 +601,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getInputStream(version, pathParts[1]); } @@ -535,6 +621,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getListing(version, pathParts[1], includeDeleted); } @@ -550,6 +640,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getListingDirect(version, pathParts[1], includeDeleted); } @@ -612,6 +706,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getDeleted(version, pathParts[1]); } @@ -639,6 +737,10 @@ public class AVMRepository public AVMStoreDescriptor getAVMStore(String name) { AVMStore store = getAVMStoreByName(name); + if (store == null) + { + return null; + } return store.getDescriptor(); } @@ -650,6 +752,10 @@ public class AVMRepository public List getAVMStoreVersions(String name) { AVMStore store = getAVMStoreByName(name); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getVersions(); } @@ -664,6 +770,10 @@ public class AVMRepository public List getAVMStoreVersions(String name, Date from, Date to) { AVMStore store = getAVMStoreByName(name); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getVersions(from, to); } @@ -696,6 +806,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getIndirectionPath(version, pathParts[1]); } @@ -707,6 +821,10 @@ public class AVMRepository public int getLatestVersionID(String name) { AVMStore store = getAVMStoreByName(name); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getNextVersionID(); } @@ -717,12 +835,7 @@ public class AVMRepository */ private AVMStore getAVMStoreByName(String name) { - AVMStore store = AVMContext.fgInstance.fAVMStoreDAO.getByName(name); - if (store == null) - { - throw new AVMNotFoundException("AVMStore not found: " + name); - } - return store; + return AVMContext.fgInstance.fAVMStoreDAO.getByName(name); } /** @@ -768,8 +881,11 @@ public class AVMRepository } String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); - Lookup result = store.lookup(version, pathParts[1], false, includeDeleted); - return result; + if (store == null) + { + return null; + } + return store.lookup(version, pathParts[1], false, includeDeleted); } finally { @@ -780,6 +896,7 @@ public class AVMRepository } } + // TODO This should really return null for not found. /** * Lookup a descriptor from a directory descriptor. * @param dir The directory descriptor. @@ -814,7 +931,15 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } Lookup lookup = store.lookup(version, pathParts[1], false, false); + if (lookup == null) + { + throw new AVMNotFoundException("Path not found."); + } return new LayeringDescriptor(!lookup.getDirectlyContained(), lookup.getAVMStore().getDescriptor(), lookup.getFinalStore().getDescriptor()); @@ -834,6 +959,10 @@ public class AVMRepository } String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + return null; + } return store.lookupDirectory(version, pathParts[1], false); } @@ -861,6 +990,10 @@ public class AVMRepository fLookupCount.set(1); String[] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.makePrimary(pathParts[1]); } @@ -874,6 +1007,10 @@ public class AVMRepository fLookupCount.set(1); String[] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.retargetLayeredDirectory(pathParts[1], target); } @@ -918,6 +1055,10 @@ public class AVMRepository fLookupCount.set(1); String[] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.setOpacity(pathParts[1], opacity); } @@ -932,6 +1073,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.setNodeProperty(pathParts[1], name, value); } @@ -945,6 +1090,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.setNodeProperties(pathParts[1], properties); } @@ -960,6 +1109,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getNodeProperty(version, pathParts[1], name); } @@ -974,6 +1127,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getNodeProperties(version, pathParts[1]); } @@ -987,6 +1144,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.deleteNodeProperty(pathParts[1], name); } @@ -999,6 +1160,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.deleteNodeProperties(pathParts[1]); } @@ -1010,7 +1175,12 @@ public class AVMRepository */ public void setStoreProperty(String store, QName name, PropertyValue value) { - getAVMStoreByName(store).setProperty(name, value); + AVMStore st = getAVMStoreByName(store); + if (st == null) + { + throw new AVMNotFoundException("Store not found."); + } + st.setProperty(name, value); } /** @@ -1020,7 +1190,12 @@ public class AVMRepository */ public void setStoreProperties(String store, Map props) { - getAVMStoreByName(store).setProperties(props); + AVMStore st = getAVMStoreByName(store); + if (st == null) + { + throw new AVMNotFoundException("Store not found."); + } + st.setProperties(props); } /** @@ -1031,7 +1206,16 @@ public class AVMRepository */ public PropertyValue getStoreProperty(String store, QName name) { - return getAVMStoreByName(store).getProperty(name); + if (store == null) + { + throw new AVMBadArgumentException("Null store name."); + } + AVMStore st = getAVMStoreByName(store); + if (st == null) + { + throw new AVMNotFoundException("Store not found."); + } + return st.getProperty(name); } /** @@ -1042,8 +1226,13 @@ public class AVMRepository */ public Map queryStorePropertyKey(String store, QName keyPattern) { + AVMStore st = getAVMStoreByName(store); + if (st == null) + { + throw new AVMNotFoundException("Store not found."); + } List matches = - AVMContext.fgInstance.fAVMStorePropertyDAO.queryByKeyPattern(getAVMStoreByName(store), + AVMContext.fgInstance.fAVMStorePropertyDAO.queryByKeyPattern(st, keyPattern); Map results = new HashMap(); for (AVMStoreProperty prop : matches) @@ -1086,7 +1275,16 @@ public class AVMRepository */ public Map getStoreProperties(String store) { - return getAVMStoreByName(store).getProperties(); + if (store == null) + { + throw new AVMBadArgumentException("Null store name."); + } + AVMStore st = getAVMStoreByName(store); + if (st == null) + { + throw new AVMNotFoundException("Store not found."); + } + return st.getProperties(); } /** @@ -1096,17 +1294,12 @@ public class AVMRepository */ public void deleteStoreProperty(String store, QName name) { - getAVMStoreByName(store).deleteProperty(name); - } - - /** - * Get the AVMStoreDescriptor for an AVMStore. - * @param name The name of the AVMStore. - * @return The descriptor. - */ - public AVMStoreDescriptor getAVMStoreDescriptor(String name) - { - return getAVMStoreByName(name).getDescriptor(); + AVMStore st = getAVMStoreByName(store); + if (st == null) + { + throw new AVMNotFoundException("Store not found."); + } + st.deleteProperty(name); } /** @@ -1179,6 +1372,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getContentDataForWrite(pathParts[1]); } @@ -1192,6 +1389,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.setContentData(pathParts[1], data); } @@ -1214,6 +1415,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.addAspect(pathParts[1], aspectName); } @@ -1228,6 +1433,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getAspects(version, pathParts[1]); } @@ -1241,6 +1450,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.removeAspect(pathParts[1], aspectName); } @@ -1256,6 +1469,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.hasAspect(version, pathParts[1], aspectName); } @@ -1269,6 +1486,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.setACL(pathParts[1], acl); } @@ -1283,6 +1504,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } return store.getACL(version, pathParts[1]); } @@ -1297,6 +1522,10 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(parentPath); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } store.link(pathParts[1], name, toLink); } @@ -1353,8 +1582,16 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } // Just force a copy if needed by looking up in write mode. Lookup lPath = store.lookup(-1, pathParts[1], true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); return node.getDescriptor(lPath); } diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index 2f50eb4921..b45c72ec68 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -307,22 +307,6 @@ public class AVMServiceImpl implements AVMService fAVMRepository.createDirectory(path, name); } - /** - * Create a new directory, in an already copy on written node. - * This should only be used if you really know what you're doing. - * @param parent The parent node. - * @param name The name of the new directory. - * @return A descriptor for the newly created directory. - */ - public AVMNodeDescriptor createDirectory(AVMNodeDescriptor parent, String name) - { - if (parent == null || name == null) - { - throw new AVMBadArgumentException("Illegal null argument."); - } - return fAVMRepository.createDirectory(parent, name); - } - /** * Create a new layered file. It must not exist. * @param srcPath The src path. Ie the target for the layering. @@ -511,6 +495,10 @@ public class AVMServiceImpl implements AVMService try { Lookup lookup = fAVMRepository.lookup(version, path, includeDeleted); + if (lookup == null) + { + return null; + } return lookup.getCurrentNode().getDescriptor(lookup); } catch (AVMNotFoundException e) @@ -1082,42 +1070,6 @@ public class AVMServiceImpl implements AVMService fAVMRepository.link(parentPath, name, toLink); } - /** - * This is a more dangerous version of link, which assumes - * that copy on write has occurred for the parent node. This is - * an internal call. Don't use it if you don't know precisely - * what you are doing. - * @param parent The parent node. - * @param name The name to give the child. - * @param child The child node to link. - */ - public void link(AVMNodeDescriptor parent, String name, AVMNodeDescriptor child) - { - if (parent == null || child == null) - { - throw new AVMBadArgumentException("Illegal Null Argument."); - } - fAVMRepository.link(parent, name, child); - } - - /** - * Flatten a direct child of a layered directory. This does - * the equivalent of removing the given child from the directory - * and then doing an uncover. This routine makes many dangerous - * assumptions and is only for use by AVMSyncService. Don't use it - * if you don't know precisely what you are doing. - * @param lDir The layered directory node. - * @param name The name to flatten. - */ - public void flatten(AVMNodeDescriptor lDir, String name) - { - if (lDir == null || name == null) - { - throw new AVMBadArgumentException("Illegal Null Argument."); - } - fAVMRepository.flatten(lDir, name); - } - /** * Force copy on write of a path. * @param path The path to force. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index edd18d6d8d..6fe2d05006 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -59,6 +59,61 @@ import org.alfresco.service.transaction.TransactionService; */ public class AVMServiceTest extends AVMServiceTestBase { + /** + * Test that an update forces a snapshot on the source. + */ + public void testUpdateSnapshot() + { + try + { + setupBasicTree(); + fService.createAVMStore("branch"); + fService.createBranch(-1, "main:/", "branch:/", "branch"); + // Modify some things in the branch. + fService.createFile("branch:/branch/a/b", "fing").close(); + fService.getFileOutputStream("branch:/branch/a/b/c/foo").close(); + fService.removeNode("branch:/branch/a/b/c", "bar"); + List diffs = + fSyncService.compare(-1, "branch:/branch", -1, "main:/"); + assertEquals(3, diffs.size()); + // Now update. + fSyncService.update(diffs, false, false, false, false); + diffs = fSyncService.compare(-1, "branch:/branch", -1, "main:/"); + assertEquals(0, diffs.size()); + fService.getFileOutputStream("branch:/branch/a/b/fing").close(); + assertTrue(fService.lookup(-1, "branch:/branch/a/b/fing").getId() != + fService.lookup(-1, "main:/a/b/fing").getId()); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } + + /** + * Test that branching forces a snapshot on the source repository. + */ + public void testBranchSnapshot() + { + try + { + setupBasicTree(); + fService.getFileOutputStream("main:/a/b/c/foo").close(); + fService.createBranch(-1, "main:/a", "main:/", "abranch"); + assertEquals(fService.lookup(-1, "main:/a/b/c/foo").getId(), + fService.lookup(-1, "main:/abranch/b/c/foo").getId()); + fService.getFileOutputStream("main:/a/b/c/foo").close(); + assertTrue(fService.lookup(-1, "main:/a/b/c/foo").getId() != + fService.lookup(-1, "main:/abranch/b/c/foo").getId()); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } + /** * Test bulk update. */ diff --git a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java index 24503a6582..a331b2820b 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java @@ -141,7 +141,8 @@ public class AVMStoreImpl implements AVMStore, Serializable // If the root isn't new, we can't take a snapshot since nothing has changed. if (!fRoot.getIsNew()) { - throw new AVMExistsException("Already snapshotted."); + // So we just return the most recent snapshot. + return AVMContext.fgInstance.fVersionRootDAO.getMaxVersionID(this); } // Clear out the new nodes. List newInRep = AVMContext.fgInstance.fAVMNodeDAO.getNewInStore(this); @@ -150,11 +151,16 @@ public class AVMStoreImpl implements AVMStore, Serializable newGuy.setStoreNew(null); } // Make up a new version record. + String user = AVMContext.fgInstance.getAuthenticationComponent().getCurrentUserName(); + if (user == null) + { + user = AVMContext.fgInstance.getAuthenticationComponent().getSystemUserName(); + } VersionRoot versionRoot = new VersionRootImpl(this, fRoot, fNextVersionID, System.currentTimeMillis(), - "britt"); + user); AVMContext.fgInstance.fVersionRootDAO.save(versionRoot); // Increment the version id. fNextVersionID++; @@ -169,6 +175,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void createDirectory(String path, String name) { Lookup lPath = lookupDirectory(-1, path, true); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (dir.lookupChild(lPath, name, -1, true, false) != null) { @@ -202,6 +212,10 @@ public class AVMStoreImpl implements AVMStore, Serializable String name) { Lookup lPath = lookupDirectory(-1, dstPath, true); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (dir.lookupChild(lPath, name, -1, true, false) != null) { @@ -236,6 +250,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public OutputStream createFile(String path, String name) { Lookup lPath = lookupDirectory(-1, path, true); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (dir.lookupChild(lPath, name, -1, true, false) != null) { @@ -262,6 +280,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void createFile(String path, String name, File data) { Lookup lPath = lookupDirectory(-1, path, true); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (dir.lookupChild(lPath, name, -1, true, false) != null) { @@ -288,6 +310,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void createLayeredFile(String srcPath, String dstPath, String name) { Lookup lPath = lookupDirectory(-1, dstPath, true); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (dir.lookupChild(lPath, name, -1, true, false) != null) { @@ -354,6 +380,10 @@ public class AVMStoreImpl implements AVMStore, Serializable boolean includeDeleted) { Lookup lPath = lookupDirectory(version, path, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); Map listing = dir.getListing(lPath, includeDeleted); return translateListing(listing, lPath); @@ -369,6 +399,10 @@ public class AVMStoreImpl implements AVMStore, Serializable boolean includeDeleted) { Lookup lPath = lookupDirectory(version, path, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (lPath.isLayered() && dir.getType() != AVMNodeType.LAYERED_DIRECTORY) { @@ -407,6 +441,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public List getDeleted(int version, String path) { Lookup lPath = lookupDirectory(version, path, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); return dir.getDeletedNames(); } @@ -443,6 +481,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void removeNode(String path, String name) { Lookup lPath = lookupDirectory(-1, path, true); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (dir.lookupChild(lPath, name, -1, true, false) == null) { @@ -460,6 +502,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void uncover(String dirPath, String name) { Lookup lPath = lookup(-1, dirPath, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); if (node.getType() != AVMNodeType.LAYERED_DIRECTORY) { @@ -540,7 +586,7 @@ public class AVMStoreImpl implements AVMStore, Serializable Lookup result = new Lookup(this, fName); if (path.length() == 0) { - throw new AVMException("Invalid path: " + path); + return null; } while (path.startsWith("/")) { @@ -576,13 +622,13 @@ public class AVMStoreImpl implements AVMStore, Serializable AVMNode child = dir.lookupChild(result, pathElements[i], version, write, includeDeleted); if (child == null) { - throw new AVMNotFoundException("Not found: " + pathElements[i]); + return null; } // Every element that is not the last needs to be a directory. if (child.getType() != AVMNodeType.PLAIN_DIRECTORY && child.getType() != AVMNodeType.LAYERED_DIRECTORY) { - throw new AVMNotFoundException("Not a directory: " + pathElements[i]); + return null; } result.add(child, pathElements[i], write); dir = (DirectoryNode)result.getCurrentNode(); @@ -592,7 +638,7 @@ public class AVMStoreImpl implements AVMStore, Serializable includeDeleted); if (child == null) { - throw new AVMNotFoundException("Not found: " + pathElements[pathElements.length - 1]); + return null; } result.add(child, pathElements[pathElements.length - 1], write); return result; @@ -629,10 +675,14 @@ public class AVMStoreImpl implements AVMStore, Serializable // Just do a regular lookup and assert that the last element // is a directory. Lookup lPath = lookup(version, path, write, false); + if (lPath == null) + { + return null; + } if (lPath.getCurrentNode().getType() != AVMNodeType.PLAIN_DIRECTORY && lPath.getCurrentNode().getType() != AVMNodeType.LAYERED_DIRECTORY) { - throw new AVMWrongTypeException("Not a directory: " + path); + return null; } return lPath; } @@ -646,6 +696,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public String getIndirectionPath(int version, String path) { Lookup lPath = lookup(version, path, false, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); if (node.getType() == AVMNodeType.LAYERED_DIRECTORY) { @@ -665,7 +719,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void makePrimary(String path) { Lookup lPath = lookupDirectory(-1, path, true); -// lPath.acquireLocks(); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (!lPath.isLayered()) { @@ -683,7 +740,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void retargetLayeredDirectory(String path, String target) { Lookup lPath = lookupDirectory(-1, path, true); -// lPath.acquireLocks(); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); if (!lPath.isLayered()) { @@ -844,6 +904,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void setOpacity(String path, boolean opacity) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); if (!(node instanceof LayeredDirectoryNode)) { @@ -863,6 +927,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void setNodeProperty(String path, QName name, PropertyValue value) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); node.setProperty(name, value); } @@ -875,6 +943,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void setNodeProperties(String path, Map properties) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); node.setProperties(properties); } @@ -889,6 +961,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public PropertyValue getNodeProperty(int version, String path, QName name) { Lookup lPath = lookup(version, path, false, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); return node.getProperty(name); } @@ -902,6 +978,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public Map getNodeProperties(int version, String path) { Lookup lPath = lookup(version, path, false, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); return node.getProperties(); } @@ -914,6 +994,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void deleteNodeProperty(String path, QName name) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); node.deleteProperty(name); } @@ -925,6 +1009,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void deleteNodeProperties(String path) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); node.deleteProperties(); } @@ -999,6 +1087,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public ContentData getContentDataForRead(int version, String path) { Lookup lPath = lookup(version, path, false, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); if (!(node instanceof FileNode)) { @@ -1015,6 +1107,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public ContentData getContentDataForWrite(String path) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); if (!(node instanceof FileNode)) { @@ -1031,6 +1127,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void setContentData(String path, ContentData data) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); if (!(node instanceof FileNode)) { @@ -1047,6 +1147,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void addAspect(String path, QName aspectName) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); if (AVMContext.fgInstance.fAVMAspectNameDAO.exists(node, aspectName)) { @@ -1068,6 +1172,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public List getAspects(int version, String path) { Lookup lPath = lookup(version, path, false, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); List names = AVMContext.fgInstance.fAVMAspectNameDAO.get(node); @@ -1087,6 +1195,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void removeAspect(String path, QName aspectName) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); AVMContext.fgInstance.fAVMAspectNameDAO.delete(node, aspectName); AspectDefinition def = AVMContext.fgInstance.getDictionaryService().getAspect(aspectName); @@ -1108,6 +1220,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public boolean hasAspect(int version, String path, QName aspectName) { Lookup lPath = lookup(version, path, false, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); return AVMContext.fgInstance.fAVMAspectNameDAO.exists(node, aspectName); } @@ -1120,6 +1236,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void setACL(String path, DbAccessControlList acl) { Lookup lPath = lookup(-1, path, true, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } AVMNode node = lPath.getCurrentNode(); node.setAcl(acl); } @@ -1133,6 +1253,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public DbAccessControlList getACL(int version, String path) { Lookup lPath = lookup(version, path, false, false); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } return lPath.getCurrentNode().getAcl(); } @@ -1145,6 +1269,10 @@ public class AVMStoreImpl implements AVMStore, Serializable public void link(String parentPath, String name, AVMNodeDescriptor toLink) { Lookup lPath = lookupDirectory(-1, parentPath, true); + if (lPath == null) + { + throw new AVMNotFoundException("Path not found."); + } DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); dir.link(lPath, name, toLink); } diff --git a/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java index 863cf6d8c7..84a095cf23 100644 --- a/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java @@ -46,6 +46,11 @@ public class AVMSyncServiceImpl implements AVMSyncService */ private AVMService fAVMService; + /** + * The AVMRepository. + */ + private AVMRepository fAVMRepository; + /** * Do nothing constructor. */ @@ -54,10 +59,7 @@ public class AVMSyncServiceImpl implements AVMSyncService } /** - * Set the AVM Service. For Spring. For now, at least, - * it's important to wire this using the unintercepted AVMServiceImpl, - * as AVMServiceImpl uses Runtime Exceptions for handling valid states - * that should not cause rollbacks. + * Set the AVM Service. For Spring. * @param avmService The AVMService reference. */ public void setAvmService(AVMService avmService) @@ -65,6 +67,11 @@ public class AVMSyncServiceImpl implements AVMSyncService fAVMService = avmService; } + public void setAvmRepository(AVMRepository avmRepository) + { + fAVMRepository = avmRepository; + } + /** * Get a difference list between two corresponding node trees. * @param srcVersion The version id for the source tree. @@ -280,7 +287,14 @@ public class AVMSyncServiceImpl implements AVMSyncService { throw new AVMSyncException("Malformed AVMDifference."); } - AVMNodeDescriptor srcDesc = fAVMService.lookup(diff.getSourceVersion(), + int colonOff = diff.getSourcePath().indexOf(':'); + if (colonOff == -1) + { + throw new AVMBadArgumentException("Invalid path."); + } + String storeName = diff.getSourcePath().substring(0, colonOff); + int version = fAVMService.createSnapshot(storeName); + AVMNodeDescriptor srcDesc = fAVMService.lookup(version, diff.getSourcePath(), true); if (srcDesc == null) { @@ -385,8 +399,6 @@ public class AVMSyncServiceImpl implements AVMSyncService fAVMService.link(parentPath, name, toLink); } - // TODO doesn't handle copies from non head nodes. - /** * Recursively copy a node into the given position. * @param parentPath The place to put it. @@ -417,12 +429,12 @@ public class AVMSyncServiceImpl implements AVMSyncService // If it's a file or deleted simply link it in. if (toCopy.isFile() || toCopy.isDeleted() || toCopy.isPlainDirectory()) { - fAVMService.link(parent, name, toCopy); + fAVMRepository.link(parent, name, toCopy); return; } // Otherwise make a directory in the target parent, and recursiveCopy all the source // children into it. - AVMNodeDescriptor newParentDesc = fAVMService.createDirectory(parent, name); + AVMNodeDescriptor newParentDesc = fAVMRepository.createDirectory(parent, name); fgLogger.error(newParentDesc); Map children = fAVMService.getDirectoryListing(toCopy, true); @@ -613,14 +625,14 @@ public class AVMSyncServiceImpl implements AVMSyncService // We've found an identity so flatten it. if (topNode.getId() == bottomNode.getId()) { - fAVMService.flatten(layer, name); + fAVMRepository.flatten(layer, name); } else { // Otherwise recursively flatten the children. if (flatten(topNode, bottomNode)) { - fAVMService.flatten(layer, name); + fAVMRepository.flatten(layer, name); } else { diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java index cb8badfdae..c9dff89bb9 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java @@ -25,7 +25,6 @@ import java.util.SortedMap; import java.util.TreeMap; import org.alfresco.service.cmr.avm.AVMBadArgumentException; -import org.alfresco.service.cmr.avm.AVMCycleException; import org.alfresco.service.cmr.avm.AVMException; import org.alfresco.service.cmr.avm.AVMExistsException; import org.alfresco.service.cmr.avm.AVMNodeDescriptor; @@ -316,18 +315,14 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec } else { - try + Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, getUnderlying(lPath)); + if (lookup != null) { - Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, getUnderlying(lPath)); DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode(); listing = dir.getListing(lookup, includeDeleted); } - catch (AVMException re) + else { - if (re instanceof AVMCycleException) - { - throw re; - } // It's OK for an indirection to dangle. listing = new HashMap(); } @@ -406,9 +401,9 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec // If we are not opaque, get the underlying base listing. if (!fOpacity) { - try + Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, dir.getIndirection()); + if (lookup != null) { - Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, dir.getIndirection()); DirectoryNode dirNode = (DirectoryNode)lookup.getCurrentNode(); Map listing = dirNode.getListing(lookup, includeDeleted); for (String name : listing.keySet()) @@ -418,13 +413,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec lookup.getCurrentIndirection())); } } - catch (AVMException e) - { - if (e instanceof AVMCycleException) - { - throw e; - } - } } List children = AVMContext.fgInstance.fChildEntryDAO.getByParent(this); for (ChildEntry child : children) @@ -489,20 +477,16 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec return null; } // Not here so check our indirection. - try + Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, getUnderlying(lPath)); + if (lookup != null) { - Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, getUnderlying(lPath)); DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode(); AVMNode retVal = dir.lookupChild(lookup, name, -1, false, includeDeleted); lPath.setFinalStore(lookup.getFinalStore()); return retVal; } - catch (AVMException re) + else { - if (re instanceof AVMCycleException) - { - throw re; - } return null; } } @@ -535,9 +519,9 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec { return null; } - try + Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, mine.getIndirection()); + if (lookup != null) { - Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, mine.getIndirection()); DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode(); AVMNode child = dir.lookupChild(lookup, name, -1, false, includeDeleted); if (child == null) @@ -546,12 +530,8 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec } return child.getDescriptor(lookup); } - catch (AVMException e) + else { - if (e instanceof AVMCycleException) - { - throw e; - } return null; } } diff --git a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java index adcd459af0..3385740d3c 100644 --- a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java @@ -79,6 +79,10 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode { // LayeredFileNodes are always copied. Lookup lookup = AVMRepository.GetInstance().lookup(-1, fIndirection, false); + if (lookup == null) + { + throw new AVMException("Unbacked layered file node."); + } AVMNode indirect = lookup.getCurrentNode(); if (indirect.getType() != AVMNodeType.LAYERED_FILE && indirect.getType() != AVMNodeType.PLAIN_FILE) @@ -250,6 +254,10 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode public ContentData getContentData(Lookup lPath) { Lookup lookup = lPath.getAVMStore().getAVMRepository().lookup(-1, getIndirection(), false); + if (lookup == null) + { + throw new AVMException("Invalid target."); + } AVMNode node = lookup.getCurrentNode(); if (!(node instanceof FileNode)) { diff --git a/source/java/org/alfresco/repo/avm/VersionRootDAO.java b/source/java/org/alfresco/repo/avm/VersionRootDAO.java index c9cba6e2fd..af8cf55c39 100644 --- a/source/java/org/alfresco/repo/avm/VersionRootDAO.java +++ b/source/java/org/alfresco/repo/avm/VersionRootDAO.java @@ -68,4 +68,11 @@ public interface VersionRootDAO * @return The highest numbered version. */ public VersionRoot getMaxVersion(AVMStore store); + + /** + * Get the highest numbered id from all the versions in a store. + * @param store The store. + * @return The highest numbered id. + */ + public Integer getMaxVersionID(AVMStore store); } diff --git a/source/java/org/alfresco/repo/avm/hibernate/VersionRootDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/VersionRootDAOHibernate.java index ce2519461a..d7a22ff2e7 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/VersionRootDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/VersionRootDAOHibernate.java @@ -141,4 +141,17 @@ class VersionRootDAOHibernate extends HibernateDaoSupport implements "(select max(v.versionID) from VersionRootImpl v)"); return (VersionRoot)query.uniqueResult(); } + + /** + * Get the highest numbered id from all the versions in a store. + * @param store The store. + * @return The highest numbered id. + */ + public Integer getMaxVersionID(AVMStore store) + { + Query query = getSession().createQuery("select max(vr.versionID) from VersionRootImpl vr " + + "where vr.avmStore = :store"); + query.setEntity("store", store); + return (Integer)query.uniqueResult(); + } } diff --git a/source/java/org/alfresco/service/cmr/avm/AVMService.java b/source/java/org/alfresco/service/cmr/avm/AVMService.java index dac0db83a1..83b434a625 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMService.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMService.java @@ -192,15 +192,6 @@ public interface AVMService */ public void createDirectory(String path, String name); - /** - * Create a new directory, in an already copy on written node. - * This should only be used if you really know what you're doing. - * @param parent The parent node. - * @param name The name of the new directory. - * @return A descriptor for the newly created directory. - */ - public AVMNodeDescriptor createDirectory(AVMNodeDescriptor parent, String name); - /** * Create a new layered file. * @param targetPath The simple absolute path that the new file will point at. @@ -695,28 +686,6 @@ public interface AVMService */ public void link(String parentPath, String name, AVMNodeDescriptor toLink); - /** - * This is a more dangerous version of link, which assumes - * that copy on write has occurred for the parent node. This is - * an internal call. Don't use it if you don't know precisely - * what you are doing. - * @param parent The parent node. - * @param name The name to give the child. - * @param child The child node to link. - */ - public void link(AVMNodeDescriptor parent, String name, AVMNodeDescriptor child); - - /** - * Flatten a direct child of a layered directory. This does - * the equivalent of removing the given child from the directory - * and then doing an uncover. This routine makes many dangerous - * assumptions and is only for use by AVMSyncService. Don't use it - * if you don't know precisely what you are doing. - * @param lDir The layered directory node. - * @param name The name to flatten. - */ - public void flatten(AVMNodeDescriptor lDir, String name); - /** * Force copy on write of a path. * @param path The path to force.