Class ExtensionManager
- All Implemented Interfaces:
Content
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 ClassesModifier and TypeClassDescription(package private) class
(package private) class
private static class
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate List
<BundleCapability> private final Map
(package private) static final ExtensionManager
private final List
private Bundle[]
private final List
<ExtensionManager.ExtensionTuple> private final Map
private final Logger
private final Set
private Object
private final Map
private final BundleRevision
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprivate
(package private)
ExtensionManager
(Logger logger, Map configMap, Felix felix) This constructor is used to create one instance per framework instance. -
Method Summary
Modifier and TypeMethodDescriptionprivate void
private void
_removeExtensions
(Object source) private void
addExtension
(Object source, Bundle extension) (package private) void
addExtensionBundle
(Felix felix, BundleImpl bundle) Add an extension bundle.private static List
<BundleCapability> private void
protected BundleCapability
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 String
convertCapabilitiesToHeaders
(Map headers) private List
<BundleCapability> getCapabilities
(String namespace) Returns an enumeration of entry names as String objects.byte[]
getEntryAsBytes
(String name) This method returns the named entry as an array of bytes.getEntryAsContent
(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.This method returns the named entry as a file in the file system for use as a native library.getEntryAsStream
(String name) This method returns the named entry as an input stream.getEntryAsURL
(String name) This method allows retrieving an entry as a local URL.protected InetAddress
boolean
This method determines if the specified named entry is contained in the associated content.openConnection
(URL url) (package private) void
removeExtensions
(Felix felix) Remove all extension registered by the given framework instance.void
setSecurityContext
(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
(package private) void
stopExtensionBundles
(Felix felix) Methods inherited from class java.net.URLStreamHandler
equals, getDefaultPort, hashCode, hostsEqual, openConnection, parseURL, sameFile, setURL, setURL, toExternalForm
-
Field Details
-
m_extensionManager
-
m_logger
-
m_configMap
-
m_headerMap
-
m_systemBundleRevision
-
m_capabilities
-
m_exportNames
-
m_securityContext
-
m_extensions
-
m_extensionsCache
-
m_names
-
m_sourceToExtensions
-
m_extensionTuples
-
-
Constructor Details
-
ExtensionManager
private ExtensionManager() -
ExtensionManager
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 Details
-
buildNativeCapabilites
-
aliasSymbolicName
-
getRevision
-
getSecurityContext
-
setSecurityContext
-
addExtensionBundle
void addExtensionBundle(Felix felix, BundleImpl bundle) throws SecurityException, BundleException, 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.SecurityException
- if the caller does not have the needed AdminPermission.EXTENSIONLIFECYCLE and security is enabled.Exception
- in case something goes wrong.
-
startExtensionBundle
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
-
stopExtensionBundles
-
removeExtensions
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
-
appendCapabilities
-
convertCapabilitiesToHeaders
-
openConnection
- Specified by:
openConnection
in classURLStreamHandler
- Throws:
IOException
-
getHostAddress
- Overrides:
getHostAddress
in classURLStreamHandler
-
addExtension
-
_removeExtensions
-
_add
-
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
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
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
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
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:
IOException
-
getEntryAsContent
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
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
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.
-