[jdom-interest] xmlOutputter question

Joe Bowbeer joe.bowbeer at gmail.com
Mon Jan 19 09:58:17 PST 2009


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)<http://192.168.1.199:3334/sdata/slx/dynamic/accounts%28A6UJ9A000036%29>
>>>>>>> ");
>>>>>>>         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)<http://192.168.1.199:3334/sdata/slx/dynamic/accounts%28A6UJ9A000036%29>
>>>>>>> ");
>>>>>>>         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@yourhost.com
>>>>>
>>>>
>>>>
>>>
>>
>> _______________________________________________
>> To control your jdom-interest membership:
>> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.jdom.org/pipermail/jdom-interest/attachments/20090119/42708ddc/attachment.htm


More information about the jdom-interest mailing list