Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.core / src / org / argeo / osgi / useradmin / AbstractUserDirectory.java
index 768610b8e22ae68262e8f8ca9d54abd5851ba70f..3f5bf850d55a890093804df97993f27f1eb809e4 100644 (file)
@@ -38,13 +38,12 @@ import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
 
 /** Base class for a {@link UserDirectory}. */
-abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
+public abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
        private final static Log log = LogFactory.getLog(AbstractUserDirectory.class);
 
        private final Hashtable<String, Object> properties;
-       private final String baseDn;
-       private final String userObjectClass;
-       private final String groupObjectClass;
+       private final LdapName baseDn;
+       private final String userObjectClass, userBase, groupObjectClass, groupBase;
 
        private final boolean readOnly;
        private final URI uri;
@@ -56,15 +55,11 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
        private String memberAttributeId = "member";
        private List<String> credentialAttributeIds = Arrays.asList(new String[] { LdifName.userPassword.name() });
 
+       // JTA
        private TransactionManager transactionManager;
-       // private TransactionSynchronizationRegistry transactionRegistry;
-       // private Xid editingTransactionXid = null;
        private WcXaResource xaResource = new WcXaResource(this);
 
-       // POSIX
-       private String homeDirectoryBase = "/home";
-
-       AbstractUserDirectory(Dictionary<String, ?> props) {
+       public AbstractUserDirectory(Dictionary<String, ?> props) {
                properties = new Hashtable<String, Object>();
                for (Enumeration<String> keys = props.keys(); keys.hasMoreElements();) {
                        String key = keys.nextElement();
@@ -81,16 +76,22 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                                throw new UserDirectoryException("Badly formatted URI " + uriStr, e);
                        }
 
-               baseDn = UserAdminConf.baseDn.getValue(properties).toString();
+               try {
+                       baseDn = new LdapName(UserAdminConf.baseDn.getValue(properties));
+               } catch (InvalidNameException e) {
+                       throw new UserDirectoryException("Badly formated base DN " + UserAdminConf.baseDn.getValue(properties), e);
+               }
                String readOnlyStr = UserAdminConf.readOnly.getValue(properties);
                if (readOnlyStr == null) {
                        readOnly = readOnlyDefault(uri);
-                       properties.put(UserAdminConf.readOnly.property(), Boolean.toString(readOnly));
+                       properties.put(UserAdminConf.readOnly.name(), Boolean.toString(readOnly));
                } else
                        readOnly = new Boolean(readOnlyStr);
 
                userObjectClass = UserAdminConf.userObjectClass.getValue(properties);
+               userBase = UserAdminConf.userBase.getValue(properties);
                groupObjectClass = UserAdminConf.groupObjectClass.getValue(properties);
+               groupBase = UserAdminConf.groupBase.getValue(properties);
        }
 
        /** Returns the groups this user is a direct member of. */
@@ -110,26 +111,18 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
 
        }
 
