Re: xmlOutputter question

Rick <[email protected]>
Newsgroups gmane.comp.java.jdom.general
Message-ID <[email protected]>
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 <[email protected]>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 <[email protected]>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)<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/[email protected]
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> To control your jdom-interest membership:
>>>> http://www.jdom.org/mailman/options/jdom-interest/[email protected]
>>>>
>>>
>>>
>>
>> _______________________________________________
>> To control your jdom-interest membership:
>> http://www.jdom.org/mailman/options/jdom-interest/[email protected]
>>
>
>

_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.