[jdom-interest] Text class in the api
Alex Rosen
arosen at silverstream.com
Fri Nov 16 09:49:24 PST 2001
The FilterList code in jdom-wip is pretty much ready to go. And, the changes
to the existing classes is pretty minimal - a few lines in Document and
Element, that's it. (The rest is in the new classes.) I can try to merge it
in to the main jdom tree this weekend, if that's OK with everyone.
Alex
> -----Original Message-----
> From: jdom-interest-admin at jdom.org
> [mailto:jdom-interest-admin at jdom.org]On Behalf Of
> philip.nelson at omniresources.com
> Sent: Thursday, November 15, 2001 8:04 PM
> To: hip at a.cs.okstate.edu; jdom-interest at jdom.org
> Cc: jhunter at collab.net; brett.mclaughlin at lutris.com
> Subject: RE: [jdom-interest] Text class in the api
>
>
> I finally got around to taking a look at the code done by
> Bradley Huffman
> for implementing the Text class. Looks really good to me.
> About the only
> places we will certainly see some problems are where people
> are dealing with
> the Element list content directly. The test suite only
> failed with a couple
> of obvious class Cast exceptions and where I was looking for
> a specific
> string in the toString() method.
>
> So, how do we go about merging it into the source tree? We probably
> shouldn't wait too much longer or we will have yet another
> merge process to
> go through.
>
> Approaches we could take:
>
> Merge it into jdom-wip and release it with FilterList. Has
> the advantage of
> a separate source tree so we can adequately warn people of
> the change rather
> than suffer the consequences.
>
> Merge it into the jdom source tree. Makes more sense if
> jdom-wip will take
> awhile to make real and two fairly different source trees have to be
> maintained.
>
> Merge it into both. Well, the second comment leads to this
> approach anyway.
> Seems like we have to pick a time and go with it.
>
>
> Here is a diff -r file done on the source tree with the files
> that only had
> cvs tag differences in them. I am sending this not a source
> release, but
> just to show you all what has changed. I have left out the
> changes to the
> Text class which has been fully changed and implemented with
> StringBuffer,
> and SAXHandler, which I can't easily do a diff with since I
> made so many
> changes to my version for DeclHandler, DTDHandler and the
> like. The updated
> Text class is included in full.
>
> diff -r ./java/org/jdom/Element.java
> \temp\jdom-test\brad\jdom\src/java/org/jdom/Element.java
> 565,566c565,567
> < * all String nodes returned by getContent(). The
> call does not
> < * recurse into child elements. If no textual value
> exists for the
> ---
> > * all <code>Text</code> and <code>CDATA</code> nodes
> returned by
> > * getContent(). The call does not recurse into
> child elements.
> > * If no textual value exists for the
> 579c580
> < // If we hold only a String or CDATA, return it directly
> ---
> > // If we hold only a Text or CDATA, return it directly
> 582,583c583,58
> < if (obj instanceof String) {
> < return (String)obj;
> ---
> > if (obj instanceof Text) {
> > return ((Text) obj).getText();
> 585c586
> < return ((CDATA)obj).getText();
> ---
> > return ((CDATA) obj).getText();
> 598,599c599,600
> < if (obj instanceof String) {
> < textContent.append((String)obj);
> ---
> > if (obj instanceof Text) {
> > textContent.append(((Text) obj).getText());
> 602c603
> < textContent.append(((CDATA)obj).getText());
> ---
> > textContent.append(((CDATA) obj).getText());
> 641,666c642
> < return normalizeString(getText());
> < }
> <
> < // Support method for fast string normalization
> < // Per XML 1.0 Production 3 whitespace includes: #x20,
> #x9, #xD, #xA
> < private static String normalizeString(String value) {
> < char[] c = value.toCharArray();
> < char[] n = new char[c.length];
> < boolean white = true;
> < int pos = 0;
> < for (int i = 0; i < c.length; i++) {
> < if (" \t\n\r".indexOf(c[i]) != -1) {
> < if (!white) {
> < n[pos++] = ' ';
> < white = true;
> < }
> < }
> < else {
> < n[pos++] = c[i];
> < white = false;
> < }
> < }
> < if (white && pos > 0) {
> < pos--;
> < }
> < return new String(n, 0, pos);
> ---
> > return Text.normalizeString(getText());
> 810c786
> < content.add(text);
> ---
> > content.add( new Text( text));
> 856c832
> < * may contain objects of type <code>String</code>,
> <code>Element</code>,
> ---
> > * may contain objects of type <code>Text</code>,
> > <code>Element</code>,
> 865c841
> < * element: may contain <code>String</code>,
> ---
> > * element: may contain <code>Text</code>,
> 884,885c860,862
> < * contain only objects of type <code>String</code>,
> <code>Element</code>,
> < * <code>Comment</code>, <code>ProcessingInstruction</code>,
> ---
> > * contain only objects of type <code>String</code>,
> <code>Text</code>,
> > * <code>Element</code>, <code>Comment</code>,
> > * <code>ProcessingInstruction</code>,
> 916c893,896
> < addContent((String)obj);
> ---
> > addContent( new Text( (String) obj));
> > }
> > else if (obj instanceof Text) {
> > addContent((Text)obj);
> 933,934c913,914
> < "String, Element, Comment, CDATA,
> EntityRef, and " +
>
> < "ProcessingInstruction: " +
> ---
> > "String, Text, Element, Comment,
> CDATA, EntityRef, "
> +
> > "and ProcessingInstruction: " +
> 955a936,938
> > else if (obj instanceof Text) {
> > ((Text)obj).setParent(null);
> > }
> 958a942,944
> > else if (obj instanceof CDATA) {
> > ((CDATA)obj).setParent(null);
> > }
> 981a968,970
> > else if (obj instanceof Text) {
> > ((Text)obj).setParent(null);
> > }
> 984a974,976
> > else if (obj instanceof CDATA) {
> > ((CDATA)obj).setParent(null);
> > }
> 1186c1178,1207
> < * @param text <code>String</code> to add
> ---
> > * @param str <code>String</code> to add
> > * @return this element modified
> > */
> > public Element addContent(String str) {
> > if (content == null) {
> > content = new ArrayList(INITIAL_ARRAY_SIZE);
> > }
> >
> > int size = content.size();
> > if (size > 0) {
> > Object ob = content.get(size - 1);
> > if (ob instanceof Text) {
> > Text txt = (Text) ob;
> > txt.append( str);
> > return this;
> > }
> > }
> > Text txt = new Text( str);
> > txt.setParent(this);
> > content.add( txt);
> > return this;
> > }
> >
> > /**
> > * <p>
> > * This adds text content to this element. It does not
> replace the
> > * existing content as does <code>setText()</code>.
> > * </p>
> > *
> > * @param text <code>Text</code> to add
> 1189c1210
> < public Element addContent(String text) {
> ---
> > public Element addContent(Text text) {
> 1197,1199c1218,1221
> < if (ob instanceof String) {
> < text = (String)ob + text;
> < content.remove(size - 1);
> ---
> > if (ob instanceof Text) {
> > Text txt = (Text) ob;
> > txt.append( text);
> > return this;
> 1202c1224,1226
> < content.add(text);
> ---
> >
> > content.add( text);
> > text.setParent(this);
> 1325a1350
> > cdata.setParent(this);
> 1590c1615
> < this.attributes = null;
> ---
> > this.attributes = (List) null;
> 1597,1598c1622,1629
> < setAttribute((Attribute) iter.next());
> < itemsAdded++;
> ---
> > Object obj = iter.next();
> > if (obj instanceof Attribute) {
> > setAttribute( (Attribute) obj);
> > itemsAdded++;
> > }
> > else {
> > throw new IllegalAddException( "Non-Attribute in
> list");
> > }
> 1942d1972
> < // No need to clone CDATA or String since they're immutable
> 1946,1948c1976
> < if (obj instanceof String) {
> < element.content.add(obj);
> < } else if (obj instanceof Element) {
> ---
> > if (obj instanceof Element) {
> 1951a1980,1983
> > } else if (obj instanceof Text) {
> > Text t = (Text)((Text)obj).clone();
> > t.setParent(element);
> > element.content.add(t);
> 1957c1989,1991
> < element.content.add(obj);
> ---
> > CDATA d = (CDATA)((CDATA)obj).clone();
> > d.setParent(element);
> > element.content.add(d);
> 2082a2117,2139
> > cdata.setParent(null);
> > return true;
> > } else {
> > return false;
> > }
> > }
> >
> > /**
> > * <p>
> > * This removes the specified <code>Text</code>.
> > * If the specified <code>Text</code> is not a child of
> > * this <code>Element</code>, this method does nothing.
> > * </p>
> > *
> > * @param text <code>Text</code> to delete
> > * @return whether deletion occurred
> > */
> > public boolean removeContent(Text text) {
> > if (content == null) {
> > return false;
> > }
> > if (content.remove(text)) {
> > text.setParent(null);
>
> diff -r ./java/org/jdom/input/DefaultJDOMFactory.java
> \temp\jdom-test\brad\jdom\src/java/org/jdom/input/DefaultJDOMF
> actory.java
> 88,89c88,93
> < public CDATA cdata(String text) {
> < return new CDATA(text);
> ---
> > public CDATA cdata(String data) {
> > return new CDATA(data);
> > }
> >
> > public Text text(String str) {
> > return new Text(str);
>
> diff -r ./java/org/jdom/input/DOMBuilder.java
> \temp\jdom-test\brad\jdom\src/java/org/jdom/input/DOMBuilder.java
> 475,476c475,476
> < String text = node.getNodeValue();
> < current.addContent(text);
> ---
> > String data = node.getNodeValue();
> > current.addContent(factory.text( data));
>
> diff -r ./java/org/jdom/input/JDOMFactory.java
> \temp\jdom-test\brad\jdom\src/java/org/jdom/input/JDOMFactory.java
> 113c113
> < * @param text <code>String</code> content of CDATA.
> ---
> > * @param data <code>String</code> content of CDATA.
> 115c115,127
> < public CDATA cdata(String text);
> ---
> > public CDATA cdata(String data);
> >
> > // **** constructing Text ****
> >
> > /**
> > * <p>
> > * This creates new <code>Text</code> with the supplied
> > * string.
> > * </p>
> > *
> > * @param str <code>String</code> content of Text.
> > */
> > public Text text(String str);
> diff -r ./java/org/jdom/output/DOMOutputter.java
> \temp\jdom-test\brad\jdom\src/java/org/jdom/output/DOMOutputter.java
> 352,354c352,355
> < else if (node instanceof String) {
> < String str = (String) node;
> < org.w3c.dom.Text domText =
> domDoc.createTextNode(str);
> ---
> > else if (node instanceof Text) {
> > Text text = (Text) node;
> > org.w3c.dom.Text domText =
> > domDoc.createTextNode(text.getText());
> diff -r ./java/org/jdom/output/SAXOutputter.java
> \temp\jdom-test\brad\jdom\src/java/org/jdom/output/SAXOutputter.java
> 917c917
> < eltContent.get(0) instanceof String;
> ---
> > eltContent.get(0) instanceof Text;
> 930c930
> < else if (content instanceof String) {
> ---
> > else if (content instanceof Text) {
> 932c932
> < characters((String) content);
> ---
> > characters(((Text) content).getText());
>
> diff -r ./java/org/jdom/output/XMLOutputter.java
> \temp\jdom-test\brad\jdom\src/java/org/jdom/output/XMLOutputter.java
> 285a286,287
> > * <p>Sets whether new lines should be printed.</p>
> > *
> 699d700
> < * <p>
> 723c724
> < printString(text.getValue(), out);
> ---
> > printString(text.getText(), out);
> 728d728
> < * <p>
> 874a875,889
> > * Return a string representing a Text node. Warning: a
> String is
> > * Unicode, which may not match the outputter's specified
> > * encoding.
> > *
> > * @param text <code>Text</code> to format.
> > **/
> > public String outputString(Text text) {
> > StringWriter out = new StringWriter();
> > try {
> > output(text, out); // output() flushes
> > } catch (IOException e) { }
> > return out.toString();
> > }
> >
> > /**
> 1014a1030,1042
> > * This will write the text node to the specified writer.
> > * </p>
> > *
> > * @param text <code>Text</code> to write.
> > * @param out <code>Writer</code> to write to.
> > */
> > protected void printText(Text text, Writer out)
> > throws IOException {
> > printString(text.getText(), out);
> > }
> >
> > /**
> > * <p>
> 1114c1142
> < if (!(o instanceof String) && !(o instanceof CDATA)) {
> ---
> > if (!(o instanceof Text) && !(o instanceof CDATA)) {
> 1188,1189c1216,1217
> < if (content instanceof String) {
> < String scontent = (String) content;
> ---
> > if (content instanceof Text) {
> > String scontent = ((Text) content).getText();
> 1225,1226c1253,1254
> < } else if (content instanceof String) {
> < String scontent = (String) content;
> ---
> > } else if (content instanceof Text) {
> > String scontent = ((Text) content).getText();
> 1631c1659
> < if (!(o instanceof String) && !(o instanceof CDATA)) {
> ---
> > if (!(o instanceof Text) && !(o instanceof CDATA)) {
> 1638a1667,1669
> > * <p>Return a string listing of the settings for this
> > * XMLOutputter instance.</p>
> > *
>
>
>
>
More information about the jdom-interest
mailing list