Entirely possible. If you would, can you please open a jira issue to track this and I'll look into it further a bit later this week.

- James

Christoph Bauer wrote:
Hi,

ok. i tried it with a jdk 1.5 and it seems to work. I still think there is something fundamental wrong with the <org.apache.abdera.parser.stax.FOMDiv>.getInternalValue() method though.

Consider this test:
public static void main(String[] args) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    XMLStreamWriter writer = factory.createXMLStreamWriter(out);
    writer.writeStartElement("");
// simulate <OMNode>.serialize(writer):
    writer.writeStartElement("a");
    writer.writeEndElement();
    writer.flush(); // !
writer.writeEndElement();

    System.out.println("BEFORE:");
    System.out.println(out.toString());

    // i think you should:
    writer.flush();
System.out.println("AFTER:");
    System.out.println(out.toString());
}

on my computer it outputs:
BEFORE:
<><a />
AFTER:
<><a /></>

Axiom's <OMNode>.serialize() calls flush() after writing.

The Abdera code does not.

Using the content of an ByteArrayOutputStream in this way is in my eyes unpredictable without calling flush on the writer.

The other thing is that calling substring(2) is really silly.

Why generate an entity that you take away afterwards?

Especially after i found out that OMNode can be serialized to an OutputStream.

So the following might work (untested):
  protected String getInternalValue() {
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
//      XMLStreamWriter writer =
//        XMLOutputFactory.newInstance().createXMLStreamWriter(out);
//      writer.writeStartElement("");
      for (Iterator nodes = this.getChildren(); nodes.hasNext();) {
        OMNode node = (OMNode) nodes.next();
//        node.serialize(writer);
        node.serialize(out);
      }
//      writer.writeEndElement();
//      return out.toString().substring(2);
      return out.toString();
    } catch (Exception e) {}
    return "";
  }

g

Christoph

James M Snell wrote:
The stax implementation has a lot to do with it. Based on the classpath, it would appear that you're using the stax impl that ships with JDK 1.6? If so, please note that Abdera has not been tested on 1.6. I've tried both the IBM and Sun 1.5 JDK's and have not been able to duplicate your results.

- James

Christoph Bauer wrote:
Hi,

thanks for the immediate response.


I was testing inside Eclipse Europe with a sun jdk.1.6.0_03 64bit Java (linux-64)

The testing routine contained only the main method.

following libs in classpath
abdera.0.3.0-incubating/abdera.client.0.3.0-incubating.jar
abdera.0.3.0-incubating/abdera.core.0.3.0-incubating.jar
abdera.0.3.0-incubating/abdera.parser.0.3.0-incubating.jar
abdera.0.3.0-incubating/abdera.protocol.0.3.0-incubating.jar
abdera.0.3.0-incubating/lib/axiom-api-1.2.5.jar
abdera.0.3.0-incubating/lib/axiom-impl-1.2.5.jar
abdera.0.3.0-incubating/lib/commons-codec-1.3.jar
abdera.0.3.0-incubating/lib/commons-httpclient-3.1-rc1.jar
abdera.0.3.0-incubating/lib/commons-logging-1.0.4.jar
abdera.0.3.0-incubating/lib/jaxen-1.1.1.jar
abdera.0.3.0-incubating/lib/abdera-i18n-0.3.0-incubating.jar
abdera.0.3.0-incubating/lib/stax-api-1.0.1.jar

also tried the retro libs with a 32bit 1.4 jdk (same result)


Initially i found the problem with a self-generate feed so i tried others and found the same problem.

Concerning stax: see classpath, but looking at the code i don't see how that should matter when abdera generates

<>
<h3>Header</h3>
<p>some text here</p>
</>

and then goes ahead and throws the first two characters away.




James M Snell schrieb:
I am unable to duplicate the issue. What stax implementation are you using? What platform? Does this happen with every entry or just one specific entry? Are you seeing this problem with more than one feed or several?

- James

Christoph Bauer wrote:
Hi Everyone,

i haven't found a bug report for this so i thought i ask here

please considered the following snippet:

public static void main(String[] args) {
    Abdera abdera = new Abdera();
    AbderaClient client = new AbderaClient(abdera);
ClientResponse resp = client.get("http://mail-archives.apache.org/mod_mbox/incubator-abdera-dev/?format=atom";);
    if (resp.getType() == ResponseType.SUCCESS) {
      Document<Feed> doc = resp.getDocument();
System.out.println(doc.getRoot().getEntries().iterator().next().getContent());
    } else {
    }
}


Right at the end of the content i get an empty </> xml tag.
Something like this:

<pre>My content</pre> </>



I dived through the code and found the <org.apache.abdera.parser.stax.FOMDiv>.getInternalValue() Class which I think is supposed to handle this:

  protected String getInternalValue() {
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      XMLStreamWriter writer =
        XMLOutputFactory.newInstance().createXMLStreamWriter(out);
      writer.writeStartElement("");
      for (Iterator nodes = this.getChildren(); nodes.hasNext();) {
        OMNode node = (OMNode) nodes.next();
        node.serialize(writer);
      }
      writer.writeEndElement();
      return out.toString().substring(2);
    } catch (Exception e) {}
    return "";
  }

If I understand that right abdera is trying to remove the surrounding "div" tag. Unfortunately the output from this method cannot be used if you need valid xhtml or at least valid xml because of the empty element tag.

I shudder when i see
out.toString().substring(2);

For now i decided to stick with abdera, but handle the xhtml myself:

Element c = doc.getRoot().getEntries().iterator().next().getContentElement().getFirstChild();
try {
  StringWriter out = new StringWriter();
  Element e = c.getFirstChild();
  while (e != null) {
      e.writeTo(out);
      e = e.getNextSibling();
  }
  System.out.println(out.toString());
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}


Would be nice to know whether this is some kind of bug, or whether i got something wrong.

g
christoph bauer











Reply via email to