You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Alexander Berger (JIRA)" <ji...@apache.org> on 2009/05/07 07:58:30 UTC

[jira] Created: (FELIX-1130) Bundle.getHeaders() returns a Dictionary

Bundle.getHeaders() returns a Dictionary<java.util.jar.Attribute.Name,String>
-----------------------------------------------------------------------------

                 Key: FELIX-1130
                 URL: https://issues.apache.org/jira/browse/FELIX-1130
             Project: Felix
          Issue Type: Bug
          Components: Framework
    Affects Versions: felix-1.6.1
         Environment: IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460-20090215_29883 (JIT enabled, AOT enabled)
            Reporter: Alexander Berger


Bundle.getHeaders() returns a Dictionary whose key type is java.util.jar.Attribute.Name but the key type should be 
java.lang.String. For some unknown reasons (I guess different implementations of equals() and hashCode()) this
causes no problems with SUN's JRE but a lot of trouble with IBM's JRE. Especially bundles that rely on bundle 
headers (like for example Felix SCR) do not work on IBM's JRE due to this bug.

The suspicious code is in the getManifestHeader() member of org.apache.felix.framework.cache.JarRevision and DirectoryRevision:

            Manifest mf = jarFile.getManifest();
            // Create a case insensitive map of manifest attributes.
            return new StringMap(mf.getMainAttributes(), false);

So either org.apache.felix.framework.cache.JarRevision and DirectoryRevision should be changed in order for 
their getManifestHeader() member to return a Dictionary<String,String> 

            Manifest mf = jarFile.getManifest();
            // Create a case insensitive map of manifest attributes.
            final Attributes attributes = mf.getMainAttributes();
            final StringMap m = new StringMap(false);
            for ( final Object name : attributes.keySet() ) {
                final String text = name.toString();
                m.put(text, attributes.getValue(text));
            }
            return m;

or as Richard suggested the org.apache.felix.framework.util.StringMap
class should override putAll(Map) and ensure that all keys are of type String (like StringMap.put(...)) does.

Corresponding mailing list entries:

http://www.mail-archive.com/users@felix.apache.org/msg04248.html
http://www.mail-archive.com/users@felix.apache.org/msg04249.html


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (FELIX-1130) Bundle.getHeaders() returns a Dictionary

Posted by "Richard S. Hall (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/FELIX-1130?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Richard S. Hall resolved FELIX-1130.
------------------------------------

       Resolution: Fixed
    Fix Version/s: felix-2.0.0

I committed a patch that overrides putAll() and calls put() on each entry, where put() overrides the super class to do a toString() on each key. Please close this issue if you are satisfied. Thanks for the feedback.

> Bundle.getHeaders() returns a Dictionary<java.util.jar.Attribute.Name,String>
> -----------------------------------------------------------------------------
>
>                 Key: FELIX-1130
>                 URL: https://issues.apache.org/jira/browse/FELIX-1130
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: felix-1.6.1
>         Environment: IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460-20090215_29883 (JIT enabled, AOT enabled)
>            Reporter: Alexander Berger
>            Assignee: Richard S. Hall
>             Fix For: felix-2.0.0
>
>
> Bundle.getHeaders() returns a Dictionary whose key type is java.util.jar.Attribute.Name but the key type should be 
> java.lang.String. For some unknown reasons (I guess different implementations of equals() and hashCode()) this
> causes no problems with SUN's JRE but a lot of trouble with IBM's JRE. Especially bundles that rely on bundle 
> headers (like for example Felix SCR) do not work on IBM's JRE due to this bug.
> The suspicious code is in the getManifestHeader() member of org.apache.felix.framework.cache.JarRevision and DirectoryRevision:
>             Manifest mf = jarFile.getManifest();
>             // Create a case insensitive map of manifest attributes.
>             return new StringMap(mf.getMainAttributes(), false);
> So either org.apache.felix.framework.cache.JarRevision and DirectoryRevision should be changed in order for 
> their getManifestHeader() member to return a Dictionary<String,String> 
>             Manifest mf = jarFile.getManifest();
>             // Create a case insensitive map of manifest attributes.
>             final Attributes attributes = mf.getMainAttributes();
>             final StringMap m = new StringMap(false);
>             for ( final Object name : attributes.keySet() ) {
>                 final String text = name.toString();
>                 m.put(text, attributes.getValue(text));
>             }
>             return m;
> or as Richard suggested the org.apache.felix.framework.util.StringMap
> class should override putAll(Map) and ensure that all keys are of type String (like StringMap.put(...)) does.
> Corresponding mailing list entries:
> http://www.mail-archive.com/users@felix.apache.org/msg04248.html
> http://www.mail-archive.com/users@felix.apache.org/msg04249.html

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Closed: (FELIX-1130) Bundle.getHeaders() returns a Dictionary

