[jboss-osgi-commits] JBoss-OSGI SVN: r92648 - in projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework: classloading and 1 other directory.

jboss-osgi-commits at lists.jboss.org jboss-osgi-commits at lists.jboss.org
Thu Aug 20 21:30:04 EDT 2009


Author: thomas.diesler at jboss.com
Date: 2009-08-20 21:30:02 -0400 (Thu, 20 Aug 2009)
New Revision: 92648

Added:
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/FrameworkClassLoader.java
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/RuntimeClassLoaderImpl.java
Removed:
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/FrameworkClassLoader.java
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/RuntimeClassLoaderImpl.java
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver/
Modified:
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/FrameworkImpl.java
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/BundleResolverPluginImpl.java
   projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/ClassLoaderFactoryPluginImpl.java
Log:
Rename resolver to classloading

Modified: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/FrameworkImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/FrameworkImpl.java	2009-08-21 01:18:12 UTC (rev 92647)
+++ projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/FrameworkImpl.java	2009-08-21 01:30:02 UTC (rev 92648)
@@ -43,6 +43,9 @@
 import org.jboss.osgi.jbossmc.api.FrameworkEventsPlugin;
 import org.jboss.osgi.jbossmc.api.ServiceEventsPlugin;
 import org.jboss.osgi.jbossmc.api.ServiceRegistryPlugin;
+import org.jboss.osgi.jbossmc.framework.classloading.BundleResolverPluginImpl;
+import org.jboss.osgi.jbossmc.framework.classloading.ClassLoaderFactoryPluginImpl;
+import org.jboss.osgi.jbossmc.framework.classloading.FrameworkClassLoader;
 import org.jboss.osgi.jbossmc.framework.plugins.BundleEventsPluginImpl;
 import org.jboss.osgi.jbossmc.framework.plugins.BundleFactoryPluginImpl;
 import org.jboss.osgi.jbossmc.framework.plugins.BundleLifecyclePluginImpl;
@@ -51,9 +54,6 @@
 import org.jboss.osgi.jbossmc.framework.plugins.FrameworkEventsPluginImpl;
 import org.jboss.osgi.jbossmc.framework.plugins.ServiceEventsPluginImpl;
 import org.jboss.osgi.jbossmc.framework.plugins.ServiceRegistryPluginImpl;
-import org.jboss.osgi.jbossmc.framework.resolver.BundleResolverPluginImpl;
-import org.jboss.osgi.jbossmc.framework.resolver.FrameworkClassLoader;
-import org.jboss.osgi.jbossmc.framework.resolver.ClassLoaderFactoryPluginImpl;
 import org.jboss.virtual.VFS;
 import org.jboss.virtual.VirtualFile;
 import org.osgi.framework.Bundle;

Copied: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading (from rev 92618, projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver)

Modified: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/BundleResolverPluginImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver/BundleResolverPluginImpl.java	2009-08-20 19:01:43 UTC (rev 92618)
+++ projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/BundleResolverPluginImpl.java	2009-08-21 01:30:02 UTC (rev 92648)
@@ -19,7 +19,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.osgi.jbossmc.framework.resolver;
+package org.jboss.osgi.jbossmc.framework.classloading;
 
 //$Id: $
 

Modified: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/ClassLoaderFactoryPluginImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver/ClassLoaderFactoryPluginImpl.java	2009-08-20 19:01:43 UTC (rev 92618)
+++ projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/ClassLoaderFactoryPluginImpl.java	2009-08-21 01:30:02 UTC (rev 92648)
@@ -19,7 +19,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.jboss.osgi.jbossmc.framework.resolver;
+package org.jboss.osgi.jbossmc.framework.classloading;
 
 //$Id: BundleLifecycleImpl.java 92578 2009-08-19 14:33:04Z thomas.diesler at jboss.com $
 

