You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ff...@apache.org on 2013/10/28 06:11:26 UTC
svn commit: r1536253 - in /servicemix/smx4/bundles/trunk/reflections-0.9.8:
./ src/main/java/ src/main/java/org/ src/main/java/org/reflections/
src/main/java/org/reflections/util/ src/main/java/org/reflections/vfs/
Author: ffang
Date: Mon Oct 28 05:11:25 2013
New Revision: 1536253
URL: http://svn.apache.org/r1536253
Log:
[SMX4-1599]Vfs in reflections can't handle bundle url
Added:
servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/
servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/
servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/
servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/Vfs.java
servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/util/
servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/vfs/
Modified:
servicemix/smx4/bundles/trunk/reflections-0.9.8/pom.xml
Modified: servicemix/smx4/bundles/trunk/reflections-0.9.8/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/bundles/trunk/reflections-0.9.8/pom.xml?rev=1536253&r1=1536252&r2=1536253&view=diff
==============================================================================
--- servicemix/smx4/bundles/trunk/reflections-0.9.8/pom.xml (original)
+++ servicemix/smx4/bundles/trunk/reflections-0.9.8/pom.xml Mon Oct 28 05:11:25 2013
@@ -43,6 +43,7 @@
org.reflections*
</servicemix.osgi.export.pkg>
<servicemix.osgi.import.pkg>
+ org.osgi.framework,
com.google.common.base;resolution:=optional,
com.google.common.cache;resolution:=optional,
com.google.common.collect;resolution:=optional,
@@ -101,6 +102,15 @@
<classifier>sources</classifier>
<optional>true</optional>
</dependency>
+
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.3.1</version>
+ </dependency>
+
+
+
</dependencies>
<build>
Added: servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/Vfs.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/Vfs.java?rev=1536253&view=auto
==============================================================================
--- servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/Vfs.java (added)
+++ servicemix/smx4/bundles/trunk/reflections-0.9.8/src/main/java/org/reflections/Vfs.java Mon Oct 28 05:11:25 2013
@@ -0,0 +1,261 @@
+package org.reflections.vfs;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import org.osgi.framework.FrameworkUtil;
+import org.reflections.Reflections;
+import org.reflections.ReflectionsException;
+import org.reflections.util.Utils;
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.JarFile;
+
+/**
+ * a simple virtual file system bridge
+ * <p>use the {@link org.reflections.vfs.Vfs#fromURL(java.net.URL)} to get a {@link org.reflections.vfs.Vfs.Dir}
+ * and than use {@link org.reflections.vfs.Vfs.Dir#getFiles()} to iterate over it's {@link org.reflections.vfs.Vfs.File}
+ * <p>for example:
+ * <pre>
+ * Vfs.Dir dir = Vfs.fromURL(url);
+ * Iterable<Vfs.File> files = dir.getFiles();
+ * for (Vfs.File file : files) {
+ * InputStream is = file.openInputStream();
+ * }
+ * </pre>
+ * <p>use {@link org.reflections.vfs.Vfs#findFiles(java.util.Collection, com.google.common.base.Predicate)} to get an
+ * iteration of files matching given name predicate over given list of urls
+ * <p><p>{@link org.reflections.vfs.Vfs#fromURL(java.net.URL)} uses static {@link org.reflections.vfs.Vfs.DefaultUrlTypes} to resolves URLs
+ * and it can be plugged in with {@link org.reflections.vfs.Vfs#addDefaultURLTypes(org.reflections.vfs.Vfs.UrlType)} or {@link org.reflections.vfs.Vfs#setDefaultURLTypes(java.util.List)}.
+ * <p>for example:
+ * <pre>
+ * Vfs.addDefaultURLTypes(new Vfs.UrlType() {
+ * public boolean matches(URL url) {
+ * return url.getProtocol().equals("http");
+ * }
+ * public Vfs.Dir createDir(final URL url) {
+ * return new HttpDir(url); //implement this type... (check out a naive implementation on VfsTest)
+ * }
+ * });
+ *
+ * Vfs.Dir dir = Vfs.fromURL(new URL("http://mirrors.ibiblio.org/pub/mirrors/maven2/org/slf4j/slf4j-api/1.5.6/slf4j-api-1.5.6.jar"));
+ * </pre>
+ */
+public abstract class Vfs {
+ private static List<UrlType> defaultUrlTypes = Lists.<UrlType>newArrayList(DefaultUrlTypes.values());
+
+ /** an abstract vfs dir */
+ public interface Dir {
+ String getPath();
+ Iterable<File> getFiles();
+ void close();
+ }
+
+ /** an abstract vfs file */
+ public interface File {
+ String getName();
+ String getRelativePath();
+ InputStream openInputStream() throws IOException;
+ }
+
+ /** a matcher and factory for a url */
+ public interface UrlType {
+ boolean matches(URL url) throws Exception;
+ Dir createDir(URL url) throws Exception;
+ }
+
+ /** the default url types that will be used when issuing {@link org.reflections.vfs.Vfs#fromURL(java.net.URL)} */
+ public static List<UrlType> getDefaultUrlTypes() {
+ return defaultUrlTypes;
+ }
+
+ /** sets the static default url types. can be used to statically plug in urlTypes */
+ public static void setDefaultURLTypes(final List<UrlType> urlTypes) {
+ defaultUrlTypes = urlTypes;
+ }
+
+ /** add a static default url types. can be used to statically plug in urlTypes */
+ public static void addDefaultURLTypes(UrlType urlType) {
+ defaultUrlTypes.add(urlType);
+ }
+
+ /** tries to create a Dir from the given url, using the defaultUrlTypes */
+ public static Dir fromURL(final URL url) {
+ return fromURL(url, defaultUrlTypes);
+ }
+
+ /** tries to create a Dir from the given url, using the given urlTypes*/
+ public static Dir fromURL(final URL url, final List<UrlType> urlTypes) {
+ for (UrlType type : urlTypes) {
+ try {
+ if (type.matches(url)) {
+ Dir dir = type.createDir(url);
+ if (dir != null) return dir;
+ }
+ } catch (Throwable e) {
+ /*if (Reflections.log != null) {
+ Reflections.log.warn("could not create Dir using " + type + " from url " + url.toExternalForm() + ". skipping.", e);
+ }*/
+ }
+ }
+
+ throw new ReflectionsException("could not create Vfs.Dir from url, no matching UrlType was found [" + url.toExternalForm() + "]\n" +
+ "either use fromURL(final URL url, final List<UrlType> urlTypes) or " +
+ "use the static setDefaultURLTypes(final List<UrlType> urlTypes) or addDefaultURLTypes(UrlType urlType) " +
+ "with your specialized UrlType.");
+ }
+
+ /** tries to create a Dir from the given url, using the given urlTypes*/
+ public static Dir fromURL(final URL url, final UrlType... urlTypes) {
+ return fromURL(url, Lists.<UrlType>newArrayList(urlTypes));
+ }
+
+ /** return an iterable of all {@link org.reflections.vfs.Vfs.File} in given urls, starting with given packagePrefix and matching nameFilter */
+ public static Iterable<File> findFiles(final Collection<URL> inUrls, final String packagePrefix, final Predicate<String> nameFilter) {
+ Predicate<File> fileNamePredicate = new Predicate<File>() {
+ public boolean apply(File file) {
+ String path = file.getRelativePath();
+ if (path.startsWith(packagePrefix)) {
+ String filename = path.substring(path.indexOf(packagePrefix) + packagePrefix.length());
+ return !Utils.isEmpty(filename) && nameFilter.apply(filename.substring(1));
+ } else {
+ return false;
+ }
+ }
+ };
+
+ return findFiles(inUrls, fileNamePredicate);
+ }
+
+ /** return an iterable of all {@link org.reflections.vfs.Vfs.File} in given urls, matching filePredicate */
+ public static Iterable<File> findFiles(final Collection<URL> inUrls, final Predicate<File> filePredicate) {
+ Iterable<File> result = new ArrayList<File>();
+
+ for (final URL url : inUrls) {
+ try {
+ result = Iterables.concat(result,
+ Iterables.filter(new Iterable<File>() {
+ public Iterator<File> iterator() {
+ return fromURL(url).getFiles().iterator();
+ }
+ }, filePredicate));
+ } catch (Throwable e) {
+ /*if (Reflections.log != null) {
+ Reflections.log.error("could not findFiles for url. continuing. [" + url + "]", e);
+ }*/
+ }
+ }
+
+ return result;
+ }
+
+ /**try to get {@link java.io.File} from url*/
+ static java.io.File getFile(URL url) {
+ java.io.File file;
+ String path;
+
+ try {
+ path = url.toURI().getSchemeSpecificPart();
+ if ((file = new java.io.File(path)).exists()) return file;
+ } catch (URISyntaxException e) {
+ }
+
+ try {
+ path = URLDecoder.decode(url.getPath(), "UTF-8");
+ if (path.contains(".jar!")) path = path.substring(0, path.lastIndexOf(".jar!") + ".jar".length());
+ if ((file = new java.io.File(path)).exists()) return file;
+
+ } catch (UnsupportedEncodingException e) {
+ }
+
+ try {
+ path = url.toExternalForm();
+ if (path.startsWith("jar:")) path = path.substring("jar:".length());
+ if (path.startsWith("file:")) path = path.substring("file:".length());
+ if (path.contains(".jar!")) path = path.substring(0, path.indexOf(".jar!") + ".jar".length());
+ if ((file = new java.io.File(path)).exists()) return file;
+
+ path = path.replace("%20", " ");
+ if ((file = new java.io.File(path)).exists()) return file;
+
+ } catch (Exception e) {
+ }
+
+ return null;
+ }
+
+ /** default url types used by {@link org.reflections.vfs.Vfs#fromURL(java.net.URL)}
+ * <p>
+ * <p>jarFile - creates a {@link org.reflections.vfs.ZipDir} over jar file
+ * <p>jarUrl - creates a {@link org.reflections.vfs.ZipDir} over a jar url (contains ".jar!/" in it's name)
+ * <p>directory - creates a {@link org.reflections.vfs.SystemDir} over a file system directory
+ * <p>vfs_jboss7 - creates a {@link org.reflections.vfs.SystemDir} over jboss 7 vfs
+ * */
+ public static enum DefaultUrlTypes implements UrlType {
+ jarFile {
+ public boolean matches(URL url) {
+ return url.getProtocol().equals("file") && url.toExternalForm().contains(".jar");
+ }
+
+ public Dir createDir(final URL url) throws Exception {
+ return new ZipDir(new JarFile(getFile(url)));
+ }
+ },
+
+ jarUrl {
+ public boolean matches(URL url) {
+ return "jar".equals(url.getProtocol());
+ }
+
+ public Dir createDir(URL url) throws Exception {
+ URLConnection urlConnection = url.openConnection();
+ return urlConnection instanceof JarURLConnection ?
+ new ZipDir(((JarURLConnection) urlConnection).getJarFile()) : null;
+ }
+ },
+
+ directory {
+ public boolean matches(URL url) {
+ return url.getProtocol().equals("file") && !url.toExternalForm().contains(".jar");
+ }
+
+ public Dir createDir(final URL url) throws Exception {
+ return new SystemDir(getFile(url));
+ }
+ },
+
+ bundleUrl {
+ public boolean matches(URL url) {
+ return url.getProtocol().equals("bundle");
+ }
+
+ public Dir createDir(final URL url) throws Exception {
+ try {
+ return new ZipDir(new JarFile(getFile(new URL(FrameworkUtil.getBundle(Vfs.class).getBundleContext().getBundle(getBundleIdforResourceScan(url.toExternalForm())).getLocation()))));
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private long getBundleIdforResourceScan(String bundleUrl) {
+ int startIdx = bundleUrl.indexOf("://");
+ int endIdx = bundleUrl.indexOf(".");
+ String retStr = bundleUrl.substring(startIdx + 3, endIdx);
+ return Long.valueOf(retStr).longValue();
+
+ }
+ },
+ }
+}