Bug 549920 - Batik 1.9.1 bundles have unrestricted imports of batik.util packages
Summary: Batik 1.9.1 bundles have unrestricted imports of batik.util packages
Status: NEW
Alias: None
Product: Orbit
Classification: Tools
Component: bundles (show other bugs)
Version: unspecified   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Orbit Bundles CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-08-09 05:06 EDT by Stephan Wahlbrink CLA
Modified: 2020-05-08 18:05 EDT (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Stephan Wahlbrink CLA 2019-08-09 05:06:49 EDT
Several Batik 1.9.1 bundles (I20190731180122) have unrestricted imports of batik.util packages like:

Import-Package: [...] org.apache.batik.util;resolution:=
 optional

This causes issues like

> java.lang.NoSuchMethodError: org.apache.batik.util.SoftReferenceCache.<init>(Z)V
> 	at org.apache.batik.ext.awt.color.NamedProfileCache.<init>(NamedProfileCache.java:43)
> 	at org.apache.batik.ext.awt.color.NamedProfileCache.<clinit>(NamedProfileCache.java:35)
> 	at org.apache.batik.bridge.SVGColorProfileElementBridge.<init>(SVGColorProfileElementBridge.java:48)
> 	at org.apache.batik.bridge.SVGBridgeExtension.registerTags(SVGBridgeExtension.java:101)
> 	at org.apache.batik.bridge.BridgeContext.registerSVGBridges(BridgeContext.java:2052)
> 	at org.apache.batik.bridge.BridgeContext.setDocument(BridgeContext.java:445)
> 	at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:54)
> 	at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208)
> 	at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92)
> 	at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)
> 	at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)

> java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/loader/EquinoxClassLoader) previously initiated loading for a different type with name "org/apache/batik/util/ParsedURL"
> 	at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:255)
> 	at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92)
> 	at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)
> 	at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)

because classes from other version of Batik are used.

The bundles I checked imports batik.util as bundles, so the package imports can be simply removed (!org.apache.batik.util.*).
Comment 1 Roland Grunberg CLA 2019-08-22 15:12:39 EDT
This seems to be every bundle except batik-util itself, batik-constants, and batik-i18n.
Comment 2 Bernd Wiswedel CLA 2020-05-08 17:55:59 EDT
It seems the recipes that build the OSGi bundles (see code in git repo [1]) don't include packages in their "Import-Package" statement from required bundles, nor the bundle itself. These get added automagically added by 'bnd' (probably when it detects that those packages are used -- ignoring that they are provided via 'Require-Bundle' or contained in the same bundle itself?)


For instance, those are the import statements for batik.bridge (as taken directly from [1] today). Note, there is no line specifying batik.util imports...:

