Class URLHandlers
- All Implemented Interfaces:
ContentHandlerFactory,URLStreamHandlerFactory
This class is a singleton and implements the stream and content handler factories for all framework instances executing within the JVM. Any calls to retrieve stream or content handlers is routed through this class and it acts as a multiplexer for all framework instances. To achieve this, all framework instances register with this class when they are created so that it can maintain a centralized registry of instances.
When this class receives a request for a stream or content handler, it always returns a proxy handler instead of only returning a proxy if a handler currently exists. This approach is used for three reasons:
- Potential caching behavior by the JVM of stream handlers does not give you a second chance to provide a handler.
- Due to the dynamic nature of OSGi services, handlers may appear at any time, so always creating a proxy makes sense.
- Since these handler factories service all framework instances, some instances may have handlers and others may not, so returning a proxy is the only answer that makes sense.
It is possible to disable the URL Handlers service by setting the framework.service.urlhandlers configuration property to false. When multiple framework instances are in use, if no framework instances enable the URL Handlers service, then the singleton stream and content factories will never be set (i.e., URL.setURLStreamHandlerFactory() and URLConnection.setContentHandlerFactory()). However, if one instance enables URL Handlers service, then the factory methods will be invoked. In that case, framework instances that disable the URL Handlers service will simply not provide that services to their contained bundles, while framework instances with the service enabled will.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final Class<?>[]private static final Stringprivate static final ConcurrentHashMap<String, URLStreamHandler> private static final ConcurrentHashMap<ClassLoader, List<Object>> private static final ConcurrentHashMap<String, ContentHandler> private static ContentHandlerFactoryprivate static intprivate static final CopyOnWriteArrayList<Felix> private static URLHandlersprivate static final booleanprivate static final ConcurrentHashMap<String, URL> private static Objectprivate static final SecureActionprivate static SecurityManagerExprivate static final ConcurrentHashMap<String, URLStreamHandler> private static URLStreamHandlerFactoryprivate static final Stringprivate static final Stringprivate static final Class<?> -
Constructor Summary
ConstructorsModifierConstructorDescriptionprivateOnly one instance of this class is created per classloader and that one instance is registered as the stream and content handler factories for the JVM. -
Method Summary
Modifier and TypeMethodDescriptionprivate static <K,V> V addToCache(ConcurrentHashMap<K, V> cache, K key, V value) createContentHandler(String mimeType) This is a method implementation for the ContentHandlerFactory interface.createURLStreamHandler(String protocol) This is a method implementation for the URLStreamHandlerFactory interface.private URLStreamHandlergetBuiltInStreamHandler(String protocol, URLStreamHandlerFactory factory) static ObjectThis method returns the system bundle context for the caller.static Objectprivate static <K,V> V getFromCache(ConcurrentHashMap<K, V> cache, K key) private voidinit(String protocol, URLStreamHandlerFactory factory) private booleanprivate URLStreamHandlerloadBuiltInStreamHandler(String protocol, ClassLoader classLoader) static voidregisterFrameworkInstance(Felix framework, boolean enable) Static method that adds a framework instance to the centralized instance registry.(package private) static voidregisterFrameworkListsForContextSearch(ClassLoader index, List<Object> frameworkLists) static voidunregisterFrameworkInstance(Object framework) Static method that removes a framework instance from the centralized instance registry.(package private) static void
-
Field Details
-
CLASS_TYPE
-
URLHANDLERS_CLASS
-
m_secureAction
-
m_sm
-
m_handler
-
m_classloaderToFrameworkLists
-
m_frameworks
-
m_counter
private static volatile int m_counter -
m_contentHandlerCache
-
m_streamHandlerCache
-
m_protocolToURL
-
m_streamHandlerFactory
-
m_contentHandlerFactory
-
STREAM_HANDLER_PACKAGE_PROP
- See Also:
-
DEFAULT_STREAM_HANDLER_PACKAGE
- See Also:
-
m_rootURLHandlers
-
m_streamPkgs
-
m_builtIn
-
m_loaded
private static final boolean m_loaded
-
-
Constructor Details
-
URLHandlers
private URLHandlers()Only one instance of this class is created per classloader and that one instance is registered as the stream and content handler factories for the JVM. Unless, we already register one from a different classloader. In this case we attach to this root.
-
-
Method Details
-
init
-
registerFrameworkListsForContextSearch
-
unregisterFrameworkListsForContextSearch
-
getBuiltInStreamHandler
-
loadBuiltInStreamHandler
-
createURLStreamHandler
This is a method implementation for the URLStreamHandlerFactory interface. It simply creates a stream handler proxy object for the specified protocol. It caches the returned proxy; therefore, subsequent requests for the same protocol will receive the same handler proxy.
- Specified by:
createURLStreamHandlerin interfaceURLStreamHandlerFactory- Parameters:
protocol- the protocol for which a stream handler should be returned.- Returns:
- a stream handler proxy for the specified protocol.
-
isJVM
-
createContentHandler
This is a method implementation for the ContentHandlerFactory interface. It simply creates a content handler proxy object for the specified mime type. It caches the returned proxy; therefore, subsequent requests for the same content type will receive the same handler proxy.
- Specified by:
createContentHandlerin interfaceContentHandlerFactory- Parameters:
mimeType- the mime type for which a content handler should be returned.- Returns:
- a content handler proxy for the specified mime type.
-
addToCache
-
getFromCache
-
registerFrameworkInstance
Static method that adds a framework instance to the centralized instance registry.
- Parameters:
framework- the framework instance to be added to the instance registry.enable- a flag indicating whether or not the framework wants to enable the URL Handlers service.
-
unregisterFrameworkInstance
Static method that removes a framework instance from the centralized instance registry.
- Parameters:
framework- the framework instance to be removed from the instance registry.
-
getFrameworkFromContext
This method returns the system bundle context for the caller. It determines the appropriate system bundle by retrieving the class call stack and find the first class that is loaded from a bundle. It then checks to see which of the registered framework instances owns the class and returns its system bundle context.
- Returns:
- the system bundle context associated with the caller or null if no associated framework was found.
-
getFrameworkFromContext
-