You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2014/04/11 08:31:13 UTC
git commit: [OLINGO-239] Changed folder path handling
Repository: olingo-odata2
Updated Branches:
refs/heads/master df769309a -> e1b6ead92
[OLINGO-239] Changed folder path handling
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/e1b6ead9
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/e1b6ead9
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/e1b6ead9
Branch: refs/heads/master
Commit: e1b6ead92c2bb71055e99cc9f762e4bccbd96974
Parents: df76930
Author: Michael Bolz <mi...@apache.org>
Authored: Fri Apr 11 06:00:04 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Fri Apr 11 08:27:13 2014 +0200
----------------------------------------------------------------------
.../processor/core/util/ClassHelper.java | 56 ++++++++++++--------
.../processor/core/util/ClassHelperTest.java | 20 +++++++
2 files changed, 53 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/e1b6ead9/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
index 22ba73c..d81d9cf 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
@@ -23,6 +23,8 @@ import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Field;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
@@ -58,25 +60,22 @@ public class ClassHelper {
}
};
- public static final List<Class<?>> loadClasses(final String packageToScan, final ClassValidator cv) {
+ public static List<Class<?>> loadClasses(final String packageToScan, final ClassValidator cv) {
return loadClasses(packageToScan, CLASSFILE_FILTER, cv);
}
- public static final List<Class<?>> loadClasses(final String packageToScan, final FilenameFilter ff,
+ public static List<Class<?>> loadClasses(final String packageToScan, final FilenameFilter ff,
final ClassValidator cv) {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- String folderToScan = packageToScan.replace(PACKAGE_SEPARATOR, RESOURCE_SEPARATOR);
- URL url = classLoader.getResource(folderToScan);
- if (url == null) {
- throw new IllegalArgumentException("No folder to scan found for package '" + packageToScan + "'.");
- }
+
+ URI uri = getResourceUri(packageToScan, classLoader);
final Collection<String> fqnForClasses;
- File folder = new File(url.getFile());
+ File folder = new File(uri.getSchemeSpecificPart());
if (folder.isDirectory()) {
fqnForClasses = getClassFqnFromDir(ff, folder, packageToScan);
- } else if (isJarFile(url)) {
- fqnForClasses = getClassFqnFromJar(url.getFile().substring(5), packageToScan);
+ } else if (isJarFile(uri)) {
+ fqnForClasses = getClassFqnFromJar(uri, packageToScan);
} else {
fqnForClasses = null;
}
@@ -94,7 +93,7 @@ public class ClassHelper {
}
} catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Exception during class loading of class '" + fqn +
- " from resource '" + url.getFile() + "'" +
+ " from resource '" + uri + "'" +
"' with message '" + ex.getMessage() + "'.");
}
}
@@ -102,18 +101,29 @@ public class ClassHelper {
return annotatedClasses;
}
- private static boolean isJarFile(final URL url) {
- String filename = url.getFile();
- int index = filename.indexOf(JAR_RESOURCE_SEPARATOR);
- if (index > JAR_FILE_ENDING.length()) {
- String fileEnding = filename.substring(index - JAR_FILE_ENDING.length(), index);
- return JAR_FILE_ENDING.equalsIgnoreCase(fileEnding);
+ private static URI getResourceUri(String packageToScan, ClassLoader classLoader) {
+ String folderToScan = packageToScan.replace(PACKAGE_SEPARATOR, RESOURCE_SEPARATOR);
+ URL url = classLoader.getResource(folderToScan);
+ if (url == null) {
+ throw new IllegalArgumentException("No folder to scan found for package '" + packageToScan + "'.");
+ }
+ try {
+ URI uri = url.toURI();
+ if (uri == null) {
+ throw new IllegalArgumentException("No folder to scan found for package '" + packageToScan + "'.");
+ }
+ return uri;
+ } catch (URISyntaxException e) {
+ throw new IllegalArgumentException("Invalid folder path for path URL '" + url +
+ "' from thread context class loader.");
}
- return false;
}
- private static Collection<String> getClassFqnFromDir(final FilenameFilter ff, final File folder,
- final String packageToScan) {
+ private static boolean isJarFile(URI uri) {
+ return JAR_FILE_ENDING.equals(uri.getScheme());
+ }
+
+ private static Collection<String> getClassFqnFromDir(final FilenameFilter ff, File folder, String packageToScan) {
List<String> classFiles = new ArrayList<String>();
String[] classFilesForFolder = folder.list(ff);
for (String name : classFilesForFolder) {
@@ -129,10 +139,9 @@ public class ClassHelper {
return classFiles;
}
- private static Collection<String> getClassFqnFromJar(final String filepath, final String packageToScan) {
- JarFile jarFile = null;
-
+ private static Collection<String> getClassFqnFromJar(URI uri, String packageToScan) {
final String jarFilePath;
+ String filepath = uri.getSchemeSpecificPart().substring(5);
String[] split = filepath.split(JAR_RESOURCE_SEPARATOR);
if (split.length == 2) {
jarFilePath = split[0];
@@ -140,6 +149,7 @@ public class ClassHelper {
throw new IllegalArgumentException("Illegal jar file path '" + filepath + "'.");
}
+ JarFile jarFile = null;
try {
jarFile = new JarFile(jarFilePath);
List<String> classFileNames = new ArrayList<String>();
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/e1b6ead9/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
index 393b651..42dd259 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
@@ -15,6 +15,8 @@
*/
package org.apache.olingo.odata2.annotation.processor.core.util;
+import java.io.File;
+import java.net.URL;
import java.util.List;
import junit.framework.Assert;
@@ -59,6 +61,24 @@ public class ClassHelperTest {
Assert.assertEquals(SimpleEntity.class.getName(), loadedClasses.get(0).getName());
}
+ @Test(expected = ClassFormatError.class)
+ public void loadFromSpaceDir() throws Exception {
+ URL currentPath = Thread.currentThread().getContextClassLoader().getResource(".");
+ File folder = new File(currentPath.getFile(), "space space/package");
+ folder.mkdirs();
+ File classFile = new File(folder, "Invalid.class");
+ classFile.createNewFile();
+ String packageToScan = "space space.package";
+
+ //
+ List<Class<?>> loadedClasses = ClassHelper.loadClasses(packageToScan, annotatedTestEntityInnerClasses);
+
+ //
+ Assert.assertEquals(1, loadedClasses.size());
+ Assert.assertEquals(SimpleEntity.class.getName(), loadedClasses.get(0).getName());
+ }
+
+
@Test
public void loadSingleEntityFromJar() throws ODataException {
String packageToScan = AnnotatedEntity.class.getPackage().getName();