######################
Import-Package: \
 org.apache.batik.anim.dom;version="${batik-anim-version-range}", \
 org.apache.batik.anim.timing;version="${batik-anim-version-range}", \
 org.apache.batik.anim.values;version="${batik-anim-version-range}", \
 org.apache.batik.anim;version="${batik-anim-version-range}", \
 org.apache.batik.css.engine.value.svg12;version="${batik-css-version-range}", \
 org.apache.batik.css.engine.value.svg;version="${batik-css-version-range}", \
 org.apache.batik.css.engine.value;version="${batik-css-version-range}", \
 org.apache.batik.css.engine;version="${batik-css-version-range}", \
 org.apache.batik.dom.events;version="${batik-dom-version-range}", \
 org.apache.batik.dom.svg12;version="${batik-svg-dom-version-range}", \
 org.apache.batik.dom.svg;version="${batik-svg-dom-version-range}", \
 org.apache.batik.dom.util;version="${batik-dom-version-range}", \
 org.apache.batik.dom.xbl;version="${batik-dom-version-range}", \
 org.apache.batik.dom;version="${batik-dom-version-range}", \
 org.apache.batik.ext.awt.color;version="${batik-awt-util-version-range}", \
 org.apache.batik.ext.awt.geom;version="${batik-awt-util-version-range}", \
 org.apache.batik.ext.awt.image.renderable;version="${batik-awt-util-version-range}", \
 org.apache.batik.ext.awt.image.spi;version="${batik-awt-util-version-range}", \
 org.apache.batik.ext.awt.image;version="${batik-awt-util-version-range}", \
 org.apache.batik.ext.awt;version="${batik-awt-util-version-range}", \
 org.apache.batik.gvt.event;version="${batik-gvt-version-range}", \
 org.apache.batik.gvt.filter;version="${batik-gvt-version-range}", \
 org.apache.batik.gvt.flow;version="${batik-gvt-version-range}", \
 org.apache.batik.gvt.font;version="${batik-gvt-version-range}", \
 org.apache.batik.gvt.renderer;version="${batik-gvt-version-range}", \
 org.apache.batik.gvt.text;version="${batik-gvt-version-range}", \
 org.apache.batik.gvt;version="${batik-gvt-version-range}", \
 org.apache.batik.i18n;version="${batik-i18n-version-range}", \
 org.apache.batik.parser;version="${batik-parser-version-range}", \
 org.apache.batik.script.rhino;version="${batik-script-version-range}", \
 org.apache.batik.script;version="${batik-script-version-range}", \
 org.apache.batik.xml;version="${batik-xml-version-range}", \
 org.apache.xml.utils;version="${xalan-version}", \
 org.apache.xmlgraphics.java2d.color.profile;version="${xmlgraphics-commons-version}", \
 org.apache.xmlgraphics.java2d.color;version="${xmlgraphics-commons-version}", \
 org.apache.xpath.objects;version="${xalan-version}", \
 org.apache.xpath;version="${xalan-version}", \
 org.mozilla.javascript;resolution:=optional, \
 org.w3c.dom.svg;version="1.1", \
 org.w3c.dom.xpath, \
 org.w3c.dom.smil, \
 org.w3c.dom.css, \
 *;resolution:=optional
######################

However, listing the imports in the built jar file, taken from Orbit [2], shows:
######################
:~$ bnd print -i /tmp/org.apache.batik.bridge_1.9.1.v20190730-1743.jar 
[IMPEXP]
Import-Package
  javax.swing.event                      {resolution:=optional}
  javax.xml.transform                    {resolution:=optional}
  org.apache.batik.anim                  {version=[1.9.1,1.9.2)}
  org.apache.batik.anim.dom              {version=[1.9.1,1.9.2)}
  org.apache.batik.anim.timing           {version=[1.9.1,1.9.2)}
  org.apache.batik.anim.values           {version=[1.9.1,1.9.2)}
  org.apache.batik.css.engine            {version=[1.9.1,1.9.2)}
  org.apache.batik.css.engine.value      {version=[1.9.1,1.9.2)}
  org.apache.batik.css.engine.value.svg  {version=[1.9.1,1.9.2)}
  org.apache.batik.css.engine.value.svg12 {version=[1.9.1,1.9.2)}
  org.apache.batik.dom                   {version=[1.9.1,1.9.2)}
  org.apache.batik.dom.events            {version=[1.9.1,1.9.2)}
  org.apache.batik.dom.svg               {version=[1.9.1,1.9.2)}
  org.apache.batik.dom.svg12             {version=[1.9.1,1.9.2)}
  org.apache.batik.dom.util              {version=[1.9.1,1.9.2)}
  org.apache.batik.dom.xbl               {version=[1.9.1,1.9.2)}
  org.apache.batik.ext.awt               {version=[1.9.1,1.9.2)}
  org.apache.batik.ext.awt.color         {version=[1.9.1,1.9.2)}
  org.apache.batik.ext.awt.geom          {version=[1.9.1,1.9.2)}
  org.apache.batik.ext.awt.image         {version=[1.9.1,1.9.2)}
  org.apache.batik.ext.awt.image.renderable {version=[1.9.1,1.9.2)}
  org.apache.batik.ext.awt.image.spi     {version=[1.9.1,1.9.2)}
  org.apache.batik.gvt                   {version=[1.9.1,1.9.2)}
  org.apache.batik.gvt.event             {version=[1.9.1,1.9.2)}
  org.apache.batik.gvt.filter            {version=[1.9.1,1.9.2)}
  org.apache.batik.gvt.flow              {version=[1.9.1,1.9.2)}
  org.apache.batik.gvt.font              {version=[1.9.1,1.9.2)}
  org.apache.batik.gvt.renderer          {version=[1.9.1,1.9.2)}
  org.apache.batik.gvt.text              {version=[1.9.1,1.9.2)}
  org.apache.batik.i18n                  {version=[1.9.1,1.9.2)}
  org.apache.batik.parser                {version=[1.9.1,1.9.2)}
  org.apache.batik.script                {version=[1.9.1,1.9.2)}
  org.apache.batik.script.rhino          {version=[1.9.1,1.9.2)}
  org.apache.batik.util                  {resolution:=optional}
  org.apache.batik.util.io               {resolution:=optional}
  org.apache.batik.xml                   {version=[1.9.1,1.9.2)}
  org.apache.xml.utils                   {version=2.7.1}
  org.apache.xmlgraphics.java2d.color    {version=2.2.0}
  org.apache.xmlgraphics.java2d.color.profile {version=2.2.0}
  org.apache.xpath                       {version=2.7.1}
  org.apache.xpath.objects               {version=2.7.1}
  org.mozilla.javascript                 {resolution:=optional}
  org.w3c.dom.css                        
  org.w3c.dom.events                     {resolution:=optional}
  org.w3c.dom.smil                       
  org.w3c.dom.svg                        {version=1.1}
  org.w3c.dom.views                      {resolution:=optional}
  org.w3c.dom.xpath                      
