« Return to Thread: xmlOutputter question

Re: xmlOutputter question

by Rick Avlonitis :: Rate this Message:

Reply to Author | View in Thread

I may be wrong here, but it seems that JDom is perhaps not the choice to use when posting to an atom feed.  I say this because I can output a document to a file with no problems.  However, I can't out the document to an http stream.  I've wrapped the stream in a buffer and called flush on it to no avail.  I know that there isn't a problem with the stream, because when I create a new document from the file where I output to originally, it works.  But I don't want to have to write to a file (or even a string).  I want to find a solution that works.  My solution is fine until I want to post the results back to the server :(.  Perhaps ROME is the way to go?

On Mon, Jan 19, 2009 at 7:11 PM, Joe Bowbeer <joe.bowbeer@...> wrote:
On Mon, Jan 19, 2009 at 9:08 AM, Joe Bowbeer wrote:
What's the diff between the two documents created in the two different ways?

Also, what's your root element?

The snippet below looks like nothing more than an empty "entry" element:


<?xml version="1.0" encoding="UTF-8"?>
<entry><entry /> ...ignored...



Update: Nope, I got that wrong.  The document itself is an "entry" and the first element is an empty "entry".

Joe

 


On Mon, Jan 19, 2009 at 1:15 AM, Rick Avlonitis wrote:
Thank you for the inputs.  However, I have to disagree.  My problem can be distilled like so:

If I create a document from an ArrayList<Element> and try to post, the server doesn't update.
If I create a document by parsing the file made from a document that was made from ArrayList<Element> and post, the server updates.

This makes me think that the http output stream is not at fault, since it works for the case for the document built from a parsed file. (I have also since wrapped the httpOutputStream in a bufferedStreamReader and called flush().  Still nothing).  It makes me think that there is a setting which is read from the parsed file which is not read from the ArrayList<Element>.

So the above makes me wonder if ArrayList<Element> is a suitable list to work with.  What other container could I use?

Regards,
Rick

On Sat, Jan 17, 2009 at 1:49 AM, Joe Bowbeer wrote:
I agree with Jason that you should close the output stream (which will also flush) before getting the response code.

Also, if you're going to be doing a lot of http processing I recommend using Apache's httpclient instead of dealing with Java's HttpConnection directly.


On Fri, Jan 16, 2009 at 5:26 AM, Rick Avlonitis wrote:
When I call xmlOutputter.output(docForPosting, http.getOutputStream()), this fails to update the data  but I get: (Response Code: 200, Response Message: OK).
But when I write the docForPosting to a file and then create a new document from the parsed file, I can successfully update the data (Response Code: 200, Response Message: OK).

Why can I not put data successfully on the server with xmlOutputter.output(docForPosting, http.getOutputStream())?

Your help will be appreciated.  My code is below:


package myJDom;

import org.jdom.*;
import org.jdom.input.DOMBuilder;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.xml.sax.SAXException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

public class MyJDomParser {
    protected List<Element> rawElementList = new ArrayList<Element>();
    protected List<Element> scrubbedElementList = new ArrayList<Element>();
    protected List<Element> newElementList = new ArrayList<Element>();
    protected SAXBuilder saxBuilder = new SAXBuilder();
    protected DOMBuilder domBuilder = new DOMBuilder();
    protected Document rawDoc = new Document();
    protected Element element;

    @SuppressWarnings("unchecked")
    public void parseUrl() throws JDOMException, IOException {
        System.out.println("preparing to parse the elements...");
        URL url = new URL(
                "http://192.168.1.199:3334/sdata/slx/dynamic/accounts(A6UJ9A000036)");
        saxBuilder.setIgnoringElementContentWhitespace(true);
        rawDoc = saxBuilder.build(url);

        element = rawDoc.getRootElement();
        rawElementList.addAll(element.getChildren());

        for (int i = 0; i < 3; i++) {// remove 2 useless elements
            rawElementList.remove(0);
        }

        for (int i = 0; i < rawElementList.size(); i++) {
            String s = rawElementList.get(i).getText();
            if (s != null && s != "") {
                scrubbedElementList.add(rawElementList.get(i));
            }
        }

        for (Element e : scrubbedElementList) {
            System.out.println(e.getText());
        }
        // for (Element e : rawElementList) {
        // System.out.println(e.getText());
        // }
    }

    public void getAllChangedElements() throws URISyntaxException {
        System.out.println("preparing to change the data...");
        Element entry = new Element("entry");
        entry.addNamespaceDeclaration(Namespace.getNamespace(""));
        newElementList.add(entry);
        // rawElementList.add(entry);

        for (int i = 0; i < scrubbedElementList.size(); i++) {
            String s = scrubbedElementList.get(i).getText();
            String name = scrubbedElementList.get(i).getName();
            if (s != null && s != "") {
                if (name == "AccountName") {
                    s = "****55555******";
                }
                Element e = new Element(name);
                e.setText(s);
                newElementList.add(e);
            }
        }
        // return newData;
        // for (Element e : newElementList) {
        // System.out.println(e.getText());
        // }
    }

    public void postData() throws IOException, JDOMException,
            ParserConfigurationException, SAXException {
        // building a document from DOM
        DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
        org.w3c.dom.Document docPrepareToPost = docBuilder.newDocument();

        // create my root element
        org.w3c.dom.Element root = docPrepareToPost.createElement("entry");
        docPrepareToPost.appendChild(root);

        // add elements to my dom doc
        for (int i = 0; i < newElementList.size(); i++) {
            org.w3c.dom.Element child = docPrepareToPost
                    .createElement(newElementList.get(i).getName());
            child.setTextContent(newElementList.get(i).getText());
            root.appendChild(child);
        }

        // parsing my doc from the file allows me a successful post
        // FileWriter fs = new FileWriter("/home/rick/deleteme/crap2");
        // //posting is successful from this parsed file
        // xmlOutputter.output(docForPosting, fs);

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        docPrepareToPost = factory.newDocumentBuilder().parse(
                new File("/home/rick/deleteme/crap2"));

        // setting up the stream
        URL url = new URL(
                "http://192.168.1.199:3334/sdata/slx/dynamic/accounts(A6UJ9A000036)");
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);
        java.net.HttpURLConnection http = (HttpURLConnection) connection;
        http.setRequestMethod("PUT");
        HttpURLConnection.setFollowRedirects(true);
        http.setRequestProperty("Content-type",
                "application/atom+xml;type=entry");

        // creating a JDom doc from the DOM doc to facilitate streaming to the
        // server
        org.jdom.Document docForPosting = domBuilder.build(docPrepareToPost);

        XMLOutputter xmlOutputter = new XMLOutputter();
        //this fails to update the data (Response Code: 200, Response Message: OK)
        xmlOutputter.output(docForPosting, http.getOutputStream());
        //output seems ok
        xmlOutputter.output(docForPosting, System.out);
        //the printout seems ok
        System.out.println("doctype = " + docForPosting.getDocType()); //=null
        FileWriter file = new FileWriter("/home/rick/deleteme/crap2");
        //this successfully updates the data (Response Code: 200, Response Message: OK)
        xmlOutputter.output(docForPosting, file);

        System.out.println("Response Code: " + http.getResponseCode());
        System.out.println("Response Message: " + http.getResponseMessage());
    }

    public static void main(String[] args) {
        MyJDomParser parser = new MyJDomParser();
        Authenticator.setDefault(new MyAuthenticator());
        try {
            parser.parseUrl();
            parser.getAllChangedElements();
            parser.postData();
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }
}

Output (snipped):

preparing to change the data...
<?xml version="1.0" encoding="UTF-8"?>
<entry><entry /><published>0001-01-01T00:00:00+00:00</published><title>**------**</title><updated>2009-01-16T12:38:38+00:00</updated><AccountName>****55555******</AccountName><AccountNameUpper>**SHORTENED**</AccountNameUpper><CreateDate>2008-10-21T09:01:41+00:00</CreateDate><CreateUser>U6UJ9A000009</CreateUser><LastHistoryBy>ADMIN       </LastHistoryBy><LastHistoryDate>2008-10-31T13:25:58+00:00</LastHistoryDate><ModifyDate>2009-01-16T12:38:38+00:00</ModifyDate><ModifyUser>ADMIN       </ModifyUser><Status>Active</Status><Type>Corporate</Type><Prefix>Mr.</Prefix><Name>Bob</Name><Surname>Smith</Surname><Gender>Male</Gender><Idtype>I.D.</Idtype><Idpassportno>7904055766543</Idpassportno><Citizen>RSA</Citizen></entry>



_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/youraddr@...




_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/youraddr@...


_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/youraddr@...

 « Return to Thread: xmlOutputter question