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