######################

[1] The 'osgi.bnd' file building org.apache.batik.bridge:
https://git.eclipse.org/c/orbit/orbit-recipes.git/tree/apache/batik/org.apache.batik.bridge_1.9.1/osgi.bnd#n39

[2] https://download.eclipse.org/tools/orbit/downloads/drops/R20200224183213/
Comment 3 Bernd Wiswedel CLA 2020-05-08 18:05:15 EDT
Also note that this is a problem for packages defined in the bundle itself, e.g. 

:~$ bnd print -i /tmp/org.apache.batik.util.gui_1.9.1.v20190730-1743.jar 
[IMPEXP]
Import-Package
  javax.swing                            {resolution:=optional}
  javax.swing.border                     {resolution:=optional}
  javax.swing.event                      {resolution:=optional}
  javax.swing.filechooser                {resolution:=optional}
  javax.swing.plaf                       {resolution:=optional}
  javax.swing.plaf.basic                 {resolution:=optional}
  javax.swing.text                       {resolution:=optional}
  javax.swing.undo                       {resolution:=optional}
  org.apache.batik.util.gui.resource     {resolution:=optional, version=[1.9,2)}
  org.apache.batik.util.resources        {resolution:=optional}
  org.apache.batik.xml                   {version=[1.9.1,1.9.2)}
Export-Package
  org.apache.batik.util.gui              {version=1.9.1}
  org.apache.batik.util.gui.resource     {version=1.9.1, imported-as=[1.9,2)}
  org.apache.batik.util.gui.resources    {version=1.9.1}
  org.apache.batik.util.gui.resources.flags {version=1.9.1}
  org.apache.batik.util.gui.xmleditor    {version=1.9.1}


Note, it imports packages from the bundle itself (org.apache.batik.util.resources). 

This is a problem since Eclipse's BundleLoader will first load classes via 'Import-Packages', then 'Require-Bundle' and then the local bundle itself [1].

[1] https://git.eclipse.org/c/equinox/rt.equinox.framework.git/tree/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/BundleLoader.java#n459
(The steps 1-5 documented in the comments are actually useful..)