Deleted: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/FrameworkClassLoader.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver/FrameworkClassLoader.java	2009-08-20 19:01:43 UTC (rev 92618)
+++ projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/FrameworkClassLoader.java	2009-08-21 01:30:02 UTC (rev 92648)
@@ -1,112 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.osgi.jbossmc.framework.resolver;
-
-//$Id: FrameworkImpl.java 92607 2009-08-20 12:03:26Z thomas.diesler at jboss.com $
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.jboss.logging.Logger;
-import org.jboss.osgi.jbossmc.framework.FrameworkImpl;
-import org.osgi.framework.Constants;
-
-/**
- * A ClassLoader that only loads system packages defined by the framework.
- * 
- * @author thomas.diesler at jboss.com
- * @since 29-Jul-2009
- */
-public class FrameworkClassLoader extends ClassLoader
-{
-   // Provide logging
-   final Logger log = Logger.getLogger(FrameworkClassLoader.class);
-
-   private List<String> sysPackagesFull = new ArrayList<String>();
-   private List<String> sysPackages = new ArrayList<String>();
-
-   public FrameworkClassLoader(FrameworkImpl framework)
-   {
-      // Initialize system packages
-      String sysPackageStr = (String)framework.getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES);
-      if (sysPackageStr == null)
-      {
-         sysPackagesFull.add("org.osgi.framework");
-         sysPackagesFull.add("org.osgi.service.startlevel");
-         sysPackagesFull.add("org.osgi.service.packageadmin");
-         sysPackagesFull.add("org.osgi.util.tracker");
-      }
-      else
-      {
-         sysPackagesFull.clear();
-         sysPackagesFull.addAll(toList(sysPackageStr));
-      }
-
-      // Add extra system packages
-      String sysPackagesExtra = (String)framework.getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA);
-      if (sysPackagesExtra != null)
-      {
-         sysPackagesFull.addAll(toList(sysPackagesExtra));
-      }
-
-      // Remove the version specifier 
-      for (String packName : sysPackagesFull)
-      {
-         int semicolon = packName.indexOf(';');
-         if (semicolon > 0)
-            packName = packName.substring(0, semicolon);
-
-         sysPackages.add(packName.trim());
-      }
-
-      log.debug("Framework System Packages");
-      ArrayList<String> sortedList = new ArrayList<String>(sysPackagesFull);
-      Collections.sort(sortedList);
-      for (String packName : sortedList)
-         log.debug("  [" + packName + "]");
-   }
-
-   @Override
-   public Class<?> loadClass(String name) throws ClassNotFoundException
-   {
-      String packPrefix = name.substring(0, name.lastIndexOf('.'));
-      if (sysPackages.contains(packPrefix) == false)
-         throw new ClassNotFoundException("Cannot load from system packages: " + name);
-
-      return super.loadClass(name);
-   }
-
-   private List<String> toList(String packagesStr)
-   {
-      List<String> list = new ArrayList<String>();
-      StringTokenizer st = new StringTokenizer(packagesStr, ",");
-      while (st.hasMoreTokens())
-      {
-         String token = st.nextToken();
-         list.add(token.trim());
-      }
-      return list;
-   }
-}
\ No newline at end of file

