tags:

views:

62

answers:

2

I have a little GWT/AppEngine Project which uses RPC. Basically I need to get some data from a XML file that resides on the server. But when I use the RPC to read the file in my server-package I am getting a AccessControlException (access denied). Any ideas what the problem is?

//JAXB powered XML Parser
public PoiList readXML() {
    try {

        unmarshaller = jaxbContext.createUnmarshaller();
        unmarshaller.setEventHandler(new XMLValidEventHandler());
        db = (PoiList) unmarshaller.unmarshal(new File("src/com/sem/server/source.xml"));


    } catch (JAXBException e) {
        e.printStackTrace();
    }               
    return db;
}

java.security.AccessControlException: access denied (java.io.FilePermission \WEB-INF\classes\com\sem\server read)

cheers hoax

A: 

I think the problem is that you're trying to read a file that is not located in your working directory. The guidlines for structuring your code in gwt apps are as follows

Under the main project directory create the following directories:

  • src folder - contains production Java source
  • war folder - your web app; contains static resources as well as compiled output
  • test folder - (optional) JUnit test code would go here

Try moving the file to the war directory (for example /war/resources/myFile.xml) and then open it by

File myFile = new File(System.getProperty("user.dir") + "/resources/myFile.xml");
Banang
A: 

Usually, when you load a resource that is located in your classpath, you should't use java.io.File. Why? Because it's very much possible, that there is no real file - the classes are often packaged as a .jar file, or even loaded in a completely different way (very likely in the case of AppEngine, though I don't know the details.)

So, if you want to load it directly from your classpath, you can use:

ClassLoader classLoader = 
        getClass().getClassLoader(); // Or some other way to
                                     // get the correct ClassLoader
InputStream is = classloader.getResourceAsStream("/com/sem/server/source.xml");

Then you can use the input stream in your unmarshaller.

Chris Lercher