Supporting OSGi Bundles in the Java Module System

Gordon Hirsch gordon.hirsch at SAS.COM
Tue Apr 29 07:43:05 PDT 2008


Stanley,

The javadoc zip file was stripped by our firewall. Could you either 
resend with a different extension or post it to the EG homepage at jcp.org?

Stanley M. Ho wrote:
> Dear 277 experts,
> 
> The first attachment is a draft spec for supporting OSGi bundles in the
> Java Module System. This is based on the past EG discussion in
> particular the proposals and inputs from Glyn, Richard, and Bryan. This
> is a work in progress and is expected to evolve based on further inputs
> from this EG.
> 
> The second attachment is the latest API javadoc for your reference.
> 
> We're currently updating the JSR 277 EDR2 specification and APIs to make
> the distinction between the framework/abstractions for the Java Module
> System more clear, and we expect they will be available for the EG to
> review in a few weeks after JavaOne. In the meantime, the draft is
> intended to provide enough information for the EG to review and provide
> inputs without the EDR2.
> 
> Numerous EG members are preparing to attend and/or speak at JavaOne next
> week, so some of them may well not respond until afterwards.
> 
> Finally, thanks to Bryan and his blog that serves really well to set up
> the context for this discussion.
> 
> - Stanley and Alex
> 
> 
> ------------------------------------------------------------------------
> 
> 
>   Supporting OSGi Bundles in the Java Module System
> 
> *
> 
> Mandy Chung and Stanley Ho
> Version 0.1
> April 28, 2008
> Copyright 2008 Sun Microsystems, Inc.
> 
> * JSR 277 Early Draft defines the framework for the Java Module System 
> and provides the API to access Java modules such as searching for 
> modules, loading and initializing a module, and also managing its life 
> time. JSR 277 enables one or more module systems run on a single Java 
> virtual machine. This document^1 defines how JSR 277 supports OSGi 
> bundles as defined in JSR 291. This document is a work in progress and 
> is expected to evolve based on more input from the Expert Group.
> 
> Section 1 describes various definitions in the Java Module System. 
> Section 2 describes the requirements for supporting OSGi bundles in the 
> Java Module System and section 3 describes the proposed API changes. 
> Section 4 specifies how to map an OSGi bundle to a ModuleDefinition so 
> they can be consumed by other modules in the Java Module System. Section 
> 5 describes the repository mechanism that enables the OSGi module system 
> to be plugged into the Java Module System framework to make OSGi bundles 
> accessible by other module systems at runtime. Appendix A shows the code 
> example illustrating how a JAM module system implementation uses the JSR 
> 277 API to search and import OSGi bundles.
> 
> ^1 This draft is built upon from the basis of the past EG discussions, 
> proposals and suggestions for the interoperability support especially 
> the ideas and invaluable inputs from Glyn Normington, Richard Hall and 
> Bryan Atsatt.
> 
> 
>     0. Current Status
> 
> The JSR 277 EDR2 is being updated to make the distinction between the 
> framework/abstractions for the Java Module System and the JAM module 
> system (See Section 1) clearer.
> 
> This section highlights the main items that remain to be sorted out.
> 
>    1. Versioning scheme (see Section 4.2)
>    2. Security
>    3. Java Module Events
> 
> 
>     1. Definitions
> 
> /Java module/
> 
> A development abstraction that exists at compile-time in the Java 
> programming language and is reified in the Java Virtual Machine.
> 
> /Module Definition/
> 
> A deployment abstraction that contains metadata, classes and resources, 
> and is reified as ModuleDefinition as part of a Java Module System 
> implementation.
> 
> /JAM module/
> 
> A concrete, portable deployment format which implements the Module 
> Definition. Amongst other details, it has metadata, classes, resources, 
> and can contain embedded JAR files and native libraries. The 
> distribution format is called JAM (JAva Module) that is based on the JAR 
> file format.
> 
> /Java Module System/
> 
> A set of runtime abstractions that includes ModuleSystem, Repository, 
> ModuleDefinition (see "Module Definition" above), Module, 
> ImportDependency and others.
> 
> /JAM Module System/
> 
> A concrete implementation of the Java Module System that supports JAM 
> modules. It is the default implementation of the Java Module System for 
> the Java SE platform.
> 
> /OSGi Module System/
> 
> A concrete implementation of the Java Module System by an OSGi container.
> 
> 
>     2. Requirements
> 
>    1. It shall be possible for an OSGi container to implement the Java
>       Module System.
>    2. It shall be possible for a JAM module to express an import
>       dependency on any Module Definition in any Java Module System.
> 
> Below provides an example to illustrate how a JAM module imports OSGi 
> bundles.
> 
> A Wombat application is a JAM module that processes shopping orders for 
> a website. It depends on the Apache Xerces XML parser and the Apache 
> Derby and both of them are available as OSGi bundles. The module 
> definition of the Wombat application looks like this:
> 
>   //
>   // com/wombat/app/module-info.java
>   //
>   @Version("1.0") 
>   @ImportModules({
>       @ImportModule(name="org.apache.xerces.parsers", version="2.6.6+")
>       @ImportModule(name="org.apache.derby", version="10.0+")
>   })
>   module com.wombat.app;
>   
> 
> This Wombat application is packaged as a JAM file named 
> "com.wombat.app-1.0.jam" and the OSGi bundles it depends on are packaged 
> as JAR files containing the following manifests,^2 per the OSGi 
> specifications:
> 
>   org.apache.xerces.parsers:
>      Bundle-SymbolicName: org.apache.xerces.parsers
>      Bundle-Version: 2.9.10
> 
>      Export-Package: org.apache.xerces.parsers; version=2.6.6; uses="org.apache.commons.logging",
>                      org.apache.xerces.jaxp; version=2.6.6,
>                      org.apache.xerces.framework; version=2.6.6,
>                      org.apache.xerces.readers; version=2.6.6,
>                      org.apache.xerces.utils; version=2.6.6,
>                      org.apache.commons.logging; version=1.0.4
>      Import-Package: javax.xml.parsers; version=1.2.0,
>                      org.w3c.dom; version=1.0.0,
>                      org.xml.sax; version=2.0.1
>      Require-Bundle: org.osgi.util.xml; version=1.0.0; visibility:=reexport; resolution:=optional
>                      
>   org.apache.derby:
>      Bundle-SymbolicName: org.apache.derby
>      Bundle-Version: 10.0.2
>      Export-Package: org.apache.derby.authentication,
>                      org.apache.derby.database,
>                      org.apache.derby.io,
>                      org.apache.derby.jdbc
>      Import-Package: java.sql
>   
> 
> ^2 These example manifests are for illustration purpose and they do not 
> represent the manifest in the actual Apache Xerces XML Parser and Apache 
> Derby bundles.
> 
> 
>     3. Proposed API Changes
> 
> This section describes the proposed API changes for supporting OSGi 
> bundles in the Java Module System.
> 
> 
>       3.1 ModuleSystem class
> 
> The ModuleSystem specification is updated to support multiple 
> implementations running in a single Java virtual machine. This update is 
> necessary to meet the requirement (1). See JSR 277 EDR2 for the full 
> specification.
> 
> A ModuleSystem implementation is responsible for creation, management, 
> and release of Java Modules owned by this module system. The 
> ModuleSystem specification does not define the resolution algorithm and 
> the distribution format that a module system supports. Instead, the 
> resolution algorithm and the distribution format are specific to a 
> ModuleSystem implementation.
> 
> 
>       3.1.1 Module Initialization
> 
> This section is a clarification to the JSR 277 EDR about the 
> initialization of a Module instance.
> 
> The ModuleSystem.getModule(ModuleDefinition) method returns a /fully 
> initialized/ Module instance^3 for a given ModuleDefinition. A Module 
> instance is fully initialized if the following conditions are all met:
> 
>    1. Its import dependencies have been resolved. ModuleDefinitions for
>       the imported Java modules satisfying the import dependencies and
>       all its constraints are found using the algorithm defined by this
>       ModuleSystem.
>    2. Module instances for its imports are successfully instantiated and
>       initialized by its owning ModuleSystem.
>    3. This ModuleSystem has performed its own type consistency checking
>       successfully in the Module instance.
>    4. If this ModuleSystem supports an initializer^4 to be invoked
>       before a Module instance is fully initialized, the initializer for
>       this Module instance is invoked.
> 
> In addition, a ModuleSystem can support import constraints specific to 
> its algorithm to tailor the resolution of the imports for a 
> ModuleDefinition. The constraints specified in a ModuleDefinition is 
> only known to its owning ModuleSystem and other ModuleSystem 
> implementations are not required to understand them.
> 
> ^3 Initializing an OSGi bundle is equivalent to resolving, wiring and 
> starting an OSGi bundle.
> 
> ^4 The ModuleSystem specification does not define a generic initializer 
> mechanism for ModuleDefinitions. The JAM module system supports the 
> module initializer through the ModuleInitializer API and the 
> ModuleInitializerClass annotation (see JSR 277 EDR 2). The OSGi module 
> system supports the module initializer through the bundle activator.
> 
> 
>       3.1.2 Constraint Checking
> 
> A new method ModuleSystem.getModules is added to allow a ModuleSystem 
> implementation to instantiate Module instances for multiple 
> ModuleDefinitions in the same resolution and also to enforce constraints 
> specified in these Modules.
> 
>   ModuleSystem class:
>       /**
>        * Returns the list of Module instances for the imports 
>        * in the same resolution for the specified importer.
>        * The returned Module instances are instantiated and initialized
>        * using the algorithm specific to this ModuleSystem.
>        *
>        * This method is called by a ModuleSystem when initializing
>        * a Module instance (importer) that imports Modules (imports) 
>        * from this ModuleSystem.
>        */
>       public List<Module> getModules(ModuleDefinition importer,
>                                              List<ModuleDefinition> imports)
>           throws ModuleInitializationException;
>   
> 
> OSGi allows to put constraints on the importer through the metadata for 
> an exported package in another bundle. The OSGi module system can 
> enforce the constraints on the importer in the implementation of this 
> getModules method. The importer can be a ModuleDefinition from other 
> ModuleSystem.
> 
> For example, the Apache Xerces XML parser bundle in Example 1 of Section 
> 1 exports the org.apache.xerces.parsers package whose export definition 
> has a "use" constraint. This export definition puts a constraint on the 
> importer of the org.apache.xerces.parsers package to use the 
> org.apache.commons.logging package wired to the 
> org.apache.xerces.parsers package in the same resolution. The 1.0 
> version of the Wombat application imports the org.apache.xerces.parsers 
> bundle and the org.apache.derby bundle. The org.apache.xerces.parsers 
> package will get wired to the version 1.0.4 logging package and the 
> constraint is satisfied and thus it can be wired successfully.
> 
> Let's say a new version of the Wombat application (say version 1.2) is 
> updated and it depends on an additional Apache Commons Logging utility 
> which is also an OSGi bundle.
> 
>   //
>   // com/wombat/app/module-info.java
>   //
>   @Version("1.2") 
>   @ImportModules({
>       @ImportModule(name="org.apache.xerces.parsers", version="2.6.6+")
>       @ImportModule(name="org.apache.derby", version="10.0+")
>       @ImportModule(name="org.apache.commons.logging", version="2.0+")
>   })
>   module com.wombat.app;
>   
> 
> The bundle manifest header for the Apache Commons Logging utility is:
> 
>   org.apache.commons.logging:
>      Bundle-SymbolicName: org.apache.commons.logging
>      Bundle-Version: 2.0
>      Export-Package: org.apache.commons.logging; version=2.0
>   
> 
> The 1.2 version of the Wombat application imports the 
> org.apache.commons.logging bundle that violates the constraint if the 
> org.apache.xerces.parsers package is wired to the version 1.0.4 logging 
> package but the Wombat application requires the version 2.0 logging 
> package. The version 1.2 of the Wombat application should fail to 
> initialize due to this constraint. In other words, the getModules() 
> method of the OSGi module system should throw a 
> ModuleInitializationException when the OSGi module system determines 
> that the constraint is violated.
> 
> 
>       3.2 ModuleDefinition class
> 
> Two new methods are added in the ModuleDefinition class to return the 
> exported packages and member packages respectively. The export and 
> member definitions contained in the OSGi metadata are in package 
> granularity. In addition, a new PackageDefinition class is added to 
> allow an OSGi bundle to expose the metadata for an exported package. 
> This is required to meet the requirements (1) and (2).
> 
>   ModuleDefinition class:
>       public abstract Set<PackageDefinition> getExportedPackageDefinitions();
>       public abstract Set<PackageDefinition> getMemberPackageDefinitions();
>       
>   PackageDefinition class:
>       public abstract class PackageDefinition {
>           public String getName();
>           public Version getVersion();
>           public Set<String> getAttributeNames();
>           public String getAttribute(String name); 
>       }
>   
> 
> The version and attributes in the PackageDefinition are optional and for 
> information only and to aid diagnosis. A ModuleSystem importing a 
> ModuleDefinition from other ModuleSystem is not required to understand 
> the version and attributes of its exported PackageDefinitions.
> 
> 
>       3.3 ImportDependency class
> 
> The ImportDependency class is updated as follows.
> 
>    1. An import type is added to indicate if the ImportDependency is for
>       module-level or package-level. "module" and "package" are two
>       defined import types.
>    2. The ImportDependency class can have attributes for a module system
>       to include additional information about an import dependency.
> 
> This is required to meet the requirement (1).
> 
>   ImportDependency class:
>          // static factory methods
>        public static ImportDependency 
>            newImportModuleDependency(String moduleName,
>                                      VersionConstraint constraint,
>                                      boolean reexport,
>                                      boolean optional,
>                                      Map<String, String> attributes);
>        public static ImportDependency
>            newImportPackageDependency(String packageName,
>                                       VersionConstraint constraint,
>                                       boolean optional,
>                                       Map<String, String> attributes);
>        public String getType();
>        public String getAttribute(String name);
>        public Set<String> getAttributeNames();
>   
> 
> 
>     4. Mapping OSGi Bundles to ModuleDefinitions
> 
> This section specifies how an OSGi bundle maps to a ModuleDefinition to 
> expose in the Java Module System so that other ModuleDefinitions can 
> import them.
> 
> 
>       4.1 Bundle-SymbolicName
> 
> The bundle symbolic name maps to a module name (i.e. 
> ModuleDefinition.getName()). The directives for the Bundle-SymbolicName 
> header maps to the module attributes.
> 
> For example:
> 
>       Bundle-SymbolicName: com.acme.foo
>   
> 
> The Java Module System and OSGi do not enforce any naming convention. It 
> is encouraged to use the reverse domain name convention to name OSGi 
> bundles and Java modules to avoid the name space conflict.
> 
> 
>       4.2 Bundle-Version
> 
> A bundle version maps to a module version^5 (i.e. 
> ModuleDefinition.getVersion()). Bundle-Version is an optional header and 
> the default value is 0.0.0. The bundle version format is:
> 
>       major[.minor[.micro]][.qualifier]
>   
> 
> The module version format is:
> 
>       major[.minor[.micro[.update]]][-qualifier]
>   
> 
> If the bundle version contains a qualifier, the delimiter prior to the 
> qualifier will need to be changed from a period ('.') to a dash ('-'). 
> For example, the bundle version 3.1.4.pi maps to the module version 
> 3.1.4-pi.
> 
> ^5 *Difference in OSGi and JSR 277 versioning scheme*
> The versioning scheme defined in the JSR 277 Early Draft is loosely 
> based on the existing versioning schemes that are widely used in the 
> Java platform today and for backward compatibility reason (see JSR 277 
> EDR chapter 5). Many existing products including the JDK use the version 
> format with the micro, minor, micro, and update numbers. A version with 
> no qualifier is higher than the version with the same version number but 
> with a qualifier. This is more intuitive and has been the convention the 
> JDK has been using. The Expert Group has discussed the difference with 
> the OSGi versioning scheme and agreed with the JSR 277 versioning scheme 
> defined.
> 
> *Open Issue:*
> Need to investigate the version mapping due to the difference in the 
> comparison of two versions - one with a qualifier and the other without 
> a qualifier.
> 
> When two bundle versions have the same major, minor, and micro numbers, 
> the bundle version that has a qualifier is lower than the bundle version 
> that has no qualifier. e.g. 7.8.9.pi < 7.8.9
> 
> When two module versions have the same major, minor, micro, and update 
> numbers, the module version that has a qualifier is higher than the 
> module version that has no qualifier. e.g. 7.8.9 < 7.8.9-b04-alpha
> 
> One possible solution would be:
> 
>   OSGi version                      JSR 277 Version
>   
>   major.minor.micro            ->   major.minor.micro-0
>   major.minor.micro.qualifier  ->   major.minor.micro-1-qualifier  
>   
> 
> 
>       4.3 Import-Package
> 
> The Import-Package header maps to the import dependencies for a Java 
> module (i.e. ModuleDefinition.getImportDependencies()).
> 
> The Import-Package header contains one or more import definitions, each 
> of which describes a single package import for a bundle. Each import 
> definition maps to an ImportDependency instance with the "package" type 
> as follows:
> 
>     * The import package name maps to ImportDependency.getName().
>     * ImportDependency.getType() returns "package".
>     * The "resolution" directive maps to the "optional" input parameter
>       of the ImportDependency constructor; true if
>       "resolution:=optional" is specified and false otherwise.
>     * The "version" attribute maps to the VersionConstraint of the
>       ImportDependency as described in the version-range section below.
>     * All other attributes specified in the import definition including
>       the bundle-symbolic-name and bundle-version attributes map to the
>       attributes in the ImportDependency.
> 
> Example,
> 
>       Import-Package: p;
>           version="[1.23, 1.24]";
>           resolution:=optional
>   
> 
> maps to the import dependencies equivalent to:
> 
>       ImportDependency importP = 
>           ImportDependency.newImportPackageDependency("p", 
>                                                       VersionConstraint.valueOf("[1.23,1.24]",
>                                                       true /* optional */);
>   
> 
> 
>         The version-range mapping:
> 
> The OSGi version-range maps to a VersionConstraint as follows:
> 
>     * If a version has no qualifier, the mapping is exact. For example,
>       a bundle version range [1.1, 1.2) maps to a module version range
>       [1.1, 1.2). If there is a qualifier, then section 4.2 should be used.
>     * If a bundle version range is specified as a single version, it
>       will map to an open version range. For example, the bundle version
>       range "1.23" maps to the module version range "1.23+".
> 
> 
>       4.4 Export-Package
> 
> The Export-Package header maps to the exported package definitions for a 
> Java module (i.e. ModuleDefinition.getExportedPackageDefinitions()).
> 
> The Export-Package header contains one or more export definitions, each 
> of which describes a single package export for a bundle. Each export 
> definition maps to a PackageDefinition instance as follows:
> 
>     * The package name maps to PackageDefinition.getName().
>     * The "include" and "exclude" directive along with the classes in
>       the exported package are the input to determine the returned value
>       of the ModuleDefinition.isClassExported() method.
>     * The "version" attribute maps to PackageDefinition.getVersion().
>     * Other attributes and directives including the "use" directive in
>       the export definition can map to the attributes in the
>       PackageDefinition.
>     * The exported package definition is also a member package
>       definition for the module.
> 
> 
>       4.5 Require-Bundle
> 
> The required bundles maps to the import dependencies for a Java module 
> (i.e. ModuleDefinition.getImportDependencies()). Each required bundle 
> maps to an ImportDependency instance with the "module" type:
> 
>     * The bundle symbolic name of the required bundle maps to
>       ImportDependency.getName().
>     * ImportDependency.getType() returns "module".
>     * The "visibility" directive maps to
>       ImportDependency.isReexported(). The isReexported() method returns
>       true if "visibility:=reexport" is specified; false otherwise.
>     * The "resolution" directive maps to ImportDependency.isOptional().
>       The isOptional() method returns true if "resolution:=optional" is
>       specified; false otherwise.
>     * The "bundle-version" attribute maps to the VersionConstraint of
>       the ImportDependency as described in the Version Range Mapping
>       section of section 4.4.
> 
> Example,
> 
>       Require-Bundle: com.acme.facade;visibility:=reexport,
>           com.acme.bar;visibility:=reexport;resolution:=optional
>   
> 
> maps to the import dependencies equivalent to:
> 
>       ImportDependency facade = 
>           ImportDependency.newImportModuleDependency("com.acme.facade", 
>                                                      VersionConstraint.DEFAULT,
>                                                      true /* reexport */,
>                                                      false /* optional */);
>                                                     
>       ImportDependency bar = 
>           ImportDependency.newImportModuleDependency("com.acme.bar", 
>                                                      VersionConstraint.DEFAULT,
>                                                      true /* reexport */,
>                                                      true /* optional */);
>   
> 
> 
>       4.6 Other Manifest Headers
> 
> The above sections cover the manifest headers that provide the metadata 
> for the OSGi resolver (see Section 3.5 of the OSGi Service Platform Core 
> Specification Release 4, Version 4.1). The other bundle manifest 
> headers, including Bundle-Vendor, Bundle-Description and 
> DynamicImport-Package, do not affect the module resolution. This 
> specification does not need to define how to map them to 
> ModuleDefinition. However, implementations are encouraged to include 
> them as the module attributes (i.e. ModuleDefinition.getAttribute()) as 
> additional information to aid diagnosis.
> 
> 
>       4.7 Fragment Bundles
> 
> Fragment bundles are not exposed as ModuleDefinitions in the Java Module 
> System. Instead, they are exposed as part of the ModuleDefinition of its 
> host bundle to which they are attached to.
> 
> 
>       4.8 Example
> 
> The manifest in the org.apache.xerces.parsers bundle shown in Example 1 
> of Section 2 is:
> 
>   org.apache.xerces.parsers:
>      Bundle-SymbolicName: org.apache.xerces.parsers
>      Bundle-Version: 2.9.10
> 
>      Export-Package: org.apache.xerces.parsers; version=2.6.6; uses="org.apache.commons.logging",
>                      org.apache.xerces.jaxp; version=2.6.6,
>                      org.apache.xerces.framework; version=2.6.6,
>                      org.apache.xerces.readers; version=2.6.6,
>                      org.apache.xerces.utils; version=2.6.6,
>                      org.apache.commons.logging; version=1.0.4
>      Import-Package: javax.xml.parsers; version=1.2.0,
>                      org.w3c.dom; version=1.0.0,
>                      org.xml.sax; version=2.0.1
>      Require-Bundle: org.osgi.util.xml; version=1.0.0; visibility:=reexport; resolution:=optional
>   
> 
> Below shows the ModuleDefinition for this OSGi bundle when exposed in 
> the Java Module System. For clarity, we only show one Export-Package 
> entry and one Import-Package entry.
> 
> Method of ModuleDefinition 	Returned Value 	Bundle Manifest Header
> getName() 	"org.apache.xerces.parsers" 	Bundle-SymbolicName
> getVersion() 	Version.valueOf("2.9.10") 	Bundle-Version
> getImportDependencies() 	
> 
> ImportDependency.newImportModuleDependency("org.osgi.util.xml", 
>                                            VersionConstraint.valueOf("1.0.0+"),
>                                            true /* reexport */,
>                                            true /* optional */);
> 
> 	Require-Bundle
> 
> ImportDependency.newImportPackageDependency("javax.xml.parsers", 
>                                             VersionConstraint.valueOf("1.2.0+"),
>                                             false /* optional */);          
> 
> 	Import-Package
> getExportedPackageDefinition() 	PackageDefinition with:
> 
>  name="org.apache.xerces.parsers",
>  version="2.6.6"
>  attributes=(("uses", "org.apache.commons.logging")}
> 
> 	Export-Package
> 
> 
>     5. Enabling the OSGi Module System in the Framework
> 
> To enable the OSGi module system in the framework, an OSGi Repository 
> implementation should be plugged into the runtime. The OSGi repository 
> is responsible for discovering OSGi bundles and exposing them as 
> ModuleDefinitions so that OSGi bundles are available for other module 
> systems to use. A ModuleSystem implementation finds OSGi bundles via the 
> repository delegation model and therefore the OSGi repository has to be 
> configured as an ancestor of the repository where the Java module 
> depending on OSGi bundles resides. Otherwise, it will fail to find the 
> importing OSGi bundles.
> 
> One or more repositories can be created for the OSGi module system and 
> interoperate with other module systems via the repository delegation model.
> 
> The following picture depicts the repository tree set up to run the 
> Wombat application described in Example 1 of Section 2. The OSGi 
> repository is configured as the parent of the application repository. 
> This particular OSGi repository implementation includes the Apache Felix 
> OSGi runtime for loading and resolving OSGi bundles.
> 
>  
>                ------------------------
>                | Bootstrap Repository |
>                ------------------------
>                           |
>                           |
>                  --------------------
>                  | Global Repository |
>                  --------------------
>                           |   
>                           |                       xxxxxxxxxxxxxxxx
>                  -------------------              x Apache Felix x
>                  | OSGi Repository |   <====>     x     OSGi     x ---> org.apache.xerces.parsers version 2.10
>                  -------------------              x   Runtime    x      org.apache.derby version 10.0.2
>                           |                       xxxxxxxxxxxxxxxx      org.apache.derby version 9.1
>                           |
>                   ----------------- 
>                   |  Application  | 
>                   |  Repository   |
>                   -----------------
>                   com.wombat.app-1.0.jam
>   
> 
> For example, the following command will launch the Wombat application in 
> the "/wombat-application" directory.
> 
>                 
>   > java -repository /wombat-application -module com.wombat.app         
>   
> 
> The com.wombat.app module is located in the application repository which 
> is a repository for the JAM module system. The JAM module system first 
> loads the com.wombat.app module. To initialize this JAM module, the JAM 
> module system looks at its import dependencies and performs a search of 
> two imported OSGi bundles through the repository delegation model from 
> the OSGi repository. The JAM module system then requests the OSGi module 
> system associated with the OSGi repository to get the Module instances 
> for the imports (see Section 3.1). Once the imported OSGi bundles are 
> loaded and started, the initialization process for the com.wombat.app 
> module continues.
> 
> 
>       6. Delegation of Class and Resource Loading
> 
> The class loader of a Module instance (i.e. returned by the 
> Module.getClassLoader() method) must be capable to load all classes and 
> resources in the module.
> 
> As described in Section 5 above, when the com.wombat.app JAM module is 
> initialized, two other Module instances for its imports representing the 
> resolved OSGi bundles are created in the system. The class loader for 
> the Module instance for the org.apache.xerces.parsers bundle must be 
> capable to load all classes and resources in it. Similarly for the 
> org.apache.derby bundle.
> 
> 
>     7. Security
> 
> TBD.
> 
> 
>     8. Implementation Notes
> 
> The following are the notes for the implementation of the OSGi 
> repository and the implementation of the Java Module System.
> 
>    1. The repository delegation hierarchy is a tree and thus cycles
>       involving multiple module systems are inherently unsupported.
>    2. The repository delegation model is designed to offer isolation
>       between ModuleDefinitions in different repositories. Although a
>       module system could have access to multiple repositories, the
>       module system should adhere to the repository delegation module.
>       Otherwise, it would break the isolation model the repository
>       provides.
>    3. Java SE 7 is expected to have parallel class loading support. All
>       module systems plugged in the framework are required have parallel
>       class loading enabled in order to avoid potential deadlocks.
>    4. Split packages without shadowing are explicitly permitted in OSGi
>       whereas the JAM module system does not allow split packages. So
>       importing OSGi bundles with split packages in a JAM module will
>       result in module initialization failure.
>    5. When a resolution involves multiple module systems, a module
>       system implementation should take the possible potential issues
>       (such as hanging) into account in their design to prevent a
>       foreign module system from bringing down the module system or the
>       entire JVM. A module system could implement time out policy to
>       prevent from hanging the module system.
> 
> 
>     8. References
> 
>     * OSGi Service Platform Core Specification Release 4, Version 4.1
>       April 2007
>     * JSR 277 Interoperation with OSGi by Richard Hall and Glyn
>       Normington, Apr 24, 2006.
>     * Module System Interoperability by Richard Hall, May 11, 2006.
> 
> 
>     A. Appendix
> 
> The following illustrates how the JAM module system implementation uses 
> the JSR 277 API to search and import OSGi bundles This example does not 
> cover the exact resolution algorithm and the implementation of the 
> module system runtime.
> Example 1 of Section 1 has a com.wombat.app JAM module importing two 
> OSGi bundles.
> 
> com.wombat.app ----> org.apache.xerces.parsers
>                |
>                |---> org.apache.derby
> 
> // the Java runtime will first find the module com.wombat.app
> ModuleDefinition wombatModDef = repository.find("com.wombat.app", "1.0+");
> // This call blocks until com.wombat.app is fully initialized
> Module wombat = wombatModDef.getModuleInstance();
> 
> 	
> /JAM Module System Runtime/
> 
> // find imports for wombat
> List<ModuleDefinition> imports = ...;
> Map<ModuleSystem, List<ModuleDefinition>> foreignImportMap = new HashMap....;
> for (ModuleDefinition md : imports) {
>     if (md is from a foreign module system (ms)) {
>         // the case to add a new entry in foreignImportMap 
>         // is not shown in this pseudo-code.
>         // 
>         // org.apache.xerces.parsers and org.apache.derby will be added in this map       
>         foreignImportMap.get(ms).add(md); 
>     } else {
>         // JAM resolution algorithm
>         ...
>     }
> }
> 
> // Gets imports from foreign module systems
> // Should do this in a separate thread since this is a synchronous call
> for (ModuleSystem ms : foreignImportMap.keySet()) {
>    // The getModules() method will allow a module system to know if 
>    // a set of ModuleDefinition are resolved in the same resolution. 
>    List<Module> imports = ms.getModules(wombatModDef, foreignImportMap.get(ms));
>    // interconnect the imports with wombat
>    ...
> }
> 
> // continue the module initialization process such as shadow validatation
> // and execute initializers
> ...
> 
> // Module initialization completed
> if (succeeded) {
>    com.wombat.app is now fully initialized
> } else {
>    // signal the getModule method to throw ModuleInitializationException
>    ...
> }
> 



More information about the jsr277-eg-observer mailing list