-       boolean isEditing() {
-               // if (editingTransactionXid == null)
-               // return false;
-               // return workingCopy.get() != null;
+       protected boolean isEditing() {
                return xaResource.wc() != null;
        }
 
        protected UserDirectoryWorkingCopy getWorkingCopy() {
-               // UserDirectoryWorkingCopy wc = workingCopy.get();
                UserDirectoryWorkingCopy wc = xaResource.wc();
                if (wc == null)
                        return null;
-               // if (wc.getXid() == null) {
-               // workingCopy.set(null);
-               // return null;
-               // }
                return wc;
        }
 
-       void checkEdit() {
+       protected void checkEdit() {
                Transaction transaction;
                try {
                        transaction = transactionManager.getTransaction();
@@ -139,28 +132,16 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                if (transaction == null)
                        throw new UserDirectoryException("A transaction needs to be active in order to edit");
                if (xaResource.wc() == null) {
-                       // UserDirectoryWorkingCopy wc = new UserDirectoryWorkingCopy(this);
                        try {
                                transaction.enlistResource(xaResource);
-                               // editingTransactionXid = wc.getXid();
-                               // workingCopy.set(wc);
                        } catch (Exception e) {
                                throw new UserDirectoryException("Cannot enlist " + xaResource, e);
                        }
                } else {
-                       // UserDirectoryWorkingCopy wc = xaResource.wc();
-                       // if (wc == null)
-                       // throw new UserDirectoryException("Transaction "
-                       // + editingTransactionXid + " already editing");
-                       // else if
-                       // (!editingTransactionXid.equals(workingCopy.get().getXid()))
-                       // throw new UserDirectoryException("Working copy Xid "
-                       // + workingCopy.get().getXid() + " inconsistent with"
-                       // + editingTransactionXid);
                }
        }
 
-       List<Role> getAllRoles(DirectoryUser user) {
+       protected List<Role> getAllRoles(DirectoryUser user) {
                List<Role> allRoles = new ArrayList<Role>();
                if (user != null) {
                        collectRoles(user, allRoles);
@@ -336,62 +317,6 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                return actuallyDeleted;
        }
 
-       // // POSIX
-       // /** Generate path for a new user home */
-       // protected String generateHomeDirectory(String username) {
-       // String base = homeDirectoryBase;
-       // int atIndex = username.indexOf('@');
-       // if (atIndex > 0) {
-       // String domain = username.substring(0, atIndex);
-       // String name = username.substring(atIndex + 1);
-       // return base + '/' + firstCharsToPath(domain, 2) + '/' + domain + '/' +
-       // firstCharsToPath(name, 2) + '/'
-       // + name;
-       // } else if (atIndex == 0 || atIndex == (username.length() - 1)) {
-       // throw new ArgeoException("Unsupported username " + username);
-       // } else {
-       // return base + '/' + firstCharsToPath(username, 2) + '/' + username;
-       // }
-       // }
-       //
-       // protected long max(String attr) {
-       // long max;
-       // try {
-       // List<DirectoryUser> users = doGetRoles(FrameworkUtil.createFilter("(" +
-       // attr + "=*)"));
-       // max = 1000;
-       // for (DirectoryUser user : users) {
-       // long uid =
-       // Long.parseLong(user.getAttributes().get(attr).get().toString());
-       // if (uid > max)
-       // max = uid;
-       // }
-       // } catch (Exception e) {
-       // throw new UserDirectoryException("Cannot get max of " + attr, e);
-       // }
-       // return max;
-       // }
-
-       // /**
-       // * Creates depth from a string (typically a username) by adding levels
-       // based
-       // * on its first characters: "aBcD",2 => a/aB
-       // */
-       // public static String firstCharsToPath(String str, Integer nbrOfChars) {
-       // if (str.length() < nbrOfChars)
-       // throw new ArgeoException("String " + str + " length must be greater or
-       // equal than " + nbrOfChars);
-       // StringBuffer path = new StringBuffer("");
-       // StringBuffer curr = new StringBuffer("");
-       // for (int i = 0; i < nbrOfChars; i++) {
-       // curr.append(str.charAt(i));
-       // path.append(curr);
-       // if (i < nbrOfChars - 1)
-       // path.append('/');
-       // }
-       // return path.toString();
-       // }
-
        // TRANSACTION
        protected void prepare(UserDirectoryWorkingCopy wc) {
 
@@ -405,10 +330,6 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
 
        }
 
-       // void clearEditingTransactionXid() {
-       // editingTransactionXid = null;
-       // }
-
        // UTILITIES
        protected LdapName toDn(String name) {
                try {
@@ -419,12 +340,11 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
        }
 
        // GETTERS
-
-       String getMemberAttributeId() {
+       protected String getMemberAttributeId() {
                return memberAttributeId;
        }
 
-       List<String> getCredentialAttributeIds() {
+       protected List<String> getCredentialAttributeIds() {
                return credentialAttributeIds;
        }
 
@@ -457,28 +377,37 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                return readOnly;
        }
 
-       UserAdmin getExternalRoles() {
+       protected UserAdmin getExternalRoles() {
                return externalRoles;
        }
 
-       public String getBaseDn() {
-               return baseDn;
+       public LdapName getBaseDn() {
+               // always clone so that the property is not modified by reference
+               return (LdapName) baseDn.clone();
        }
 
        /** dn can be null, in that case a default should be returned. */
-       protected String getUserObjectClass() {
+       public String getUserObjectClass() {
                return userObjectClass;
        }
 
+       public String getUserBase() {
+               return userBase;
+       }
+
        protected String newUserObjectClass(LdapName dn) {
                return getUserObjectClass();
        }
 
-       protected String getGroupObjectClass() {
+       public String getGroupObjectClass() {
                return groupObjectClass;
        }
 
-       public Dictionary<String, ?> getProperties() {
+       public String getGroupBase() {
+               return groupBase;
+       }
+
+       public Dictionary<String, Object> getProperties() {
                return properties;
        }