Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » JDOM User »

Re: [jdom-interest] setIndent("") doesn't work as expected

William Krick

2006-09-07

Replies:

Judging from the comment, it seems like it was an attempt at
optimization that had unintended side effects...

  public Format setIndent(String indent) {
     // if passed the empty string, change it to null, for marginal
     // performance gains later (can compare to null first instead
     // of calling equals())
     if ("".equals(indent)) {
        indent = null;
     }
     this.indent = indent;
     return this;
  }


Without that "optimization" it would be this...

  public Format setIndent(String indent) {
     this.indent = indent;
     return this;
  }


...which does what I expect it to do.

I'll try building my own and see how it goes.

Is there a recommended procedure for submitting a patch?





Quoting Jason Hunter <jhunter@(protected)>:

> Well, for the time being you can just change the Format class code itself.
>
> Is it a bug? I'd call it an RFE more than a bug. It's behaving as
> expected, we just never anticipated your use case. I don't see a
> problem with enhancing JDOM to differentiate between null and empty.
> Why don't you try changing Format internally, do a build, and let us
> know if it fixes your problem. Then send in the change as a patch file.
>
> -jh-
>
> wkrick@(protected):
>> Hmmm... I can't subclass Format because the constructor is private.
>> Any other ideas?
>>
>>
>> Quoting wkrick@(protected):
>>
>>> So is this a bug or is it by design?
>>>
>>> If it's a bug, how do I make sure it gets fixed in the JDOM 1.1 release?
>>>
>>>
>>>
>>> Quoting Laurent Bihanic <laurent.bihanic@(protected)>:
>>>
>>>> The problem comes from XMLOutputter itself:
>>>>  private void newline(Writer out) throws IOException {
>>>>     if (currentFormat.indent != null) {
>>>>       out.write(currentFormat.lineSeparator);
>>>>     }
>>>>  }
>>>> No indent, no newlines!
>>>>
>>>> The easiest way to fix this is to create your own subclass of Format
>>>> and override setIndent() to distinguish between "" and null.
>>>> Here's the current code:
>>>>  public Format setIndent(String indent) {
>>>>     // if passed the empty string, change it to null, for marginal
>>>>     // performance gains later (can compare to null first instead
>>>>     // of calling equals())
>>>>     if ("".equals(indent)) {
>>>>       indent = null;
>>>>     }
>>>>     this.indent = indent;
>>>>     return this;
>>>>  }
>>>> Remove the test on "" and XMLOutputter will behave as you expect.
>>>>
>>>> Laurent
>>>>
>>>> wkrick@(protected) :
>>>>> I'm currently outputting my document with the PrettyFormat...
>>>>>
>>>>> Format fmt = Format.getPrettyFormat();
>>>>> fmt.setTextMode(Format.TextMode.PRESERVE);
>>>>> XMLOutputter outputter = new XMLOutputter(fmt);
>>>>>
>>>>> ...and it works as expected, outputting one start/end tag per line.
>>>>> However, when I try to remove the indents on each line like this...
>>>>>
>>>>> Format fmt = Format.getPrettyFormat();
>>>>> fmt.setTextMode(Format.TextMode.PRESERVE);
>>>>> fmt.setIndent("");
>>>>> XMLOutputter outputter = new XMLOutputter(fmt);
>>>>>
>>>>> ...it removes all indents _AND_ newlines, compressing my whole  
>>>>>  document into a single line of output.
>>>>>
>>>>> I'm confused...
>>>>>
>>>>> fmt.setIndent(" "); adds a two space indent
>>>>> fmt.setIndent(" "); adds a one space indent
>>>>> fmt.setIndent(""); no indent and removes newline on previous line?
>>>>>
>>>>> I'm suspecting that the problem has something to do with...
>>>>>
>>>>> fmt.setTextMode(Format.TextMode.PRESERVE);
>>>>>
>>>>> ...but I need that mode to keep padding that's present in my document.
>>>>>
>>>>>
>>>>> Basically, given a document that looks like this...
>>>>>
>>>>> <FOO><BAR>   12345</BAR><BAR>   67890</BAR></FOO>
>>>>>
>>>>> ...I need the output to look like this...
>>>>>
>>>>> <FOO>
>>>>> <BAR>   12345</BAR>
>>>>> <BAR>   67890</BAR>
>>>>> </FOO>
>>>>>
>>>>> ...instead of this...
>>>>>
>>>>> <FOO>
>>>>> <BAR>   12345</BAR>
>>>>> <BAR>   67890</BAR>
>>>>> </FOO>
>>>>>
>>>>> ...but I can't seem to find the magic incantation that works.
>>>>>
>>>>> Is this possible?
>>>> _______________________________________________
>>>> To control your jdom-interest membership:
>>>> http://www.jdom.org/mailman/options/jdom-interest/youraddr@(protected)
>>
>>
>>
>> _______________________________________________
>> To control your jdom-interest membership:
>> http://www.jdom.org/mailman/options/jdom-interest/youraddr@(protected)
>>



_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/youraddr@(protected)
©2008 junlu.com - Jax Systems, LLC, U.S.A.