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