]> source.dussan.org Git - archiva.git/blob
586eebc88565cb7df4faefc689ca453e9f0c777a
[archiva.git] /
1 package org.apache.archiva.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.archiva.repository.ManagedRepositoryContent;
23 import org.apache.archiva.repository.content.StorageAsset;
24 import org.apache.archiva.webdav.util.IndexWriter;
25 import org.apache.archiva.webdav.util.MimeTypes;
26 import org.apache.jackrabbit.util.Text;
27 import org.apache.jackrabbit.webdav.DavException;
28 import org.apache.jackrabbit.webdav.DavResource;
29 import org.apache.jackrabbit.webdav.DavResourceFactory;
30 import org.apache.jackrabbit.webdav.DavResourceIterator;
31 import org.apache.jackrabbit.webdav.DavResourceLocator;
32 import org.apache.jackrabbit.webdav.DavSession;
33 import org.apache.jackrabbit.webdav.MultiStatusResponse;
34 import org.apache.jackrabbit.webdav.io.InputContext;
35 import org.apache.jackrabbit.webdav.io.OutputContext;
36 import org.apache.jackrabbit.webdav.lock.ActiveLock;
37 import org.apache.jackrabbit.webdav.lock.LockInfo;
38 import org.apache.jackrabbit.webdav.lock.LockManager;
39 import org.apache.jackrabbit.webdav.lock.Scope;
40 import org.apache.jackrabbit.webdav.lock.Type;
41 import org.apache.jackrabbit.webdav.property.DavProperty;
42 import org.apache.jackrabbit.webdav.property.DavPropertyName;
43 import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
44 import org.apache.jackrabbit.webdav.property.DavPropertySet;
45 import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
46 import org.apache.jackrabbit.webdav.property.ResourceType;
47 import org.joda.time.DateTime;
48 import org.joda.time.format.DateTimeFormatter;
49 import org.joda.time.format.ISODateTimeFormat;
50
51 import java.io.IOException;
52 import java.nio.file.Files;
53 import java.nio.file.Path;
54 import java.util.*;
55 import java.util.stream.Collectors;
56
57 /**
58  * DavResource for virtual repositories
59  */
60 public class ArchivaVirtualDavResource
61     implements DavResource
62 {
63     private static final String COMPLIANCE_CLASS = "1";
64
65     private ArchivaDavResourceLocator locator;
66
67     private DavResourceFactory factory;
68
69     private String logicalResource;
70
71     private DavPropertySet properties;
72
73     private boolean propsInitialized = false;
74
75     private static final String METHODS = "OPTIONS, GET, HEAD, POST, TRACE, PROPFIND, PROPPATCH, MKCOL";
76
77     private final List<StorageAsset> localResources;
78
79     public ArchivaVirtualDavResource(List<StorageAsset> localResources, String logicalResource, MimeTypes mimeTypes,
80                                      ArchivaDavResourceLocator locator, DavResourceFactory factory )
81     {
82         this.localResources = localResources;
83         this.logicalResource = logicalResource;
84         this.locator = locator;
85         this.factory = factory;
86         this.properties = new DavPropertySet();
87     }
88
89     @Override
90     public void spool( OutputContext outputContext ) {
91         if ( outputContext.hasStream() )
92         {
93             List<StorageAsset> localResourceFiles = localResources.stream().filter(Objects::nonNull)
94                     .filter(repoAsset -> repoAsset.exists())
95                     .sorted(Comparator.comparing(o -> o.getName())).collect(Collectors.toList());
96
97             IndexWriter writer = new IndexWriter(localResourceFiles, logicalResource );
98             writer.write( outputContext );
99         }
100     }
101
102     @Override
103     public void addLockManager( LockManager arg0 )
104     {
105
106     }
107
108     @Override
109     public void addMember( DavResource arg0, InputContext arg1 )
110         throws DavException
111     {
112
113     }
114
115     @SuppressWarnings( "unchecked" )
116     @Override
117     public MultiStatusResponse alterProperties( List arg0 )
118         throws DavException
119     {
120         return null;
121     }
122
123     public MultiStatusResponse alterProperties( DavPropertySet arg0, DavPropertyNameSet arg1 )
124         throws DavException
125     {
126         return null;
127     }
128
129     @Override
130     public void copy( DavResource arg0, boolean arg1 )
131         throws DavException
132     {
133
134     }
135
136     @Override
137     public boolean exists()
138     {
139         // localResources are already filtered (all files in the list are already existing)
140         return true;
141     }
142
143     @Override
144     public ActiveLock getLock( Type arg0, Scope arg1 )
145     {
146         return null;
147     }
148
149     @Override
150     public ActiveLock[] getLocks()
151     {
152         return null;
153     }
154
155     @Override
156     public DavResourceIterator getMembers()
157     {
158         return null;
159     }
160
161     @Override
162     public String getSupportedMethods()
163     {
164         return METHODS;
165     }
166
167     @Override
168     public long getModificationTime()
169     {
170         return 0;
171     }
172
173     @Override
174     public boolean hasLock( Type arg0, Scope arg1 )
175     {
176         return false;
177     }
178
179     @Override
180     public boolean isCollection()
181     {
182         return true;
183     }
184
185     @Override
186     public boolean isLockable( Type arg0, Scope arg1 )
187     {
188         return false;
189     }
190
191     @Override
192     public ActiveLock lock( LockInfo arg0 )
193         throws DavException
194     {
195         return null;
196     }
197
198     @Override
199     public void move( DavResource arg0 )
200         throws DavException
201     {
202
203     }
204
205     @Override
206     public ActiveLock refreshLock( LockInfo arg0, String arg1 )
207         throws DavException
208     {
209         return null;
210     }
211
212     @Override
213     public void removeMember( DavResource arg0 )
214         throws DavException
215     {
216
217     }
218
219     @Override
220     public void unlock( String arg0 )
221         throws DavException
222     {
223
224     }
225
226     @Override
227     public String getComplianceClass()
228     {
229         return COMPLIANCE_CLASS;
230     }
231
232     @Override
233     public DavResourceLocator getLocator()
234     {
235         return locator;
236     }
237
238     @Override
239     public String getResourcePath()
240     {
241         return locator.getResourcePath();
242     }
243
244     @Override
245     public String getHref()
246     {
247         return locator.getHref( isCollection() );
248     }
249
250     @Override
251     public DavResourceFactory getFactory()
252     {
253         return factory;
254     }
255
256     @Override
257     public String getDisplayName()
258     {
259         String resPath = getResourcePath();
260
261         return ( resPath != null ) ? Text.getName( resPath ) : resPath;
262     }
263
264     @Override
265     public DavSession getSession()
266     {
267         return null;
268     }
269
270     @Override
271     public DavPropertyName[] getPropertyNames()
272     {
273         return getProperties().getPropertyNames();
274     }
275
276     @Override
277     public DavProperty getProperty( DavPropertyName name )
278     {
279         initProperties();
280         return properties.get( name );
281     }
282
283     @Override
284     public DavPropertySet getProperties()
285     {
286         initProperties();
287         return properties;
288     }
289
290     @Override
291     public void setProperty( DavProperty property )
292         throws DavException
293     {
294     }
295
296     @Override
297     public void removeProperty( DavPropertyName propertyName )
298         throws DavException
299     {
300     }
301
302     @Override
303     public DavResource getCollection()
304     {
305         DavResource parent = null;
306         if ( getResourcePath() != null && !getResourcePath().equals( "/" ) )
307         {
308             String parentPath = Text.getRelativeParent( getResourcePath(), 1 );
309             if ( parentPath.equals( "" ) )
310             {
311                 parentPath = "/";
312             }
313             DavResourceLocator parentloc =
314                 locator.getFactory().createResourceLocator( locator.getPrefix(), parentPath );
315             try
316             {
317                 // go back to ArchivaDavResourceFactory!
318                 parent = factory.createResource( parentloc, null );
319             }
320             catch ( DavException e )
321             {
322                 // should not occur
323             }
324         }
325         return parent;
326     }
327
328     /**
329      * Fill the set of properties
330      */
331     protected void initProperties()
332     {
333         if ( !exists() || propsInitialized )
334         {
335             return;
336         }
337
338         // set (or reset) fundamental properties
339         if ( getDisplayName() != null )
340         {
341             properties.add( new DefaultDavProperty<>( DavPropertyName.DISPLAYNAME, getDisplayName() ) );
342         }
343         if ( isCollection() )
344         {
345             properties.add( new ResourceType( ResourceType.COLLECTION ) );
346             // Windows XP support
347             properties.add( new DefaultDavProperty<>( DavPropertyName.ISCOLLECTION, "1" ) );
348         }
349         else
350         {
351             properties.add( new ResourceType( ResourceType.DEFAULT_RESOURCE ) );
352
353             // Windows XP support
354             properties.add( new DefaultDavProperty<>( DavPropertyName.ISCOLLECTION, "0" ) );
355         }
356
357         // Need to get the ISO8601 date for properties
358         DateTime dt = new DateTime( 0 );
359         DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
360         String modifiedDate = fmt.print( dt );
361
362         properties.add( new DefaultDavProperty<>( DavPropertyName.GETLASTMODIFIED, modifiedDate ) );
363
364         properties.add( new DefaultDavProperty<>( DavPropertyName.CREATIONDATE, modifiedDate ) );
365
366         properties.add( new DefaultDavProperty<>( DavPropertyName.GETCONTENTLENGTH, 0 ) );
367
368         propsInitialized = true;
369     }
370
371     public String getLogicalResource()
372     {
373         return logicalResource;
374     }
375
376     public void setLogicalResource( String logicalResource )
377     {
378         this.logicalResource = logicalResource;
379     }
380 }