1 package org
.argeo
.cms
.acr
.directory
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Dictionary
;
5 import java
.util
.Enumeration
;
7 import java
.util
.Optional
;
9 import java
.util
.TreeSet
;
11 import javax
.xml
.namespace
.QName
;
13 import org
.argeo
.api
.acr
.ContentName
;
14 import org
.argeo
.api
.acr
.CrName
;
15 import org
.argeo
.api
.acr
.NamespaceUtils
;
16 import org
.argeo
.api
.acr
.spi
.ContentProvider
;
17 import org
.argeo
.api
.acr
.spi
.ProvidedSession
;
18 import org
.argeo
.cms
.acr
.AbstractContent
;
19 import org
.argeo
.util
.naming
.LdapAttrs
;
20 import org
.argeo
.util
.naming
.LdapObjs
;
22 abstract class AbstractDirectoryContent
extends AbstractContent
{
23 protected final DirectoryContentProvider provider
;
25 public AbstractDirectoryContent(ProvidedSession session
, DirectoryContentProvider provider
) {
27 this.provider
= provider
;
30 abstract Dictionary
<String
, Object
> doGetProperties();
32 @SuppressWarnings("unchecked")
34 public <A
> Optional
<A
> get(QName key
, Class
<A
> clss
) {
35 String attrName
= key
.getLocalPart();
36 Object value
= doGetProperties().get(attrName
);
38 return Optional
.empty();
39 // TODO deal with type and multiple
40 return Optional
.of((A
) value
);
44 protected Iterable
<QName
> keys() {
45 Dictionary
<String
, Object
> properties
= doGetProperties();
46 Set
<QName
> keys
= new TreeSet
<>(NamespaceUtils
.QNAME_COMPARATOR
);
47 keys
: for (Enumeration
<String
> it
= properties
.keys(); it
.hasMoreElements();) {
48 String key
= it
.nextElement();
49 if (key
.equalsIgnoreCase(LdapAttrs
.objectClass
.name()))
51 if (key
.equalsIgnoreCase(LdapAttrs
.objectClasses
.name()))
53 ContentName name
= new ContentName(CrName
.LDAP_NAMESPACE_URI
, key
, provider
);
60 public List
<QName
> getTypes() {
61 Dictionary
<String
, Object
> properties
= doGetProperties();
62 List
<QName
> contentClasses
= new ArrayList
<>();
63 String objectClass
= properties
.get(LdapAttrs
.objectClass
.name()).toString();
64 contentClasses
.add(new ContentName(CrName
.LDAP_NAMESPACE_URI
, objectClass
, provider
));
66 String
[] objectClasses
= properties
.get(LdapAttrs
.objectClasses
.name()).toString().split("\\n");
67 objectClasses
: for (String oc
: objectClasses
) {
68 if (LdapObjs
.top
.name().equalsIgnoreCase(oc
))
69 continue objectClasses
;
70 if (objectClass
.equalsIgnoreCase(oc
))
71 continue objectClasses
;
72 contentClasses
.add(new ContentName(CrName
.LDAP_NAMESPACE_URI
, oc
, provider
));
74 return contentClasses
;
78 public Object
put(QName key
, Object value
) {
79 Object previous
= get(key
);
80 // TODO deal with typing
81 doGetProperties().put(key
.getLocalPart(), value
);
86 protected void removeAttr(QName key
) {
87 doGetProperties().remove(key
.getLocalPart());
91 public ContentProvider
getProvider() {