« Return to Thread: xmlOutputter question

Re: xmlOutputter question

by Joe Bowbeer :: Rate this Message:

Reply to Author | View in Thread

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...

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@...

 « Return to Thread: xmlOutputter question