]> git.argeo.org Git - lgpl/argeo-commons.git/blob - acr/directory/AbstractDirectoryContent.java
Prepare next development cycle
[lgpl/argeo-commons.git] / acr / directory / AbstractDirectoryContent.java
1 package org.argeo.cms.acr.directory;
2
3 import java.util.ArrayList;
4 import java.util.Dictionary;
5 import java.util.Enumeration;
6 import java.util.List;
7 import java.util.Optional;
8 import java.util.Set;
9 import java.util.TreeSet;
10
11 import javax.xml.namespace.QName;
12
13 import org.argeo.api.acr.ContentName;
14 import org.argeo.api.acr.CrAttributeType;
15 import org.argeo.api.acr.CrName;
16 import org.argeo.api.acr.NamespaceUtils;
17 import org.argeo.api.acr.spi.ContentProvider;
18 import org.argeo.api.acr.spi.ProvidedSession;
19 import org.argeo.cms.acr.AbstractContent;
20 import org.argeo.util.naming.LdapAttrs;
21 import org.argeo.util.naming.LdapObjs;
22
23 abstract class AbstractDirectoryContent extends AbstractContent {
24 protected final DirectoryContentProvider provider;
25
26 public AbstractDirectoryContent(ProvidedSession session, DirectoryContentProvider provider) {
27 super(session);
28 this.provider = provider;
29 }
30
31 abstract Dictionary<String, Object> doGetProperties();
32
33 @SuppressWarnings("unchecked")
34 @Override
35 public <A> Optional<A> get(QName key, Class<A> clss) {
36 String attrName = key.getLocalPart();
37 Object value = doGetProperties().get(attrName);
38 if (value == null)
39 return Optional.empty();
40 Optional<A> res = CrAttributeType.cast(clss, value);
41 if (res.isEmpty())
42 return Optional.of((A) value);
43 else
44 return res;
45 }
46
47 @Override
48 protected Iterable<QName> keys() {
49 Dictionary<String, Object> properties = doGetProperties();
50 Set<QName> keys = new TreeSet<>(NamespaceUtils.QNAME_COMPARATOR);
51 keys: for (Enumeration<String> it = properties.keys(); it.hasMoreElements();) {
52 String key = it.nextElement();
53 if (key.equalsIgnoreCase(LdapAttrs.objectClass.name()))
54 continue keys;
55 if (key.equalsIgnoreCase(LdapAttrs.objectClasses.name()))
56 continue keys;
57 ContentName name = new ContentName(CrName.LDAP_NAMESPACE_URI, key, provider);
58 keys.add(name);
59 }
60 return keys;
61 }
62
63 @Override
64 public List<QName> getContentClasses() {
65 Dictionary<String, Object> properties = doGetProperties();
66 List<QName> contentClasses = new ArrayList<>();
67 String objectClass = properties.get(LdapAttrs.objectClass.name()).toString();
68 contentClasses.add(new ContentName(CrName.LDAP_NAMESPACE_URI, objectClass, provider));
69
70 String[] objectClasses = properties.get(LdapAttrs.objectClasses.name()).toString().split("\\n");
71 objectClasses: for (String oc : objectClasses) {
72 if (LdapObjs.top.name().equalsIgnoreCase(oc))
73 continue objectClasses;
74 if (objectClass.equalsIgnoreCase(oc))
75 continue objectClasses;
76 contentClasses.add(new ContentName(CrName.LDAP_NAMESPACE_URI, oc, provider));
77 }
78 return contentClasses;
79 }
80
81 @Override
82 public Object put(QName key, Object value) {
83 Object previous = get(key);
84 // TODO deal with typing
85 doGetProperties().put(key.getLocalPart(), value);
86 return previous;
87 }
88
89 @Override
90 protected void removeAttr(QName key) {
91 doGetProperties().remove(key.getLocalPart());
92 }
93
94 @Override
95 public ContentProvider getProvider() {
96 return provider;
97 }
98
99 }