You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pa...@apache.org on 2009/04/17 14:39:30 UTC

svn commit: r765971 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework: URLHandlers.java URLHandlersContentHandlerProxy.java URLHandlersServiceTracker.java URLHandlersStreamHandlerProxy.java searchpolicy/ModuleImpl.java

Author: pauls
Date: Fri Apr 17 12:39:30 2009
New Revision: 765971

URL: http://svn.apache.org/viewvc?rev=765971&view=rev
Log:
Rework stream handler proxies to not do classloads when looking up the URLHandler services (FELIX-1035).

Removed:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersServiceTracker.java
Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersContentHandlerProxy.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java?rev=765971&r1=765970&r2=765971&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java Fri Apr 17 12:39:30 2009
@@ -20,19 +20,16 @@
 
 import java.net.ContentHandler;
 import java.net.ContentHandlerFactory;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
-import org.apache.felix.framework.searchpolicy.ModuleImpl.ModuleClassLoader;
 import org.apache.felix.framework.util.FelixConstants;
 import org.apache.felix.framework.util.SecureAction;
 import org.apache.felix.framework.util.SecurityManagerEx;
@@ -79,6 +76,10 @@
 **/
 class URLHandlers implements URLStreamHandlerFactory, ContentHandlerFactory
 {
+    private static final Class[] CLASS_TYPE = new Class[]{Class.class};
+
+    private static final Class URLHANDLERS_CLASS = URLHandlers.class;
+
     private static final SecureAction m_secureAction = new SecureAction();
 
     private static volatile SecurityManagerEx m_sm = null;
@@ -122,7 +123,7 @@
         {
             m_handlerToURL.put(getBuiltInStreamHandler(protocol, null), new URL(protocol + ":") );
         }
-        catch (MalformedURLException ex)
+        catch (Throwable ex)
         {
             ex.printStackTrace();
             // Ignore, this is a best effort (maybe log it or something).
@@ -143,7 +144,15 @@
         init("ftp");
         init("http");
         init("https");
-        getBuiltInStreamHandler("jar", null);
+        try 
+        {
+            getBuiltInStreamHandler("jar", null);
+        }
+        catch (Throwable ex)
+        {
+            ex.printStackTrace();
+            // Ignore, this is a best effort (maybe log it or something)
+        }
         m_sm = new SecurityManagerEx();
         synchronized (URL.class)
         {
@@ -160,18 +169,18 @@
                     // there already is a factory set so try to swap it with ours.
                     m_streamHandlerFactory = (URLStreamHandlerFactory)
                         m_secureAction.swapStaticFieldIfNotClass(URL.class, 
-                        URLStreamHandlerFactory.class, URLHandlers.class, "streamHandlerLock");
+                        URLStreamHandlerFactory.class, URLHANDLERS_CLASS, "streamHandlerLock");
                     
                     if (m_streamHandlerFactory == null)
                     {
                         throw err;
                     }
-                    if (!m_streamHandlerFactory.getClass().getName().equals(URLHandlers.class.getName()))
+                    if (!m_streamHandlerFactory.getClass().getName().equals(URLHANDLERS_CLASS.getName()))
                     {
                         URL.setURLStreamHandlerFactory(this);
                         m_rootURLHandlers = this;
                     }
-                    else if (URLHandlers.class != m_streamHandlerFactory.getClass())
+                    else if (URLHANDLERS_CLASS != m_streamHandlerFactory.getClass())
                     {
                         try
                         {
@@ -179,7 +188,7 @@
                                 m_secureAction.getDeclaredMethod(m_streamHandlerFactory.getClass(), 
                                 "registerFrameworkListsForContextSearch", 
                                 new Class[]{ClassLoader.class, List.class}), 
-                                m_streamHandlerFactory, new Object[]{ URLHandlers.class.getClassLoader(), 
+                                m_streamHandlerFactory, new Object[]{ URLHANDLERS_CLASS.getClassLoader(), 
                                     m_frameworks });
                             m_rootURLHandlers = m_streamHandlerFactory;
                         }
@@ -208,13 +217,13 @@
                     m_contentHandlerFactory = (ContentHandlerFactory) 
                         m_secureAction.swapStaticFieldIfNotClass(
                             URLConnection.class, ContentHandlerFactory.class, 
-                            URLHandlers.class, null);
+                            URLHANDLERS_CLASS, null);
                     if (m_contentHandlerFactory == null)
                     {
                         throw err;
                     }
                     if (!m_contentHandlerFactory.getClass().getName().equals(
-                        URLHandlers.class.getName()))
+                        URLHANDLERS_CLASS.getName()))
                     {
                         URLConnection.setContentHandlerFactory(this);
                     }
@@ -226,7 +235,7 @@
             }
         }
         // are we not the new root?
-        if (!((m_streamHandlerFactory == this) || !URLHandlers.class.getName().equals(
+        if (!((m_streamHandlerFactory == this) || !URLHANDLERS_CLASS.getName().equals(
             m_streamHandlerFactory.getClass().getName())))
         {
             m_sm = null;
@@ -271,7 +280,7 @@
                                 ex.printStackTrace();
                             }
                             
-                            if (m_streamHandlerFactory.getClass() != URLHandlers.class)
+                            if (m_streamHandlerFactory.getClass() != URLHANDLERS_CLASS)
                             {
                                 URL.setURLStreamHandlerFactory(m_streamHandlerFactory);
                             }
@@ -287,7 +296,7 @@
                                 ex.printStackTrace();
                             }
                             
-                            if (m_contentHandlerFactory.getClass() != URLHandlers.class)
+                            if (m_contentHandlerFactory.getClass() != URLHANDLERS_CLASS)
                             {
                                 URLConnection.setContentHandlerFactory(m_contentHandlerFactory);
                             }
@@ -471,31 +480,6 @@
         return result;
     }
 
-    synchronized void flush()
-    {
-        if (m_streamHandlerCache != null)
-        {
-            for (Iterator iter = m_streamHandlerCache.values().iterator();iter.hasNext();)
-            {
-                Object proxy = iter.next();
-                if (proxy instanceof URLHandlersStreamHandlerProxy)
-                {
-                    ((URLHandlersStreamHandlerProxy) proxy).flush();
-                }
-            }
-        }
-        if (m_contentHandlerCache != null)
-        {
-            for (Iterator iter = m_contentHandlerCache.values().iterator();iter.hasNext();)
-            {
-                Object proxy = iter.next();
-                if (proxy instanceof URLHandlersContentHandlerProxy)
-                {
-                    ((URLHandlersContentHandlerProxy) proxy).flush();
-                }
-            }
-        }
-    }
     /**
      * <p>
      * Static method that adds a framework instance to the centralized
@@ -542,18 +526,6 @@
             m_counter--;
             if (m_frameworks.remove(framework))
             {    
-                try
-                {
-                    m_secureAction.invoke(m_secureAction.getDeclaredMethod(
-                        m_rootURLHandlers.getClass(), 
-                       "flush", null), 
-                       m_rootURLHandlers, null);
-                }
-                catch (Exception e)
-                {
-                    // TODO: this should not happen
-                    e.printStackTrace();
-                }
                 if (m_frameworks.isEmpty())
                 {
                     try
@@ -563,7 +535,7 @@
                             "unregisterFrameworkListsForContextSearch", 
                             new Class[]{ ClassLoader.class}), 
                             m_rootURLHandlers,
-                            new Object[] {URLHandlers.class.getClassLoader()});
+                            new Object[] {URLHANDLERS_CLASS.getClassLoader()});
                     }
                     catch (Exception e)
                     {
@@ -610,7 +582,7 @@
         for (int i = 0; i < stack.length; i++)
         {
             if ((stack[i].getClassLoader() != null) && 
-                ModuleClassLoader.class.getName().equals(
+                "org.apache.felix.framework.searchpolicy.ModuleImpl.ModuleClassLoader".equals(
                 stack[i].getClassLoader().getClass().getName()))
             {
                 targetClass = stack[i];
@@ -630,7 +602,7 @@
                 List frameworks = (List) m_classloaderToFrameworkLists.get(
                     index);
                 
-                if ((frameworks == null) && (index == URLHandlers.class.getClassLoader())) 
+                if ((frameworks == null) && (index == URLHANDLERS_CLASS.getClassLoader())) 
                 {
                     frameworks = m_frameworks;
                 }
@@ -646,7 +618,7 @@
                             {
                                 if (m_secureAction.invoke(
                                     m_secureAction.getDeclaredMethod(framework.getClass(), 
-                                    "getBundle", new Class[]{Class.class}),
+                                    "getBundle", CLASS_TYPE),
                                     framework, new Object[]{targetClass}) != null)
                                 {
                                     return framework;

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersContentHandlerProxy.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersContentHandlerProxy.java?rev=765971&r1=765970&r2=765971&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersContentHandlerProxy.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersContentHandlerProxy.java Fri Apr 17 12:39:30 2009
@@ -23,12 +23,10 @@
 import java.net.ContentHandlerFactory;
 import java.net.URLConnection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.StringTokenizer;
 
 import org.apache.felix.framework.util.SecureAction;
-import org.osgi.service.url.URLConstants;
 
 /**
  * <p>
@@ -54,6 +52,11 @@
 **/
 class URLHandlersContentHandlerProxy extends ContentHandler
 {
+    private static final Object[] SERVICE_RANKING_PARAMS = new Object[]{"service.ranking"};
+    private static final Object[] SERVICE_ID_PARAMS = new Object[]{"service.id"};
+    private static final Class[] STRING_TYPES = new Class[]{String.class};
+    private static final Class[] STRING_STRING_TYPES = new Class[]{String.class, String.class};
+
     private static final String CONTENT_HANDLER_PACKAGE_PROP = "java.content.handler.pkgs";
     private static final String DEFAULT_CONTENT_HANDLER_PACKAGE = "sun.net.www.content|com.ibm.oti.net.www.content|gnu.java.net.content|org.apache.harmony.luni.internal.net.www.content|COM.newmonics.www.content";
     
@@ -70,9 +73,9 @@
 
     private final ContentHandlerFactory m_factory;
 
-    private final Map m_trackerMap = new HashMap();
     private final String m_mimeType;
     private final SecureAction m_action;
+    private final Object[] m_filter;
 
     public URLHandlersContentHandlerProxy(String mimeType, SecureAction action, 
         ContentHandlerFactory factory)
@@ -80,7 +83,11 @@
         m_mimeType = mimeType;
         m_action = action;
         m_factory = factory;
-    }
+        m_filter = new Object[]{"java.net.ContentHandler", 
+            "(&(objectClass=java.net.ContentHandler)(url.content.mimetype="
+            + mimeType
+            + "))"};
+    } 
 
     //
     // ContentHandler interface method.
