You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by di...@apache.org on 2001/08/18 16:17:12 UTC

cvs commit: jakarta-slide/src/examples/SimpleWebdavServlet readme.txt SimpleWebdavServlet.java

dirkv       01/08/18 07:17:12

  Added:       src/examples/SimpleWebdavServlet readme.txt
                        SimpleWebdavServlet.java
  Log:
  example how to extend webdav servlet
  
  Revision  Changes    Path
  1.1                  jakarta-slide/src/examples/SimpleWebdavServlet/readme.txt
  
  Index: readme.txt
  ===================================================================
  Here is how you have to extend the WebdavServlet:
  1) compile the provided SimpleWebdavServlet
  2) copy it here: webapps\slide\WEB-INF\classes\SimpleWebdavServlet.class
  3) modify: webapps\slide\WEB-INF\web.xml
  change:
      <servlet-class>org.apache.slide.webdav.WebdavServlet</servlet-class>
  
  to:
      <servlet-class>SimpleWebdavServlet</servlet-class>
  
  Now when you request a directory listing, the following text is printed
  on the top of the page
  "This my servlet and not the default one"
  
  You can change the look and implement the doPost method or anything you want.
  Only be carefull to always use a directory as a target to do your special actions.
  Operations on files always go to the original WebdavServlet and you can only change
  doGet and doPost, not the other WebDAV specific methods.
  
  
  
  1.1                  jakarta-slide/src/examples/SimpleWebdavServlet/SimpleWebdavServlet.java
  
  Index: SimpleWebdavServlet.java
  ===================================================================
  import java.io.*;
  import java.net.URL;
  import java.security.Principal;
  import java.text.DateFormat;
  import java.text.SimpleDateFormat;
  import java.util.*;
  import javax.servlet.*;
  import javax.servlet.http.*;
  import javax.xml.parsers.SAXParser;
  import javax.xml.parsers.SAXParserFactory;
  import org.xml.sax.*;
  import org.xml.sax.helpers.*;
  
  import org.apache.util.URLUtil;
  import org.apache.util.WebdavStatus;
  
  import org.apache.slide.authenticate.SecurityToken;
  import org.apache.slide.common.*;
  import org.apache.slide.content.Content;
  import org.apache.slide.content.NodeRevisionDescriptor;
  import org.apache.slide.content.NodeRevisionDescriptors;
  import org.apache.slide.lock.Lock;
  import org.apache.slide.lock.NodeLock;
  import org.apache.slide.security.AccessDeniedException;
  import org.apache.slide.security.NodePermission;
  import org.apache.slide.security.Security;
  import org.apache.slide.structure.LinkedObjectNotFoundException;
  import org.apache.slide.structure.ObjectNode;
  import org.apache.slide.structure.ObjectNotFoundException;
  import org.apache.slide.structure.Structure;
  import org.apache.slide.util.conf.*;
  import org.apache.slide.util.Messages;
  import org.apache.slide.util.logger.Logger;
  
  import org.apache.slide.webdav.logger.XHttpServletRequestFacade;
  import org.apache.slide.webdav.logger.XHttpServletResponseFacade;
  import org.apache.slide.webdav.logger.XMLTestCaseGenerator;
  import org.apache.slide.webdav.method.*;
  import org.apache.slide.webdav.WebdavServlet;
  
  public class SimpleWebdavServlet extends WebdavServlet {
  
  
      private static final DateFormat formatter =
          new SimpleDateFormat(DATE_FORMAT);
      
      /**
       * Handle a GET request on a collection resource.
       */
      protected void doGet(HttpServletRequest req, HttpServletResponse resp)
          throws ServletException, IOException {
          
          if (directoryBrowsing) {
              Writer writer = resp.getWriter();
              resp.setContentType("text/html");
              try {
                  displayDirectoryBrowsing(req, writer);
              } 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);
          }
      }
      
      /**
       * Display a directory browsing page.
       */
      protected void displayDirectoryBrowsing(HttpServletRequest req,
                                              Writer servletWriter)
          throws IOException, SlideException {
          
          String contextPath = req.getContextPath();
          if (contextPath == null)
              contextPath = "";
          
          // get the helpers
          Content content = token.getContentHelper();
          Lock lock = token.getLockHelper();
          Security security = token.getSecurityHelper();
          Structure structure = token.getStructureHelper();
  
          SlideToken slideToken = WebdavMethod.createSlideToken(req);
          String resourcePath = WebdavMethod.getRelativePath(req);
          ObjectNode object = structure.retrieve(slideToken, resourcePath);
          String name = object.getUri();
          
          // Number of characters to trim from the beginnings of filenames
          int trim = name.length();
          if (!name.endsWith("/"))
              trim += 1;
          if (name.equals("/"))
              trim = 1;
          
          PrintWriter writer = new PrintWriter(servletWriter);
          
          // Render the page header
          writer.print("<html>\r\n");
          writer.print("<head>\r\n");
          writer.print("<title>");
          writer.print
              (Messages.format
                   ("org.apache.slide.webdav.GetMethod.directorylistingfor", name));
          writer.print("</title>\r\n</head>\r\n");
          writer.print("<body bgcolor=\"white\">\r\n");
  
  /////////////////////////////
          writer.print("<H1> This my servlet and not the default one </H1>\r\n");
  /////////////////////////////
  
  
          writer.print("<table width=\"90%\" cellspacing=\"0\"" +
                           " cellpadding=\"5\" align=\"center\">\r\n");
          
          // Render the in-page title
          writer.print("<tr><td colspan=\"3\"><font size=\"+2\">\r\n<strong>");
          writer.print
              (Messages.format
                   ("org.apache.slide.webdav.GetMethod.directorylistingfor", name));
          writer.print("</strong>\r\n</font></td></tr>\r\n");
          
          // Render the link to our parent (if required)
          String parentDirectory = name;
          if (parentDirectory.endsWith("/")) {
              parentDirectory =
                  parentDirectory.substring(0, parentDirectory.length() - 1);
          }
          int slash = parentDirectory.lastIndexOf("/");
          if (slash >= 0) {
              String parent = name.substring(0, slash);
              writer.print("<tr><td colspan=\"5\" bgcolor=\"#ffffff\">\r\n");
              writer.print("<a href=\"");
              writer.print(URLUtil.URLEncode(contextPath, "UTF8"));
              if (parent.equals(""))
                  parent = "/";
              writer.print(parent);
              writer.print("\">");
              writer.print(Messages.format
                               ("org.apache.slide.webdav.GetMethod.parent", parent));
              writer.print("</a>\r\n");
              writer.print("</td></tr>\r\n");
          }
          
          Enumeration permissionsList = null;
          Enumeration locksList = null;
          
          try {
              
              permissionsList =
                  security.enumeratePermissions(slideToken, object.getUri());
              locksList = lock.enumerateLocks(slideToken, object.getUri());
              
          } catch (SlideException e) {
              
              // Any security based exception will be trapped here
              
              // Any locking based exception will be trapped here
              
          }
          
          // Displaying ACL info
          if( org.apache.slide.util.Configuration.useIntegratedSecurity() )
              displayPermissions(permissionsList, writer, false);
          
          // Displaying lock info
          displayLocks(locksList, writer, false);
          
          writer.print("<tr><td colspan=\"5\" bgcolor=\"#ffffff\">");
          writer.print("&nbsp;");
          writer.print("</td></tr>\r\n");
          
          // Render the column headings
          writer.print("<tr bgcolor=\"#cccccc\">\r\n");
          writer.print("<td align=\"left\" colspan=\"3\">");
          writer.print("<font size=\"+1\"><strong>");
          writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.filename"));
          writer.print("</strong></font></td>\r\n");
          writer.print("<td align=\"center\"><font size=\"+1\"><strong>");
          writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.size"));
          writer.print("</strong></font></td>\r\n");
          writer.print("<td align=\"right\"><font size=\"+1\"><strong>");
          writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.lastModified"));
          writer.print("</strong></font></td>\r\n");
          writer.print("</tr>\r\n");
          
          Enumeration resources = object.enumerateChildren();
          boolean shade = false;
          
          while (resources.hasMoreElements()) {
              
              String currentResource = (String) resources.nextElement();
              
              NodeRevisionDescriptor currentDescriptor = null;
              
              permissionsList = null;
              locksList = null;
              
              try {
                  
                  NodeRevisionDescriptors revisionDescriptors =
                      content.retrieve(slideToken, currentResource);
                  // Retrieve latest revision descriptor
                  currentDescriptor =
                      content.retrieve(slideToken, revisionDescriptors);
                  
              } catch (SlideException e) {
                  
                  // Silent exception : Objects without any revision are
                  // considered collections, and do not have any attributes
                  
                  // Any security based exception will be trapped here
                  
                  // Any locking based exception will be trapped here
                  
              }
              
              try {
                  
                  permissionsList =
                      security.enumeratePermissions(slideToken, currentResource);
                  locksList = lock.enumerateLocks(slideToken, currentResource);
                  
              } catch (SlideException e) {
                  
                  // Any security based exception will be trapped here
                  
                  // Any locking based exception will be trapped here
                  
              }
              
              String trimmed = currentResource.substring(trim);
              if (trimmed.equalsIgnoreCase("WEB-INF") ||
                  trimmed.equalsIgnoreCase("META-INF"))
                  continue;
              
              writer.print("<tr");
              if (shade) {
                  writer.print(" bgcolor=\"dddddd\"");
              } else {
                  writer.print(" bgcolor=\"eeeeee\"");
              }
              writer.print(">\r\n");
              shade = !shade;
              
              writer.print("<td align=\"left\" colspan=\"3\">&nbsp;&nbsp;\r\n");
              writer.print("<a href=\"");
              writer.print(URLUtil.URLEncode(contextPath + currentResource,
                                             "UTF8"));
              writer.print("\"><tt>");
              writer.print(trimmed);
              if (WebdavMethod.isCollection(currentDescriptor)) {
                  writer.print("/");
              }
              writer.print("</tt></a></td>\r\n");
              
              writer.print("<td align=\"right\"><tt>");
              if (WebdavMethod.isCollection(currentDescriptor))
                  writer.print("&nbsp;");
              else
                  writer.print(renderSize(currentDescriptor.getContentLength()));
              writer.print("</tt></td>\r\n");
              
              writer.print("<td align=\"right\"><tt>");
              if (currentDescriptor != null) {
                  writer.print(currentDescriptor.getLastModified());
              } else {
                  writer.print("&nbsp;");
              }
              writer.print("</tt></td>\r\n");
              
              writer.print("</tr>\r\n");
              
              // Displaying ACL info
              if( org.apache.slide.util.Configuration.useIntegratedSecurity() )
                  displayPermissions(permissionsList, writer, shade);
              
              // Displaying lock info
              displayLocks(locksList, writer, shade);
              
          }
          
          // Render the page footer
          writer.print("<tr><td colspan=\"5\">&nbsp;</td></tr>\r\n");
          writer.print("<tr><td colspan=\"3\" bgcolor=\"#cccccc\">");
          writer.print("<font size=\"-1\">");
          writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.version"));
          writer.print("</font></td>\r\n");
          writer.print("<td colspan=\"2\" align=\"right\" bgcolor=\"#cccccc\">");
          writer.print("<font size=\"-1\">");
          writer.print(formatter.format(new Date()));
          writer.print("</font></td></tr>\r\n");
          writer.print("</table>\r\n");
          writer.print("</body>\r\n");
          writer.print("</html>\r\n");
          
          // Return an input stream to the underlying bytes
          writer.flush();
          
      }
      
      
      /**
       * Display an ACL list.
       *
       * @param permissionsList List of NodePermission objects
       * @param boolean Shade
       * @param writer The output will be appended to this writer
       */
      private void displayPermissions(Enumeration permissionsList,
                                      PrintWriter writer,
                                      boolean shade)
          throws IOException {
          
          if ((permissionsList != null) && (permissionsList.hasMoreElements())) {
              
              writer.print("<tr");
              if (!shade) {
                  writer.print(" bgcolor=\"dddddd\"");
              } else {
                  writer.print(" bgcolor=\"eeeeee\"");
              }
              writer.print(">\r\n");
              writer.print("<td align=\"left\" colspan=\"5\"><tt><b>");
              writer.print(Messages.message
                               ("org.apache.slide.webdav.GetMethod.aclinfo"));
              writer.print("</b></tt></td>\r\n");
              writer.print("</tr>\r\n");
              
              writer.print("<tr");
              if (!shade) {
                  writer.print(" bgcolor=\"dddddd\"");
              } else {
                  writer.print(" bgcolor=\"eeeeee\"");
              }
              writer.print(">\r\n");
              
              writer.print("<td align=\"left\" colspan=\"2\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.subject"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("<td align=\"left\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.action"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("<td align=\"right\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.inheritable"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("<td align=\"right\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.deny"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("</tr>\r\n");
              
              while (permissionsList.hasMoreElements()) {
                  
                  writer.print("<tr");
                  if (!shade) {
                      writer.print(" bgcolor=\"dddddd\"");
                  } else {
                      writer.print(" bgcolor=\"eeeeee\"");
                  }
                  writer.print(">\r\n");
                  
                  NodePermission currentPermission =
                      (NodePermission) permissionsList.nextElement();
                  
                  writer.print("<td align=\"left\" colspan=\"2\"><tt>");
                  writer.print(currentPermission.getSubjectUri());
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("<td align=\"left\"><tt>");
                  writer.print(currentPermission.getActionUri());
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("<td align=\"right\"><tt>");
                  writer.print(currentPermission.isInheritable());
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("<td align=\"right\"><tt>");
                  writer.print(currentPermission.isNegative());
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("</tr>\r\n");
              }
              
          }
          
      }
      
      
      /**
       * Display a lock list.
       *
       * @param locksList List of NodeLock objects
       * @param boolean Shade
       * @param writer The output will be appended to this writer
       */
      private void displayLocks(Enumeration locksList, PrintWriter writer,
                                boolean shade)
          throws IOException {
          
          if ((locksList != null) && (locksList.hasMoreElements())) {
              
              writer.print("<tr");
              if (!shade) {
                  writer.print(" bgcolor=\"dddddd\"");
              } else {
                  writer.print(" bgcolor=\"eeeeee\"");
              }
              writer.print(">\r\n");
              writer.print("<td align=\"left\" colspan=\"5\"><tt><b>");
              writer.print(Messages.message
                               ("org.apache.slide.webdav.GetMethod.locksinfo"));
              writer.print("</b></tt></td>\r\n");
              writer.print("</tr>\r\n");
              
              writer.print("<tr");
              if (!shade) {
                  writer.print(" bgcolor=\"dddddd\"");
              } else {
                  writer.print(" bgcolor=\"eeeeee\"");
              }
              writer.print(">\r\n");
              
              writer.print("<td align=\"left\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.subject"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("<td align=\"left\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.type"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("<td align=\"right\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.expiration"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("<td align=\"right\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.inheritable"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("<td align=\"right\"><tt><b>");
              writer.print(Messages.message
                           ("org.apache.slide.webdav.GetMethod.exclusive"));
              writer.print("</b></tt></td>\r\n");
              
              writer.print("</tr>\r\n");
              
              while (locksList.hasMoreElements()) {
                  
                  writer.print("<tr");
                  if (!shade) {
                      writer.print(" bgcolor=\"dddddd\"");
                  } else {
                      writer.print(" bgcolor=\"eeeeee\"");
                  }
                  writer.print(">\r\n");
                  
                  NodeLock currentLock = (NodeLock) locksList.nextElement();
                  
                  writer.print("<td align=\"left\"><tt>");
                  writer.print(currentLock.getSubjectUri());
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("<td align=\"left\"><tt>");
                  writer.print(currentLock.getTypeUri());
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("<td align=\"right\"><tt>");
                  writer.print
                      (formatter.format(currentLock.getExpirationDate()));
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("<td align=\"right\"><tt>");
                  writer.print(currentLock.isInheritable());
                  writer.print("</tt></td>\r\n");
                  
                  writer.print("<td align=\"right\"><tt>");
                  writer.print(currentLock.isExclusive());
                  writer.print("</tt></td>\r\n");
                  
              }
              
          }
          
      }
      
      
      // -------------------------------------------------------- Private Methods
      
      
      /**
       * Render the specified file size (in bytes).
       *
       * @param size File size (in bytes)
       */
      private String renderSize(long size) {
          
          long leftSide = size / 1024;
          long rightSide = (size % 1024) / 103;   // Makes 1 digit
          if ((leftSide == 0) && (rightSide == 0) && (size > 0))
              rightSide = 1;
          
          return ("" + leftSide + "." + rightSide + " kb");
      }
  
  
  }