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
.cms
.dav
.DavResponse
;
20 import org
.argeo
.cms
.http
.HttpStatus
;
22 public class DavContent
extends AbstractContent
{
23 private final DavContentProvider provider
;
24 private final URI uri
;
26 private Set
<QName
> keyNames
;
27 private Optional
<Map
<QName
, String
>> values
;
29 public DavContent(ProvidedSession session
, DavContentProvider provider
, URI uri
, Set
<QName
> keyNames
) {
30 this(session
, provider
, uri
, keyNames
, Optional
.empty());
33 public DavContent(ProvidedSession session
, DavContentProvider provider
, URI uri
, Set
<QName
> keyNames
,
34 Optional
<Map
<QName
, String
>> values
) {
36 this.provider
= provider
;
38 this.keyNames
= keyNames
;
43 public QName
getName() {
44 String fileName
= ContentUtils
.getParentPath(uri
.getPath())[1];
45 ContentName name
= NamespaceUtils
.parsePrefixedName(provider
, fileName
);
50 public Content
getParent() {
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
);
61 public Iterator
<Content
> iterator() {
62 Iterator
<DavResponse
> responses
= provider
.getDavClient().listChildren(uri
);
63 return new DavResponseIterator(responses
);
67 protected Iterable
<QName
> keys() {
71 @SuppressWarnings("unchecked")
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());
78 String valueStr
= values
.get().get(key
);
80 return Optional
.empty();
82 return Optional
.of((A
) valueStr
);
86 public ContentProvider
getProvider() {
90 class DavResponseIterator
implements Iterator
<Content
> {
91 private final Iterator
<DavResponse
> responses
;
93 public DavResponseIterator(Iterator
<DavResponse
> responses
) {
94 this.responses
= responses
;
98 public boolean hasNext() {
99 return responses
.hasNext();
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
));