Ankush Mishra created JCR-3984:
----------------------------------

             Summary: Overriding of processResponseBody, and using 
getResponseBodyAsDocument(), causes a NullPointerException
                 Key: JCR-3984
                 URL: https://issues.apache.org/jira/browse/JCR-3984
             Project: Jackrabbit Content Repository
          Issue Type: Improvement
          Components: jackrabbit-webdav
    Affects Versions: 2.12.1
         Environment: Oracle_JVM 1.8.0_91, jackrabbit-webdav-2.12.1
            Reporter: Ankush Mishra
            Priority: Trivial


So, since, WebDAV-Sync Report Method RFC 6578 hasn't been included yet. I 
decided to go along and make a method, which extends ReportMethod. I had to 
override processResponseBody in DavMethodBase because RFC 6578 overrides the 
MultiStatus element to include other than MultiStatusResponses but also a sync 
token. For Example:

{quote}
    <D:multistatus>
        <D:response>...</D:response>
        <D:response>...</D:response>
        <D:sync-token> ... </D:sync-token>
    </D:multistatus>
{quote}

To parse I need to getResponseBodyasDocument. But problem lies in the fact that 
it can't be used more than once, by definition. Thus, I have to override the 
Sync Method class to also include a private _multistatus_ variable, where as if 
this wasn't done and DavMethodBase.processResponseBody was used, then it would 
yield a NullPointerException. 

The solution to this, I found is that in the function 
DavMethodBase.getResponseBodyasDocument has a check for responseDocument, but 
responseDocument is never set after reading

{quote}
DavMethodBase.java

getResponseBodyasDocument(){
        if (responseDocument != null) {
                  return responseDocument; // response has already been read
        }
       ....
       ....
    InputStream in = getResponseBodyAsStream();
        if (in != null) {
            // read response and try to build a xml document
            try {
                return DomUtil.parseDocument(in);
{quote}

which simply put returns the document without setting it. A minor update to 
this solution would be:


{quote}
DavMethodBase.java

getResponseBodyasDocument(){
        if (responseDocument != null) {
                  return responseDocument; // response has already been read
        }
       ....
       ....
    InputStream in = getResponseBodyAsStream();
        if (in != null) {
            // read response and try to build a xml document
            try {
       responseDocument = DomUtil.parseDocument(in);
                return responseDocument;
{quote}

Hopefully, this makes sense and is updated. in 
DavMethodBase#getResponseBodyasDocument



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to