📄 abstractwebdavservlet.java
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jackrabbit.server;import org.apache.jackrabbit.server.io.IOUtil;import org.apache.jackrabbit.webdav.DavConstants;import org.apache.jackrabbit.webdav.DavException;import org.apache.jackrabbit.webdav.DavLocatorFactory;import org.apache.jackrabbit.webdav.DavMethods;import org.apache.jackrabbit.webdav.DavResource;import org.apache.jackrabbit.webdav.DavResourceFactory;import org.apache.jackrabbit.webdav.DavServletRequest;import org.apache.jackrabbit.webdav.DavServletResponse;import org.apache.jackrabbit.webdav.DavSessionProvider;import org.apache.jackrabbit.webdav.MultiStatus;import org.apache.jackrabbit.webdav.MultiStatusResponse;import org.apache.jackrabbit.webdav.WebdavRequest;import org.apache.jackrabbit.webdav.WebdavRequestImpl;import org.apache.jackrabbit.webdav.WebdavResponse;import org.apache.jackrabbit.webdav.WebdavResponseImpl;import org.apache.jackrabbit.webdav.DavCompliance;import org.apache.jackrabbit.webdav.io.InputContext;import org.apache.jackrabbit.webdav.io.InputContextImpl;import org.apache.jackrabbit.webdav.io.OutputContext;import org.apache.jackrabbit.webdav.io.OutputContextImpl;import org.apache.jackrabbit.webdav.lock.ActiveLock;import org.apache.jackrabbit.webdav.lock.LockInfo;import org.apache.jackrabbit.webdav.observation.EventDiscovery;import org.apache.jackrabbit.webdav.observation.ObservationResource;import org.apache.jackrabbit.webdav.observation.Subscription;import org.apache.jackrabbit.webdav.observation.SubscriptionInfo;import org.apache.jackrabbit.webdav.ordering.OrderPatch;import org.apache.jackrabbit.webdav.ordering.OrderingResource;import org.apache.jackrabbit.webdav.property.DavProperty;import org.apache.jackrabbit.webdav.property.DavPropertyName;import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;import org.apache.jackrabbit.webdav.search.SearchConstants;import org.apache.jackrabbit.webdav.search.SearchInfo;import org.apache.jackrabbit.webdav.search.SearchResource;import org.apache.jackrabbit.webdav.security.AclProperty;import org.apache.jackrabbit.webdav.security.AclResource;import org.apache.jackrabbit.webdav.transaction.TransactionInfo;import org.apache.jackrabbit.webdav.transaction.TransactionResource;import org.apache.jackrabbit.webdav.version.DeltaVConstants;import org.apache.jackrabbit.webdav.version.DeltaVResource;import org.apache.jackrabbit.webdav.version.LabelInfo;import org.apache.jackrabbit.webdav.version.MergeInfo;import org.apache.jackrabbit.webdav.version.OptionsInfo;import org.apache.jackrabbit.webdav.version.OptionsResponse;import org.apache.jackrabbit.webdav.version.UpdateInfo;import org.apache.jackrabbit.webdav.version.VersionControlledResource;import org.apache.jackrabbit.webdav.version.VersionResource;import org.apache.jackrabbit.webdav.version.VersionableResource;import org.apache.jackrabbit.webdav.version.ActivityResource;import org.apache.jackrabbit.webdav.version.report.Report;import org.apache.jackrabbit.webdav.version.report.ReportInfo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.w3c.dom.Document;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;/** * <code>AbstractWebdavServlet</code> * <p/> */abstract public class AbstractWebdavServlet extends HttpServlet implements DavConstants { // todo respect Position header /** * default logger */ private static Logger log = LoggerFactory.getLogger(AbstractWebdavServlet.class); /** * Default value for the 'WWW-Authenticate' header, that is set, if request * results in a {@link DavServletResponse#SC_UNAUTHORIZED 401 (Unauthorized)} * error. * * @see #getAuthenticateHeaderValue() */ public static final String DEFAULT_AUTHENTICATE_HEADER = "Basic realm=\"Jackrabbit Webdav Server\""; /** * Checks if the precondition for this request and resource is valid. * * @param request * @param resource * @return */ abstract protected boolean isPreconditionValid(WebdavRequest request, DavResource resource); /** * Returns the <code>DavSessionProvider</code>. * * @return the session provider */ abstract public DavSessionProvider getDavSessionProvider(); /** * Returns the <code>DavSessionProvider</code>. * * @param davSessionProvider */ abstract public void setDavSessionProvider(DavSessionProvider davSessionProvider); /** * Returns the <code>DavLocatorFactory</code>. * * @return the locator factory */ abstract public DavLocatorFactory getLocatorFactory(); /** * Sets the <code>DavLocatorFactory</code>. * * @param locatorFactory */ abstract public void setLocatorFactory(DavLocatorFactory locatorFactory); /** * Returns the <code>DavResourceFactory</code>. * * @return the resource factory */ abstract public DavResourceFactory getResourceFactory(); /** * Sets the <code>DavResourceFactory</code>. * * @param resourceFactory */ abstract public void setResourceFactory(DavResourceFactory resourceFactory); /** * Returns the value of the 'WWW-Authenticate' header, that is returned in * case of 401 error. * * @return value of the 'WWW-Authenticate' header */ abstract public String getAuthenticateHeaderValue(); /** * Service the given request. * * @param request * @param response * @throws ServletException * @throws IOException */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { WebdavRequest webdavRequest = new WebdavRequestImpl(request, getLocatorFactory()); // DeltaV requires 'Cache-Control' header for all methods except 'VERSION-CONTROL' and 'REPORT'. int methodCode = DavMethods.getMethodCode(request.getMethod()); boolean noCache = DavMethods.isDeltaVMethod(webdavRequest) && !(DavMethods.DAV_VERSION_CONTROL == methodCode || DavMethods.DAV_REPORT == methodCode); WebdavResponse webdavResponse = new WebdavResponseImpl(response, noCache); try { // make sure there is a authenticated user if (!getDavSessionProvider().attachSession(webdavRequest)) { return; } // check matching if=header for lock-token relevant operations DavResource resource = getResourceFactory().createResource(webdavRequest.getRequestLocator(), webdavRequest, webdavResponse); if (!isPreconditionValid(webdavRequest, resource)) { webdavResponse.sendError(DavServletResponse.SC_PRECONDITION_FAILED); return; } if (!execute(webdavRequest, webdavResponse, methodCode, resource)) { super.service(request, response); } } catch (DavException e) { if (e.getErrorCode() == HttpServletResponse.SC_UNAUTHORIZED) { webdavResponse.setHeader("WWW-Authenticate", getAuthenticateHeaderValue()); webdavResponse.sendError(e.getErrorCode(), e.getStatusPhrase()); } else { webdavResponse.sendError(e); } } finally { getDavSessionProvider().releaseSession(webdavRequest); } } /** * Executes the respective method in the given webdav context * * @param request * @param response * @param method * @param resource * @throws ServletException * @throws IOException * @throws DavException */ protected boolean execute(WebdavRequest request, WebdavResponse response, int method, DavResource resource) throws ServletException, IOException, DavException { switch (method) { case DavMethods.DAV_GET: doGet(request, response, resource); break; case DavMethods.DAV_HEAD: doHead(request, response, resource); break; case DavMethods.DAV_PROPFIND: doPropFind(request, response, resource); break; case DavMethods.DAV_PROPPATCH: doPropPatch(request, response, resource); break; case DavMethods.DAV_POST: doPost(request, response, resource); break; case DavMethods.DAV_PUT: doPut(request, response, resource); break; case DavMethods.DAV_DELETE: doDelete(request, response, resource); break; case DavMethods.DAV_COPY: doCopy(request, response, resource); break; case DavMethods.DAV_MOVE: doMove(request, response, resource); break; case DavMethods.DAV_MKCOL: doMkCol(request, response, resource); break; case DavMethods.DAV_OPTIONS: doOptions(request, response, resource); break; case DavMethods.DAV_LOCK: doLock(request, response, resource); break; case DavMethods.DAV_UNLOCK: doUnlock(request, response, resource); break; case DavMethods.DAV_ORDERPATCH: doOrderPatch(request, response, resource); break; case DavMethods.DAV_SUBSCRIBE: doSubscribe(request, response, resource); break; case DavMethods.DAV_UNSUBSCRIBE: doUnsubscribe(request, response, resource); break; case DavMethods.DAV_POLL: doPoll(request, response, resource); break; case DavMethods.DAV_SEARCH: doSearch(request, response, resource); break; case DavMethods.DAV_VERSION_CONTROL: doVersionControl(request, response, resource); break; case DavMethods.DAV_LABEL: doLabel(request, response, resource); break; case DavMethods.DAV_REPORT: doReport(request, response, resource); break; case DavMethods.DAV_CHECKIN: doCheckin(request, response, resource); break; case DavMethods.DAV_CHECKOUT: doCheckout(request, response, resource); break; case DavMethods.DAV_UNCHECKOUT: doUncheckout(request, response, resource); break; case DavMethods.DAV_MERGE: doMerge(request, response, resource); break; case DavMethods.DAV_UPDATE: doUpdate(request, response, resource); break; case DavMethods.DAV_MKWORKSPACE: doMkWorkspace(request, response, resource); break; case DavMethods.DAV_MKACTIVITY: doMkActivity(request, response, resource); break; case DavMethods.DAV_BASELINE_CONTROL: doBaselineControl(request, response, resource); break; case DavMethods.DAV_ACL: doAcl(request, response, resource); break; default: // any other method return false; } return true; } /** * The OPTION method * * @param request * @param response * @param resource */ protected void doOptions(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { response.addHeader(DavConstants.HEADER_DAV, resource.getComplianceClass()); response.addHeader("Allow", resource.getSupportedMethods()); response.addHeader("MS-Author-Via", DavConstants.HEADER_DAV); if (resource instanceof SearchResource) { String[] langs = ((SearchResource) resource).getQueryGrammerSet().getQueryLanguages(); for (int i = 0; i < langs.length; i++) { response.addHeader(SearchConstants.HEADER_DASL, "<" + langs[i] + ">"); } } // with DeltaV the OPTIONS request may contain a Xml body. OptionsResponse oR = null; OptionsInfo oInfo = request.getOptionsInfo(); if (oInfo != null && resource instanceof DeltaVResource) { oR = ((DeltaVResource) resource).getOptionResponse(oInfo); } if (oR == null) { response.setStatus(DavServletResponse.SC_OK); } else { response.sendXmlResponse(oR, DavServletResponse.SC_OK); } } /** * The HEAD method * * @param request * @param response * @param resource * @throws java.io.IOException */ protected void doHead(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException { spoolResource(request, response, resource, false); } /** * The GET method * * @param request * @param response * @param resource * @throws IOException */ protected void doGet(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException { spoolResource(request, response, resource, true); } /** * @param request * @param response * @param resource * @param sendContent * @throws IOException */ private void spoolResource(WebdavRequest request, WebdavResponse response, DavResource resource, boolean sendContent) throws IOException { if (!resource.exists()) { response.sendError(HttpServletResponse.SC_NOT_FOUND);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -