Renaming artifact and packages
[scannotation] / src / main / java / org / scannotation / ClasspathUrlFinder.java
diff --git a/src/main/java/org/scannotation/ClasspathUrlFinder.java b/src/main/java/org/scannotation/ClasspathUrlFinder.java
new file mode 100644 (file)
index 0000000..122dfd0
--- /dev/null
@@ -0,0 +1,190 @@
+package org.scannotation;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * Various functions to locate URLs to scan
+ *
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class ClasspathUrlFinder
+{
+
+   /**
+    * Find the classpath URLs for a specific classpath resource.  The classpath URL is extracted
+    * from loader.getResources() using the baseResource.
+    *
+    * @param baseResource
+    * @return
+    */
+   public static URL[] findResourceBases(String baseResource, ClassLoader loader)
+   {
+      ArrayList<URL> list = new ArrayList<URL>();
+      try
+      {
+         Enumeration<URL> urls = loader.getResources(baseResource);
+         while (urls.hasMoreElements())
+         {
+            URL url = urls.nextElement();
+            list.add(findResourceBase(url, baseResource));
+         }
+      }
+      catch (IOException e)
+      {
+         throw new RuntimeException(e);
+      }
+      return list.toArray(new URL[list.size()]);
+   }
+
+   /**
+    * Find the classpath URLs for a specific classpath resource.  The classpath URL is extracted
+    * from loader.getResources() using the baseResource.
+    *
+    * @param baseResource
+    * @return
+    */
+   public static URL[] findResourceBases(String baseResource)
+   {
+      return findResourceBases(baseResource, Thread.currentThread().getContextClassLoader());
+   }
+
+   private static URL findResourceBase(URL url, String baseResource)
+   {
+      String urlString = url.toString();
+      int idx = urlString.lastIndexOf(baseResource);
+      urlString = urlString.substring(0, idx);
+      URL deployUrl = null;
+      try
+      {
+         deployUrl = new URL(urlString);
+      }
+      catch (MalformedURLException e)
+      {
+         throw new RuntimeException(e);
+      }
+      return deployUrl;
+   }
+
+   /**
+    * Find the classpath URL for a specific classpath resource.  The classpath URL is extracted
+    * from Thread.currentThread().getContextClassLoader().getResource() using the baseResource.
+    *
+    * @param baseResource
+    * @return
+    */
+   public static URL findResourceBase(String baseResource)
+   {
+      return findResourceBase(baseResource, Thread.currentThread().getContextClassLoader());
+   }
+
+   /**
+    * Find the classpath URL for a specific classpath resource.  The classpath URL is extracted
+    * from loader.getResource() using the baseResource.
+    *
+    * @param baseResource
+    * @param loader
+    * @return
+    */
+   public static URL findResourceBase(String baseResource, ClassLoader loader)
+   {
+      URL url = loader.getResource(baseResource);
+      return findResourceBase(url, baseResource);
+   }
+
+   /**
+    * Find the classpath for the particular class
+    *
+    * @param clazz
+    * @return
+    */
+   public static URL findClassBase(Class clazz)
+   {
+      String resource = clazz.getName().replace('.', '/') + ".class";
+      return findResourceBase(resource, clazz.getClassLoader());
+   }
+
+   /**
+    * Uses the java.class.path system property to obtain a list of URLs that represent the CLASSPATH
+    *
+    * @return
+    */
+   public static URL[] findClassPaths()
+   {
+      List<URL> list = new ArrayList<URL>();
+      String classpath = System.getProperty("java.class.path");
+      StringTokenizer tokenizer = new StringTokenizer(classpath, File.pathSeparator);
+
+      while (tokenizer.hasMoreTokens())
+      {
+         String path = tokenizer.nextToken();
+         File fp = new File(path);
+         if (!fp.exists()) throw new RuntimeException("File in java.class.path does not exist: " + fp);
+         try
+         {
+            list.add(fp.toURL());
+         }
+         catch (MalformedURLException e)
+         {
+            throw new RuntimeException(e);
+         }
+      }
+      return list.toArray(new URL[list.size()]);
+   }
+
+   /**
+    * Uses the java.class.path system property to obtain a list of URLs that represent the CLASSPATH
+    * <p/>
+    * paths is used as a filter to only include paths that have the specific relative file within it
+    *
+    * @param paths comma list of files that should exist in a particular path
+    * @return
+    */
+   public static URL[] findClassPaths(String... paths)
+   {
+      ArrayList<URL> list = new ArrayList<URL>();
+
+      String classpath = System.getProperty("java.class.path");
+      StringTokenizer tokenizer = new StringTokenizer(classpath, File.pathSeparator);
+      for (int i = 0; i < paths.length; i++)
+      {
+         paths[i] = paths[i].trim();
+      }
+
+      while (tokenizer.hasMoreTokens())
+      {
+         String path = tokenizer.nextToken().trim();
+         boolean found = false;
+         for (String wantedPath : paths)
+         {
+            if (path.endsWith(File.separator + wantedPath))
+            {
+               found = true;
+               break;
+            }
+         }
+         if (!found) continue;
+         File fp = new File(path);
+         if (!fp.exists()) throw new RuntimeException("File in java.class.path does not exists: " + fp);
+         try
+         {
+            list.add(fp.toURL());
+         }
+         catch (MalformedURLException e)
+         {
+            throw new RuntimeException(e);
+         }
+      }
+      return list.toArray(new URL[list.size()]);
+   }
+
+
+}
+