]> source.dussan.org Git - archiva.git/blob
6a3d5157642f58fd335ed85ac7fc3f9307d348c6
[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             outputContext.setContentLength(getContentLength());
137             outputContext.setContentType(getContentType());
138         }
139         else
140         {
141             IndexWriter writer = new IndexWriter(this, localResource, logicalResource);
142             writer.write(outputContext);
143         }
144     }
145
146     public DavPropertyName[] getPropertyNames()
147     {
148         return new DavPropertyName[0];
149     }
150
151     public DavProperty getProperty(DavPropertyName name)
152     {
153         return null;
154     }
155
156     public DavPropertySet getProperties()
157     {
158         return properties;
159     }
160
161     public void setProperty(DavProperty property) throws DavException
162     {
163     }
164
165     public void removeProperty(DavPropertyName propertyName) throws DavException
166     {
167     }
168
169     public MultiStatusResponse alterProperties(DavPropertySet setProperties, DavPropertyNameSet removePropertyNames) throws DavException
170     {
171         return null;
172     }
173
174     public MultiStatusResponse alterProperties(List changeList) throws DavException
175     {
176         return null;
177     }
178
179     public DavResource getCollection()
180     {
181         DavResource parent = null;
182         if (getResourcePath() != null && !getResourcePath().equals("/")) {
183             String parentPath = Text.getRelativeParent(getResourcePath(), 1);
184             if (parentPath.equals("")) {
185                 parentPath = "/";
186             }
187             DavResourceLocator parentloc = locator.getFactory().createResourceLocator(locator.getPrefix(), locator.getWorkspacePath(), parentPath);
188             try {
189                 parent = factory.createResource(parentloc, session);
190             } catch (DavException e) {
191                 // should not occur
192             }
193         }
194         return parent;
195     }
196
197     public void addMember(DavResource resource, InputContext inputContext) throws DavException
198     {
199         File localFile = new File(localResource, resource.getDisplayName());
200         if (!resource.isCollection() && isCollection() && inputContext.hasStream()) //New File
201         {
202             boolean deleteFile = false;
203             FileOutputStream stream = null;
204             try
205             {
206                 stream = new FileOutputStream(localFile);
207                 IOUtils.copy(inputContext.getInputStream(), stream);
208                 if (inputContext.getContentLength() != localFile.length())
209                 {
210                     deleteFile = true;
211                     throw new DavException(HttpServletResponse.SC_BAD_REQUEST, "Content Header length was "
212                             + inputContext.getContentLength() + " but was " + localFile.length());
213                 }
214             }
215             catch (IOException e)
216             {
217                 throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
218             }
219             finally
220             {
221                 IOUtils.closeQuietly(stream);
222                 if (deleteFile)
223                 {
224                     FileUtils.deleteQuietly(localFile);
225                 }
226             }
227         }
228         else if (resource.isCollection() && isCollection()) //New directory
229         {
230             localFile.mkdir();
231         }
232         else
233         {
234             throw new DavException(HttpServletResponse.SC_BAD_REQUEST, "Could not write member "
235                     + resource.getResourcePath() + " at " + getResourcePath());
236         }
237     }
238
239     public DavResourceIterator getMembers()
240     {
241         return null;
242     }
243
244     public void removeMember(DavResource member) throws DavException
245     {
246     }
247
248     public void move(DavResource destination) throws DavException
249     {
250     }
251
252     public void copy(DavResource destination, boolean shallow) throws DavException
253     {
254     }
255
256     public boolean isLockable(Type type, Scope scope)
257     {
258         return false;
259     }
260
261     public boolean hasLock(Type type, Scope scope)
262     {
263         return false;
264     }
265
266     public ActiveLock getLock(Type type, Scope scope)
267     {
268         return null;
269     }
270
271     public ActiveLock[] getLocks()
272     {
273         return new ActiveLock[0];
274     }
275
276     public ActiveLock lock(LockInfo reqLockInfo) throws DavException
277     {
278         return null;
279     }
280
281     public ActiveLock refreshLock(LockInfo reqLockInfo, String lockToken) throws DavException
282     {
283         return null;
284     }
285
286     public void unlock(String lockToken) throws DavException
287     {
288     }
289
290     public void addLockManager(LockManager lockmgr)
291     {
292     }
293
294     public DavResourceFactory getFactory()
295     {
296         return factory;
297     }
298
299     public DavSession getSession()
300     {
301         return session;
302     }
303 }