]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/dav/DavContentProvider.java
Introduce CMS JShell
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / dav / DavContentProvider.java
1 package org.argeo.cms.acr.dav;
2
3 import java.net.URI;
4 import java.net.URISyntaxException;
5 import java.util.Iterator;
6
7 import org.argeo.api.acr.RuntimeNamespaceContext;
8 import org.argeo.api.acr.spi.ContentProvider;
9 import org.argeo.api.acr.spi.ProvidedContent;
10 import org.argeo.api.acr.spi.ProvidedSession;
11 import org.argeo.cms.dav.DavClient;
12 import org.argeo.cms.dav.DavResponse;
13 import org.argeo.cms.http.HttpStatus;
14
15 public class DavContentProvider implements ContentProvider {
16 private String mountPath;
17 private URI baseUri;
18
19 private DavClient davClient;
20
21 public DavContentProvider(String mountPath, URI baseUri) {
22 this.mountPath = mountPath;
23 this.baseUri = baseUri;
24 if (!baseUri.getPath().endsWith("/"))
25 throw new IllegalArgumentException("Base URI " + baseUri + " path does not end with /");
26 this.davClient = new DavClient();
27 }
28
29 @Override
30 public String getNamespaceURI(String prefix) {
31 // FIXME retrieve mappings from WebDav
32 return RuntimeNamespaceContext.getNamespaceContext().getNamespaceURI(prefix);
33 }
34
35 @Override
36 public Iterator<String> getPrefixes(String namespaceURI) {
37 // FIXME retrieve mappings from WebDav
38 return RuntimeNamespaceContext.getNamespaceContext().getPrefixes(namespaceURI);
39 }
40
41 @Override
42 public ProvidedContent get(ProvidedSession session, String relativePath) {
43 URI contentUri = relativePathToUri(relativePath);
44 return getDavContent(session, contentUri);
45 }
46
47 DavContent getDavContent(ProvidedSession session, URI uri) {
48 DavResponse response = davClient.get(uri);
49 return new DavContent(session, this, uri, response.getPropertyNames(HttpStatus.OK));
50 }
51
52 @Override
53 public boolean exists(ProvidedSession session, String relativePath) {
54 URI contentUri = relativePathToUri(relativePath);
55 return davClient.exists(contentUri);
56 }
57
58 @Override
59 public String getMountPath() {
60 return mountPath;
61 }
62
63 DavClient getDavClient() {
64 return davClient;
65 }
66
67 URI relativePathToUri(String relativePath) {
68 try {
69 // TODO check last slash
70 String path = relativePath.startsWith("/") ? relativePath : baseUri.getPath() + relativePath;
71 URI uri = new URI(baseUri.getScheme(), baseUri.getHost(), path, baseUri.getFragment());
72 return uri;
73 } catch (URISyntaxException e) {
74 throw new IllegalArgumentException("Cannot build URI for " + relativePath + " relatively to " + baseUri, e);
75 }
76 }
77 }