Name: gm110360 Date: 02/14/2002
FULL PRODUCT VERSION :
java version "1.4.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)
Java(TM) Plug-in: Version 1.4.0
Using JRE version 1.4.0-rc Java HotSpot(TM) Client VM
User home directory = C:\WINDOWS
Proxy Configuration: No proxy
FULL OPERATING SYSTEM VERSION :Windows 98 [Version
4.10.2222]
A DESCRIPTION OF THE PROBLEM :
I try to read xml data from webpage into JApplet. The xml
data is avaliable as text file and place at the same
JApplet directory. The error message is "access denied" by
java.net.SocketPermission which was called from
javax.xml.parsers.DocumentBuilder.parse(). I use
URL.openStream() to open the InputStream. However, the xml
data can be read by BufferedReader.
I first found the problem when I used Forte 3.0 with tomcat
3.2. Then, I try again with JWSDP 1.0 EA1 which released
with tomcat 4.0.1. It has the same result.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Prepare files :
copy DOMEdit.html, webxml.txt, and DOMEdit.java into same
directory of web server. Then, compile DOMEdit.java and run
web server.
2. Browse DOMEdit.html:
When the applet start, the messagebox "Reading file ..."
will be shown. Next messagebox will show data from
webxml.txt which is read by BufferedRead.
3. Error:
After that, the error messagebox will be shown.
EXPECTED VERSUS ACTUAL BEHAVIOR :
If there is no problem, the messagebox "Reading file
complete." will be shown and the tree of xml DOM will be
drawn.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.security.AccessControlException: access denied (java.net.SocketPermission
java.sun.com resolve)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:524)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
at org.apache.crimson.jaxp.DocumentBuilderImpl.parse
(DocumentBuilderImpl.java:185)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:86)
at DOMEdit.readFile(DOMEdit.java:97)
at DOMEdit.init(DOMEdit.java:75)
at sun.applet.AppletPanel.run(AppletPanel.java:341)
at java.lang.Thread.run(Thread.java:536)
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
================ DOMEdit.java ==============
/*
* DOMEdit.java
*
* Created on 10 ?????????? 2545, 23:15 ?.
*/
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.tree.*;
import java.net.URL;
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
*
* @author lsomchai
*/
public class DOMEdit extends javax.swing.JApplet {
Document document;
String url;
/** Creates new form DOMEdit */
public DOMEdit() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
viewPane = new javax.swing.JPanel();
titleLabel = new javax.swing.JLabel();
splitPane = new javax.swing.JSplitPane();
leftScroll = new javax.swing.JScrollPane();
domTree = new javax.swing.JTree();
rightScroll = new javax.swing.JScrollPane();
setName("DOMEdit");
viewPane.setLayout(new java.awt.BorderLayout());
viewPane.setBorder(new javax.swing.border.EmptyBorder(new
java.awt.Insets(5, 5, 5, 5)));
titleLabel.setText("jLabel1");
viewPane.add(titleLabel, java.awt.BorderLayout.NORTH);
leftScroll.setViewportView(domTree);
splitPane.setLeftComponent(leftScroll);
splitPane.setRightComponent(rightScroll);
viewPane.add(splitPane, java.awt.BorderLayout.CENTER);
getContentPane().add(viewPane, java.awt.BorderLayout.CENTER);
}//GEN-END:initComponents
public void init() {
URL cb = getCodeBase();
readFile();
}
private void readFile() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//factory.setValidating(true);
//factory.setNamespaceAware(true);
try {
javax.swing.JOptionPane.showMessageDialog(this,"Reading file...");
URL tc = new URL(getCodeBase(),"webxml.txt");
URL ac = new URL(getCodeBase(),"webxml.txt");
titleLabel.setText(ac.toString());
InputStream tin = tc.openStream();
InputStream in = ac.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader
(tin));
String text="",buffer;
while ((buffer = reader.readLine()) != null) {
text += buffer;
}
javax.swing.JOptionPane.showMessageDialog(this,text);
tin.close();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(in);
domTree.setModel(new DefaultTreeModel(new DOMNodeAdapter
(document)));
//domTree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode
("Test")));
//domTree.setCellRenderer(new DOMTreeCellRenderer());
javax.swing.JOptionPane.showMessageDialog(this,"Reading file
complete.");
in.close();
} catch (Exception e) {
// Error generated during parsing)
e.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(this,e.toString());
}
}
public static void main(String[] argv) {
JFrame frame = new JFrame("DOMEdit");
frame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
}
);
DOMEdit edit = new DOMEdit();
edit.url = "http://vslwin:8080/webxml.txt";
edit.readFile();
frame.getContentPane().add(edit);
frame.pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
int w = 500 + 10;
int h = 350 + 10;
frame.setLocation(screenSize.width/3 - w/2,
screenSize.height/2 - h/2);
frame.setSize(w, h);
frame.setVisible(true);
}
public class DOMTreeCellRenderer extends
javax.swing.tree.DefaultTreeCellRenderer {
public java.awt.Component getTreeCellRendererComponent
(javax.swing.JTree tree, java.lang.Object obj, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasfocus) {
return tree;
}
}
public class DOMNodeAdapter implements javax.swing.tree.TreeNode,
javax.swing.tree.MutableTreeNode {
org.w3c.dom.Node domNode;
public DOMNodeAdapter(org.w3c.dom.Node node) {
domNode = node;
}
public boolean getAllowsChildren() {
return true;
}
public String toString() {
switch (domNode.getNodeType()) {
case Node.ATTRIBUTE_NODE : return "ATTRIBUTE";
case Node.CDATA_SECTION_NODE : return "CDATA_SECTION";
case Node.COMMENT_NODE : return "COMMENT";
case Node.DOCUMENT_FRAGMENT_NODE : return "DOCUMENT_FRAGMENT";
case Node.DOCUMENT_NODE : return "DOCUMENT";
case Node.DOCUMENT_TYPE_NODE : return "DOCUMENT_TYPE";
case Node.ELEMENT_NODE : return "ELEMENT";
case Node.ENTITY_NODE : return "ENTITY";
case Node.ENTITY_REFERENCE_NODE : return "ENTITY_REFERENCE";
case Node.NOTATION_NODE : return "NOTATION";
case Node.PROCESSING_INSTRUCTION_NODE :
return "PROCESSING_INSTRUCTION";
case Node.TEXT_NODE : return "TEXT";
}
return "UNKNOWN";
}
public java.util.Enumeration children() {
int count = getChildCount();
java.util.Vector list = new java.util.Vector();
for (int i=0; i<count; i++) list.add(getChildAt(i));
return list.elements();
}
public javax.swing.tree.TreeNode getChildAt(int param) {
return new DOMNodeAdapter(domNode.getChildNodes().item(param));
}
public int getIndex(javax.swing.tree.TreeNode treeNode) {
DOMNodeAdapter node = (DOMNodeAdapter)treeNode;
DOMNodeAdapter parent = (DOMNodeAdapter)node.getParent();
int count = parent.getChildCount();
for (int i=0; i<count; i++) {
DOMNodeAdapter child = (DOMNodeAdapter)parent.getChildAt(i);
if (node.domNode == child.domNode) return i;
}
return -1; // Should never get here.
}
public int getChildCount() {
int count = 0;
for (int i=0; i<domNode.getChildNodes().getLength(); i++) {
org.w3c.dom.Node child = domNode.getChildNodes().item(i);
//if (child.getNodeType() == Node.ELEMENT_NODE)
++count;
}
return count;
}
public boolean isLeaf() {
if (getChildCount() > 0) return false;
return true;
}
public javax.swing.tree.TreeNode getParent() {
return new DOMNodeAdapter(domNode.getParentNode());
}
public void setUserObject(java.lang.Object obj) {
}
public void remove(javax.swing.tree.MutableTreeNode mutableTreeNode) {
}
public void removeFromParent() {
}
public void setParent(javax.swing.tree.MutableTreeNode mutableTreeNode)
{
}
public void remove(int param) {
}
public void insert(javax.swing.tree.MutableTreeNode mutableTreeNode,
int param) {
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel viewPane;
private javax.swing.JLabel titleLabel;
private javax.swing.JSplitPane splitPane;
private javax.swing.JScrollPane leftScroll;
private javax.swing.JTree domTree;
private javax.swing.JScrollPane rightScroll;
// End of variables declaration//GEN-END:variables
}
================ DOMEdit.java ==============
================ DOMEdit.html ==============
<HTML>
<HEAD>
<TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>
<H3><HR WIDTH="100%">Applet HTML Page<HR WIDTH="100%"></H3>
<P>
<APPLET code="DOMEdit.class" width=350 height=200></APPLET>
</P>
<HR WIDTH="100%"><FONT SIZE=-1><I>Generated by NetBeans IDE</I></FONT>
</BODY>
</HTML>
================ DOMEdit.html ==============
================ webxml.txt ================
<?xml version="1.0" encoding="UTF-8"?>
<!--
Sun Public License Notice
The contents of this file are subject to the Sun Public License
Version 1.0 (the "License"). You may not use this file except in
compliance with the License. A copy of the License is available at
http://www.sun.com/
The Original Code is NetBeans. The Initial Developer of the Original
Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
Microsystems, Inc. All Rights Reserved.
-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>Servlet_AppContext</servlet-name>
<display-name>Servlet AppContext</display-name>
<description>Default configuration created for servlet.</description>
<servlet-class>AppContext</servlet-class>
<load-on-startup>99</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_AppContext</servlet-name>
<url-pattern>webxml.txt</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file>
</welcome-file-list>
</web-app>
================ webxml.txt ================
---------- END SOURCE ----------
(Review ID: 139522)
======================================================================
###@###.### 2002-12-27
FULL PRODUCT VERSION :
java version "1.4.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)
Java(TM) Plug-in: Version 1.4.0
Using JRE version 1.4.0-rc Java HotSpot(TM) Client VM
User home directory = C:\WINDOWS
Proxy Configuration: No proxy
FULL OPERATING SYSTEM VERSION :Windows 98 [Version
4.10.2222]
A DESCRIPTION OF THE PROBLEM :
I try to read xml data from webpage into JApplet. The xml
data is avaliable as text file and place at the same
JApplet directory. The error message is "access denied" by
java.net.SocketPermission which was called from
javax.xml.parsers.DocumentBuilder.parse(). I use
URL.openStream() to open the InputStream. However, the xml
data can be read by BufferedReader.
I first found the problem when I used Forte 3.0 with tomcat
3.2. Then, I try again with JWSDP 1.0 EA1 which released
with tomcat 4.0.1. It has the same result.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Prepare files :
copy DOMEdit.html, webxml.txt, and DOMEdit.java into same
directory of web server. Then, compile DOMEdit.java and run
web server.
2. Browse DOMEdit.html:
When the applet start, the messagebox "Reading file ..."
will be shown. Next messagebox will show data from
webxml.txt which is read by BufferedRead.
3. Error:
After that, the error messagebox will be shown.
EXPECTED VERSUS ACTUAL BEHAVIOR :
If there is no problem, the messagebox "Reading file
complete." will be shown and the tree of xml DOM will be
drawn.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.security.AccessControlException: access denied (java.net.SocketPermission
java.sun.com resolve)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:524)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
at org.apache.crimson.jaxp.DocumentBuilderImpl.parse
(DocumentBuilderImpl.java:185)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:86)
at DOMEdit.readFile(DOMEdit.java:97)
at DOMEdit.init(DOMEdit.java:75)
at sun.applet.AppletPanel.run(AppletPanel.java:341)
at java.lang.Thread.run(Thread.java:536)
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
================ DOMEdit.java ==============
/*
* DOMEdit.java
*
* Created on 10 ?????????? 2545, 23:15 ?.
*/
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.tree.*;
import java.net.URL;
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
*
* @author lsomchai
*/
public class DOMEdit extends javax.swing.JApplet {
Document document;
String url;
/** Creates new form DOMEdit */
public DOMEdit() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
viewPane = new javax.swing.JPanel();
titleLabel = new javax.swing.JLabel();
splitPane = new javax.swing.JSplitPane();
leftScroll = new javax.swing.JScrollPane();
domTree = new javax.swing.JTree();
rightScroll = new javax.swing.JScrollPane();
setName("DOMEdit");
viewPane.setLayout(new java.awt.BorderLayout());
viewPane.setBorder(new javax.swing.border.EmptyBorder(new
java.awt.Insets(5, 5, 5, 5)));
titleLabel.setText("jLabel1");
viewPane.add(titleLabel, java.awt.BorderLayout.NORTH);
leftScroll.setViewportView(domTree);
splitPane.setLeftComponent(leftScroll);
splitPane.setRightComponent(rightScroll);
viewPane.add(splitPane, java.awt.BorderLayout.CENTER);
getContentPane().add(viewPane, java.awt.BorderLayout.CENTER);
}//GEN-END:initComponents
public void init() {
URL cb = getCodeBase();
readFile();
}
private void readFile() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//factory.setValidating(true);
//factory.setNamespaceAware(true);
try {
javax.swing.JOptionPane.showMessageDialog(this,"Reading file...");
URL tc = new URL(getCodeBase(),"webxml.txt");
URL ac = new URL(getCodeBase(),"webxml.txt");
titleLabel.setText(ac.toString());
InputStream tin = tc.openStream();
InputStream in = ac.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader
(tin));
String text="",buffer;
while ((buffer = reader.readLine()) != null) {
text += buffer;
}
javax.swing.JOptionPane.showMessageDialog(this,text);
tin.close();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(in);
domTree.setModel(new DefaultTreeModel(new DOMNodeAdapter
(document)));
//domTree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode
("Test")));
//domTree.setCellRenderer(new DOMTreeCellRenderer());
javax.swing.JOptionPane.showMessageDialog(this,"Reading file
complete.");
in.close();
} catch (Exception e) {
// Error generated during parsing)
e.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(this,e.toString());
}
}
public static void main(String[] argv) {
JFrame frame = new JFrame("DOMEdit");
frame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
}
);
DOMEdit edit = new DOMEdit();
edit.url = "http://vslwin:8080/webxml.txt";
edit.readFile();
frame.getContentPane().add(edit);
frame.pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
int w = 500 + 10;
int h = 350 + 10;
frame.setLocation(screenSize.width/3 - w/2,
screenSize.height/2 - h/2);
frame.setSize(w, h);
frame.setVisible(true);
}
public class DOMTreeCellRenderer extends
javax.swing.tree.DefaultTreeCellRenderer {
public java.awt.Component getTreeCellRendererComponent
(javax.swing.JTree tree, java.lang.Object obj, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasfocus) {
return tree;
}
}
public class DOMNodeAdapter implements javax.swing.tree.TreeNode,
javax.swing.tree.MutableTreeNode {
org.w3c.dom.Node domNode;
public DOMNodeAdapter(org.w3c.dom.Node node) {
domNode = node;
}
public boolean getAllowsChildren() {
return true;
}
public String toString() {
switch (domNode.getNodeType()) {
case Node.ATTRIBUTE_NODE : return "ATTRIBUTE";
case Node.CDATA_SECTION_NODE : return "CDATA_SECTION";
case Node.COMMENT_NODE : return "COMMENT";
case Node.DOCUMENT_FRAGMENT_NODE : return "DOCUMENT_FRAGMENT";
case Node.DOCUMENT_NODE : return "DOCUMENT";
case Node.DOCUMENT_TYPE_NODE : return "DOCUMENT_TYPE";
case Node.ELEMENT_NODE : return "ELEMENT";
case Node.ENTITY_NODE : return "ENTITY";
case Node.ENTITY_REFERENCE_NODE : return "ENTITY_REFERENCE";
case Node.NOTATION_NODE : return "NOTATION";
case Node.PROCESSING_INSTRUCTION_NODE :
return "PROCESSING_INSTRUCTION";
case Node.TEXT_NODE : return "TEXT";
}
return "UNKNOWN";
}
public java.util.Enumeration children() {
int count = getChildCount();
java.util.Vector list = new java.util.Vector();
for (int i=0; i<count; i++) list.add(getChildAt(i));
return list.elements();
}
public javax.swing.tree.TreeNode getChildAt(int param) {
return new DOMNodeAdapter(domNode.getChildNodes().item(param));
}
public int getIndex(javax.swing.tree.TreeNode treeNode) {
DOMNodeAdapter node = (DOMNodeAdapter)treeNode;
DOMNodeAdapter parent = (DOMNodeAdapter)node.getParent();
int count = parent.getChildCount();
for (int i=0; i<count; i++) {
DOMNodeAdapter child = (DOMNodeAdapter)parent.getChildAt(i);
if (node.domNode == child.domNode) return i;
}
return -1; // Should never get here.
}
public int getChildCount() {
int count = 0;
for (int i=0; i<domNode.getChildNodes().getLength(); i++) {
org.w3c.dom.Node child = domNode.getChildNodes().item(i);
//if (child.getNodeType() == Node.ELEMENT_NODE)
++count;
}
return count;
}
public boolean isLeaf() {
if (getChildCount() > 0) return false;
return true;
}
public javax.swing.tree.TreeNode getParent() {
return new DOMNodeAdapter(domNode.getParentNode());
}
public void setUserObject(java.lang.Object obj) {
}
public void remove(javax.swing.tree.MutableTreeNode mutableTreeNode) {
}
public void removeFromParent() {
}
public void setParent(javax.swing.tree.MutableTreeNode mutableTreeNode)
{
}
public void remove(int param) {
}
public void insert(javax.swing.tree.MutableTreeNode mutableTreeNode,
int param) {
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel viewPane;
private javax.swing.JLabel titleLabel;
private javax.swing.JSplitPane splitPane;
private javax.swing.JScrollPane leftScroll;
private javax.swing.JTree domTree;
private javax.swing.JScrollPane rightScroll;
// End of variables declaration//GEN-END:variables
}
================ DOMEdit.java ==============
================ DOMEdit.html ==============
<HTML>
<HEAD>
<TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>
<H3><HR WIDTH="100%">Applet HTML Page<HR WIDTH="100%"></H3>
<P>
<APPLET code="DOMEdit.class" width=350 height=200></APPLET>
</P>
<HR WIDTH="100%"><FONT SIZE=-1><I>Generated by NetBeans IDE</I></FONT>
</BODY>
</HTML>
================ DOMEdit.html ==============
================ webxml.txt ================
<?xml version="1.0" encoding="UTF-8"?>
<!--
Sun Public License Notice
The contents of this file are subject to the Sun Public License
Version 1.0 (the "License"). You may not use this file except in
compliance with the License. A copy of the License is available at
http://www.sun.com/
The Original Code is NetBeans. The Initial Developer of the Original
Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
Microsystems, Inc. All Rights Reserved.
-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>Servlet_AppContext</servlet-name>
<display-name>Servlet AppContext</display-name>
<description>Default configuration created for servlet.</description>
<servlet-class>AppContext</servlet-class>
<load-on-startup>99</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_AppContext</servlet-name>
<url-pattern>webxml.txt</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file>
</welcome-file-list>
</web-app>
================ webxml.txt ================
---------- END SOURCE ----------
(Review ID: 139522)
======================================================================
###@###.### 2002-12-27