Posted by "Alexander Berger (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/FELIX-1130?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Alexander Berger closed FELIX-1130.
-----------------------------------


Thanks Richard. 

As the patch is very simple and is identically with the one I use for Felix 1.6.1 I close this issue as it works.

> Bundle.getHeaders() returns a Dictionary<java.util.jar.Attribute.Name,String>
> -----------------------------------------------------------------------------
>
>                 Key: FELIX-1130
>                 URL: https://issues.apache.org/jira/browse/FELIX-1130
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: felix-1.6.1
>         Environment: IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460-20090215_29883 (JIT enabled, AOT enabled)
>            Reporter: Alexander Berger
>            Assignee: Richard S. Hall
>             Fix For: felix-2.0.0
>
>
> Bundle.getHeaders() returns a Dictionary whose key type is java.util.jar.Attribute.Name but the key type should be 
> java.lang.String. For some unknown reasons (I guess different implementations of equals() and hashCode()) this
> causes no problems with SUN's JRE but a lot of trouble with IBM's JRE. Especially bundles that rely on bundle 
> headers (like for example Felix SCR) do not work on IBM's JRE due to this bug.
> The suspicious code is in the getManifestHeader() member of org.apache.felix.framework.cache.JarRevision and DirectoryRevision:
>             Manifest mf = jarFile.getManifest();
>             // Create a case insensitive map of manifest attributes.
>             return new StringMap(mf.getMainAttributes(), false);
> So either org.apache.felix.framework.cache.JarRevision and DirectoryRevision should be changed in order for 
> their getManifestHeader() member to return a Dictionary<String,String> 
>             Manifest mf = jarFile.getManifest();
>             // Create a case insensitive map of manifest attributes.
>             final Attributes attributes = mf.getMainAttributes();
>             final StringMap m = new StringMap(false);
>             for ( final Object name : attributes.keySet() ) {
>                 final String text = name.toString();
>                 m.put(text, attributes.getValue(text));
>             }
>             return m;
> or as Richard suggested the org.apache.felix.framework.util.StringMap
> class should override putAll(Map) and ensure that all keys are of type String (like StringMap.put(...)) does.
> Corresponding mailing list entries:
> http://www.mail-archive.com/users@felix.apache.org/msg04248.html
> http://www.mail-archive.com/users@felix.apache.org/msg04249.html

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Assigned: (FELIX-1130) Bundle.getHeaders() returns a Dictionary

Posted by "Richard S. Hall (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/FELIX-1130?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Richard S. Hall reassigned FELIX-1130:
--------------------------------------

    Assignee: Richard S. Hall

> Bundle.getHeaders() returns a Dictionary<java.util.jar.Attribute.Name,String>
> -----------------------------------------------------------------------------
>
>                 Key: FELIX-1130
>                 URL: https://issues.apache.org/jira/browse/FELIX-1130
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: felix-1.6.1
>         Environment: IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460-20090215_29883 (JIT enabled, AOT enabled)
>            Reporter: Alexander Berger
>            Assignee: Richard S. Hall
>
> Bundle.getHeaders() returns a Dictionary whose key type is java.util.jar.Attribute.Name but the key type should be 
> java.lang.String. For some unknown reasons (I guess different implementations of equals() and hashCode()) this
> causes no problems with SUN's JRE but a lot of trouble with IBM's JRE. Especially bundles that rely on bundle 
> headers (like for example Felix SCR) do not work on IBM's JRE due to this bug.
> The suspicious code is in the getManifestHeader() member of org.apache.felix.framework.cache.JarRevision and DirectoryRevision:
>             Manifest mf = jarFile.getManifest();
>             // Create a case insensitive map of manifest attributes.
>             return new StringMap(mf.getMainAttributes(), false);
> So either org.apache.felix.framework.cache.JarRevision and DirectoryRevision should be changed in order for 
> their getManifestHeader() member to return a Dictionary<String,String> 
>             Manifest mf = jarFile.getManifest();
>             // Create a case insensitive map of manifest attributes.
>             final Attributes attributes = mf.getMainAttributes();
>             final StringMap m = new StringMap(false);
>             for ( final Object name : attributes.keySet() ) {
>                 final String text = name.toString();
>                 m.put(text, attributes.getValue(text));
>             }
>             return m;
> or as Richard suggested the org.apache.felix.framework.util.StringMap
> class should override putAll(Map) and ensure that all keys are of type String (like StringMap.put(...)) does.
> Corresponding mailing list entries:
> http://www.mail-archive.com/users@felix.apache.org/msg04248.html
> http://www.mail-archive.com/users@felix.apache.org/msg04249.html

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.