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