Just don't apply that patch _just_ yet... I've just found that SpyderMQ and EmbeddedTomcat also use the com.sun.xml.* classes. Could people coding be a bit careful in this area, please? There is a Java standard for XML parsing, let's use it... On Thu, 25 Jan 2001, you wrote: > Hi, > > I just forwarded this to jboss-dev. Unfortunately I don't use parsers and > the like, so I cannot test it. > Anyone ? > > Simon > > PS: Thanks Tom > > > -----Original Message----- > > From: Tom Cook [mailto:[EMAIL PROTECTED]] > > Sent: giovedi 25 gennaio 2001 1:54 > > To: [EMAIL PROTECTED] > > Subject: [jBoss-User] PATCH: JBoss and generic XML parsers > > > > > > Hi all. > > > > Here is a patch to allow jboss to work with a generic xml > > parser. This allows > > you to use, for instance xerces.jar instead of xml.jar. > > Sorry this didn't go > > the jboss-dev, but I'm not really in a position where I can > > justify (to my > > employer) being on that list. In March maybe (ah! the > > student life!) Anyway, > > if someone feels like committing this, that'd be good. > > > > The first patch is to run.sh. > > > > 9a10,13 > > > if [ ! -z XML_DOCUMENT_BUILDER_FACTORY ] ; then > > > > > XML_DOCUMENT_BUILDER_FACTORY=-Djavax.xml.parsers.DocumentBuild > > erFactoryImpl=$XML_DOCUMENT_BUILDER_FACTORY ; > > > fi > > > > > 11c15 > > < java -server -classpath $CLASSPATH org.jboss.Main $@ > > --- > > > java -server $XML_DOCUMENT_BUILDER_FACTORY -classpath > > $CLASSPATH org.jboss.Main $@ > > > > This allows you to set an environment variable, > > XML_DOCUMENT_BUILDER_FACTORY > > which will be used as the document builder factory > > implementation. This class > > must be in your classpath before you execute run.sh. > > > > The second patch is to > > org/jboss/configuration/ConfigurationService.java: > > > > 22c22 > > < import com.sun.xml.tree.*; > > --- > > > import javax.xml.parsers.*; > > 157c157,160 > > < XmlDocument doc = new XmlDocument(); > > --- > > > DocumentBuilderFactory xdbFactory = > > DocumentBuilderFactory.newInstance(); > > > DocumentBuilder xdb = xdbFactory.newDocumentBuilder(); > > > > > > Document doc = xdb.newDocument(); > > 200c203,204 > > < doc.write(out, "UTF-8"); > > --- > > > DOMWriter dWriter = new DOMWriter( true, new > > PrintWriter( out ) ); > > > dWriter.print( doc ); > > 221,227c225,231 > > < out = new PrintWriter(new > > FileOutputStream(confFile.getFile()));< } catch > > (java.io.FileNotFoundException e) { > > < log.error("Configuration file > > "+confFile.getFile()+" must be available and writable."); > > < log.exception(e); > > < } > > < out.print(xml); > > < out.close(); > > --- > > > out = new PrintWriter(new > > FileOutputStream(confFile.getFile())); > > > } catch (java.io.FileNotFoundException e) { > > > log.error("Configuration file > > "+confFile.getFile()+" must be available and writable."); > > > log.exception(e); > > > } > > > out.print(xml); > > > out.close(); > > 248,250c252,253 > > < XmlDocumentBuilder xdb = new XmlDocumentBuilder(); > > < Parser parser = new com.sun.xml.parser.Parser(); > > < xdb.setParser(parser); > > --- > > > DocumentBuilderFactory xdbFactory = > > DocumentBuilderFactory.newInstance(); > > > DocumentBuilder xdb = xdbFactory.newDocumentBuilder(); > > 254,255c257 > > < parser.parse(new InputSource(new StringReader(cfg))); > > < userConf = xdb.getDocument(); > > --- > > > userConf = xdb.parse( new InputSource( new > > StringReader( cfg ) ) );275,277d276 > > < xdb = new XmlDocumentBuilder(); > > < parser = new com.sun.xml.parser.Parser(); > > < xdb.setParser(parser); > > 281,282c280 > > < parser.parse(new InputSource(new StringReader(cfg))); > > < autoConf = xdb.getDocument(); > > --- > > > autoConf = xdb.parse(new InputSource(new > > StringReader(cfg))); > > 342c340 > > < ex = > > ((ReflectionException)ex).getTargetException(); > > --- > > > ex = > > ((ReflectionException)ex).getTargetException(); > > 404a403 > > > > > > > This makes the configuration service use the standard > > DocumentBuilderFactory > > API to parse it's XML documents, instead of using the Sun > > parser directly. > > > > The third change is the addition of a new class, > > org.jboss.configuration.DOMWriter. This maybe should go > > somewhere else, but > > here's where it's used, so here's where I've put it. It's > > based on a sample > > from Xerces-J, but is different enough from that that I don't > > even know if > > licensing will be an issue. Maybe the apache license should > > go on it, maybe > > not. I don't know enough about the licensing issues, so > > someone else can add > > licensing if they want. > > > > ------ DOMWriter.java > > /* Adapted from the sample dom.DOMWriter from the Apache > > Xerces-J samples. > > * See the Xerces-J license for licensing details. > > */ > > > > package org.jboss.configuration; > > > > import java.io.OutputStreamWriter; > > import java.io.PrintWriter; > > import java.io.UnsupportedEncodingException; > > > > import org.w3c.dom.Attr; > > import org.w3c.dom.Document; > > import org.w3c.dom.NamedNodeMap; > > import org.w3c.dom.Node; > > import org.w3c.dom.NodeList; > > > > /** > > * Utility class to serialize a DOM tree to a PrintWriter. > > */ > > public class DOMWriter > > { > > protected boolean canonical; > > > > protected PrintWriter out; > > > > /** > > * Only constructor. > > * @param canonical If true, then the DOM tree is > > serialized in canonical > > * form, otherwise it is not. > > * @param out The PrintWriter to serialize the DOM tree to. > > */ > > public DOMWriter( boolean canonical, PrintWriter out) > > { > > this.out = out; > > this.canonical = canonical; > > } > > > > /** Prints the specified node, recursively. */ > > public void print(Node node) { > > > > // is there anything to do? > > if ( node == null ) { > > return; > > } > > > > int type = node.getNodeType(); > > switch ( type ) { > > // print document > > case Node.DOCUMENT_NODE: { > > if ( !canonical ) { > > out.println("<?xml version=\"1.0\" > > encoding=\"UTF-8\"?>"); > > } > > //print(((Document)node).getDocumentElement()); > > > > NodeList children = node.getChildNodes(); > > for ( int iChild = 0; iChild < > > children.getLength(); iChild++ ) { > > print(children.item(iChild)); > > } > > out.flush(); > > break; > > } > > > > // print element with attributes > > case Node.ELEMENT_NODE: { > > out.print('<'); > > out.print(node.getNodeName()); > > Attr attrs[] = sortAttributes(node.getAttributes()); > > for ( int i = 0; i < attrs.length; i++ ) { > > Attr attr = attrs[i]; > > out.print(' '); > > out.print(attr.getNodeName()); > > out.print("=\""); > > out.print(normalize(attr.getNodeValue())); > > out.print('"'); > > } > > out.print('>'); > > NodeList children = node.getChildNodes(); > > if ( children != null ) { > > int len = children.getLength(); > > for ( int i = 0; i < len; i++ ) { > > print(children.item(i)); > > } > > } > > break; > > } > > > > // handle entity reference nodes > > case Node.ENTITY_REFERENCE_NODE: { > > if ( canonical ) { > > NodeList children = node.getChildNodes(); > > if ( children != null ) { > > int len = children.getLength(); > > for ( int i = 0; i < len; i++ ) { > > print(children.item(i)); > > } > > } > > } else { > > out.print('&'); > > out.print(node.getNodeName()); > > out.print(';'); > > } > > break; > > } > > > > // print cdata sections > > case Node.CDATA_SECTION_NODE: { > > if ( canonical ) { > > out.print(normalize(node.getNodeValue())); > > } else { > > out.print("<![CDATA["); > > out.print(node.getNodeValue()); > > out.print("]]>"); > > } > > break; > > } > > > > // print text > > case Node.TEXT_NODE: { > > out.print(normalize(node.getNodeValue())); > > break; > > } > > > > // print processing instruction > > case Node.PROCESSING_INSTRUCTION_NODE: { > > out.print("<?"); > > out.print(node.getNodeName()); > > String data = node.getNodeValue(); > > if ( data != null && data.length() > 0 ) { > > out.print(' '); > > out.print(data); > > } > > out.println("?>"); > > break; > > } > > } > > > > if ( type == Node.ELEMENT_NODE ) { > > out.print("</"); > > out.print(node.getNodeName()); > > out.print('>'); > > } > > > > out.flush(); > > > > } > > > > /** Returns a sorted list of attributes. */ > > protected Attr[] sortAttributes(NamedNodeMap attrs) { > > > > int len = (attrs != null) ? attrs.getLength() : 0; > > Attr array[] = new Attr[len]; > > for ( int i = 0; i < len; i++ ) { > > array[i] = (Attr)attrs.item(i); > > } > > for ( int i = 0; i < len - 1; i++ ) { > > String name = array[i].getNodeName(); > > int index = i; > > for ( int j = i + 1; j < len; j++ ) { > > String curName = array[j].getNodeName(); > > if ( curName.compareTo(name) < 0 ) { > > name = curName; > > index = j; > > } > > } > > if ( index != i ) { > > Attr temp = array[i]; > > array[i] = array[index]; > > array[index] = temp; > > } > > } > > > > return(array); > > > > } > > > > > > /** Normalizes the given string. */ > > protected String normalize(String s) { > > StringBuffer str = new StringBuffer(); > > > > int len = (s != null) ? s.length() : 0; > > for ( int i = 0; i < len; i++ ) { > > char ch = s.charAt(i); > > switch ( ch ) { > > case '<': { > > str.append("<"); > > break; > > } > > case '>': { > > str.append(">"); > > break; > > } > > case '&': { > > str.append("&"); > > break; > > } > > case '"': { > > str.append("""); > > break; > > } > > case '\r': > > case '\n': { > > if ( canonical ) { > > str.append("&#"); > > str.append(Integer.toString(ch)); > > str.append(';'); > > break; > > } > > // else, default append char > > } > > default: { > > str.append(ch); > > } > > } > > } > > > > return(str.toString()); > > > > } > > > > } > > ----- End DOMWriter.java > > > > > > I hope this is useful to someone else out there (it certainly > > is to me). > > > > Regards > > Tom > > > > > > -- > > -------------------------------------------------------------- > > To subscribe: [EMAIL PROTECTED] > > To unsubscribe: [EMAIL PROTECTED] > > List Help?: [EMAIL PROTECTED] > > > > > -- > -------------------------------------------------------------- > To subscribe: [EMAIL PROTECTED] > To unsubscribe: [EMAIL PROTECTED] > List Help?: [EMAIL PROTECTED] -- -------------------------------------------------------------- To subscribe: [EMAIL PROTECTED] To unsubscribe: [EMAIL PROTECTED] List Help?: [EMAIL PROTECTED]