@@ -116,63 +123,65 @@
         {
             return getBuiltIn();
         }
-
-        // Get the service tracker for the framework instance or create one.
-        Object tracker;
-        synchronized (m_trackerMap)
-        {
-            tracker = m_trackerMap.get(framework);
-        }
-        try
-        {
-            if (tracker == null)
-            {
-                // Create a filter for the mime type.
-                String filter = 
-                    "(&(objectClass="
-                    + ContentHandler.class.getName()
-                    + ")("
-                    + URLConstants.URL_CONTENT_MIMETYPE
-                    + "="
-                    + m_mimeType
-                    + "))";
-                // Create a simple service tracker for the framework.
-                tracker = m_action.invoke(m_action.getConstructor(
-                    framework.getClass().getClassLoader().loadClass(
-                    URLHandlersServiceTracker.class.getName()),
-                    new Class[]{framework.getClass().getClassLoader().loadClass(
-                    Felix.class.getName()), String.class}), 
-                    new Object[]{framework, filter});
-                // Cache the simple service tracker.
-                synchronized (m_trackerMap) 
+        try 
+        {
+            Object context = m_action.invoke(
+                    m_action.getMethod(framework.getClass(), "getBundleContext", null),framework, null);
+                
+            Class contextClass = context.getClass();
+            
+            Object[] refs = (Object[]) m_action.invoke(
+                m_action.getMethod(contextClass, "getServiceReferences", STRING_STRING_TYPES), 
+                context, m_filter);
+            
+            Object ref = null;
+            int highestRank = -1;
+            long currentId = -1;
+            if (refs != null) 
+            {
+                // Loop through all service references and select the reference
+                // with the highest ranking and lower service identifier.
+                for (int i = 0; (refs != null) && (i < refs.length); i++)
                 {
-                    if (!m_trackerMap.containsKey(framework))
+                    Class refClass = refs[i].getClass();
+                    Long idObj = (Long) m_action.invoke(m_action.getMethod(refClass, 
+                        "getProperty", STRING_TYPES), refs[i], SERVICE_ID_PARAMS);
+                    Integer rankObj = (Integer)  m_action.invoke(m_action.getMethod(refClass, 
+                    "getProperty", STRING_TYPES), refs[i], SERVICE_RANKING_PARAMS);
+                    // Ranking value defaults to zero.
+                    int rank = (rankObj == null) ? 0 : rankObj.intValue();
+                    if ((rank > highestRank) ||
+                        ((rank == highestRank) && (idObj.longValue() < currentId)))
                     {
-                        m_trackerMap.put(framework, tracker);
-                    }
-                    else
-                    {
-                        tracker = m_trackerMap.get(framework);
+                        ref = refs[i];
+                        highestRank = rank;
+                        currentId = idObj.longValue();
                     }
                 }
             }
-            ContentHandler result;
-            if (tracker instanceof URLHandlersServiceTracker)
-            {
-                result = (ContentHandler) 
-                    ((URLHandlersServiceTracker) tracker).getService();
-            }
-            else
+            ContentHandler service = null;
+            if (ref != null) 
             {
-                result = (ContentHandler) m_action.invokeDirect(
-                    m_action.getMethod(tracker.getClass(), "getService", null), 
-                    tracker, null);
+                Class serviceRef = null;
+                Class[] interfaces = ref.getClass().getInterfaces();
+                for (int i = 0;i < interfaces.length; i++) 
+                {
+                    if ("org.osgi.framework.ServiceReference".equals(interfaces[i].getName()))
+                    {
+                        serviceRef = interfaces[i];
+                        break;
+                    }
+                }
+                service = (ContentHandler) m_action.invoke(
+                    m_action.getMethod(contextClass, "getService", new Class[]{serviceRef}), 
+                    context, new Object[]{ref});
             }
-            if (result == null)
+        
+            if (service == null)
             {
-                result = getBuiltIn();
+                service = getBuiltIn();
             }
-            return result;
+            return service;
         }
         catch (Exception ex)
         {
@@ -182,38 +191,6 @@
         }
     }
 
-    void flush()
-    {
-        synchronized (m_trackerMap)
-        {
-            for (Iterator iter = m_trackerMap.values().iterator(); iter.hasNext();)
-            {
-                unregister(iter.next());
-            }
-            m_trackerMap.clear();
-        }
-    }
-
-    private void unregister(Object tracker)
-    {
-        if (tracker instanceof URLHandlersServiceTracker)
-        {
-            ((URLHandlersServiceTracker) tracker).unregister();
-        }
-        else
-        {
-            try
-            {
-                m_action.invokeDirect(m_action.getMethod(tracker.getClass(), 
-                    "unregister", null), tracker, null);
-            }
-            catch (Exception e)
-            {
-                // Not much we can do - log this or something
-            }
-        }
-    }
-
     private ContentHandler getBuiltIn()
     {
         synchronized (m_builtIn)

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java?rev=765971&r1=765970&r2=765971&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java Fri Apr 17 12:39:30 2009
@@ -23,13 +23,7 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.net.*;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.StringTokenizer;
-
 import org.apache.felix.framework.util.SecureAction;
-import org.osgi.service.url.URLConstants;
 import org.osgi.service.url.URLStreamHandlerService;
 import org.osgi.service.url.URLStreamHandlerSetter;
 
@@ -58,6 +52,10 @@
 public final class URLHandlersStreamHandlerProxy extends URLStreamHandler
     implements URLStreamHandlerSetter, InvocationHandler
 {
+    private static final Object[] SERVICE_RANKING_PARAMS = new Object[]{"service.ranking"};
+    private static final Object[] SERVICE_ID_PARAMS = new Object[]{"service.id"};
+    private static final Class[] STRING_TYPES = new Class[]{String.class};
+    private static final Class[] STRING_STRING_TYPES = new Class[]{String.class, String.class};
     private static final Method EQUALS;
     private static final Method GET_DEFAULT_PORT;
     private static final Method GET_HOST_ADDRESS;
@@ -102,31 +100,33 @@
             throw new RuntimeException(ex.getMessage());
         }
     }
-    
-    private final Map m_trackerMap = new HashMap();
-    private final String m_protocol;
+
     private final Object m_service;
     private final SecureAction m_action;
     private final URLStreamHandler m_builtIn;
     private final URL m_builtInURL;
+    private final Object[] m_filter;
 
     public URLHandlersStreamHandlerProxy(String protocol, 
         SecureAction action, URLStreamHandler builtIn, URL builtInURL)
     {
-        m_protocol = protocol;
         m_service = null;
         m_action = action;
         m_builtIn = builtIn;
         m_builtInURL = builtInURL;
+        m_filter = new Object[]{"org.osgi.service.url.URLStreamHandlerService", 
+            "(&(objectClass=org.osgi.service.url.URLStreamHandlerService)(url.handler.protocol="
+            + protocol
+            + "))"};
     }
     
     private URLHandlersStreamHandlerProxy(Object service, SecureAction action)
     {
-        m_protocol = null;
         m_service = service;
         m_action = action;
         m_builtIn = null;
         m_builtInURL = null;
+        m_filter = null;
     }
 
     //
@@ -416,55 +416,56 @@
             {
                 return m_builtIn;
             }
-    
-            // Get the service tracker for the framework instance or create one.
-            Object tracker;
-            synchronized (m_trackerMap)
-            {
-                tracker = m_trackerMap.get(framework);
-            }
-            if (tracker == null)
-            {
-                // Create a filter for the protocol.
-                String filter = 
-                    "(&(objectClass="
-                    + URLStreamHandlerService.class.getName()
-                    + ")("
-                    + URLConstants.URL_HANDLER_PROTOCOL
-                    + "="
-                    + m_protocol
-                    + "))";
-                // Create a simple service tracker for the framework.
-                tracker = m_action.invoke(m_action.getConstructor(
-                    framework.getClass().getClassLoader().loadClass(
-                    "org.apache.felix.framework.URLHandlersServiceTracker"), 
-                    new Class[]{framework.getClass().getClassLoader().loadClass(
-                    "org.apache.felix.framework.Felix"), String.class}), 
-                    new Object[]{framework, filter});
-
-                // Cache the simple service tracker.
-                synchronized (m_trackerMap) 
+            Object context = m_action.invoke(
+                m_action.getMethod(framework.getClass(), "getBundleContext", null),framework, null);
+            
+            Class contextClass = context.getClass();
+            
+            Object[] refs = (Object[]) m_action.invoke(
+                m_action.getMethod(contextClass, "getServiceReferences", STRING_STRING_TYPES), 
+                context, m_filter);
+            
+            Object ref = null;
+            int highestRank = -1;
+            long currentId = -1;
+            if (refs != null) 
+            {
+                // Loop through all service references and select the reference
+                // with the highest ranking and lower service identifier.
+                for (int i = 0; (refs != null) && (i < refs.length); i++)
                 {
-                    if (!m_trackerMap.containsKey(framework))
-                    {
-                        m_trackerMap.put(framework, tracker);
-                    }
-                    else
+                    Class refClass = refs[i].getClass();
+                    Long idObj = (Long) m_action.invoke(m_action.getMethod(refClass, 
+                        "getProperty", STRING_TYPES), refs[i], SERVICE_ID_PARAMS);
+                    Integer rankObj = (Integer)  m_action.invoke(m_action.getMethod(refClass, 
+                        "getProperty", STRING_TYPES), refs[i], SERVICE_RANKING_PARAMS);
+                    // Ranking value defaults to zero.
+                    int rank = (rankObj == null) ? 0 : rankObj.intValue();
+                    if ((rank > highestRank) ||
+                        ((rank == highestRank) && (idObj.longValue() < currentId)))
                     {
-                        unregister(tracker);
-                        tracker = m_trackerMap.get(framework);
+                        ref = refs[i];
+                        highestRank = rank;
+                        currentId = idObj.longValue();
                     }
                 }
             }
-            Object service;
-            if (tracker instanceof URLHandlersServiceTracker)
-            {
-                service = ((URLHandlersServiceTracker) tracker).getService();
-            }
-            else
+            Object service = null;
+            if (ref != null) 
             {
-                service = m_action.invokeDirect(m_action.getMethod(
-                    tracker.getClass(), "getService", null), tracker, null);
+                Class serviceRef = null;
+                Class[] interfaces = ref.getClass().getInterfaces();
+                for (int i = 0;i < interfaces.length; i++) 
+                {
+                    if ("org.osgi.framework.ServiceReference".equals(interfaces[i].getName()))
+                    {
+                        serviceRef = interfaces[i];
+                        break;
+                    }
+                }
+                service = m_action.invoke(
+                    m_action.getMethod(contextClass, "getService", new Class[]{serviceRef}), 
+                    context, new Object[]{ref});
             }
             if (service == null) 
             {
@@ -485,43 +486,10 @@
         }
         catch (Throwable t)
         {
-         //   t.printStackTrace();
             return m_builtIn;
         }
     }
 
-    void flush()
-    {
-        synchronized (m_trackerMap)
-        {
-            for (Iterator iter = m_trackerMap.values().iterator(); iter.hasNext();)
-            {
-                unregister(iter.next());
-            }
-            m_trackerMap.clear();
-        }
-    }
-
-    private void unregister(Object tracker)
-    {
-        if (tracker instanceof URLHandlersServiceTracker)
-        {
-            ((URLHandlersServiceTracker) tracker).unregister();
-        }
-        else
-        {
-            try
-            {
-                m_action.invokeDirect(m_action.getMethod(tracker.getClass(), 
-                    "unregister", null), tracker, null);
-            }
-            catch (Exception e)
-            {
-                // Not much we can do - log this or something
-            }
-        }
-    }
-
     public Object invoke(Object obj, Method method, Object[] params)
         throws Throwable
     {

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java?rev=765971&r1=765970&r2=765971&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java Fri Apr 17 12:39:30 2009
@@ -18,7 +18,6 @@
  */
 package org.apache.felix.framework.searchpolicy;
 
-import java.lang.reflect.InvocationTargetException;
 import org.apache.felix.moduleloader.*;
 import java.io.IOException;
 import java.io.InputStream;