How to read the .xml file path in Eclipse rcp application using java? - eclipse-rcp

I have find the solution.This solution will help me to read file from appropriate folder path.
**
String resourceFolder=""; URL url=new
URL("platform:/plugin/com.example"+resourceFolder);
String resourceFolderPath=org.eclipse.core.runtime.FileLocator.toFileURL(url).getPath();
resourceFile=resourceFolderPath+"xxxx.xml";
**
Is there any other way to find it?

FileLocator is the correct API to use to access plugin resources.
Use FileLocator.find to get a URL to a resource:
URL url = FileLocator.find(bundle, new Path("relative path in plugin"), null);
bundle is the Bundle for the plugin. For the current plugin you can get this using:
Bundle bundle = FrameworkUtil.getBundle(getClass());
to get the bundle of a different plugin use:
Bundle bundle = Platform.getBundle("plugin id");
The URL returned by find is an bundleentry URL. You can use openStream on this to read to resource.
If you want a file URL you can convert the url using:
URL fileURL = FileLocator.toFileURL(url);
This may cause Eclipse to copy the resource in to a file in a temporary location.

Related

Is it possible to get a resource from a feature?

I can access a resource in a plugin
Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
URL fileURL = bundle.getEntry("resources/resource.txt");
Is it possible to do something similar using a feature?

can't access play-scala public folder resources

For my play-scala project, My routes file has:
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
however, I am not able to retrieve any resource from this folder. For example, I placed a png file calleg favicon.png in the public folder, yet, if I run
http://localhost:9000/public/favicon.png
the play server can't find the resource. Any ideas about what to look for to repair this problem?
The server also says that tried the route:
GET/assets/$file<.+>controllers.Assets.versioned(path:String = "/public", file:Asset)
But no luck.
You are reading your configuration wrong, the correct request would look like this:
http://localhost:9000/assets/favicon.png
That way favicon.png will be searched in public folder, not another way around
If you want your original URL to work, you'll need to change your configuration to following:
GET /public/*file controllers.Assets.versioned(path="/public", file: Asset)

Eclipse RCP local history is empty

I'm trying to get the local history for a file, but its always empty:
FileSystemResourceManager fsm =
((org.eclipse.core.internal.resources.Workspace)ResourcesPlugin.getWorkspace()).getFileSystemManager();
IFileState[] fileStates =
fsm.getHistoryStore().getStates(myFile.getFullPath(),null);
In the .metadata/.plugins/org.eclipse.core.resources/.history/ folder I can find the items for the file, but I cant reach them via code.
The APIs you are using are internal use only and are not part of the Eclipse API, see Eclipse API Rules of Engagement.
You get the IFileState from an IFile object using the getHistory method.
IFile file = get ifile
IFileState [] states = file.getHistory(progress monitor);

Servlet cannot find the file I'm trying to open

I read that the servlets map the current location based on the url. Clicking a button from my Home.jsp page directs me to my servlet, ExcelUploader. The URL when said button is clicked is
http://localhost:8080/ServletExample/ExcelUploader
I'm trying to open an excel file located in the same folder as my JSP. so that means I have to move one folder up relative to the url above. I have this in my servlet:
InputStream inp = new FileInputStream("../OpenMe.xls");
However I'm still getting a
java.io.FileNotFoundException: ..\OpenMe.xls (The system cannot find the file specified)
This is how my project is setup:
The FileInputStream operates on the local disk file system relative to the working directory and knows absolutely nothing about the fact that it's invoked from a Java EE web application. Any relative path you pass to it is relative to the folder which was been opened at the moment the command to start the server is executed. This is often the server's own installation folder, but in case of an IDE this can also be project's own root folder. This variable is not controllable from inside your Java code. You should not be relying on that.
You've stored the file as a resource of the public webcontent. So it's available as a webcontent resource by ServletContext#getResourceAsStream() which returns an InputStream. If you have absolutely a legitimate reason to invoke the servlet by its URL instead of just using the file's own URL http://localhost:8080/ServletExample/OpenMe.xls, then you should be getting at as follows:
InputStream input = getServletContext().getResourceAsStream("/OpenMe.xls");
// ...
If your intent is indeed to restrict the file's access to by the servlet only, you might want to consider to move the file into the /WEB-INF folder, so that the enduser can never open it directly by entering the file's own URL. You only need to change the resource path accordingly.
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/OpenMe.xls");
// ...
You should not be using getRealPath() as suggested by the other answer. This won't work when the servletcontainer is configured to expand the WAR file into memory instead of into local disk file system, which is often the case in 3rd party hosts. It would return null then.
See also:
getResourceAsStream() vs FileInputStream
Paths for files that live in the webtree have to be "translated" using getRealPath before they are usable, like this:
File excelFile = new File(getServletContext().getRealPath("/OpenMe.xls"));
While you're at it, using the default package isn't a good idea, create a package for your files.

How to get the eclipse installation/plugins directory or path

How to get the Eclipse installation directory through programming in swt/java.
I actually want to get the plugins directory of the eclipse.
Update (January 2012)
James Moore mentions in the comments that the FAQ and API are quite old.
FileLocator.resolve(URL) is now preferred to the deprecated Platform.resolve().
As this example shows, you need to pass the actual resource (here a bundle), not the name of the resource, in order to resolve it:
private static URI locateFile(String bundle, String fullPath) {
try {
URL url = FileLocator.find(Platform.getBundle(bundle), new Path(fullPath), null);
if(url != null)
return FileLocator.resolve(url).toURI();
} catch (Exception e) {}
return null;
}
}
See also "How to refer a file from jar file in eclipse plugin" for more.
Original answer (January 2011)
Maybe the FAQ "How do I find out the install location of a plug-in?" can help here:
You should generally avoid making assumptions about the location of a plug-in at runtime.
To find resources, such as images, that are stored in your plug-in’s install directory, you can use URLs provided by the Platform class. These URLs use a special Eclipse Platform protocol, but if you are using them only to read files, it does not matter.
In Eclipse 3.1 and earlier, the following snippet opens an input stream on a file called sample.gif located in a subdirectory, called icons, of a plug-in’s install directory:
Bundle bundle = Platform.getBundle(yourPluginId);
Path path = new Path("icons/sample.gif");
URL fileURL = Platform.find(bundle, path);
InputStream in = fileURL.openStream();
If you need to know the file system location of a plug-in, you need to use Platform.resolve(URL). This method converts a platform URL to a standard URL protocol, such as HyperText Transfer Protocol (HTTP), or file.
Note that the Eclipse Platform does not specify that plug-ins must exist in the local file system, so you cannot rely on this method’s returning a file system URL under all circumstances in the future.
In Eclipse 3.2, the preferred method seems to be:
Bundle bundle = Platform.getBundle(yourPluginId);
Path path = new Path("icons/sample.gif");
URL fileURL = FileLocator.find(bundle, path, null);
InputStream in = fileURL.openStream();
Use the below code to get the plugin path :
this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();