File names in zip need to agree with list of names provided.

git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1627395 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/java/org/apache/tomcat/buildutil/SignCode.java b/java/org/apache/tomcat/buildutil/SignCode.java
index 48df3fb..dc24a8b 100644
--- a/java/org/apache/tomcat/buildutil/SignCode.java
+++ b/java/org/apache/tomcat/buildutil/SignCode.java
@@ -160,13 +160,15 @@
                 requestSigningRequest.addChildElement("signingServiceName", NS);
         signingServiceName.addTextNode(this.signingService);
 
+        List<String> fileNames = getFileNames(filesToSign);
+
         SOAPElement commaDelimitedFileNames =
                 requestSigningRequest.addChildElement("commaDelimitedFileNames", NS);
-        commaDelimitedFileNames.addTextNode(getFileNames(filesToSign));
+        commaDelimitedFileNames.addTextNode(listToString(fileNames));
 
         SOAPElement application =
                 requestSigningRequest.addChildElement("application", NS);
-        application.addTextNode(getApplicationString(filesToSign));
+        application.addTextNode(getApplicationString(fileNames, filesToSign));
 
         // Send the message
         SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
@@ -204,6 +206,21 @@
     }
 
 
+    private String listToString(List<String> list) {
+        StringBuilder sb = new StringBuilder(list.size() * 6);
+        boolean doneFirst = false;
+        for (String s : list) {
+            if (doneFirst) {
+                sb.append(',');
+            } else {
+                doneFirst = true;
+            }
+            sb.append(s);
+        }
+        return sb.toString();
+    }
+
+
     private void downloadSignedFiles(List<File> filesToSign, String id)
             throws SOAPException, IOException {
 
@@ -294,50 +311,43 @@
      * extension since the signing service appears to use it to figure out what
      * to sign and how to sign it.
      */
-    private static String getFileNames(List<File> filesToSign) {
-        StringBuilder sb = new StringBuilder();
-
-        boolean first = true;
+    private static List<String> getFileNames(List<File> filesToSign) {
+        List<String> result = new ArrayList<>(filesToSign.size());
 
         for (int i = 0; i < filesToSign.size(); i++) {
-            if (first) {
-                first = false;
-            } else {
-                sb.append(',');
-            }
             File f = filesToSign.get(i);
             String fileName = f.getName();
             int extIndex = fileName.lastIndexOf('.');
-            String ext;
+            String newName;
             if (extIndex < 0) {
-                ext = null;
+                newName = Integer.toString(i);
             } else {
-                ext = fileName.substring(extIndex);
+                newName = Integer.toString(i) + fileName.substring(extIndex);
             }
-            sb.append(Integer.toString(i));
-            if (ext != null) {
-                sb.append(ext);
-            }
+            result.add(newName);
         }
-        return sb.toString();
+        return result;
     }
 
+
     /**
      * Zips the files, base 64 encodes the resulting zip and then returns the
      * string. It would be far more efficient to stream this directly to the
      * signing server but the files that need to be signed are relatively small
      * and this simpler to write.
      *
-     * @param files Files to be signed
+     * @param fileNames Modified names of files
+     * @param files     Files to be signed
      */
-    private static String getApplicationString(List<File> files) throws IOException {
+    private static String getApplicationString(List<String> fileNames, List<File> files)
+            throws IOException {
         // 16 MB should be more than enough for Tomcat
         ByteArrayOutputStream baos = new ByteArrayOutputStream(16 * 1024 * 1024);
         try (ZipOutputStream zos = new ZipOutputStream(baos)) {
             byte[] buf = new byte[32 * 1024];
             for (int i = 0; i < files.size(); i++) {
                 try (FileInputStream fis = new FileInputStream(files.get(i))) {
-                    ZipEntry zipEntry = new ZipEntry(Integer.toString(i));
+                    ZipEntry zipEntry = new ZipEntry(fileNames.get(i));
                     zos.putNextEntry(zipEntry);
                     int numRead;
                     while ( (numRead = fis.read(buf)) >= 0) {