JBoss-Jetty 3.0.x fails to startup with latest version of Xe
ssotangkur2 Mar 23, 2004 7:20 PMThis 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;
 }