]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/dav/DavClient.java
5788a32b462e78dcbe6e25e6a53a392efc78c803
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / dav / DavClient.java
1 package org.argeo.cms.dav;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.Authenticator;
6 import java.net.PasswordAuthentication;
7 import java.net.URI;
8 import java.net.http.HttpClient;
9 import java.net.http.HttpRequest;
10 import java.net.http.HttpRequest.BodyPublishers;
11 import java.net.http.HttpResponse;
12 import java.net.http.HttpResponse.BodyHandler;
13 import java.net.http.HttpResponse.BodyHandlers;
14 import java.util.Iterator;
15
16 import javax.xml.namespace.QName;
17
18 import org.argeo.util.http.HttpResponseStatus;
19
20 public class DavClient {
21
22 private HttpClient httpClient;
23
24 public DavClient() {
25 httpClient = HttpClient.newBuilder() //
26 // .sslContext(insecureContext()) //
27 .version(HttpClient.Version.HTTP_1_1) //
28 // .authenticator(new Authenticator() {
29 //
30 // @Override
31 // protected PasswordAuthentication getPasswordAuthentication() {
32 // return new PasswordAuthentication("root", "demo".toCharArray());
33 // }
34 //
35 // }) //
36 .build();
37 }
38
39 public void setProperty(String url, QName key, String value) {
40 try {
41 String body = """
42 <?xml version="1.0" encoding="utf-8" ?>
43 <D:propertyupdate xmlns:D="DAV:"
44 """ //
45 + "xmlns:" + key.getPrefix() + "=\"" + key.getNamespaceURI() + "\">" + //
46 """
47 <D:set>
48 <D:prop>
49 """ //
50 + "<" + key.getPrefix() + ":" + key.getLocalPart() + ">" + value + "</" + key.getPrefix() + ":"
51 + key.getLocalPart() + ">" + //
52 """
53 </D:prop>
54 </D:set>
55 </D:propertyupdate>
56 """;
57 System.out.println(body);
58 HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)) //
59 .header("Depth", "1") //
60 .method(DavMethod.PROPPATCH.name(), BodyPublishers.ofString(body)) //
61 .build();
62 BodyHandler<String> bodyHandler = BodyHandlers.ofString();
63 HttpResponse<String> response = httpClient.send(request, bodyHandler);
64 System.out.println(response.body());
65 } catch (IOException | InterruptedException e) {
66 // TODO Auto-generated catch block
67 e.printStackTrace();
68 }
69 }
70
71 public Iterator<DavResponse> listChildren(URI uri) {
72 try {
73 String body = """
74 <?xml version="1.0" encoding="utf-8" ?>
75 <D:propfind xmlns:D="DAV:">
76 <D:propname/>
77 </D:propfind>""";
78 HttpRequest request = HttpRequest.newBuilder().uri(uri) //
79 .header(DavHeader.DEPTH.getHeaderName(), DavDepth.DEPTH_1.getValue()) //
80 .method(DavMethod.PROPFIND.name(), BodyPublishers.ofString(body)) //
81 .build();
82
83 HttpResponse<String> responseStr = httpClient.send(request, BodyHandlers.ofString());
84 System.out.println(responseStr.body());
85
86 HttpResponse<InputStream> response = httpClient.send(request, BodyHandlers.ofInputStream());
87 MultiStatusReader msReader = new MultiStatusReader(response.body(), uri.getPath());
88 return msReader;
89 } catch (IOException | InterruptedException e) {
90 throw new IllegalStateException("Cannot list children of " + uri, e);
91 }
92
93 }
94
95 public boolean exists(URI uri) {
96 try {
97 HttpRequest request = HttpRequest.newBuilder().uri(uri) //
98 .header(DavHeader.DEPTH.getHeaderName(), DavDepth.DEPTH_0.getValue()) //
99 .method(DavMethod.HEAD.name(), BodyPublishers.noBody()) //
100 .build();
101 BodyHandler<String> bodyHandler = BodyHandlers.ofString();
102 HttpResponse<String> response = httpClient.send(request, bodyHandler);
103 System.out.println(response.body());
104 int responseStatusCode = response.statusCode();
105 if (responseStatusCode == HttpResponseStatus.NOT_FOUND.getCode())
106 return false;
107 if (responseStatusCode >= 200 && responseStatusCode < 300)
108 return true;
109 throw new IllegalStateException(
110 "Cannot check whether " + uri + " exists: Unknown response status code " + responseStatusCode);
111 } catch (IOException | InterruptedException e) {
112 throw new IllegalStateException("Cannot check whether " + uri + " exists", e);
113 }
114
115 }
116
117 public DavResponse get(URI uri) {
118 try {
119 String body = """
120 <?xml version="1.0" encoding="utf-8" ?>
121 <D:propfind xmlns:D="DAV:">
122 <D:allprop/>
123 </D:propfind>""";
124 HttpRequest request = HttpRequest.newBuilder().uri(uri) //
125 .header(DavHeader.DEPTH.getHeaderName(), DavDepth.DEPTH_0.getValue()) //
126 .method(DavMethod.PROPFIND.name(), BodyPublishers.ofString(body)) //
127 .build();
128
129 // HttpResponse<String> responseStr = httpClient.send(request, BodyHandlers.ofString());
130 // System.out.println(responseStr.body());
131
132 HttpResponse<InputStream> response = httpClient.send(request, BodyHandlers.ofInputStream());
133 MultiStatusReader msReader = new MultiStatusReader(response.body());
134 if (!msReader.hasNext())
135 throw new IllegalArgumentException(uri + " does not exist");
136 return msReader.next();
137 } catch (IOException | InterruptedException e) {
138 throw new IllegalStateException("Cannot list children of " + uri, e);
139 }
140
141 }
142
143 public static void main(String[] args) {
144 DavClient davClient = new DavClient();
145 // Iterator<DavResponse> responses = davClient
146 // .listChildren(URI.create("http://localhost/unstable/a2/org.argeo.tp.sdk/"));
147 Iterator<DavResponse> responses = davClient
148 .listChildren(URI.create("http://root:demo@localhost:7070/api/acr/srv/example"));
149 while (responses.hasNext()) {
150 DavResponse response = responses.next();
151 System.out.println(response.getHref() + (response.isCollection() ? " (collection)" : ""));
152 System.out.println(" " + response.getPropertyNames());
153
154 }
155 // davClient.setProperty("http://localhost/unstable/a2/org.argeo.tp.sdk/org.opentest4j.1.2.jar",
156 // CrName.uuid.qName(), UUID.randomUUID().toString());
157
158 }
159
160 }