Friday, February 10, 2012

Convert file located in OSGi Bundle to IFile


I have an installed bundle (org.osgi.framework.Bundle) in my running eclipse. There is a file in this bundle. I have the path to the file and i can represent this file by an URL (java.net.URL) by using URL url = bundle.getEntry("/folder/file") .



Is there a way to get a handle of this file of type IFile (org.eclipse.core.resources.IFile)?



I need a reference of the file located in the installed osgi bundle of type IFile. But I don't want to copy the file temporary on my local disk (like workspace).



Thanks in advance!

2 comments:

  1. It's difficult. An IFile represents an actual file rather than an entry in an archive. You would need to build an Eclipse FileSystem (EFS) representation for the archive, but that's likely to be a lot of work.

    What are you trying to achieve? There's probably something you can do that is much simpler.

    ReplyDelete
  2. If you have an eclipse plugin / editor or something like this try:

    //get the workspace
    IWorkspace workspace= ResourcesPlugin.getWorkspace();

    //create the path to the file
    IPath location= new Path(yourURL.getPath());

    //try to get the IFile (returns null if it could not be found in the workspace)
    IFile file= workspace.getRoot().getFileForLocation(location);

    if (file == null) {
    //not found in the workspace, get the IFileStore (external files)
    IFileStore fileStore = EFS.getLocalFileSystem().getStore(location);
    return fileStore;
    } else {
    // file found, return it
    return file;
    }


    Helpfull could be also:

    url = FileLocator.toFileURL(yourURL);


    and/or

    URL resolvedUrl = FileLocator.resolve(url);


    After this you can create the input for your editor (I think you want to use it there?)

    Object file = myGetFile();
    IEditorInput input;
    if (file instanceof IFile) {
    input = new FileEditorInput((IFile)file);
    else {
    if (file instanceof IFileStore) {
    input = new FileStoreEditorInput((IFileStore)file);
    } else {
    throw new MyException("file is null, not found");
    }
    }


    I hope this will help you.

    Greetz,
    Adreamus

    ReplyDelete