ozeigermann    2004/10/30 11:29:16

  Modified:    src/webdav/server/org/apache/slide/webdav/method Tag:
                        SLIDE_2_1_RELEASE_BRANCH GetMethod.java
               src/webdav/server/org/apache/slide/webdav/util Tag:
                        SLIDE_2_1_RELEASE_BRANCH
                        DirectoryIndexGenerator.java
               src/webdav/server/org/apache/slide/webdav Tag:
                        SLIDE_2_1_RELEASE_BRANCH WebdavServlet.java
  Log:
  Moved check and display of collections as HTML pages
  into the GET method to assure all access is done from inside transactions
  and then inside THE SAME transaction per request.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.51.2.2  +105 -69   
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/GetMethod.java
  
  Index: GetMethod.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/GetMethod.java,v
  retrieving revision 1.51.2.1
  retrieving revision 1.51.2.2
  diff -u -r1.51.2.1 -r1.51.2.2
  --- GetMethod.java    23 Sep 2004 08:23:46 -0000      1.51.2.1
  +++ GetMethod.java    30 Oct 2004 18:29:15 -0000      1.51.2.2
  @@ -44,12 +44,15 @@
   import org.apache.slide.content.RevisionDescriptorNotFoundException;
   import org.apache.slide.content.RevisionNotFoundException;
   import org.apache.slide.event.EventDispatcher;
  +import org.apache.slide.security.AccessDeniedException;
   import org.apache.slide.structure.LinkedObjectNotFoundException;
  +import org.apache.slide.structure.ObjectNotFoundException;
   import org.apache.slide.util.Configuration;
   import org.apache.slide.webdav.WebdavException;
   import org.apache.slide.webdav.WebdavServletConfig;
   import org.apache.slide.webdav.event.WebdavEvent;
   import org.apache.slide.webdav.util.DeltavConstants;
  +import org.apache.slide.webdav.util.DirectoryIndexGenerator;
   import org.apache.slide.webdav.util.LabeledRevisionNotFoundException;
   import org.apache.slide.webdav.util.PreconditionViolationException;
   import org.apache.slide.webdav.util.VersioningHelper;
  @@ -126,6 +129,28 @@
       // ------------------------------------------------------ Protected Methods
   
   
  +    protected void displayDirectory() throws IOException {
  +        String directoryBrowsing = config.getInitParameter( "directory-browsing" );
  +        if( "true".equalsIgnoreCase(directoryBrowsing) ) {
  +                try {
  +                    DirectoryIndexGenerator directoryIndexGenerator =
  +                        new DirectoryIndexGenerator
  +                        (token, config);
  +                    directoryIndexGenerator.generate(req, resp, slideToken);
  +                } catch (AccessDeniedException e) {
  +                    resp.sendError(WebdavStatus.SC_FORBIDDEN);
  +                } catch (ObjectNotFoundException e) {
  +                    resp.sendError(WebdavStatus.SC_NOT_FOUND);
  +                } catch (LinkedObjectNotFoundException e) {
  +                    resp.sendError(WebdavStatus.SC_NOT_FOUND);
  +                } catch (SlideException e) {
  +                    resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +                }
  +        } else {
  +            resp.sendError(WebdavStatus.SC_FORBIDDEN);
  +        }
  +    }
  +
       /**
        * Parse XML request.
        */
  @@ -205,86 +230,97 @@
   
                   if (revisionDescriptor != null) {
   
  -                    ResourceInfo resourceInfo =
  -                        new ResourceInfo(resourcePath, revisionDescriptor);
  -
  -                    // Checking If headers
  -                    if (!checkIfHeaders(req, resp, resourceInfo))
  -                        return;
  -
  -                    ServletOutputStream os = resp.getOutputStream();
  -                    InputStream         is = null;
  -
  -                    if (printContent) {
  -                        is = content.retrieve
  -                            (slideToken, revisionDescriptors,
  -                             revisionDescriptor).streamContent();
  -                    }
  -
  -                    Vector ranges = parseRange(req, resp, resourceInfo);
  -
  -                    // ETag header (tag must be quoted)
  -                    resp.setHeader("ETag", getETag(resourceInfo, true) );
  -                    resp.setHeader
  -                        ("Content-Language", 
revisionDescriptor.getContentLanguage());
  -                    resp.addHeader
  -                        ("Last-Modified",
  -                         revisionDescriptor.getLastModified().toString());
  -
  -                    if ( ((ranges == null) || (ranges.isEmpty())) ) {
  -                        // full content response
  -                        resp.setContentType
  -                            (revisionDescriptor.getContentType());
  -                        resp.setContentLength
  -                            ((int) revisionDescriptor.getContentLength());
  -
  -                        // Copy the input stream to our output stream
  -                        // (if requested)
  +                    if (revisionDescriptor.propertyValueContains(
  +                            NodeRevisionDescriptor.RESOURCE_TYPE,
  +                            NodeRevisionDescriptor.COLLECTION_TYPE)) {
  +                        displayDirectory();
  +                    } else {
  +                    
  +                        ResourceInfo resourceInfo =
  +                            new ResourceInfo(resourcePath, revisionDescriptor);
  +    
  +                        // Checking If headers
  +                        if (!checkIfHeaders(req, resp, resourceInfo))
  +                            return;
  +    
  +                        ServletOutputStream os = resp.getOutputStream();
  +                        InputStream         is = null;
  +    
                           if (printContent) {
  -                            resp.setBufferSize(output);
  -                            copy(resourceInfo, is, os);
  +                            is = content.retrieve
  +                                (slideToken, revisionDescriptors,
  +                                 revisionDescriptor).streamContent();
                           }
  -
  -                    } else {
  -                        // Partial content response.
  -
  -                        resp.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
  -
  -                        if (ranges.size() == 1) {
  -
  -                            Range range = (Range) ranges.elementAt(0);
  -                            resp.addHeader("Content-Range", "bytes "
  -                                               + range.start
  -                                               + "-" + range.end + "/"
  -                                               + range.fileLength);
  -                            resp.setContentLength((int) range.length);
  +    
  +                        Vector ranges = parseRange(req, resp, resourceInfo);
  +    
  +                        // ETag header (tag must be quoted)
  +                        resp.setHeader("ETag", getETag(resourceInfo, true) );
  +                        resp.setHeader
  +                            ("Content-Language", 
revisionDescriptor.getContentLanguage());
  +                        resp.addHeader
  +                            ("Last-Modified",
  +                             revisionDescriptor.getLastModified().toString());
  +    
  +                        if ( ((ranges == null) || (ranges.isEmpty())) ) {
  +                            // full content response
                               resp.setContentType
                                   (revisionDescriptor.getContentType());
  -
  +                            resp.setContentLength
  +                                ((int) revisionDescriptor.getContentLength());
  +    
  +                            // Copy the input stream to our output stream
  +                            // (if requested)
                               if (printContent) {
                                   resp.setBufferSize(output);
  -                                copy(resourceInfo, is, os, range);
  +                                copy(resourceInfo, is, os);
                               }
  -
  +    
                           } else {
  -
  -                            resp.setContentType
  -                                ("multipart/byteranges; boundary="
  -                                     + mimeSeparation);
  -
  -                            if (printContent) {
  -                                resp.setBufferSize(output);
  -                                copy(resourceInfo, is, os,
  -                                     ranges.elements(),
  -                                     revisionDescriptor.getContentType());
  +                            // Partial content response.
  +    
  +                            resp.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
  +    
  +                            if (ranges.size() == 1) {
  +    
  +                                Range range = (Range) ranges.elementAt(0);
  +                                resp.addHeader("Content-Range", "bytes "
  +                                                   + range.start
  +                                                   + "-" + range.end + "/"
  +                                                   + range.fileLength);
  +                                resp.setContentLength((int) range.length);
  +                                resp.setContentType
  +                                    (revisionDescriptor.getContentType());
  +    
  +                                if (printContent) {
  +                                    resp.setBufferSize(output);
  +                                    copy(resourceInfo, is, os, range);
  +                                }
  +    
  +                            } else {
  +    
  +                                resp.setContentType
  +                                    ("multipart/byteranges; boundary="
  +                                         + mimeSeparation);
  +    
  +                                if (printContent) {
  +                                    resp.setBufferSize(output);
  +                                    copy(resourceInfo, is, os,
  +                                         ranges.elements(),
  +                                         revisionDescriptor.getContentType());
  +                                }
                               }
                           }
                       }
                   } else {
  -                    resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
  +                    // XXX if there is no revision descriptor, this should be a 
directory
  +                    displayDirectory();
  +                    // resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
                   }
               } else {
  -                resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
  +                // XXX if there is no revisions, this should be a directory
  +                displayDirectory();
  +                // resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
               }
           } catch (Exception e) {
               int statusCode;
  
  
  
  No                   revision
  No                   revision
  1.8.2.2   +6 -6      
jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/DirectoryIndexGenerator.java
  
  Index: DirectoryIndexGenerator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/DirectoryIndexGenerator.java,v
  retrieving revision 1.8.2.1
  retrieving revision 1.8.2.2
  diff -u -r1.8.2.1 -r1.8.2.2
  --- DirectoryIndexGenerator.java      20 Aug 2004 16:19:03 -0000      1.8.2.1
  +++ DirectoryIndexGenerator.java      30 Oct 2004 18:29:16 -0000      1.8.2.2
  @@ -139,7 +139,7 @@
        *                          response
        * @throw SlideException    if an exception occurrs accessing Slide
        */
  -    public void generate(HttpServletRequest req, HttpServletResponse res)
  +    public void generate(HttpServletRequest req, HttpServletResponse res, 
SlideToken slideToken)
           throws IOException, SlideException {
           
           res.setContentType("text/html; charset=\"UTF-8\"");
  @@ -150,7 +150,7 @@
           Security security = nat.getSecurityHelper();
           Structure structure = nat.getStructureHelper();
           
  -        SlideToken slideToken = WebdavUtils.getSlideToken(req);
  +//        SlideToken slideToken = WebdavUtils.getSlideToken(req);
           String resourcePath = WebdavUtils.getRelativePath(req, config);
           ObjectNode object = structure.retrieve(slideToken, resourcePath);
           String name = object.getUri();
  
  
  
  No                   revision
  No                   revision
  1.63.2.1  +53 -63    
jakarta-slide/src/webdav/server/org/apache/slide/webdav/WebdavServlet.java
  
  Index: WebdavServlet.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/WebdavServlet.java,v
  retrieving revision 1.63
  retrieving revision 1.63.2.1
  diff -u -r1.63 -r1.63.2.1
  --- WebdavServlet.java        5 Aug 2004 14:43:34 -0000       1.63
  +++ WebdavServlet.java        30 Oct 2004 18:29:16 -0000      1.63.2.1
  @@ -63,7 +63,6 @@
    */
   public class WebdavServlet extends HttpServlet {
       
  -    
       // -------------------------------------------------------------- Constants
       
       
  @@ -149,20 +148,11 @@
               resp.setStatus(WebdavStatus.SC_OK);
               
               String methodName = req.getMethod();
  -            if (!isExtTx(req) && 
  -                (methodName.equalsIgnoreCase("GET") || 
methodName.equalsIgnoreCase("POST")) &&
  -                isCollection(req)) {
  -                // let the standard doGet() / doPost() methods handle
  -                // GET/POST requests on collections (to display a directory
  -                // index pag or something similar)
  -                super.service(req, resp);
  +            WebdavMethod method = methodFactory.createMethod(methodName);
  +            if (method == null) {
  +                throw new WebdavException(WebdavStatus.SC_METHOD_NOT_ALLOWED);
               } else {
  -                WebdavMethod method = methodFactory.createMethod(methodName);
  -                if (method == null) {
  -                    throw new WebdavException(WebdavStatus.SC_METHOD_NOT_ALLOWED);
  -                } else {
  -                    method.run(req, resp);
  -                }
  +                method.run(req, resp);
               }
           } catch (WebdavException e) {
               // There has been an error somewhere ...
  @@ -296,23 +286,23 @@
           
           // Check whether directory browsing is enabled, and how it should be
           // accomplished
  -        value = getInitParameter("directory-browsing");
  -        if (value != null) {
  -            if (value.startsWith("/")) {
  -                directoryBrowsingTemplate =
  -                    getServletContext().getRequestDispatcher(value);
  -                if (directoryBrowsingTemplate == null) {
  -                    directoryBrowsing = false;
  -                }
  -            } else {
  -                directoryBrowsing = Boolean.valueOf(value).booleanValue();
  -            }
  -        }
  -        if (directoryBrowsing) {
  -            directoryIndexGenerator =
  -                new DirectoryIndexGenerator
  -                (token, (WebdavServletConfig)getServletConfig());
  -        }
  +//        value = getInitParameter("directory-browsing");
  +//        if (value != null) {
  +//            if (value.startsWith("/")) {
  +//                directoryBrowsingTemplate =
  +//                    getServletContext().getRequestDispatcher(value);
  +//                if (directoryBrowsingTemplate == null) {
  +//                    directoryBrowsing = false;
  +//                }
  +//            } else {
  +//                directoryBrowsing = Boolean.valueOf(value).booleanValue();
  +//            }
  +//        }
  +//        if (directoryBrowsing) {
  +//            directoryIndexGenerator =
  +//                new DirectoryIndexGenerator
  +//                (token, (WebdavServletConfig)getServletConfig());
  +//        }
       }
       
       
  @@ -336,34 +326,34 @@
       /**
        * Handle a GET request on a collection resource.
        */
  -    protected void doGet(HttpServletRequest req, HttpServletResponse res)
  -        throws ServletException, IOException {
  -        
  -        if (directoryBrowsing) {
  -            if (directoryBrowsingTemplate != null) {
  -                // attributes used by the tag library
  -                req.setAttribute("org.apache.slide.NamespaceName",
  -                                 token.getName());
  -                // attributes for general use
  -                req.setAttribute("slide_namespace", token.getName());
  -                directoryBrowsingTemplate.forward(req, res);
  -            } else {
  -                try {
  -                    directoryIndexGenerator.generate(req, res);
  -                } catch (AccessDeniedException e) {
  -                    res.sendError(WebdavStatus.SC_FORBIDDEN);
  -                } catch (ObjectNotFoundException e) {
  -                    res.sendError(WebdavStatus.SC_NOT_FOUND);
  -                } catch (LinkedObjectNotFoundException e) {
  -                    res.sendError(WebdavStatus.SC_NOT_FOUND);
  -                } catch (SlideException e) {
  -                    res.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -                }
  -            }
  -        } else {
  -            res.sendError(WebdavStatus.SC_FORBIDDEN);
  -        }
  -    }
  +//    protected void doGet(HttpServletRequest req, HttpServletResponse res)
  +//        throws ServletException, IOException {
  +//        
  +//        if (directoryBrowsing) {
  +//            if (directoryBrowsingTemplate != null) {
  +//                // attributes used by the tag library
  +//                req.setAttribute("org.apache.slide.NamespaceName",
  +//                                 token.getName());
  +//                // attributes for general use
  +//                req.setAttribute("slide_namespace", token.getName());
  +//                directoryBrowsingTemplate.forward(req, res);
  +//            } else {
  +//                try {
  +//                    directoryIndexGenerator.generate(req, res);
  +//                } catch (AccessDeniedException e) {
  +//                    res.sendError(WebdavStatus.SC_FORBIDDEN);
  +//                } catch (ObjectNotFoundException e) {
  +//                    res.sendError(WebdavStatus.SC_NOT_FOUND);
  +//                } catch (LinkedObjectNotFoundException e) {
  +//                    res.sendError(WebdavStatus.SC_NOT_FOUND);
  +//                } catch (SlideException e) {
  +//                    res.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +//                }
  +//            }
  +//        } else {
  +//            res.sendError(WebdavStatus.SC_FORBIDDEN);
  +//        }
  +//    }
       
       static boolean isDomLevel2Parser() {
           try {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to