Copied: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/FrameworkClassLoader.java (from rev 92639, projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver/FrameworkClassLoader.java)
===================================================================
--- projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/FrameworkClassLoader.java	                        (rev 0)
+++ projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/FrameworkClassLoader.java	2009-08-21 01:30:02 UTC (rev 92648)
@@ -0,0 +1,114 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.osgi.jbossmc.framework.classloading;
+
+// $Id: $
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.jboss.logging.Logger;
+import org.jboss.osgi.jbossmc.framework.FrameworkImpl;
+import org.osgi.framework.Constants;
+
+/**
+ * A ClassLoader that only loads system packages defined by the framework.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 29-Jul-2009
+ */
+public class FrameworkClassLoader extends ClassLoader
+{
+   // Provide logging
+   final Logger log = Logger.getLogger(FrameworkClassLoader.class);
+
+   private List<String> sysPackagesFull = new ArrayList<String>();
+   private List<String> sysPackages = new ArrayList<String>();
+
+   public FrameworkClassLoader(FrameworkImpl framework)
+   {
+      // Initialize system packages
+      String sysPackageStr = (String)framework.getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES);
+      if (sysPackageStr == null)
+      {
+         sysPackagesFull.add("org.osgi.framework");
+         sysPackagesFull.add("org.osgi.service.startlevel");
+         sysPackagesFull.add("org.osgi.service.packageadmin");
+         sysPackagesFull.add("org.osgi.util.tracker");
+      }
+      else
+      {
+         sysPackagesFull.clear();
+         sysPackagesFull.addAll(toList(sysPackageStr));
+      }
+
+      // Add extra system packages
+      String sysPackagesExtra = (String)framework.getProperty(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA);
+      if (sysPackagesExtra != null)
+      {
+         sysPackagesFull.addAll(toList(sysPackagesExtra));
+      }
+
+      // Remove the version specifier 
+      for (String packName : sysPackagesFull)
+      {
+         int semicolon = packName.indexOf(';');
+         if (semicolon > 0)
+            packName = packName.substring(0, semicolon);
+
+         sysPackages.add(packName.trim());
+      }
+
+      log.debug("Framework System Packages");
+      ArrayList<String> sortedList = new ArrayList<String>(sysPackagesFull);
+      Collections.sort(sortedList);
+      for (String packName : sortedList)
+         log.debug("  [" + packName + "]");
+   }
+
+   private List<String> toList(String packagesStr)
+   {
+      List<String> list = new ArrayList<String>();
+      StringTokenizer st = new StringTokenizer(packagesStr, ",");
+      while (st.hasMoreTokens())
+      {
+         String token = st.nextToken();
+         list.add(token.trim());
+      }
+      return list;
+   }
+
+   @Override
+   public Class<?> loadClass(String name) throws ClassNotFoundException
+   {
+      if (name == null)
+         throw new IllegalArgumentException("Cannot load null class");
+      
+      String packPrefix = name.substring(0, name.lastIndexOf('.'));
+      if (!name.startsWith("java.") && !sysPackages.contains(packPrefix))
+         throw new ClassNotFoundException("Cannot load from system packages: " + name);
+
+      return super.loadClass(name);
+   }
+}
\ No newline at end of file

