0 Replies Latest reply on Mar 23, 2004 7:20 PM by ssotangkur2

    JBoss-Jetty 3.0.x fails to startup with latest version of Xe

    ssotangkur2 Newbie

      This is the same issue as the one described here:
      http://junlu.com/msg/38980.html

      Basically, if your path to jbossweb.sar contains a space like C:\Program Files\jboss\server\default\deploy\jbossweb.sar then Xerce's XMLEntityManager.setupCurrentEntity() will call expandSystemId() on the filename and convert all spaces to '%20'. This eventually causes the server to fail startup because it cannot find the webdefault.xml file.

      [org.apache.xerces.impl.XMLEntityManager]
      public String setupCurrentEntity(String name, XMLInputSource xmlInputSource, boolean literal, boolean isExternal)
       throws IOException, XNIException {
       ...
       String expandedSystemId = expandSystemId(literalSystemId, baseSystemId, fStrictURI);
       ...
      


      When retrieving this file, the call to open the file gets delegated to JBoss's FileURLConnection class, which is instantiated with a url.

      URL location = new URL(expandedSystemId);
      URLConnection connect = location.openConnection();
      stream = connect.getInputStream();
      


      When it tries to get the inputStream, FileURLConnection will throw an error when it tries to see if the file exists. Thats because the underlying class is a regular java.io.File with a slightly modified filename, although it still has the '%20' in lieu of the space. This '%20' is causing file.exists() to return false.

      [org.jboss.net.protocol.file.FileURLConnection]
       public void connect() throws IOException
       {
       if (connected)
       return;
      
       if (!file.exists())
       {
       throw new FileNotFoundException(file.getPath());
       }
      
       connected = true;
       }
      
      


      So we need to either fix the call to expandSystemId() to not urlencode the spaces or fix FileURLConnection to unencode the '%20'.

      As a temporary fix I modified the constructer for FileURLConnection to decode the '%20'.

       public static final String HTML_SPACE = "%20";
      
       public FileURLConnection(final URL url)
       throws MalformedURLException, IOException
       {
       super(url);
       String filename = url.getFile().replace('/', File.separatorChar).replace('|', ':');
      
       // Remove '%20' from filenames and replace with space ' '
       int idx = filename.indexOf(HTML_SPACE);
       StringBuffer sb = new StringBuffer();
       while(idx > 0) {
       sb.append(filename.substring(0, idx));
       sb.append(' ');
       filename = filename.substring(idx + HTML_SPACE.length(), filename.length());
       idx = filename.indexOf(HTML_SPACE);
       }
       sb.append(filename);
       file = new File(sb.toString());
       doOutput = false;
       }