[ http://issues.apache.org/jira/browse/FELIX-149?page=all ]
Olivier Gruber closed FELIX-149. -------------------------------- > Bug in Bundle.getEntry > ---------------------- > > Key: FELIX-149 > URL: http://issues.apache.org/jira/browse/FELIX-149 > Project: Felix > Issue Type: Bug > Components: Framework > Reporter: Olivier Gruber > Assigned To: Richard S. Hall > Priority: Minor > > I think I found a bug in the implementation of URL Bundle.getEntry(String > name); > It raises a ClassCastException when called on the system bundle since its > content loader > is not a ContentLoaderImpl but actually a SystemBundleContentLoader. :-( > class BundleImpl > public URL getEntry(String name) > { > Object sm = System.getSecurityManager(); > if (sm != null) > { > try > { > ((SecurityManager) sm).checkPermission(new > AdminPermission(this, > AdminPermission.RESOURCE)); > } > catch (Exception e) > { > return null; // No permission > } > } > return m_felix.getBundleEntry(this, name); > } > class Felix > /** > * Implementation for Bundle.getEntry(). > **/ > protected URL getBundleEntry(BundleImpl bundle, String name) > { > if (bundle.getInfo().getState() == Bundle.UNINSTALLED) > { > throw new IllegalStateException("The bundle is uninstalled."); > } > ==>> return ((ContentLoaderImpl) bundle.getInfo().getCurrentModule() > .getContentLoader()).getResourceFromContent(name); > } > Here is a patch for this problem. > It is basically moving the getResourceFromContent from ContentLoaderImpl to > Felix, > which required to modify the FindEntriesEnumeration slightly. > Index: org/apache/felix/framework/searchpolicy/ContentLoaderImpl.java > =================================================================== > --- org/apache/felix/framework/searchpolicy/ContentLoaderImpl.java > (revision 440763) > +++ org/apache/felix/framework/searchpolicy/ContentLoaderImpl.java > (working copy) > @@ -174,39 +174,6 @@ > return v.elements(); > } > > - // TODO: API: Investigate making this an API call. > - public URL getResourceFromContent(String name) > - { > - URL url = null; > - > - // Check for the special case of "/", which represents > - // the root of the bundle according to the spec. > - if (name.equals("/")) > - { > - url = getURLPolicy().createURL("0/"); > - } > - > - if (url == null) > - { > - // Remove leading slash, if present. > - if (name.startsWith("/")) > - { > - name = name.substring(1); > - } > - > - // Check the module content. > - if (getContent().hasEntry(name)) > - { > - // Module content URLs start with 0, whereas module > - // class path URLs start with the index into the class > - // path + 1. > - url = getURLPolicy().createURL("0/" + name); > - } > - } > - > - return url; > - } > - > public boolean hasInputStream(String urlPath) > { > if (urlPath.startsWith("/")) > Index: org/apache/felix/framework/Felix.java > =================================================================== > --- org/apache/felix/framework/Felix.java (revision 440763) > +++ org/apache/felix/framework/Felix.java (working copy) > @@ -1001,10 +1001,47 @@ > { > throw new IllegalStateException("The bundle is uninstalled."); > } > - return ((ContentLoaderImpl) bundle.getInfo().getCurrentModule() > - .getContentLoader()).getResourceFromContent(name); > + IContentLoader loader; > + loader = bundle.getInfo().getCurrentModule().getContentLoader(); > + return getResourceFromContent(loader,name); > + //return ((ContentLoaderImpl) bundle.getInfo().getCurrentModule() > + // .getContentLoader()).getResourceFromContent(name); > } > > + // TODO: API: Investigate making this an API call. > + private URL getResourceFromContent(IContentLoader loader, String name) > + { > + URL url = null; > + > + // Check for the special case of "/", which represents > + // the root of the bundle according to the spec. > + if (name.equals("/")) > + { > + url = loader.getURLPolicy().createURL("0/"); > + } > + > + if (url == null) > + { > + // Remove leading slash, if present. > + if (name.startsWith("/")) > + { > + name = name.substring(1); > + } > + > + // Check the module content. > + IContent content = loader.getContent(); > + if (content!=null && content.hasEntry(name)) > + { > + // Module content URLs start with 0, whereas module > + // class path URLs start with the index into the class > + // path + 1. > + url = loader.getURLPolicy().createURL("0/" + name); > + } > + } > + > + return url; > + } > + > /** > * Implementation for Bundle.getEntryPaths(). > **/ > @@ -1034,8 +1071,8 @@ > > // Get the entry enumeration from the module content and > // create a wrapper enumeration to filter it. > - Enumeration enumeration = > - new FindEntriesEnumeration(bundle, path, filePattern, recurse); > + Enumeration enumeration = > + new FindEntriesEnumeration(this,bundle, path, filePattern, > recurse); > > // Return the enumeration if it has elements. > return (!enumeration.hasMoreElements()) ? null : enumeration; > Index: org/apache/felix/framework/FindEntriesEnumeration.java > =================================================================== > --- org/apache/felix/framework/FindEntriesEnumeration.java (revision > 440763) > +++ org/apache/felix/framework/FindEntriesEnumeration.java (working copy) > @@ -22,6 +22,7 @@ > > class FindEntriesEnumeration implements Enumeration > { > + private Felix m_felix; > private BundleImpl m_bundle = null; > private Enumeration m_enumeration = null; > private String m_path = null; > @@ -29,9 +30,10 @@ > private boolean m_recurse = false; > private Object m_next = null; > > - public FindEntriesEnumeration( > + public FindEntriesEnumeration(Felix felix, > BundleImpl bundle, String path, String filePattern, boolean recurse) > { > + m_felix = felix; > m_bundle = bundle; > m_path = path; > m_enumeration = m_bundle.getInfo().getCurrentModule() > @@ -49,7 +51,7 @@ > m_path = m_path.substring(1); > } > // Add a '/' to the end if not present. > - if ((m_path.length() > 0) && (m_path.charAt(path.length() - 1) != > '/')) > + if ((m_path.length() > 0) && (m_path.charAt(m_path.length() - 1) != > '/')) > { > m_path = m_path + "/"; > } > @@ -116,10 +118,12 @@ > // See if the file pattern matches the last element of > the path. > if (checkSubstring(m_filePattern, lastElement)) > { > + return m_felix.getBundleEntry(m_bundle,entryName); > + > // Convert entry name into an entry URL. > - return ((ContentLoaderImpl) m_bundle.getInfo() > - .getCurrentModule().getContentLoader()) > - .getResourceFromContent(entryName); > + //return ((ContentLoaderImpl) m_bundle.getInfo() > + // .getCurrentModule().getContentLoader()) > + // .getResourceFromContent(entryName); > } > } > } -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira