]> git.argeo.org Git - lgpl/argeo-commons.git/blob - AbstractDirectoryContent.java
a14ada79a4ec218bd5516972f31719012752b6d4
[lgpl/argeo-commons.git] / 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.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;
21
22 abstract class AbstractDirectoryContent extends AbstractContent {
23 protected final DirectoryContentProvider provider;
24
25 public AbstractDirectoryContent(ProvidedSession session, DirectoryContentProvider provider) {
26 super(session);
27 this.provider = provider;
28 }
29
30 abstract Dictionary<String, Object> doGetProperties();
31
32 @SuppressWarnings("unchecked")
33 @Override
34 public <A> Optional<A> get(QName key, Class<A> clss) {
35 String attrName = key.getLocalPart();
36 Object value = doGetProperties().get(attrName);
37 if (value == null)
38 return Optional.empty();
39 // TODO deal with type and multiple
40 return Optional.of((A) value);
41 }
42
43 @Override
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()))
50 continue keys;
51 if (key.equalsIgnoreCase(LdapAttrs.objectClasses.name()))
52 continue keys;
53 ContentName name = new ContentName(CrName.LDAP_NAMESPACE_URI, key, provider);
54 keys.add(name);
55 }
56 return keys;
57 }
58
59 @Override
60 public List<QName> getContentClasses() {
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));
65
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));
73 }
74 return contentClasses;
75 }
76
77 @Override
78 public Object put(QName key, Object value) {
79 Object previous = get(key);
80 // TODO deal with typing
81 doGetProperties().put(key.getLocalPart(), value);
82 return previous;
83 }
84
85 @Override
86 protected void removeAttr(QName key) {
87 doGetProperties().remove(key.getLocalPart());
88 }
89
90 @Override
91 public ContentProvider getProvider() {
92 return provider;
93 }
94
95
96 }