Details
Description
We're having troubles with generating a manifest using BND and iPOJO. The problem resides in iPOJO not adding referred packages (from @Provides annotations in components in our case) to the imported packages of the manifest.
I noticed the iPOJO task is supposed to be adding them, and by checking the code implementation, I found the issue in the Pojoization class which is called during manipulation. When fetching referred packages, it looks for the "specification" attribute instead of looking for the "specifications" attribute, which results in failing to find any referred package.
However fixing that doesn't completely solve our problem. We encountered another issue (after fixing the issue locally in Pojoization.java): imports are added naked, and it doesn't seem possible to add attribute such as the "version=x.x.x" which we need.
BND however implements such a mechanism - when told to process a given bundle, it will take a .bnd file. The .bnd file may then contain attributes, such as "im.an.example.*;version=6.6.6". It will, for packages which fit the wildcard, use the provided version for added package imports. Could that be implemented in some sort of way in iPOJO?
I looked into why BND wasn't adding the package of the @Provided interfaces to the imported packages: the issue lies into the @Provide annotation having a CLASS retention policy. BND will only consider RUNTIME retained annotations, which kind of makes sense to me. Could it be possible to have that annotation retained at runtime?
The annotation solution definitely looks simpler to do than implementing an attribute mechanism. It implies that tools such as BND will be able to tell which packages are needed at runtime. However, the existing implementation ("specification" instead of "specifications" and import overwriting) would still need fixing.
For reference, here are the code excerpts showing the introduced existing problems:
-
- Pojoization.getReferredPackages()
[..]
String att = elems[j].getAttribute("specification");
[..]
- Pojoization.getReferredPackages()
-
- I also noticed another issue with the Pojoization.setImports(Attribute) method, which overrides any existing package import with a blank one:
// Add referred imports from the metadata
for (int i = 0; i < m_referredPackages.size(); i++) { String pack = (String) m_referredPackages.get(i); imports.put(pack, new TreeMap()); }... meaning any previously existing import with specific pieces of information such as the package version will get deleted.
- I also noticed another issue with the Pojoization.setImports(Attribute) method, which overrides any existing package import with a blank one: