Improve naming. Fix Argeo namespace base.
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 23 Jun 2022 08:22:55 +0000 (10:22 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 23 Jun 2022 08:22:55 +0000 (10:22 +0200)
20 files changed:
eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java
eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java
jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java
org.argeo.api.acr/src/org/argeo/api/acr/Content.java
org.argeo.api.acr/src/org/argeo/api/acr/ContentName.java
org.argeo.api.acr/src/org/argeo/api/acr/CrName.java
org.argeo.cms/src/org/argeo/cms/acr/AbstractContent.java
org.argeo.cms/src/org/argeo/cms/acr/CmsContentTypes.java
org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java
org.argeo.cms/src/org/argeo/cms/acr/directory/HierarchyUnitContent.java
org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java
org.argeo.cms/src/org/argeo/cms/acr/xml/DomContent.java
org.argeo.cms/src/org/argeo/cms/internal/auth/CmsUserManagerImpl.java
org.argeo.util/src/org/argeo/util/directory/ldap/DefaultLdapEntry.java
org.argeo.util/src/org/argeo/util/directory/ldap/SharedSecret.java [new file with mode: 0644]
org.argeo.util/src/org/argeo/util/naming/LdapAttrs.java
org.argeo.util/src/org/argeo/util/naming/LdapObjs.java
org.argeo.util/src/org/argeo/util/naming/QNamed.java [new file with mode: 0644]
org.argeo.util/src/org/argeo/util/naming/SharedSecret.java [deleted file]
rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/AbstractCmsEntryPoint.java

index cfae59b49e1a06c525b3962b58acd7569ba77524..9d7b83ab18377925b905897bad51267493ca5974 100644 (file)
@@ -85,7 +85,7 @@ public class AcrContentTreeView extends Composite {
 
                        @Override
                        protected int getItemCount() {
-                               data = new ArrayList<>(selected.getTypes());
+                               data = new ArrayList<>(selected.getContentClasses());
                                return data.size();
                        }
                };
index af4c68aac9793ff8c8b4eb8199fd6cc1e9760caf..8fd4065ad92bce617dbcd2f195da80ddf6a49320 100644 (file)
@@ -89,7 +89,8 @@ public class SwtTabularPart implements TabularPart {
                        Object data = getData(row);
                        item.setData(data);
                        String text = data != null ? column.getText(data) : "";
-                       item.setText(i, text);
+                       if (text != null)
+                               item.setText(i, text);
                        CmsIcon icon = column.getIcon(data);
                        if (icon != null) {
                                Image image = theme.getSmallIcon(icon);
index 41672a0e9e24b68ca9ca0a49f64776330d2948d7..ad90b2df7880fd39b8ea1a7357c4df9d3889142e 100644 (file)
@@ -291,7 +291,7 @@ public class JcrContent extends AbstractContent {
         * TYPING
         */
        @Override
-       public List<QName> getTypes() {
+       public List<QName> getContentClasses() {
                try {
 //                     Node node = getJcrNode();
 //                     List<QName> res = new ArrayList<>();
index cd03b16a828906dff4990ad62a7b77621c9f96cd..0fdc14fe30e9f0146afbc8f8dde42187086d0200 100644 (file)
@@ -92,7 +92,27 @@ public interface Content extends Iterable<Content>, Map<QName, Object> {
        /*
         * TYPING
         */
-       List<QName> getTypes();
+       List<QName> getContentClasses();
+
+       /** AND */
+       default boolean isContentClass(QName... contentClass) {
+               List<QName> contentClasses = getContentClasses();
+               for (QName cClass : contentClass) {
+                       if (!contentClasses.contains(cClass))
+                               return false;
+               }
+               return true;
+       }
+
+       /** OR */
+       default boolean hasContentClass(QName... contentClass) {
+               List<QName> contentClasses = getContentClasses();
+               for (QName cClass : contentClass) {
+                       if (contentClasses.contains(cClass))
+                               return true;
+               }
+               return false;
+       }
 
        /*
         * DEFAULT METHODS
@@ -112,9 +132,21 @@ public interface Content extends Iterable<Content>, Map<QName, Object> {
        /*
         * CONVENIENCE METHODS
         */
-//     default String attr(String key) {
-//             return get(key, String.class);
-//     }
+       default String attr(String key) {
+               Object obj = get(key);
+               if (obj == null)
+                       return null;
+               return obj.toString();
+
+       }
+
+       default String attr(QName key) {
+               Object obj = get(key);
+               if (obj == null)
+                       return null;
+               return obj.toString();
+
+       }
 //
 //     default String attr(Object key) {
 //             return key != null ? attr(key.toString()) : attr(null);
index a3f6d901045a411ebe80761619bef54a1d41f4d2..fdeb60776a426b4bf28fb29bc1de9f079ab66170 100644 (file)
@@ -84,7 +84,7 @@ public class ContentName extends QName {
 
        @Override
        public String toString() {
-               return toPrefixedString();
+               return toQNameString();
        }
 
        @Override
index f79c47446b4e431a5680f5142317606d1a9696fc..f8ef602dbd5b962eb2c8df739be68c211f7ce26e 100644 (file)
@@ -33,14 +33,14 @@ public enum CrName implements ContentNameSupplier {
        //
        ;
 
-       public final static String CR_NAMESPACE_URI = "http://argeo.org/ns/cr";
+       public final static String CR_NAMESPACE_URI = "http://www.argeo.org/ns/cr";
 
        public final static String CR_DEFAULT_PREFIX = "cr";
 
-       public final static String LDAP_NAMESPACE_URI = "http://argeo.org/ns/ldap";
+       public final static String LDAP_NAMESPACE_URI = "http://www.argeo.org/ns/ldap";
        public final static String LDAP_DEFAULT_PREFIX = "ldap";
 
-       public final static String ROLE_NAMESPACE_URI = "http://argeo.org/ns/role";
+       public final static String ROLE_NAMESPACE_URI = "http://www.argeo.org/ns/role";
        public final static String ROLE_DEFAULT_PREFIX = "role";
 
        private final ContentName value;
index c8ba7311daaa4206a14de8be12a032ed40644c7d..2703af035ee0005f2b386cc0c8dfe3fe2568e629 100644 (file)
@@ -133,7 +133,7 @@ public abstract class AbstractContent extends AbstractMap<QName, Object> impleme
         */
 
        @Override
-       public List<QName> getTypes() {
+       public List<QName> getContentClasses() {
                return new ArrayList<>();
        }
 
index 4c1f82a257fb1021cc34b50284325ba19130a786..67c2063044132fd5b418416933bdf84b054ddc14 100644 (file)
@@ -4,8 +4,10 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Objects;
 
+import org.argeo.api.acr.CrName;
+
 public enum CmsContentTypes {
-       CR_2("cr", "http://argeo.org/ns/cr", "cr.xsd", null),
+       CR_2(CrName.CR_DEFAULT_PREFIX, CrName.CR_NAMESPACE_URI, "cr.xsd", null),
        //
        XSD_2001("xs", "http://www.w3.org/2001/XMLSchema", "XMLSchema.xsd", "http://www.w3.org/2001/XMLSchema.xsd"),
        //
@@ -13,12 +15,14 @@ public enum CmsContentTypes {
        //
        XLINK_1999("xlink", "http://www.w3.org/1999/xlink", "xlink.xsd", "http://www.w3.org/XML/2008/06/xlink.xsd"),
        //
-       XSLT_2_0("xsl", "http://www.w3.org/1999/XSL/Transform", "schema-for-xslt20.xsd", "https://www.w3.org/2007/schema-for-xslt20.xsd"),
+       XSLT_2_0("xsl", "http://www.w3.org/1999/XSL/Transform", "schema-for-xslt20.xsd",
+                       "https://www.w3.org/2007/schema-for-xslt20.xsd"),
        //
        SVG_1_1("svg", "http://www.w3.org/2000/svg", "SVG.xsd",
                        "https://raw.githubusercontent.com/oreillymedia/HTMLBook/master/schema/svg/SVG.xsd"),
        //
-       DOCBOOK_5_0_1("dbk","http://docbook.org/ns/docbook","docbook.xsd","http://docbook.org/xml/5.0.1/xsd/docbook.xsd"),
+       DOCBOOK_5_0_1("dbk", "http://docbook.org/ns/docbook", "docbook.xsd",
+                       "http://docbook.org/xml/5.0.1/xsd/docbook.xsd"),
        //
        XML_EVENTS_2001("ev", "http://www.w3.org/2001/xml-events", "xml-events-attribs-1.xsd",
                        "http://www.w3.org/MarkUp/SCHEMA/xml-events-attribs-1.xsd"),
index 62148b9af354df302b12d8a63ebe7302f6fbe811..a14ada79a4ec218bd5516972f31719012752b6d4 100644 (file)
@@ -57,7 +57,7 @@ abstract class AbstractDirectoryContent extends AbstractContent {
        }
 
        @Override
-       public List<QName> getTypes() {
+       public List<QName> getContentClasses() {
                Dictionary<String, Object> properties = doGetProperties();
                List<QName> contentClasses = new ArrayList<>();
                String objectClass = properties.get(LdapAttrs.objectClass.name()).toString();
index 9c1a480ba66f1a8de030558fbbc7393036f32f69..0ec025ced2c153bfa80170bf497ed4f8cd409021 100644 (file)
@@ -66,8 +66,8 @@ class HierarchyUnitContent extends AbstractDirectoryContent {
         * TYPING
         */
        @Override
-       public List<QName> getTypes() {
-               List<QName> contentClasses = super.getTypes();
+       public List<QName> getContentClasses() {
+               List<QName> contentClasses = super.getContentClasses();
                contentClasses.add(CrName.COLLECTION.get());
                return contentClasses;
        }
index d0df8845f308a4fa5befbef1c60ef5ca953e2265..bbd77b2217c729ee5880d722a6dbf94804f60ae1 100644 (file)
@@ -305,7 +305,7 @@ public class FsContent extends AbstractContent implements ProvidedContent {
         */
 
        @Override
-       public List<QName> getTypes() {
+       public List<QName> getContentClasses() {
                List<QName> res = new ArrayList<>();
                if (Files.isDirectory(path))
                        res.add(CrName.COLLECTION.get());
index 15dfe291b701a1f395adb8aad35b6a0bc18cb45b..d2b5188f5fd5f88f93599f4876c72b251f7a0423 100644 (file)
@@ -278,7 +278,7 @@ public class DomContent extends AbstractContent implements ProvidedContent {
         * TYPING
         */
        @Override
-       public List<QName> getTypes() {
+       public List<QName> getContentClasses() {
                List<QName> res = new ArrayList<>();
                res.add(getName());
                return res;
index 7db3cdc4cfef7923fee1b407af055e85777f4ad7..6e2c6c435df469d5256ab27f4b3472710e2187e7 100644 (file)
@@ -34,9 +34,9 @@ import org.argeo.cms.auth.UserAdminUtils;
 import org.argeo.osgi.useradmin.TokenUtils;
 import org.argeo.osgi.useradmin.UserDirectory;
 import org.argeo.util.directory.DirectoryConf;
+import org.argeo.util.directory.ldap.SharedSecret;
 import org.argeo.util.naming.LdapAttrs;
 import org.argeo.util.naming.NamingUtils;
-import org.argeo.util.naming.SharedSecret;
 import org.argeo.util.transaction.WorkTransaction;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Authorization;
index 8eff6690003c014a70b947fb1d19b8e42b71ca53..4212c5f5576fa1cfec836695ac7f03bf9dcd5140 100644 (file)
@@ -25,7 +25,6 @@ import javax.naming.ldap.LdapName;
 import org.argeo.util.directory.DirectoryDigestUtils;
 import org.argeo.util.naming.LdapAttrs;
 import org.argeo.util.naming.LdapObjs;
-import org.argeo.util.naming.SharedSecret;
 
 /** An entry in an LDAP (or LDIF) directory. */
 public class DefaultLdapEntry implements LdapEntry {
diff --git a/org.argeo.util/src/org/argeo/util/directory/ldap/SharedSecret.java b/org.argeo.util/src/org/argeo/util/directory/ldap/SharedSecret.java
new file mode 100644 (file)
index 0000000..eaab167
--- /dev/null
@@ -0,0 +1,48 @@
+package org.argeo.util.directory.ldap;
+
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+import org.argeo.util.naming.NamingUtils;
+
+public class SharedSecret extends AuthPassword {
+       public final static String X_SHARED_SECRET = "X-SharedSecret";
+       private final Instant expiry;
+
+       public SharedSecret(String authInfo, String authValue) {
+               super(authInfo, authValue);
+               expiry = null;
+       }
+
+       public SharedSecret(AuthPassword authPassword) {
+               super(authPassword);
+               String authInfo = getAuthInfo();
+               if (authInfo.length() == 16) {
+                       expiry = NamingUtils.ldapDateToInstant(authInfo);
+               } else {
+                       expiry = null;
+               }
+       }
+
+       public SharedSecret(ZonedDateTime expiryTimestamp, String value) {
+               super(NamingUtils.instantToLdapDate(expiryTimestamp), value);
+               expiry = expiryTimestamp.withZoneSameInstant(ZoneOffset.UTC).toInstant();
+       }
+
+       public SharedSecret(int hours, String value) {
+               this(ZonedDateTime.now().plusHours(hours), value);
+       }
+
+       @Override
+       protected String getExpectedAuthScheme() {
+               return X_SHARED_SECRET;
+       }
+
+       public boolean isExpired() {
+               if (expiry == null)
+                       return false;
+               return expiry.isBefore(Instant.now());
+       }
+
+}
index 43cfe03b4cc76d7bd1b6223f698a43f8eaaa4141..5253579e428313db8b1883c681e800fab6d5aec2 100644 (file)
@@ -9,7 +9,7 @@ import java.util.function.Supplier;
  * "https://github.com/krb5/krb5/blob/master/src/plugins/kdb/ldap/libkdb_ldap/kerberos.schema">Kerberos
  * LDAP (partial)</a>
  */
-public enum LdapAttrs implements SpecifiedName, Supplier<String> {
+public enum LdapAttrs implements SpecifiedName, Supplier<String>, QNamed {
        /** */
        uid("0.9.2342.19200300.100.1.1", "RFC 4519"),
        /** */
@@ -309,14 +309,6 @@ public enum LdapAttrs implements SpecifiedName, Supplier<String> {
                return spec;
        }
 
-       public String getPrefix() {
-               return prefix();
-       }
-
-       public static String prefix() {
-               return "ldap";
-       }
-
        @Deprecated
        public String property() {
                return get();
@@ -328,16 +320,18 @@ public enum LdapAttrs implements SpecifiedName, Supplier<String> {
        }
 
        public String get() {
-               String prefix = getPrefix();
+               String prefix = getDefaultPrefix();
                return prefix != null ? prefix + ":" + name() : name();
        }
 
-       public String getNamespace() {
-               return namespace();
+       @Override
+       public String getDefaultPrefix() {
+               return LdapObjs.LDAP_DEFAULT_PREFIX;
        }
 
-       public static String namespace() {
-               return "http://www.argeo.org/ns/ldap";
+       @Override
+       public String getNamespace() {
+               return LdapObjs.LDAP_NAMESPACE_URI;
        }
 
        @Override
index c616d1491de4358b40d6a6872cbe8c80654220c5..6dcb3e9eb4a829d6fcfcae8ebea953153217f8ab 100644 (file)
@@ -5,7 +5,7 @@ package org.argeo.util.naming;
  * <a href="https://www.ldap.com/ldap-oid-reference">https://www.ldap.com/ldap-
  * oid-reference</a>
  */
-public enum LdapObjs implements SpecifiedName {
+public enum LdapObjs implements SpecifiedName, QNamed {
        account("0.9.2342.19200300.100.4.5", "RFC 4524"),
        /** */
        document("0.9.2342.19200300.100.4.6", "RFC 4524"),
@@ -91,7 +91,12 @@ public enum LdapObjs implements SpecifiedName {
        /** */
        referral("2.16.840.1.113730.3.2.6", "RFC 3296");
 
-       private final static String LDAP_ = "ldap:";
+       /** MUST be equal to ContentRepository LDAP namespace. */
+       final static String LDAP_NAMESPACE_URI = "http://www.argeo.org/ns/ldap";
+       /** MUST be equal to ContentRepository LDAP prefix. */
+       final static String LDAP_DEFAULT_PREFIX = "ldap";
+
+       private final static String LDAP_ = LDAP_DEFAULT_PREFIX + ":";
        private final String oid, spec;
 
        private LdapObjs(String oid, String spec) {
@@ -111,4 +116,14 @@ public enum LdapObjs implements SpecifiedName {
                return new StringBuilder(LDAP_).append(name()).toString();
        }
 
+       @Override
+       public String getDefaultPrefix() {
+               return LdapObjs.LDAP_DEFAULT_PREFIX;
+       }
+
+       @Override
+       public String getNamespace() {
+               return LdapObjs.LDAP_NAMESPACE_URI;
+       }
+
 }
diff --git a/org.argeo.util/src/org/argeo/util/naming/QNamed.java b/org.argeo.util/src/org/argeo/util/naming/QNamed.java
new file mode 100644 (file)
index 0000000..9eac360
--- /dev/null
@@ -0,0 +1,36 @@
+package org.argeo.util.naming;
+
+import javax.xml.namespace.QName;
+
+/** A (possibly) qualified name. To be used in enums. */
+public interface QNamed {
+       String name();
+
+       default QName qName() {
+               return new DisplayQName(getNamespace(), name(), getDefaultPrefix());
+       }
+
+       String getNamespace();
+
+       String getDefaultPrefix();
+
+       static class DisplayQName extends QName {
+               private static final long serialVersionUID = 2376484886212253123L;
+
+               public DisplayQName(String namespaceURI, String localPart, String prefix) {
+                       super(namespaceURI, localPart, prefix);
+               }
+
+               public DisplayQName(String localPart) {
+                       super(localPart);
+               }
+
+               @Override
+               public String toString() {
+                       String prefix = getPrefix();
+                       assert prefix != null;
+                       return "".equals(prefix) ? getLocalPart() : prefix + ":" + getLocalPart();
+               }
+
+       }
+}
diff --git a/org.argeo.util/src/org/argeo/util/naming/SharedSecret.java b/org.argeo.util/src/org/argeo/util/naming/SharedSecret.java
deleted file mode 100644 (file)
index 7661d4c..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.argeo.util.naming;
-
-import java.time.Instant;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
-
-import org.argeo.util.directory.ldap.AuthPassword;
-
-public class SharedSecret extends AuthPassword {
-       public final static String X_SHARED_SECRET = "X-SharedSecret";
-       private final Instant expiry;
-
-       public SharedSecret(String authInfo, String authValue) {
-               super(authInfo, authValue);
-               expiry = null;
-       }
-
-       public SharedSecret(AuthPassword authPassword) {
-               super(authPassword);
-               String authInfo = getAuthInfo();
-               if (authInfo.length() == 16) {
-                       expiry = NamingUtils.ldapDateToInstant(authInfo);
-               } else {
-                       expiry = null;
-               }
-       }
-
-       public SharedSecret(ZonedDateTime expiryTimestamp, String value) {
-               super(NamingUtils.instantToLdapDate(expiryTimestamp), value);
-               expiry = expiryTimestamp.withZoneSameInstant(ZoneOffset.UTC).toInstant();
-       }
-
-       public SharedSecret(int hours, String value) {
-               this(ZonedDateTime.now().plusHours(hours), value);
-       }
-
-       @Override
-       protected String getExpectedAuthScheme() {
-               return X_SHARED_SECRET;
-       }
-
-       public boolean isExpired() {
-               if (expiry == null)
-                       return false;
-               return expiry.isBefore(Instant.now());
-       }
-
-}
index be1f30eb158a2fe752105e25906d47e141c91c44..a909dbdd7e5f940b329b4fd654f43345a972de16 100644 (file)
@@ -1,6 +1,6 @@
 package org.argeo.cms.web;
 
-import static org.argeo.util.naming.SharedSecret.X_SHARED_SECRET;
+import static org.argeo.util.directory.ldap.SharedSecret.X_SHARED_SECRET;
 
 import java.io.IOException;
 import java.security.PrivilegedAction;
@@ -35,7 +35,7 @@ import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.eclipse.ui.specific.UiContext;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.util.directory.ldap.AuthPassword;
-import org.argeo.util.naming.SharedSecret;
+import org.argeo.util.directory.ldap.SharedSecret;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.application.AbstractEntryPoint;
 import org.eclipse.rap.rwt.client.WebClient;