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