Class ExtensionManager
- java.lang.Object
-
- java.net.URLStreamHandler
-
- org.apache.felix.framework.ExtensionManager
-
- All Implemented Interfaces:
Content
class ExtensionManager extends java.net.URLStreamHandler implements Content
The ExtensionManager class is used in several ways.First, a private instance is added (as URL with the instance as URLStreamHandler) to the classloader that loaded the class. It is assumed that this is an instance of URLClassloader (if not extension bundles will not work). Subsequently, extension bundles can be managed by instances of this class (their will be one instance per framework instance).
Second, it is used as module definition of the systembundle. Added extension bundles with exported packages will contribute their exports to the systembundle export.
Third, it is used as content loader of the systembundle. Added extension bundles exports will be available via this loader.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) class
ExtensionManager.ExtensionManagerRevision
(package private) class
ExtensionManager.ExtensionManagerWiring
private static class
ExtensionManager.ExtensionTuple
-
Field Summary
Fields Modifier and Type Field Description private java.util.List<BundleCapability>
m_capabilities
private java.util.Map
m_configMap
private java.util.Set<java.lang.String>
m_exportNames
(package private) static ExtensionManager
m_extensionManager
private java.util.List
m_extensions
private Bundle[]
m_extensionsCache
private java.util.List<ExtensionManager.ExtensionTuple>
m_extensionTuples
private java.util.Map
m_headerMap
private Logger
m_logger
private java.util.Set
m_names
private java.lang.Object
m_securityContext
private java.util.Map
m_sourceToExtensions
private BundleRevision
m_systemBundleRevision
-
Constructor Summary
Constructors Modifier Constructor Description private
ExtensionManager()
(package private)
ExtensionManager(Logger logger, java.util.Map configMap, Felix felix)
This constructor is used to create one instance per framework instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
_add(java.lang.String name, Bundle extension)
private void
_removeExtensions(java.lang.Object source)
private void
addExtension(java.lang.Object source, Bundle extension)
(package private) void
addExtensionBundle(Felix felix, BundleImpl bundle)
Add an extension bundle.private static java.util.List<BundleCapability>
aliasSymbolicName(java.util.List<BundleCapability> caps)
private void
appendCapabilities(java.util.List<BundleCapability> caps)
protected BundleCapability
buildNativeCapabilites()
void
close()
This method must be called when the content is no longer needed so that any resourses being used (e.g., open files) can be closed.private java.lang.String
convertCapabilitiesToHeaders(java.util.Map headers)
private java.util.List<BundleCapability>
getCapabilities(java.lang.String namespace)
java.util.Enumeration
getEntries()
Returns an enumeration of entry names as String objects.byte[]
getEntryAsBytes(java.lang.String name)
This method returns the named entry as an array of bytes.Content
getEntryAsContent(java.lang.String name)
This method returns the named entry as an IContent Typically, this method only makes sense for entries that correspond to some form of aggregated resource (e.g., an embedded JAR file or directory), but implementations are free to interpret this however makes sense.java.lang.String
getEntryAsNativeLibrary(java.lang.String name)
This method returns the named entry as a file in the file system for use as a native library.java.io.InputStream
getEntryAsStream(java.lang.String name)
This method returns the named entry as an input stream.java.net.URL
getEntryAsURL(java.lang.String name)
This method allows retrieving an entry as a local URL.protected java.net.InetAddress
getHostAddress(java.net.URL u)
BundleRevision
getRevision()
java.lang.Object
getSecurityContext()
boolean
hasEntry(java.lang.String name)
This method determines if the specified named entry is contained in the associated content.java.net.URLConnection
openConnection(java.net.URL url)
(package private) void
removeExtensions(Felix felix)
Remove all extension registered by the given framework instance.void
setSecurityContext(java.lang.Object securityContext)
(package private) void
startExtensionBundle(Felix felix, BundleImpl bundle)
This is a Felix specific extension mechanism that allows extension bundles to have activators and be started via this method.(package private) void
startPendingExtensionBundles(Felix felix)
(package private) void
stopExtensionBundles(Felix felix)
-
-
-
Field Detail
-
m_extensionManager
static final ExtensionManager m_extensionManager
-
m_logger
private final Logger m_logger
-
m_configMap
private final java.util.Map m_configMap
-
m_headerMap
private final java.util.Map m_headerMap
-
m_systemBundleRevision
private final BundleRevision m_systemBundleRevision
-
m_capabilities
private volatile java.util.List<BundleCapability> m_capabilities
-
m_exportNames
private volatile java.util.Set<java.lang.String> m_exportNames
-
m_securityContext
private volatile java.lang.Object m_securityContext
-
m_extensions
private final java.util.List m_extensions
-
m_extensionsCache
private volatile Bundle[] m_extensionsCache
-
m_names
private final java.util.Set m_names
-
m_sourceToExtensions
private final java.util.Map m_sourceToExtensions
-
m_extensionTuples
private final java.util.List<ExtensionManager.ExtensionTuple> m_extensionTuples
-
-
Constructor Detail
-
ExtensionManager
private ExtensionManager()
-
ExtensionManager
ExtensionManager(Logger logger, java.util.Map configMap, Felix felix)
This constructor is used to create one instance per framework instance. The general approach is to have one private static instance that we register with the parent classloader and one instance per framework instance that keeps track of extension bundles and systembundle exports for that framework instance.- Parameters:
logger
- the logger to use.config
- the configuration to read properties from.systemBundleInfo
- the info to change if we need to add exports.
-
-
Method Detail
-
buildNativeCapabilites
protected BundleCapability buildNativeCapabilites()
-
aliasSymbolicName
private static java.util.List<BundleCapability> aliasSymbolicName(java.util.List<BundleCapability> caps)
-
getRevision
public BundleRevision getRevision()
-
getSecurityContext
public java.lang.Object getSecurityContext()
-
setSecurityContext
public void setSecurityContext(java.lang.Object securityContext)
-
addExtensionBundle
void addExtensionBundle(Felix felix, BundleImpl bundle) throws java.lang.SecurityException, BundleException, java.lang.Exception
Add an extension bundle. The bundle will be added to the parent classloader and it's exported packages will be added to the module definition exports of this instance. Subsequently, they are available form the instance in it's role as content loader.- Parameters:
felix
- the framework instance the given extension bundle comes from.bundle
- the extension bundle to add.- Throws:
BundleException
- if extension bundles are not supported or this is not a framework extension.java.lang.SecurityException
- if the caller does not have the needed AdminPermission.EXTENSIONLIFECYCLE and security is enabled.java.lang.Exception
- in case something goes wrong.
-
startExtensionBundle
void startExtensionBundle(Felix felix, BundleImpl bundle)
This is a Felix specific extension mechanism that allows extension bundles to have activators and be started via this method.- Parameters:
felix
- the framework instance the extension bundle is installed in.bundle
- the extension bundle to start if it has a Felix specific activator.
-
startPendingExtensionBundles
void startPendingExtensionBundles(Felix felix)
-
stopExtensionBundles
void stopExtensionBundles(Felix felix)
-
removeExtensions
void removeExtensions(Felix felix)
Remove all extension registered by the given framework instance. Note, it is not possible to unregister allready loaded classes form those extensions. That is why the spec requires a JVM restart.- Parameters:
felix
- the framework instance whose extensions need to be unregistered.
-
getCapabilities
private java.util.List<BundleCapability> getCapabilities(java.lang.String namespace)
-
appendCapabilities
private void appendCapabilities(java.util.List<BundleCapability> caps)
-
convertCapabilitiesToHeaders
private java.lang.String convertCapabilitiesToHeaders(java.util.Map headers)
-
openConnection
public java.net.URLConnection openConnection(java.net.URL url) throws java.io.IOException
- Specified by:
openConnection
in classjava.net.URLStreamHandler
- Throws:
java.io.IOException
-
getHostAddress
protected java.net.InetAddress getHostAddress(java.net.URL u)
- Overrides:
getHostAddress
in classjava.net.URLStreamHandler
-
addExtension
private void addExtension(java.lang.Object source, Bundle extension)
-
_removeExtensions
private void _removeExtensions(java.lang.Object source)
-
_add
private void _add(java.lang.String name, Bundle extension)
-
close
public void close()
Description copied from interface:Content
This method must be called when the content is no longer needed so that any resourses being used (e.g., open files) can be closed. Once this method is called, the content is no longer usable. If the content is already closed, then calls on this method should have no effect.
-
getEntries
public java.util.Enumeration getEntries()
Description copied from interface:Content
Returns an enumeration of entry names as String objects. An entry name is a path constructed with '/' as path element separators and is relative to the root of the content. Entry names for entries that represent directories should end with the '/' character.
- Specified by:
getEntries
in interfaceContent
-
hasEntry
public boolean hasEntry(java.lang.String name)
Description copied from interface:Content
This method determines if the specified named entry is contained in the associated content. The entry name is a relative path with '/' separators.
-
getEntryAsBytes
public byte[] getEntryAsBytes(java.lang.String name)
Description copied from interface:Content
This method returns the named entry as an array of bytes.
- Specified by:
getEntryAsBytes
in interfaceContent
- Parameters:
name
- The name of the entry to retrieve as a byte array.- Returns:
- An array of bytes if the corresponding entry was found, null otherwise.
-
getEntryAsStream
public java.io.InputStream getEntryAsStream(java.lang.String name) throws java.io.IOException
Description copied from interface:Content
This method returns the named entry as an input stream.
- Specified by:
getEntryAsStream
in interfaceContent
- Parameters:
name
- The name of the entry to retrieve as an input stream.- Returns:
- An input stream if the corresponding entry was found, null otherwise.
- Throws:
java.io.IOException
-
getEntryAsContent
public Content getEntryAsContent(java.lang.String name)
Description copied from interface:Content
This method returns the named entry as an IContent Typically, this method only makes sense for entries that correspond to some form of aggregated resource (e.g., an embedded JAR file or directory), but implementations are free to interpret this however makes sense. This method should return a new IContent instance for every invocation and the caller is responsible for opening and closing the returned content object.
- Specified by:
getEntryAsContent
in interfaceContent
- Parameters:
name
- The name of the entry to retrieve as an IContent.- Returns:
- An IContent instance if a corresponding entry was found, null otherwise.
-
getEntryAsNativeLibrary
public java.lang.String getEntryAsNativeLibrary(java.lang.String name)
Description copied from interface:Content
This method returns the named entry as a file in the file system for use as a native library. It may not be possible for all content implementations (e.g., memory only) to implement this method, in which case it is acceptable to return null. Since native libraries can only be associated with a single class loader, this method should return a unique file per request.
- Specified by:
getEntryAsNativeLibrary
in interfaceContent
- Parameters:
name
- The name of the entry to retrieve as a file.- Returns:
- A string corresponding to the absolute path of the file if a corresponding entry was found, null otherwise.
-
getEntryAsURL
public java.net.URL getEntryAsURL(java.lang.String name)
Description copied from interface:Content
This method allows retrieving an entry as a local URL.
- Specified by:
getEntryAsURL
in interfaceContent
- Parameters:
name
- The name of the entry to retrieve as a URL- Returns:
- A URL using a local protocol such as file, jar or null if not possible.
-
-