[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