From a004242089274ec5e3c8c034e602c70aa2dd9165 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Tue, 29 Aug 2017 15:43:13 -0700 Subject: [PATCH] Fix #87 - normalize to forward slashes On windows when walking through jar contents some files use forward slashes and some backslashes. With this change we switch to a consistent usage of forward slashes throughout (converting backslashes to forward when necessary). With these changes the testsuites work on windows. --- .../java/CloseableFilterableJavaFileObjectIterable.java | 5 ++++- .../function/compiler/java/CompiledClassDefinition.java | 4 ++-- .../function/compiler/java/MemoryBasedJavaFileManager.java | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CloseableFilterableJavaFileObjectIterable.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CloseableFilterableJavaFileObjectIterable.java index a087b7dc7..7b89da2d6 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CloseableFilterableJavaFileObjectIterable.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CloseableFilterableJavaFileObjectIterable.java @@ -46,7 +46,8 @@ public abstract class CloseableFilterableJavaFileObjectIterable implements Itera if (packageNameFilter!=null && packageNameFilter.contains(File.separator)) { throw new IllegalArgumentException("Package name filters should use dots to separate components: "+packageNameFilter); } - this.packageNameFilter = packageNameFilter==null?null:packageNameFilter.replace('.', File.separatorChar) + "/"; + // Normalize filter to forward slashes + this.packageNameFilter = packageNameFilter==null?null:packageNameFilter.replace('.', '/') + '/'; this.includeSubpackages = includeSubpackages; } @@ -65,6 +66,8 @@ public abstract class CloseableFilterableJavaFileObjectIterable implements Itera return true; } boolean accept; + // Normalize to forward slashes (some jars are producing paths with forward slashes, some with backward slashes) + name = name.replace('\\', '/'); if (includeSubpackages == true) { accept = name.startsWith(packageNameFilter); if (!accept && BOOT_PACKAGING_AWARE) { diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompiledClassDefinition.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompiledClassDefinition.java index fcfb7ef60..fac62a66c 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompiledClassDefinition.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompiledClassDefinition.java @@ -33,10 +33,10 @@ public class CompiledClassDefinition { this.filename = filename; this.bytes = bytes; this.classname = filename; - if (classname.startsWith(File.separator)) { + if (classname.startsWith("/")) { classname = classname.substring(1); } - classname = classname.replace(File.separatorChar, '.').substring(0, classname.length()-6);//strip off .class + classname = classname.replace('/', '.').substring(0, classname.length()-6); //strip off .class } public String getName() { diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/MemoryBasedJavaFileManager.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/MemoryBasedJavaFileManager.java index 9e6663df7..eaf35312d 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/MemoryBasedJavaFileManager.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/MemoryBasedJavaFileManager.java @@ -147,7 +147,7 @@ public class MemoryBasedJavaFileManager implements JavaFileManager { } // Kind of ignoring location here... assuming we want basically the FQ type name // Example value from getName(): javax/validation/bootstrap/GenericBootstrap.class - String classname = file.getName().replace('/', '.'); + String classname = file.getName().replace('/', '.').replace('\\', '.'); return classname.substring(0, classname.lastIndexOf(".class")); }