]> source.dussan.org Git - archiva.git/blob
7d2d7f40dbeea72ed894748903640885c8f81239
[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 org.apache.jackrabbit.webdav.*;
23 import org.apache.jackrabbit.webdav.property.DavPropertySet;
24 import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
25 import org.apache.jackrabbit.webdav.property.DavProperty;
26 import org.apache.jackrabbit.webdav.property.DavPropertyName;
27 import org.apache.jackrabbit.webdav.io.InputContext;
28 import org.apache.jackrabbit.webdav.io.OutputContext;
29 import org.apache.jackrabbit.webdav.lock.*;
30 import org.apache.jackrabbit.util.Text;
31 import org.apache.commons.io.IOUtils;
32 import org.apache.commons.io.FileUtils;
33 import org.apache.maven.archiva.webdav.util.MimeTypes;
34 import org.apache.maven.archiva.webdav.util.IndexWriter;
35
36 import javax.servlet.http.HttpServletResponse;
37 import java.util.List;
38 import java.util.Date;
39 import java.io.*;
40
41 /**
42  * @author <a href="mailto:james@atlassian.com">James William Dumay</a>
43  */
44 public class ArchivaDavResource implements DavResource
45 {
46     private final MimeTypes mimeTypes;
47
48     private final DavResourceLocator locator;
49
50     private final DavResourceFactory factory;
51
52     private final DavSession session;
53
54     private final File localResource;
55
56     private final String logicalResource;
57
58     private static final String METHODS = "OPTIONS, GET, HEAD, POST, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, PUT, DELETE, MOVE";
59
60     private static final String COMPLIANCE_CLASS = "1";
61
62     private DavPropertySet properties;
63
64     public ArchivaDavResource(String localResource, String logicalResource, MimeTypes mimeTypes, DavResourceLocator locator, DavResourceFactory factory, DavSession session)
65     {
66         this.mimeTypes = mimeTypes;
67         this.localResource = new File(localResource);
68         this.logicalResource = logicalResource;
69         this.locator = locator;
70         this.factory = factory;
71         this.session = session;
72         this.properties = new DavPropertySet();
73     }
74
75     public String getContentType()
76     {
77         return mimeTypes.getMimeType(localResource.getName());
78     }
79
80     public String getComplianceClass()
81     {
82         return COMPLIANCE_CLASS;
83     }
84
85     public String getSupportedMethods()
86     {
87         return METHODS;
88     }
89
90     public boolean exists()
91     {
92         return localResource.exists();
93     }
94
95     public boolean isCollection()
96     {
97         return localResource.isDirectory();
98     }
99
100     public String getDisplayName()
101     {
102         String resPath = getResourcePath();
103         return (resPath != null) ? Text.getName(resPath) : resPath;
104     }
105
106     public DavResourceLocator getLocator()
107     {
108         return locator;
109     }
110
111     public String getResourcePath()
112     {
113         return locator.getResourcePath();
114     }
115
116     public String getHref()
117     {
118         return locator.getHref(isCollection());
119     }
120
121     public long getModificationTime()
122     {
123         return localResource.lastModified();
124     }
125
126     public long getContentLength()
127     {
128         return localResource.length();
129     }
130
131     public void spool(OutputContext outputContext) throws IOException
132     {
133         if (!isCollection())
134         {
135             IOUtils.copy(new FileInputStream(localResource), outputContext.getOutputStream());
136         }
137         else
138         {
139             IndexWriter writer = new IndexWriter(this, localResource, logicalResource);
140             writer.write(outputContext);
141         }
142     }
143
144     public DavPropertyName[] getPropertyNames()
145     {
146         return new DavPropertyName[0];
147     }
148
149     public DavProperty getProperty(DavPropertyName name)
150     {
151         return null;
152     }
153
154     public DavPropertySet getProperties()
155     {
156         return properties;
157     }
158
159     public void setProperty(DavProperty property) throws DavException
160     {
161     }
162
163     public void removeProperty(DavPropertyName propertyName) throws DavException
164     {
165     }
166
167     public MultiStatusResponse alterProperties(DavPropertySet setProperties, DavPropertyNameSet removePropertyNames) throws DavException
168     {
169         return null;
170     }
171
172     public MultiStatusResponse alterProperties(List changeList) throws DavException
173     {
174         return null;
175     }
176
177     public DavResource getCollection()
178     {
179         DavResource parent = null;
180         if (getResourcePath() != null && !getResourcePath().equals("/")) {
181             String parentPath = Text.getRelativeParent(getResourcePath(), 1);
182             if (parentPath.equals("")) {
183                 parentPath = "/";
184             }
185             DavResourceLocator parentloc = locator.getFactory().createResourceLocator(locator.getPrefix(), locator.getWorkspacePath(), parentPath);
186             try {
187                 parent = factory.createResource(parentloc, session);
188             } catch (DavException e) {
189                 // should not occur
190             }
191         }
192         return parent;
193     }
194
195     public void addMember(DavResource resource, InputContext inputContext) throws DavException
196     {
197         File localFile = new File(localResource, resource.getDisplayName());
198         if (!resource.isCollection() && isCollection() && inputContext.hasStream()) //New File
199         {
200             boolean deleteFile = false;
201             FileOutputStream stream = null;
202             try
203             {
204                 stream = new FileOutputStream(localFile);
205                 IOUtils.copy(inputContext.getInputStream(), stream);
206                 if (inputContext.getContentLength() != localFile.length())
207                 {
208                     deleteFile = true;
209                     throw new DavException(HttpServletResponse.SC_BAD_REQUEST, "Content Header length was "
210                             + inputContext.getContentLength() + " but was " + localFile.length());
211                 }
212             }
213             catch (IOException e)
214             {
215                 throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
216             }
217             finally
218             {
219                 IOUtils.closeQuietly(stream);
220                 if (deleteFile)
221                 {
222                     FileUtils.deleteQuietly(localFile);
223                 }
224             }
225         }
226         else if (resource.isCollection() && isCollection()) //New directory
227         {
228             localFile.mkdir();
229         }
230         else
231         {
232             throw new DavException(HttpServletResponse.SC_BAD_REQUEST, "Could not write member "
233                     + resource.getResourcePath() + " at " + getResourcePath());
234         }
235     }
236
237     public DavResourceIterator getMembers()
238     {
239         return null;
240     }
241
242     public void removeMember(DavResource member) throws DavException
243     {
244     }
245
246     public void move(DavResource destination) throws DavException
247     {
248     }
249
250     public void copy(DavResource destination, boolean shallow) throws DavException
251     {
252     }
253
254     public boolean isLockable(Type type, Scope scope)
255     {
256         return false;
257     }
258
259     public boolean hasLock(Type type, Scope scope)
260     {
261         return false;
262     }
263
264     public ActiveLock getLock(Type type, Scope scope)
265     {
266         return null;
267     }
268
269     public ActiveLock[] getLocks()
270     {
271         return new ActiveLock[0];
272     }
273
274     public ActiveLock lock(LockInfo reqLockInfo) throws DavException
275     {
276         return null;
277     }
278
279     public ActiveLock refreshLock(LockInfo reqLockInfo, String lockToken) throws DavException
280     {
281         return null;
282     }
283
284     public void unlock(String lockToken) throws DavException
285     {
286     }
287
288     public void addLockManager(LockManager lockmgr)
289     {
290     }
291
292     public DavResourceFactory getFactory()
293     {
294         return factory;
295     }
296
297     public DavSession getSession()
298     {
299         return session;
300     }
301 }