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