Introduce CMS-specific user APIs, based at this stage on OSGi UserAdmin
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / directory / DirectoryContentProvider.java
index 60ef67551a17109528ff7a9d42cbe49f6e72f70a..9af83a33072bf2fc56695beae5e992942b15fff4 100644 (file)
@@ -5,23 +5,20 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-import javax.naming.InvalidNameException;
-import javax.naming.ldap.LdapName;
 import javax.xml.namespace.QName;
 
+import org.argeo.api.acr.ArgeoNamespace;
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentName;
 import org.argeo.api.acr.ContentNotFoundException;
-import org.argeo.api.acr.CrName;
 import org.argeo.api.acr.spi.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.cms.CmsUserManager;
 import org.argeo.cms.acr.AbstractContent;
 import org.argeo.cms.acr.ContentUtils;
-import org.argeo.osgi.useradmin.HierarchyUnit;
-import org.argeo.osgi.useradmin.LdapNameUtils;
-import org.argeo.osgi.useradmin.UserDirectory;
 import org.osgi.service.useradmin.User;
 
 public class DirectoryContentProvider implements ContentProvider {
@@ -42,36 +39,42 @@ public class DirectoryContentProvider implements ContentProvider {
                List<String> segments = ContentUtils.toPathSegments(relativePath);
                if (segments.size() == 0)
                        return new UserManagerContent(session);
-               String userDirectoryDn = segments.get(0);
+               String userDirectoryName = segments.get(0);
                UserDirectory userDirectory = null;
                userDirectories: for (UserDirectory ud : userManager.getUserDirectories()) {
-                       if (userDirectoryDn.equals(ud.getBasePath())) {
+                       if (userDirectoryName.equals(ud.getName())) {
                                userDirectory = ud;
                                break userDirectories;
                        }
                }
                if (userDirectory == null)
-                       throw new ContentNotFoundException("Cannot find user directory " + userDirectoryDn);
+                       throw new ContentNotFoundException(session, mountPath + "/" + relativePath,
+                                       "Cannot find user directory " + userDirectoryName);
                if (segments.size() == 1) {
-                       return new HierarchyUnitContent(session, this, userDirectory);
+                       return new DirectoryContent(session, this, userDirectory);
                } else {
-                       LdapName dn;
-                       try {
-                               dn = LdapNameUtils.toLdapName(userDirectoryDn);
-                               for (int i = 1; i < segments.size(); i++) {
-                                       dn.add(segments.get(i));
-                               }
-                       } catch (InvalidNameException e) {
-                               throw new IllegalStateException("Cannot interpret " + segments + " as DN", e);
-                       }
-                       User user = userManager.getUser(dn.toString());
+                       List<String> relSegments = new ArrayList<>(segments);
+                       relSegments.remove(0);
+                       String pathWithinUserDirectory = ContentUtils.toPath(relSegments);
+//                     LdapName dn;
+//                     try {
+//                             dn = LdapNameUtils.toLdapName(userDirectoryDn);
+//                             for (int i = 1; i < segments.size(); i++) {
+//                                     dn.add(segments.get(i));
+//                             }
+//                     } catch (InvalidNameException e) {
+//                             throw new IllegalStateException("Cannot interpret " + segments + " as DN", e);
+//                     }
+                       User user = (User) userDirectory.getRoleByPath(pathWithinUserDirectory);
                        if (user != null) {
                                HierarchyUnit parent = userDirectory.getHierarchyUnit(user);
                                return new RoleContent(session, this, new HierarchyUnitContent(session, this, parent), user);
                        }
-                       HierarchyUnit hierarchyUnit = userDirectory.getHierarchyUnit(dn.toString());
+                       HierarchyUnit hierarchyUnit = userDirectory.getHierarchyUnit(pathWithinUserDirectory);
                        if (hierarchyUnit == null)
-                               throw new ContentNotFoundException("Cannot find " + dn);
+                               throw new ContentNotFoundException(session,
+                                               mountPath + "/" + relativePath + "/" + pathWithinUserDirectory,
+                                               "Cannot find " + pathWithinUserDirectory + " within " + userDirectoryName);
                        return new HierarchyUnitContent(session, this, hierarchyUnit);
                }
        }
@@ -89,26 +92,29 @@ public class DirectoryContentProvider implements ContentProvider {
 
        @Override
        public String getNamespaceURI(String prefix) {
-               if (CrName.LDAP_DEFAULT_PREFIX.equals(prefix))
-                       return CrName.LDAP_NAMESPACE_URI;
-               throw new IllegalArgumentException("Only prefix " + CrName.LDAP_DEFAULT_PREFIX + " is supported");
+               if (ArgeoNamespace.LDAP_DEFAULT_PREFIX.equals(prefix))
+                       return ArgeoNamespace.LDAP_NAMESPACE_URI;
+               throw new IllegalArgumentException("Only prefix " + ArgeoNamespace.LDAP_DEFAULT_PREFIX + " is supported");
        }
 
        @Override
        public Iterator<String> getPrefixes(String namespaceURI) {
-               if (CrName.LDAP_NAMESPACE_URI.equals(namespaceURI))
-                       return Collections.singletonList(CrName.LDAP_DEFAULT_PREFIX).iterator();
-               throw new IllegalArgumentException("Only namespace URI " + CrName.LDAP_NAMESPACE_URI + " is supported");
+               if (ArgeoNamespace.LDAP_NAMESPACE_URI.equals(namespaceURI))
+                       return Collections.singletonList(ArgeoNamespace.LDAP_DEFAULT_PREFIX).iterator();
+               throw new IllegalArgumentException("Only namespace URI " + ArgeoNamespace.LDAP_NAMESPACE_URI + " is supported");
        }
 
        public void setUserManager(CmsUserManager userManager) {
                this.userManager = userManager;
        }
-       
+
        UserManagerContent getRootContent(ProvidedSession session) {
                return new UserManagerContent(session);
        }
 
+       /*
+        * COMMON UTILITIES
+        */
        class UserManagerContent extends AbstractContent {
 
                public UserManagerContent(ProvidedSession session) {
@@ -134,7 +140,7 @@ public class DirectoryContentProvider implements ContentProvider {
                public Iterator<Content> iterator() {
                        List<Content> res = new ArrayList<>();
                        for (UserDirectory userDirectory : userManager.getUserDirectories()) {
-                               HierarchyUnitContent content = new HierarchyUnitContent(getSession(), DirectoryContentProvider.this,
+                               DirectoryContent content = new DirectoryContent(getSession(), DirectoryContentProvider.this,
                                                userDirectory);
                                res.add(content);
                        }