bug 408123: Preserve original war name in deploy status files.
diff --git a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificator.java b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificator.java
index a637dd7..917ee3d 100644
--- a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificator.java
+++ b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificator.java
@@ -63,6 +63,10 @@
     private static final String[] STATUS_FILENAMES_SUFFEXES = { DOT + OP_DEPLOY + DOT + SUCCESS_MARK, DOT + OP_DEPLOY + DOT + ERROR_MARK,

         DOT + OP_UNDEPLOY + DOT + SUCCESS_MARK, DOT + OP_UNDEPLOY + DOT + ERROR_MARK };

 

+    //pattern that matches the deploy status files - ".deploy.(ok|error)"

+    private static final String STATUS_FILENAMES_DEPLOY_PATTERN =  DOT + OP_DEPLOY + DOT + '(' + SUCCESS_MARK + '|' + ERROR_MARK + ')';

+    

+    

     /**

      * Deletes the current status file (if any) for the given deployable archive

      */

@@ -78,6 +82,33 @@
             }

         }

     }

+    

+    /**

+     * Deletes the first occurrence of a status file from deploy operation that matches the given war name pattern (if

+     * any). There should be one match only.

+     * 

+     * @return the war name prefix of the deleted status file or empty string, if there's no match found

+     */

+    public static String deleteStatusFileByNamePattern(String warNamePattern, File pickupDir) {

+        final File stateDir = new File(pickupDir, STATE_DIR_NAME);

+        if (stateDir.exists()) {

+            String[] statusFileNames = stateDir.list();

+            for (String stateFileName : statusFileNames) {

+                if (stateFileName.matches(warNamePattern + STATUS_FILENAMES_DEPLOY_PATTERN)) {

+                    deleteFile(new File(stateDir, stateFileName));

+                    return stateFileName.substring(0, stateFileName.lastIndexOf(OP_DEPLOY) - 1);

+                }

+            }

+        } else {

+            if (logger.isInfoEnabled()) {

+                logger.info("State directory [" + stateDir.getAbsolutePath() + "] does not exist. Therefore, there is no status file to delete.");

+            }

+        }

+        if (logger.isWarnEnabled()) {

+            logger.warn("Cannot delete any status file, as no status file matches the given warNamePattern [" + warNamePattern + "].");

+        }

+        return EMPTY_STRING;

+    }

 

     /**

      * Create status file about the given deplayable archive.

diff --git a/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificatorTest.java b/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificatorTest.java
index 6297c25..960d809 100644
--- a/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificatorTest.java
+++ b/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificatorTest.java
@@ -30,6 +30,9 @@
         "src/test/resources/test/testapp1.deploy.error", "src/test/resources/test/testapp1.undeploy.error",

         "src/test/resources/test/testapp2.deploy.ok" };

 

+    private static final String[] strangeStatusFiles = { "src/test/resources/test/test#strangesymbols.undeploy.ok", 

+    	"src/test/resources/test/test#strangesymbols.deploy.ok", "src/test/resources/test/teststrangesymbols.undeploy.ok"};

+    

     @Before

     public void setUp() {

         PICKUP_DIR.createDirectory();

@@ -53,6 +56,34 @@
         StatusFileModificator.deleteStatusFile("testapp2", pickupFolder);

         assertTrue(stateFolder.list().length == 0);

     }

+    

+    @Test

+    public void deleteStatusFileByPatternTest() throws Exception {

+        STATE_DIR.createDirectory();

+        copyDummyStatusFiles();

+        File stateFolder = STATE_DIR.toFile();

+        File pickupFolder = PICKUP_DIR.toFile();

+        assertTrue(stateFolder.list().length == 5);

+        String deleted = StatusFileModificator.deleteStatusFileByNamePattern("testapp2", pickupFolder);

+        assertTrue(stateFolder.list().length == 4);

+        assertTrue("Only 'testapp2' file should be deleted : ", deleted.equals("testapp2"));

+        StatusFileModificator.deleteStatusFile("testapp1", pickupFolder);

+        assertTrue(stateFolder.list().length == 0);

+    }

+

+    @Test

+    public void deleteStatusFileByPatternStrangeSymbolsTest() throws Exception {

+        STATE_DIR.createDirectory();

+        copyStrangeStatusFiles();

+        File stateFolder = STATE_DIR.toFile();

+        File pickupFolder = PICKUP_DIR.toFile();

+        assertTrue(stateFolder.list().length == 3);

+        String deleted = StatusFileModificator.deleteStatusFileByNamePattern("test[^a-zA-Z0-9_-]strangesymbols", pickupFolder);

+        assertTrue(stateFolder.list().length == 2);

+        assertTrue("Only 'test#strangesymbols' file should be deleted: ", deleted.equals("test#strangesymbols"));

+        assertTrue("Both undeploy status files should not be deleted: ",

+            stateFolder.list()[0].contains(".undeploy.") && stateFolder.list()[1].contains(".undeploy."));

+    }

 

     @Test

     public void createStatusFileOkTest() throws Exception {

@@ -91,8 +122,16 @@
     }

 

     private void copyDummyStatusFiles() {

-        for (String dummyStatusFile : dummyStatusFiles) {

-            PathReference sourceFile = new PathReference(dummyStatusFile);

+    	copyStatusFiles(dummyStatusFiles);

+    }

+    

+    private void copyStrangeStatusFiles() {

+    	copyStatusFiles(strangeStatusFiles);

+    }

+    

+    private void copyStatusFiles(String[] files) {

+    	for (String statusFile : files) {

+            PathReference sourceFile = new PathReference(statusFile);

             assertTrue(sourceFile.exists());

             PathReference copy = sourceFile.copy(STATE_DIR);

             assertTrue(copy.exists());

diff --git "a/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.deploy.ok" "b/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.deploy.ok"
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ "b/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.deploy.ok"
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git "a/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.undeploy.ok" "b/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.undeploy.ok"
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ "b/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.undeploy.ok"
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/org.eclipse.virgo.nano.deployer/src/test/resources/test/teststrangesymbols.undeploy.ok b/org.eclipse.virgo.nano.deployer/src/test/resources/test/teststrangesymbols.undeploy.ok
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ b/org.eclipse.virgo.nano.deployer/src/test/resources/test/teststrangesymbols.undeploy.ok
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754