View Javadoc

1   package org.apache.continuum.webdav;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
23  import org.apache.jackrabbit.webdav.DavException;
24  import org.apache.jackrabbit.webdav.DavLocatorFactory;
25  import org.apache.jackrabbit.webdav.DavMethods;
26  import org.apache.jackrabbit.webdav.DavResource;
27  import org.apache.jackrabbit.webdav.DavResourceFactory;
28  import org.apache.jackrabbit.webdav.DavServletResponse;
29  import org.apache.jackrabbit.webdav.DavSessionProvider;
30  import org.apache.jackrabbit.webdav.WebdavRequest;
31  import org.apache.jackrabbit.webdav.WebdavRequestImpl;
32  import org.apache.jackrabbit.webdav.WebdavResponse;
33  import org.apache.jackrabbit.webdav.WebdavResponseImpl;
34  import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
35  import org.codehaus.plexus.spring.PlexusToSpringUtils;
36  import org.slf4j.Logger;
37  import org.slf4j.LoggerFactory;
38  import org.springframework.context.ConfigurableApplicationContext;
39  import org.springframework.web.context.WebApplicationContext;
40  import org.springframework.web.context.support.WebApplicationContextUtils;
41  
42  import java.io.IOException;
43  import javax.servlet.ServletConfig;
44  import javax.servlet.ServletException;
45  import javax.servlet.http.HttpServletRequest;
46  import javax.servlet.http.HttpServletResponse;
47  
48  public class WorkingCopyServlet
49      extends AbstractWebdavServlet
50  {
51      private Logger log = LoggerFactory.getLogger( this.getClass() );
52  
53      private DavLocatorFactory locatorFactory;
54  
55      private DavResourceFactory resourceFactory;
56  
57      protected DavSessionProvider sessionProvider;
58  
59      @Override
60      public void init( ServletConfig servletConfig )
61          throws ServletException
62      {
63          super.init( servletConfig );
64          initServers( servletConfig );
65      }
66  
67      /**
68       * Service the given request. This method has been overridden and copy/pasted to allow better exception handling and
69       * to support different realms
70       *
71       * @param request
72       * @param response
73       * @throws ServletException
74       * @throws java.io.IOException
75       */
76      @Override
77      protected void service( HttpServletRequest request, HttpServletResponse response )
78          throws ServletException, IOException
79      {
80          WebdavRequest webdavRequest = new WebdavRequestImpl( request, getLocatorFactory() );
81  
82          // DeltaV requires 'Cache-Control' header for all methods except 'VERSION-CONTROL' and 'REPORT'.
83          int methodCode = DavMethods.getMethodCode( request.getMethod() );
84          boolean noCache = DavMethods.isDeltaVMethod( webdavRequest ) &&
85              !( DavMethods.DAV_VERSION_CONTROL == methodCode || DavMethods.DAV_REPORT == methodCode );
86          WebdavResponse webdavResponse = new WebdavResponseImpl( response, noCache );
87          DavResource resource = null;
88  
89          try
90          {
91              // make sure there is a authenticated user
92              if ( !( getDavSessionProvider() ).attachSession( webdavRequest ) )
93              {
94                  return;
95              }
96  
97              // check matching if=header for lock-token relevant operations
98              resource = getResourceFactory().createResource( webdavRequest.getRequestLocator(), webdavRequest,
99                                                              webdavResponse );
100 
101             if ( !isPreconditionValid( webdavRequest, resource ) )
102             {
103                 webdavResponse.sendError( DavServletResponse.SC_PRECONDITION_FAILED );
104                 return;
105             }
106             if ( !execute( webdavRequest, webdavResponse, methodCode, resource ) )
107             {
108                 super.service( request, response );
109             }
110         }
111         catch ( DavException e )
112         {
113             if ( e.getErrorCode() == HttpServletResponse.SC_UNAUTHORIZED )
114             {
115                 final String msg = "Unauthorized error";
116                 log.error( msg );
117                 webdavResponse.sendError( e.getErrorCode(), msg );
118             }
119             else if ( e.getCause() != null )
120             {
121                 webdavResponse.sendError( e.getErrorCode(), e.getCause().getMessage() );
122             }
123             else
124             {
125                 webdavResponse.sendError( e.getErrorCode(), e.getMessage() );
126             }
127         }
128         finally
129         {
130             getDavSessionProvider().releaseSession( webdavRequest );
131         }
132     }
133 
134     public synchronized void initServers( ServletConfig servletConfig )
135     {
136         WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(
137             servletConfig.getServletContext() );
138 
139         resourceFactory = (DavResourceFactory) wac.getBean( PlexusToSpringUtils.
140             buildSpringId( ContinuumBuildAgentDavResourceFactory.class ) );
141 
142         BuildAgentConfigurationService buildAgentConfigurationService = (BuildAgentConfigurationService) wac.getBean(
143             PlexusToSpringUtils.buildSpringId( BuildAgentConfigurationService.class ) );
144 
145         locatorFactory = new ContinuumBuildAgentDavLocatorFactory();
146         sessionProvider = new ContinuumBuildAgentDavSessionProvider( buildAgentConfigurationService );
147     }
148 
149     @Override
150     public String getAuthenticateHeaderValue()
151     {
152         throw new UnsupportedOperationException();
153     }
154 
155     @Override
156     public DavSessionProvider getDavSessionProvider()
157     {
158         return sessionProvider;
159     }
160 
161     @Override
162     public DavLocatorFactory getLocatorFactory()
163     {
164         return locatorFactory;
165     }
166 
167     @Override
168     public DavResourceFactory getResourceFactory()
169     {
170         return resourceFactory;
171     }
172 
173     @Override
174     protected boolean isPreconditionValid( WebdavRequest request, DavResource resource )
175     {
176         // TODO Auto-generated method stub
177         return true;
178     }
179 
180     @Override
181     public void setDavSessionProvider( final DavSessionProvider sessionProvider )
182     {
183         this.sessionProvider = sessionProvider;
184     }
185 
186     @Override
187     public void setLocatorFactory( final DavLocatorFactory locatorFactory )
188     {
189         this.locatorFactory = locatorFactory;
190     }
191 
192     @Override
193     public void setResourceFactory( DavResourceFactory resourceFactory )
194     {
195         this.resourceFactory = resourceFactory;
196     }
197 
198     @Override
199     public void destroy()
200     {
201         resourceFactory = null;
202         locatorFactory = null;
203         sessionProvider = null;
204 
205         WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext( getServletContext() );
206 
207         if ( wac instanceof ConfigurableApplicationContext )
208         {
209             ( (ConfigurableApplicationContext) wac ).close();
210         }
211         super.destroy();
212     }
213 }