From: <jbo...@li...> - 2005-12-13 19:38:08
|
Author: adamw Date: 2005-12-13 14:37:52 -0500 (Tue, 13 Dec 2005) New Revision: 1808 Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnDirectoryProxy.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNodeProxy.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResource.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResourceProxy.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/DeleteOperation.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/StandaloneTest.java trunk/forge/portal-extensions/shotoku/shotoku-test/project.xml trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/AddDeleteTest.java trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/MultiSaveTest.java Log: http://jira.jboss.com/jira/browse/JBSHOTOKU-46 Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -35,6 +35,7 @@ import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.log4j.Logger; import org.apache.velocity.app.VelocityEngine; +import org.jboss.shotoku.exceptions.DeleteException; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.exceptions.SaveException; @@ -130,6 +131,18 @@ throws SaveException, RepositoryException; /** + * Deletes the given resources at one time. Recommended if you have multiple + * resources to delete. + * + * @param resources + * Resources to delete. + * @throws DeleteException + * @throws RepositoryException + */ + public abstract void delete(Collection<Resource> resources) + throws DeleteException, RepositoryException; + + /** * Saves the given resources at one time. Equivalent to * <code>save(Collection, String)</code>, where the collection is filled * with the two given resources. Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -22,6 +22,7 @@ package org.jboss.shotoku.svn; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -37,9 +38,7 @@ import org.jboss.shotoku.exceptions.SaveException; import org.jboss.shotoku.svn.operations.DeleteOperation; import org.jboss.shotoku.svn.operations.ResourceOperation; -import org.jboss.shotoku.svn.operations.WorkspaceMediator; import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.io.ISVNEditor; /** * @author Adam Warski (ad...@as...) @@ -131,6 +130,16 @@ return false; } + public void addDeleteOperation(Collection<ResourceOperation> ops) + throws DeleteException { + if (getFullName().length() <= 1) { + throw new DeleteException("Cannot delete the root directory!"); + } + + ops.add(new DeleteOperation(getId(), getFullPath(), + getParent().getFullPath())); + } + /* * INTERNAL OPS DECLARATIONS */ @@ -216,7 +225,8 @@ return svnDir; } - public void copyTo(Directory dir, String newName, String logMessage) throws CopyException { + public void copyTo(Directory dir, String newName, String logMessage) + throws CopyException { SvnDirectory svnDir; try { svnDir = getSvnDirectory(dir); @@ -244,6 +254,10 @@ throw new MoveException(e); } + if (getFullName().length() <= 1) { + throw new MoveException("Cannot move the root directory!"); + } + try { List<ResourceOperation> opsList = new ArrayList<ResourceOperation>(); @@ -260,35 +274,9 @@ } public void delete() throws DeleteException { - ISVNEditor editor = null; - try { - // Now performing the actual delete. - editor = getSvnCm().getRepository().getCommitEditor("", - new WorkspaceMediator()); - - editor.openRoot(-1); - editor.deleteEntry(getFullPath(), -1); - editor.closeDir(); - editor.closeEdit(); - - /* - * Notifying the service that a resource is deleted. Also, the - * parent directory (if it exists) is changed - it has one entry - * less. - */ - getService().addToDeleted(getId(), getFullPath()); - SvnDirectory parent = getParent(); - if (parent != null) { - getService().addDirectoryToModfied(getId(), parent.getFullPath()); - } - } catch (SVNException e) { - try { - editor.abortEdit(); - } catch (SVNException e1) { - // Can't do much here. - } - throw new DeleteException(e); - } + Set<Resource> toDelete = new HashSet<Resource>(); + toDelete.add(this); + getSvnCm().delete(toDelete); } public String getLogMessage() { Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -26,12 +26,15 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Set; import org.apache.commons.configuration.Configuration; import org.jboss.shotoku.Resource; import org.jboss.shotoku.ContentManager; +import org.jboss.shotoku.exceptions.DeleteException; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; import org.jboss.shotoku.exceptions.SaveException; @@ -262,6 +265,52 @@ } @Override + public void delete(Collection<Resource> resources) + throws DeleteException { + /* + * Collection all operations to perform - duplicates are automatically + * removed as we use a Set. + */ + Set<ResourceOperation> ops = new HashSet<ResourceOperation>(); + for (Resource resource : resources) { + SvnResource svnResource = (SvnResource) resource; + svnResource.addDeleteOperation(ops); + } + + // Sorting all operations. + List<ResourceOperation> opsList = + new LinkedList<ResourceOperation>(ops); + Collections.sort(opsList); + + // Now deleting any operations that are enclosed by other operations. + if (opsList.size() >= 2) { + ResourceOperation current = null; + + for (Iterator<ResourceOperation> iter = opsList.iterator(); + iter.hasNext();) { + if (current == null) { + // First operation - this hasn't to be deleted for sure. + current = iter.next(); + } else { + ResourceOperation ro = iter.next(); + + if (current.encloses(ro)) { + iter.remove(); + } else { + current = ro; + } + } + } + } + + try { + performOperations(opsList, ""); + } catch (SVNException e) { + throw new DeleteException(e); + } + } + + @Override public void save(Collection<Resource> resources, String logMessage) throws SaveException { /* Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnDirectoryProxy.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnDirectoryProxy.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnDirectoryProxy.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -26,8 +26,6 @@ import org.jboss.shotoku.Directory; import org.jboss.shotoku.Node; import org.jboss.shotoku.NodeList; -import org.jboss.shotoku.exceptions.CopyException; -import org.jboss.shotoku.exceptions.MoveException; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.exceptions.ResourceAlreadyExists; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; @@ -113,13 +111,4 @@ checkSwitch(); currentDirectory.setIndex(name, index); } - - public void moveTo(Directory dir, String logMessage) throws MoveException { - currentDirectory.moveTo(dir, logMessage); - } - - public void copyTo(Directory dir, String newName, String logMessage) - throws CopyException { - currentDirectory.copyTo(dir, newName, logMessage); - } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNodeProxy.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNodeProxy.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNodeProxy.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -25,10 +25,7 @@ import java.io.OutputStream; import java.util.Date; -import org.jboss.shotoku.Directory; import org.jboss.shotoku.History; -import org.jboss.shotoku.exceptions.CopyException; -import org.jboss.shotoku.exceptions.MoveException; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.svn.content.NodeContent; @@ -159,13 +156,4 @@ // called from the implementation of this function in SvnNode. return currentNode.getLastModificationDate(); } - - public void moveTo(Directory dir, String logMessage) throws MoveException { - currentNode.moveTo(dir, logMessage); - } - - public void copyTo(Directory dir, String newName, String logMessage) - throws CopyException { - currentNode.copyTo(dir, newName, logMessage); - } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResource.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResource.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResource.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -25,6 +25,7 @@ import java.util.Map; import org.jboss.shotoku.Resource; +import org.jboss.shotoku.exceptions.DeleteException; import org.jboss.shotoku.svn.operations.ResourceOperation; /** @@ -34,6 +35,8 @@ public boolean checkForChanges(); public void addOperations(Collection<ResourceOperation> ops); + public void addDeleteOperation(Collection<ResourceOperation> ops) + throws DeleteException ; public void notifySaved(); public boolean switchable(); Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResourceProxy.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResourceProxy.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnResourceProxy.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -25,7 +25,9 @@ import java.util.Map; import org.jboss.shotoku.Directory; +import org.jboss.shotoku.exceptions.CopyException; import org.jboss.shotoku.exceptions.DeleteException; +import org.jboss.shotoku.exceptions.MoveException; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.exceptions.ResourceDeleted; import org.jboss.shotoku.exceptions.SaveException; @@ -205,6 +207,11 @@ return currentResource.forceSwitch(); } + public void addDeleteOperation(Collection<ResourceOperation> ops) + throws DeleteException { + currentResource.addDeleteOperation(ops); + } + /* * Resource IMPLEMENTATION */ @@ -250,4 +257,13 @@ checkSwitch(); return currentResource.getProperties(); } + + public void moveTo(Directory dir, String logMessage) throws MoveException { + currentResource.moveTo(dir, logMessage); + } + + public void copyTo(Directory dir, String newName, String logMessage) + throws CopyException { + currentResource.copyTo(dir, newName, logMessage); + } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/DeleteOperation.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/DeleteOperation.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/DeleteOperation.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -49,4 +49,9 @@ service.addDirectoryToModfied(id, parentPath); service.addToDeleted(id, path); } + + @Override + public boolean encloses(ResourceOperation op) { + return op.path.startsWith(Tools.concatenatePaths(path, "")); + } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -67,8 +67,19 @@ public int hashCode() { return path.hashCode() + opCode.hashCode(); } - + /** + * Checks if this operation encloses the given one, that is, execution + * of this operation has more effects then the given one, so + * <code>op</code> doesn't have to be executed to all. + * @param op + * @return + */ + public boolean encloses(ResourceOperation op) { + return false; + } + + /** * Executes the specific acitons represented by this object. * * @param stack Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -26,13 +26,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.tmatesoft.svn.core.SVNCommitInfo; -import org.tmatesoft.svn.core.SVNDirEntry; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/StandaloneTest.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/StandaloneTest.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/StandaloneTest.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -21,14 +21,10 @@ */ package org.jboss.shotoku.test; -import java.io.ByteArrayOutputStream; -import java.io.OutputStream; import java.util.Arrays; import java.util.Calendar; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Random; import java.util.Set; import org.jboss.shotoku.ContentManager; @@ -40,9 +36,6 @@ import org.jboss.shotoku.exceptions.ResourceAlreadyExists; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; import org.jboss.shotoku.exceptions.SaveException; -import org.jboss.shotoku.svn.SvnContentManager; -import org.jboss.shotoku.svn.SvnRevisionInfo; -import org.jboss.shotoku.svn.SvnTools; import org.tmatesoft.svn.core.ISVNLogEntryHandler; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNLogEntry; @@ -79,7 +72,7 @@ public static void testCm() throws RepositoryException, ResourceDoesNotExist, ResourceAlreadyExists, SaveException { ContentManager cm = ContentManager.getContentManager("shotoku-test"); - Directory d = cm.getRootDirectory(); + //Directory d = cm.getRootDirectory(); Set<Resource> toSave = new HashSet<Resource>(); /*for (Directory c : d.getDirectories()) { System.out.println(c.getName()); @@ -479,7 +472,7 @@ } } - private static void printMap(Map m) { + public static void printMap(Map m) { for (Object k : m.keySet()) { System.out.println(k + " : " + m.get(k)); } Modified: trunk/forge/portal-extensions/shotoku/shotoku-test/project.xml =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-test/project.xml 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-test/project.xml 2005-12-13 19:37:52 UTC (rev 1808) @@ -50,4 +50,14 @@ </properties> </dependency> </dependencies> + + <build> + <sourceDirectory>src/java</sourceDirectory> + <resources> + <resource> + <directory>src/etc/</directory> + <include>**/*.xml</include> + </resource> + </resources> + </build> </project> Modified: trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/AddDeleteTest.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/AddDeleteTest.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/AddDeleteTest.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -21,7 +21,12 @@ */ package org.jboss.shotoku.test; +import java.util.HashSet; +import java.util.Set; + +import org.jboss.shotoku.Directory; import org.jboss.shotoku.Node; +import org.jboss.shotoku.Resource; import org.jboss.shotoku.exceptions.DeleteException; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.exceptions.ResourceAlreadyExists; @@ -34,6 +39,7 @@ */ public class AddDeleteTest extends ShotokuTest { private final static String TEST_FILE = "add-delete-test-1"; + private final static String TEST_DIR = "add-delete-test"; private void checkTestFileNotExists() { try { @@ -46,6 +52,36 @@ } } + public void testMultiDelete() throws Exception { + Directory parent = cm.getRootDirectory().newDirectory(TEST_DIR); + Directory d1 = parent.newDirectory("dir1"); + Directory d2 = parent.newDirectory("dir2"); + Node n1 = d1.newNode("node1"); + + cm.save(parent, n1, d2, ""); + + // All directories and nodes should exist. + parent = cm.getDirectory(TEST_DIR); + d1 = parent.getDirectory("dir1"); + d2 = parent.getDirectory("dir2"); + n1 = d1.getNode("node1"); + + // Deleting all and checking that they don't exist. + Set<Resource> toDelete = new HashSet<Resource>(); + toDelete.add(parent); + toDelete.add(d1); + toDelete.add(d2); + toDelete.add(n1); + cm.delete(toDelete); + + try { + cm.getNode(TEST_DIR + "/dir1/node1"); + fail(); + } catch (ResourceDoesNotExist e) { + // This should be thrown. + } + } + public void testDeleteWithoutSave() throws DeleteException, ResourceAlreadyExists, ResourceDoesNotExist { Node n = cm.getRootDirectory().newNode(TEST_FILE); Modified: trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/MultiSaveTest.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/MultiSaveTest.java 2005-12-13 18:29:37 UTC (rev 1807) +++ trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/MultiSaveTest.java 2005-12-13 19:37:52 UTC (rev 1808) @@ -34,7 +34,7 @@ public class MultiSaveTest extends ShotokuTest { private final static String TEST_DIR = "multi-save-test"; - public void testAddAfterDelete() throws ResourceAlreadyExists, ResourceDoesNotExist, RepositoryException, SaveException { + public void testMultiSave() throws ResourceAlreadyExists, ResourceDoesNotExist, RepositoryException, SaveException { Directory newDir1 = cm.getRootDirectory().newDirectory(TEST_DIR); Directory newDir2 = newDir1.newDirectory("a/b/c"); |