1 package org
.argeo
.cms
.acr
.dav
;
4 import java
.net
.URISyntaxException
;
5 import java
.util
.Iterator
;
7 import java
.util
.Optional
;
10 import javax
.xml
.namespace
.QName
;
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
.util
.dav
.DavResponse
;
21 public class DavContent
extends AbstractContent
{
22 private final DavContentProvider provider
;
23 private final URI uri
;
25 private Set
<QName
> keyNames
;
26 private Optional
<Map
<QName
, String
>> values
;
28 public DavContent(ProvidedSession session
, DavContentProvider provider
, URI uri
, Set
<QName
> keyNames
) {
29 this(session
, provider
, uri
, keyNames
, Optional
.empty());
32 public DavContent(ProvidedSession session
, DavContentProvider provider
, URI uri
, Set
<QName
> keyNames
,
33 Optional
<Map
<QName
, String
>> values
) {
35 this.provider
= provider
;
37 this.keyNames
= keyNames
;
42 public QName
getName() {
43 String fileName
= ContentUtils
.getParentPath(uri
.getPath())[1];
44 ContentName name
= NamespaceUtils
.parsePrefixedName(provider
, fileName
);
49 public Content
getParent() {
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
);
60 public Iterator
<Content
> iterator() {
61 Iterator
<DavResponse
> responses
= provider
.getDavClient().listChildren(uri
);
62 return new DavResponseIterator(responses
);
66 protected Iterable
<QName
> keys() {
70 @SuppressWarnings("unchecked")
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());
77 String valueStr
= values
.get().get(key
);
79 return Optional
.empty();
81 return Optional
.of((A
) valueStr
);
85 public ContentProvider
getProvider() {
89 class DavResponseIterator
implements Iterator
<Content
> {
90 private final Iterator
<DavResponse
> responses
;
92 public DavResponseIterator(Iterator
<DavResponse
> responses
) {
93 this.responses
= responses
;
97 public boolean hasNext() {
98 return responses
.hasNext();
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());