You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Olivier Gruber (JIRA)" <ji...@apache.org> on 2006/09/28 08:26:51 UTC
[jira] Closed: (FELIX-149) Bug in Bundle.getEntry
[ 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