]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java
Introduce CMS JShell
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / 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.ArgeoNamespace;
14 import org.argeo.api.acr.ContentName;
15 import org.argeo.api.acr.CrAttributeType;
16 import org.argeo.api.acr.NamespaceUtils;
17 import org.argeo.api.acr.ldap.LdapAttr;
18 import org.argeo.api.acr.ldap.LdapObj;
19 import org.argeo.api.acr.spi.ContentProvider;
20 import org.argeo.api.acr.spi.ProvidedSession;
21 import org.argeo.cms.acr.AbstractContent;
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(LdapAttr.objectClass.name()))
54 continue keys;
55 if (key.equalsIgnoreCase(LdapAttr.objectClasses.name()))
56 continue keys;
57 ContentName name = new ContentName(ArgeoNamespace.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(LdapAttr.objectClass.name()).toString();
68 contentClasses.add(new ContentName(ArgeoNamespace.LDAP_NAMESPACE_URI, objectClass, provider));
69
70 String[] objectClasses = properties.get(LdapAttr.objectClasses.name()).toString().split("\\n");
71 objectClasses: for (String oc : objectClasses) {
72 if (LdapObj.top.name().equalsIgnoreCase(oc))
73 continue objectClasses;
74 if (objectClass.equalsIgnoreCase(oc))
75 continue objectClasses;
76 contentClasses.add(new ContentName(ArgeoNamespace.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 provider.getUserManager().edit(() -> doGetProperties().put(key.getLocalPart(), value));
85 return previous;
86 }
87
88 @Override
89 protected void removeAttr(QName key) {
90 doGetProperties().remove(key.getLocalPart());
91 }
92
93 @Override
94 public ContentProvider getProvider() {
95 return provider;
96 }
97
98 }