]> source.dussan.org Git - archiva.git/blob
c3e4bfc32a293c0d361183b243b7fb2bd8b661c0
[archiva.git] /
1 package org.apache.maven.archiva.web.repository;
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.commons.lang.StringUtils;
23 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
24 import org.apache.maven.archiva.configuration.Configuration;
25 import org.apache.maven.archiva.configuration.RepositoryConfiguration;
26 import org.apache.maven.archiva.model.ArchivaArtifact;
27 import org.apache.maven.archiva.model.ArchivaRepository;
28 import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
29 import org.apache.maven.archiva.model.ArtifactReference;
30 import org.apache.maven.archiva.model.ProjectReference;
31 import org.apache.maven.archiva.model.VersionedReference;
32 import org.apache.maven.archiva.proxy.ProxyConnector;
33 import org.apache.maven.archiva.proxy.ProxyException;
34 import org.apache.maven.archiva.proxy.RepositoryProxyConnectors;
35 import org.apache.maven.archiva.repository.ArchivaConfigurationAdaptor;
36 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
37 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory;
38 import org.apache.maven.archiva.repository.layout.LayoutException;
39 import org.apache.maven.wagon.ResourceDoesNotExistException;
40 import org.apache.maven.wagon.proxy.ProxyInfo;
41 import org.codehaus.plexus.webdav.AbstractDavServerComponent;
42 import org.codehaus.plexus.webdav.DavServerComponent;
43 import org.codehaus.plexus.webdav.DavServerException;
44 import org.codehaus.plexus.webdav.servlet.DavServerRequest;
45 import org.codehaus.plexus.webdav.util.WebdavMethodUtil;
46
47 import java.io.File;
48 import java.io.IOException;
49 import java.lang.reflect.Proxy;
50 import java.util.ArrayList;
51 import java.util.Iterator;
52 import java.util.List;
53
54 import javax.servlet.ServletConfig;
55 import javax.servlet.ServletException;
56 import javax.servlet.http.HttpServletResponse;
57
58 /**
59  * ProxiedDavServer
60  *
61  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
62  * @version $Id$
63  * @plexus.component role="org.codehaus.plexus.webdav.DavServerComponent"
64  * role-hint="proxied"
65  * instantiation-strategy="per-lookup"
66  */
67 public class ProxiedDavServer
68     extends AbstractDavServerComponent
69 {
70     /**
71      * @plexus.requirement role-hint="simple"
72      */
73     private DavServerComponent davServer;
74
75     /**
76      * @plexus.requirement
77      */
78     private ArchivaConfiguration archivaConfiguration;
79
80     /**
81      * @plexus.requirement role-hint="default"
82      */
83     private RepositoryProxyConnectors connectors;
84
85     /**
86      * @plexus.requirement
87      */
88     private BidirectionalRepositoryLayoutFactory layoutFactory;
89
90     private BidirectionalRepositoryLayout layout;
91
92     private RepositoryConfiguration repositoryConfiguration;
93
94     private ArchivaRepository managedRepository;
95
96     private List/*<ArtifactRepository>*/proxiedRepositories;
97
98     public String getPrefix()
99     {
100         return davServer.getPrefix();
101     }
102
103     public File getRootDirectory()
104     {
105         return davServer.getRootDirectory();
106     }
107
108     public void setPrefix( String prefix )
109     {
110         davServer.setPrefix( prefix );
111     }
112
113     public void setRootDirectory( File rootDirectory )
114     {
115         davServer.setRootDirectory( rootDirectory );
116     }
117
118     public void init( ServletConfig servletConfig )
119         throws DavServerException
120     {
121         davServer.init( servletConfig );
122
123         proxiedRepositories = new ArrayList();
124
125         Configuration config = archivaConfiguration.getConfiguration();
126
127         repositoryConfiguration = config.findRepositoryById( getPrefix() );
128
129         managedRepository = ArchivaConfigurationAdaptor.toArchivaRepository( repositoryConfiguration );
130
131         try
132         {
133             layout = layoutFactory.getLayout( managedRepository.getLayoutType() );
134         }
135         catch ( LayoutException e )
136         {
137             throw new DavServerException( "Unable to initialize dav server: " + e.getMessage(), e );
138         }
139     }
140
141     public void process( DavServerRequest request, HttpServletResponse response )
142         throws DavServerException, ServletException, IOException
143     {
144         if ( WebdavMethodUtil.isReadMethod( request.getRequest().getMethod() ) )
145         {
146             if ( !hasResource( request.getLogicalResource() ) )
147             {
148                 fetchContentFromProxies( request );
149             }
150         }
151
152         davServer.process( request, response );
153     }
154
155     private void fetchContentFromProxies( DavServerRequest request )
156         throws ServletException
157     {
158         String resource = request.getLogicalResource();
159         
160         if( resource.endsWith( ".sha1" ) ||
161             resource.endsWith( ".md5") )
162         {
163             // Checksums are fetched with artifact / metadata.
164             return;
165         }
166         
167         try
168         {
169             ProjectReference project;
170             VersionedReference versioned;
171             ArtifactReference artifact;
172             
173             artifact = layout.toArtifactReference( resource );
174             if( artifact != null )
175             {
176                 connectors.fetchFromProxies( managedRepository, artifact );
177                 return;
178             }
179             
180             versioned = layout.toVersionedReference( resource );
181             if( versioned != null )
182             {
183                 connectors.fetchFromProxies( managedRepository, versioned );
184                 return;
185             }
186             
187             project = layout.toProjectReference( resource );
188             if( project != null )
189             {
190                 connectors.fetchFromProxies( managedRepository, project );
191                 return;
192             }
193         }
194         catch ( ResourceDoesNotExistException e )
195         {
196             // return an HTTP 404 instead of HTTP 500 error.
197             return;
198         }
199         catch ( ProxyException e )
200         {
201             throw new ServletException( "Unable to fetch resource.", e );
202         }
203     }
204
205     public RepositoryConfiguration getRepositoryConfiguration()
206     {
207         return repositoryConfiguration;
208     }
209 }