Deleted: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/RuntimeClassLoaderImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver/RuntimeClassLoaderImpl.java	2009-08-20 19:01:43 UTC (rev 92618)
+++ projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/RuntimeClassLoaderImpl.java	2009-08-21 01:30:02 UTC (rev 92648)
@@ -1,175 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.osgi.jbossmc.framework.resolver;
-
-//$Id: $
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Enumeration;
-
-import org.jboss.logging.Logger;
-import org.jboss.osgi.jbossmc.api.RuntimeClassLoader;
-import org.jboss.osgi.jbossmc.framework.BundleImpl;
-import org.jboss.osgi.jbossmc.framework.FrameworkImpl;
-import org.jboss.osgi.spi.NotImplementedException;
-import org.jboss.virtual.VirtualFile;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.launch.Framework;
-
-/**
- * An implementation of a RuntimeClassLoader that uses a flat class
- * space for all installed bundles.
- * 
- * @author thomas.diesler at jboss.com
- * @since 18-Aug-2009
- */
-public class RuntimeClassLoaderImpl implements RuntimeClassLoader
-{
-   // Provide logging
-   final static Logger log = Logger.getLogger(RuntimeClassLoaderImpl.class);
-
-   private static GlobalFrameworkLoader globalClassLoader;
-
-   private VirtualFile vFile;
-   private ClassLoader parentClassLoader;
-
-   public RuntimeClassLoaderImpl(Framework framework, Bundle bundle)
-   {
-      BundleImpl bundleImpl = (BundleImpl)bundle;
-      vFile = bundleImpl.getVirtualFile();
-
-      parentClassLoader = getClass().getClassLoader();
-      
-      if (globalClassLoader == null)
-      {
-         FrameworkImpl frameworkImpl = (FrameworkImpl)framework;
-         ClassLoader frameworkLoader = frameworkImpl.getFrameworkLoader();
-         globalClassLoader = new GlobalFrameworkLoader(frameworkLoader);
-      }
-
-      try
-      {
-         addClassLoaderURL(vFile);
-      }
-      catch (IOException ex)
-      {
-         throw new IllegalStateException("Cannot add bundle url", ex);
-      }
-   }
-
-   private void addClassLoaderURL(VirtualFile vFile) throws IOException
-   {
-      URL url = failsafeURL(vFile);
-      globalClassLoader.addURL(url);
-      for (VirtualFile child : vFile.getChildren())
-      {
-         if (child.isArchive())
-         {
-            addClassLoaderURL(child);
-         }
-      }
-   }
-
-   public Class<?> loadClass(String className) throws ClassNotFoundException
-   {
-      if (className == null)
-         throw new IllegalArgumentException("Cannot load null class");
-
-      // Step #1 - class or resource is in a java.* package
-      if (className.startsWith("java."))
-         return parentClassLoader.loadClass(className);
-
-      return globalClassLoader.loadClass(className);
-   }
-
-   public URL getResource(String name)
-   {
-      URL resourceURL = null;
-      try
-      {
-         VirtualFile child = vFile.getChild(name);
-         if (child != null)
-            resourceURL = child.toURL();
-      }
-      catch (Exception ex)
-      {
-         // ignore
-      }
-      return resourceURL;
-   }
-
-   public Enumeration<URL> getResources(String name) throws IOException
-   {
-      // [TODO] Bundle.getResources(String name)
-      throw new NotImplementedException();
-   }
-
-   static class GlobalFrameworkLoader extends URLClassLoader
-   {
-      private ClassLoader parent;
-
-      public GlobalFrameworkLoader(ClassLoader parent)
-      {
-         super(new URL[] {}, null);
-         this.parent = parent;
-      }
-
-      @Override
-      public void addURL(URL url)
-      {
-         log.debug("Add URL: " + url);
-         super.addURL(url);
-      }
-
-      @Override
-      public Class<?> loadClass(String name) throws ClassNotFoundException
-      {
-         Class<?> clazz;
-         try
-         {
-            clazz = super.loadClass(name);
-         }
-         catch (ClassNotFoundException ex)
-         {
-            clazz = parent.loadClass(name);
-         }
-
-         return clazz;
-      }
-   }
-
-   private URL failsafeURL(VirtualFile vFile)
-   {
-      URL url = null;
-      try
-      {
-         url = vFile.toURL();
-      }
-      catch (Exception ex)
-      {
-         log.error("Cannot get URL from: " + vFile, ex);
-      }
-      return url;
-   }
-}
\ No newline at end of file

Copied: projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/RuntimeClassLoaderImpl.java (from rev 92647, projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/resolver/RuntimeClassLoaderImpl.java)
===================================================================
--- projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/RuntimeClassLoaderImpl.java	                        (rev 0)
+++ projects/jboss-osgi/trunk/reactor/runtime/jbossmc/src/main/java/org/jboss/osgi/jbossmc/framework/classloading/RuntimeClassLoaderImpl.java	2009-08-21 01:30:02 UTC (rev 92648)
@@ -0,0 +1,178 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.osgi.jbossmc.framework.classloading;
+
+//$Id: $
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.logging.Logger;
+import org.jboss.osgi.jbossmc.api.BundleStoragePlugin;
+import org.jboss.osgi.jbossmc.api.RuntimeClassLoader;
+import org.jboss.osgi.jbossmc.framework.BundleContextImpl;
+import org.jboss.osgi.jbossmc.framework.BundleImpl;
+import org.jboss.osgi.jbossmc.framework.FrameworkImpl;
+import org.jboss.osgi.spi.NotImplementedException;
+import org.jboss.virtual.VFSUtils;
+import org.jboss.virtual.VirtualFile;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.launch.Framework;
+
+/**
+ * An implementation of a RuntimeClassLoader that uses a flat class space for all installed bundles.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 18-Aug-2009
+ */
+public class RuntimeClassLoaderImpl implements RuntimeClassLoader
+{
+   // Provide logging
+   final static Logger log = Logger.getLogger(RuntimeClassLoaderImpl.class);
+
+   private static GlobalFrameworkLoader globalClassLoader;
+
+   private Bundle bundle;
+   private VirtualFile vFile;
+   private ClassLoader parentClassLoader;
+
+   public RuntimeClassLoaderImpl(Framework framework, Bundle bundle)
+   {
+      this.bundle = bundle;
+      this.vFile = ((BundleImpl)bundle).getVirtualFile();
+
+      parentClassLoader = getClass().getClassLoader();
+
+      if (globalClassLoader == null)
+      {
+         FrameworkImpl frameworkImpl = (FrameworkImpl)framework;
+         ClassLoader frameworkLoader = frameworkImpl.getFrameworkLoader();
+         globalClassLoader = new GlobalFrameworkLoader(frameworkLoader);
+      }
+
+      try
+      {
+         addClassLoaderURL(vFile);
+      }
+      catch (IOException ex)
+      {
+         throw new IllegalStateException("Cannot add bundle url", ex);
+      }
+   }
+
+   private void addClassLoaderURL(VirtualFile vFile) throws IOException
+   {
+      BundleContextImpl context = (BundleContextImpl)bundle.getBundleContext();
+      BundleStoragePlugin storage = context.getPlugin(BundleStoragePlugin.class);
+
+      File storageFile = storage.getDataFile(bundle, "internal/" + vFile.getName());
+      VFSUtils.copyStreamAndClose(vFile.openStream(), new FileOutputStream(storageFile));
+
+      globalClassLoader.addURL(storageFile.toURL());
+      for (VirtualFile child : vFile.getChildren())
+      {
+         if (child.isArchive())
+         {
+            addClassLoaderURL(child);
+         }
+      }
+   }
+
+   public Class<?> loadClass(String name) throws ClassNotFoundException
+   {
+      if (name == null)
+         throw new IllegalArgumentException("Cannot load null class");
+
+      // Step #1 - class or resource is in a java.* package
+      if (name.startsWith("java."))
+         return parentClassLoader.loadClass(name);
+
+      return globalClassLoader.loadClass(name);
+   }
+
+   public URL getResource(String name)
+   {
+      URL resourceURL = null;
+      try
+      {
+         VirtualFile child = vFile.getChild(name);
+         if (child != null)
+            resourceURL = child.toURL();
+      }
+      catch (Exception ex)
+      {
+         // ignore
+      }
+      return resourceURL;
+   }
+
+   public Enumeration<URL> getResources(String name) throws IOException
+   {
+      // [TODO] Bundle.getResources(String name)
+      throw new NotImplementedException();
+   }
+
+   static class GlobalFrameworkLoader extends URLClassLoader
+   {
+      private ClassLoader parent;
+      private Set<String> urlCache = new HashSet<String>();
+
+      public GlobalFrameworkLoader(ClassLoader parent)
+      {
+         super(new URL[] {}, null);
+         this.parent = parent;
+      }
+
+      @Override
+      public void addURL(URL url)
+      {
+         if (urlCache.contains(url.toExternalForm()) == false)
+         {
+            log.debug("Add URL: " + url);
+            urlCache.add(url.toExternalForm());
+            super.addURL(url);
+         }
+      }
+
+      @Override
+      public Class<?> loadClass(String name) throws ClassNotFoundException
+      {
+         Class<?> clazz;
+         try
+         {
+            clazz = parent.loadClass(name);
+         }
+         catch (ClassNotFoundException ex)
+         {
+            clazz = super.loadClass(name);
+         }
+
+         return clazz;
+      }
+   }
+}
\ No newline at end of file



More information about the jboss-osgi-commits mailing list