Start simplifying user manager edition.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 24 Sep 2022 10:39:05 +0000 (12:39 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 24 Sep 2022 10:39:05 +0000 (12:39 +0200)
org.argeo.cms/src/org/argeo/cms/CmsUserManager.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/LdapEntry.java

index c013feed67d88cffbcaf000501d9328c603ed174..728884b527c33e9eb77147d280884b92ef88b242 100644 (file)
@@ -76,8 +76,14 @@ public interface CmsUserManager {
        /** Add additional object classes to this role. */
        void addObjectClasses(Role role, Set<String> objectClasses, Map<String, Object> additionalProperties);
 
+       /** Add additional object classes to this hierarchy unit. */
+       void addObjectClasses(HierarchyUnit hierarchyUnit, Set<String> objectClasses,
+                       Map<String, Object> additionalProperties);
+
        /** Add a member to this group. */
        void addMember(Group group, Role role);
+       
+       void edit(Runnable action);
 
        /* MISCELLANEOUS */
        /** Returns the dn of a role given its local ID */
index a8a322356f45a52893a25af3c3c6c02be107d7d9..b7445633b4bc8511ce469571293e4b7e3676b53d 100644 (file)
@@ -14,6 +14,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
@@ -349,6 +350,47 @@ public class CmsUserManagerImpl implements CmsUserManager {
                }
        }
 
+       @Override
+       public void addObjectClasses(HierarchyUnit hierarchyUnit, Set<String> objectClasses,
+                       Map<String, Object> additionalProperties) {
+               try {
+                       userTransaction.begin();
+                       LdapEntry.addObjectClasses(hierarchyUnit.getProperties(), objectClasses);
+                       for (String key : additionalProperties.keySet()) {
+                               hierarchyUnit.getProperties().put(key, additionalProperties.get(key));
+                       }
+                       userTransaction.commit();
+               } catch (Exception e1) {
+                       try {
+                               if (!userTransaction.isNoTransactionStatus())
+                                       userTransaction.rollback();
+                       } catch (Exception e2) {
+                               if (log.isTraceEnabled())
+                                       log.trace("Cannot rollback transaction", e2);
+                       }
+                       throw new RuntimeException("Cannot add object classes " + objectClasses + " to " + hierarchyUnit, e1);
+               }
+       }
+
+       @Override
+       public void edit(Runnable action) {
+               Objects.requireNonNull(action);
+               try {
+                       userTransaction.begin();
+                       action.run();
+                       userTransaction.commit();
+               } catch (Exception e1) {
+                       try {
+                               if (!userTransaction.isNoTransactionStatus())
+                                       userTransaction.rollback();
+                       } catch (Exception e2) {
+                               if (log.isTraceEnabled())
+                                       log.trace("Cannot rollback transaction", e2);
+                       }
+                       throw new RuntimeException("Cannot edit", e1);
+               }
+       }
+
        @Override
        public void addMember(Group group, Role role) {
                try {
index 218e0c57e0977dd5805d49fb37903b7b9a069e80..6b6154dcc0094792d19a2d3290574b29ddbfd829 100644 (file)
@@ -374,6 +374,7 @@ public class DefaultLdapEntry implements LdapEntry {
 
                @Override
                public Object put(String key, Object value) {
+                       Objects.requireNonNull(value, "Value for key " + key + " is null");
                        try {
                                if (key == null) {
                                        // FIXME remove this "feature", a key should be specified
index 823bc9502e6eb9a57c9e51e6d381c9c29b94f9c8..4657c8798e41fdf40fe9b37110b593e041a7a14a 100644 (file)
@@ -53,4 +53,13 @@ public interface LdapEntry {
                        value = properties.get(key + ";lang-" + locale.getLanguage());
                return value;
        }
+
+       public static String toLocalizedKey(String key, Locale locale) {
+               String country = locale.getCountry();
+               if ("".equals(country)) {
+                       return key + ";lang-" + locale.getLanguage();
+               } else {
+                       return key + ";lang-" + locale.getLanguage() + "-" + locale.getCountry();
+               }
+       }
 }