xmlOutputter question

View: New views
10 Messages — Rating Filter:   Alert me  

xmlOutputter question

by Rick Avlonitis :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: xmlOutputter question

by jhunter :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I'd try flushing the output stream to make the content actually go  
over the wire.  If that's not it exactly, it's probably something like  
that.

-jh-

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

Re: xmlOutputter question

by Joe Bowbeer :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: xmlOutputter question

by Rick Avlonitis :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: xmlOutputter question

by Joe Bowbeer :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: xmlOutputter question

by Joe Bowbeer :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: xmlOutputter question

by Rick Avlonitis :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: xmlOutputter question

by Joe Bowbeer :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

What you're putting doesn't like like a valid atom post.

The root should be a feed instead of an entry, right?

And that empty entry in the first element doesn't look right.

See sample feed here:

http://www.ibm.com/developerworks/library/x-tipatom2/

Yes, I'd recommend using ROME, which itself uses JDOM.

Joe

On Mon, Jan 19, 2009 at 9:45 AM, Rick Avlonitis wrote:
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 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@...

Re: xmlOutputter question

by Rick Avlonitis :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Thank you for the link (although it's in php).  That root entry I got from some C# example.  I'm trying to implement a form of ReSTful webservice, where I call a URI (discovery will be through ROME, I suspect) and parse the xml  with jdom (at least it does that well ;).  In order to change the text values of the elements, I will have to iterate through them (jdom).  Then I put them back together in a document and PUT them back on the server.  That was the theory :(

You are right in noticing the empty first element - that slipped past my eye.  Although I did get this damnable code PUTting to the server with a document parsed from a file (the file being the result of a jdom document output).  That there made me think the jdom api was fishy ;)  I'll try ROME and report back.

On Mon, Jan 19, 2009 at 7:58 PM, Joe Bowbeer <joe.bowbeer@...> wrote:
What you're putting doesn't like like a valid atom post.

The root should be a feed instead of an entry, right?

And that empty entry in the first element doesn't look right.

See sample feed here:

http://www.ibm.com/developerworks/library/x-tipatom2/

Yes, I'd recommend using ROME, which itself uses JDOM.

Joe

On Mon, Jan 19, 2009 at 9:45 AM, Rick Avlonitis wrote:
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 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@...


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

Re: xmlOutputter question

by Rick Avlonitis :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Ok, the problem is solved.  It seems that the app on the server is acting in a non-standard way.  Even though it apparently supports atom and rss, I couldn't post to it successfully using jdom or RoME.  My only hope lay in constructing the correct string and parsing it with jdom to post to the server.  It worked after I reverse engineered the string.  A tip for those going down this path is to strip the prologue from the xml string before parsing it with a SAXBuilder.  The SAXBuilder will add the correct prologue before posting.

On Mon, Jan 19, 2009 at 8:27 PM, Rick Avlonitis <rick.softly@...> wrote:
Thank you for the link (although it's in php).  That root entry I got from some C# example.  I'm trying to implement a form of ReSTful webservice, where I call a URI (discovery will be through ROME, I suspect) and parse the xml  with jdom (at least it does that well ;).  In order to change the text values of the elements, I will have to iterate through them (jdom).  Then I put them back together in a document and PUT them back on the server.  That was the theory :(

You are right in noticing the empty first element - that slipped past my eye.  Although I did get this damnable code PUTting to the server with a document parsed from a file (the file being the result of a jdom document output).  That there made me think the jdom api was fishy ;)  I'll try ROME and report back.


On Mon, Jan 19, 2009 at 7:58 PM, Joe Bowbeer <joe.bowbeer@...> wrote:
What you're putting doesn't like like a valid atom post.

The root should be a feed instead of an entry, right?

And that empty entry in the first element doesn't look right.

See sample feed here:

http://www.ibm.com/developerworks/library/x-tipatom2/

Yes, I'd recommend using ROME, which itself uses JDOM.

Joe

On Mon, Jan 19, 2009 at 9:45 AM, Rick Avlonitis wrote:
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 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@...



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