]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/acr/dav/DavContentProvider.java
Introduce WebDav support
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / dav / DavContentProvider.java
diff --git a/org.argeo.cms/src/org/argeo/cms/acr/dav/DavContentProvider.java b/org.argeo.cms/src/org/argeo/cms/acr/dav/DavContentProvider.java
new file mode 100644 (file)
index 0000000..4f7699b
--- /dev/null
@@ -0,0 +1,76 @@
+package org.argeo.cms.acr.dav;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Iterator;
+
+import org.argeo.api.acr.RuntimeNamespaceContext;
+import org.argeo.api.acr.spi.ContentProvider;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.util.dav.DavClient;
+import org.argeo.util.dav.DavResponse;
+
+public class DavContentProvider implements ContentProvider {
+       private String mountPath;
+       private URI baseUri;
+
+       private DavClient davClient;
+
+       public DavContentProvider(String mountPath, URI baseUri) {
+               this.mountPath = mountPath;
+               this.baseUri = baseUri;
+               if (!baseUri.getPath().endsWith("/"))
+                       throw new IllegalArgumentException("Base URI " + baseUri + " path does not end with /");
+               this.davClient = new DavClient();
+       }
+
+       @Override
+       public String getNamespaceURI(String prefix) {
+               // FIXME retrieve mappings from WebDav
+               return RuntimeNamespaceContext.getNamespaceContext().getNamespaceURI(prefix);
+       }
+
+       @Override
+       public Iterator<String> getPrefixes(String namespaceURI) {
+               // FIXME retrieve mappings from WebDav
+               return RuntimeNamespaceContext.getNamespaceContext().getPrefixes(namespaceURI);
+       }
+
+       @Override
+       public ProvidedContent get(ProvidedSession session, String relativePath) {
+               URI contentUri = relativePathToUri(relativePath);
+               return getDavContent(session, contentUri);
+       }
+
+       DavContent getDavContent(ProvidedSession session, URI uri) {
+               DavResponse response = davClient.get(uri);
+               return new DavContent(session, this, uri, response.getPropertyNames());
+       }
+
+       @Override
+       public boolean exists(ProvidedSession session, String relativePath) {
+               URI contentUri = relativePathToUri(relativePath);
+               return davClient.exists(contentUri);
+       }
+
+       @Override
+       public String getMountPath() {
+               return mountPath;
+       }
+
+       DavClient getDavClient() {
+               return davClient;
+       }
+
+       URI relativePathToUri(String relativePath) {
+               try {
+                       // TODO check last slash
+                       String path = relativePath.startsWith("/") ? relativePath : baseUri.getPath() + relativePath;
+                       URI uri = new URI(baseUri.getScheme(), baseUri.getHost(), path, baseUri.getFragment());
+                       return uri;
+               } catch (URISyntaxException e) {
+                       throw new IllegalArgumentException("Cannot build URI for " + relativePath + " relatively to " + baseUri, e);
+               }
+       }
+}