]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/dav/DavContent.java
Introduce CMS JShell
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / dav / DavContent.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 import java.util.Map;
7 import java.util.Optional;
8 import java.util.Set;
9
10 import javax.xml.namespace.QName;
11
12 import org.argeo.api.acr.Content;
13 import org.argeo.api.acr.ContentName;
14 import org.argeo.api.acr.NamespaceUtils;
15 import org.argeo.api.acr.spi.ContentProvider;
16 import org.argeo.api.acr.spi.ProvidedSession;
17 import org.argeo.cms.acr.AbstractContent;
18 import org.argeo.cms.acr.ContentUtils;
19 import org.argeo.cms.dav.DavResponse;
20 import org.argeo.cms.http.HttpStatus;
21
22 public class DavContent extends AbstractContent {
23 private final DavContentProvider provider;
24 private final URI uri;
25
26 private Set<QName> keyNames;
27 private Optional<Map<QName, String>> values;
28
29 public DavContent(ProvidedSession session, DavContentProvider provider, URI uri, Set<QName> keyNames) {
30 this(session, provider, uri, keyNames, Optional.empty());
31 }
32
33 public DavContent(ProvidedSession session, DavContentProvider provider, URI uri, Set<QName> keyNames,
34 Optional<Map<QName, String>> values) {
35 super(session);
36 this.provider = provider;
37 this.uri = uri;
38 this.keyNames = keyNames;
39 this.values = values;
40 }
41
42 @Override
43 public QName getName() {
44 String fileName = ContentUtils.getParentPath(uri.getPath())[1];
45 ContentName name = NamespaceUtils.parsePrefixedName(provider, fileName);
46 return name;
47 }
48
49 @Override
50 public Content getParent() {
51 try {
52 String parentPath = ContentUtils.getParentPath(uri.getPath())[0];
53 URI parentUri = new URI(uri.getScheme(), uri.getHost(), parentPath, null);
54 return provider.getDavContent(getSession(), parentUri);
55 } catch (URISyntaxException e) {
56 throw new IllegalStateException("Cannot create parent", e);
57 }
58 }
59
60 @Override
61 public Iterator<Content> iterator() {
62 Iterator<DavResponse> responses = provider.getDavClient().listChildren(uri);
63 return new DavResponseIterator(responses);
64 }
65
66 @Override
67 protected Iterable<QName> keys() {
68 return keyNames;
69 }
70
71 @SuppressWarnings("unchecked")
72 @Override
73 public <A> Optional<A> get(QName key, Class<A> clss) {
74 if (values.isEmpty()) {
75 DavResponse response = provider.getDavClient().get(uri);
76 values = Optional.of(response.getProperties());
77 }
78 String valueStr = values.get().get(key);
79 if (valueStr == null)
80 return Optional.empty();
81 // TODO convert
82 return Optional.of((A) valueStr);
83 }
84
85 @Override
86 public ContentProvider getProvider() {
87 return provider;
88 }
89
90 class DavResponseIterator implements Iterator<Content> {
91 private final Iterator<DavResponse> responses;
92
93 public DavResponseIterator(Iterator<DavResponse> responses) {
94 this.responses = responses;
95 }
96
97 @Override
98 public boolean hasNext() {
99 return responses.hasNext();
100 }
101
102 @Override
103 public Content next() {
104 DavResponse response = responses.next();
105 String relativePath = response.getHref();
106 URI contentUri = provider.relativePathToUri(relativePath);
107 return new DavContent(getSession(), provider, contentUri, response.getPropertyNames(HttpStatus.OK));
108 }
109
110 }
111 }