Simplify and document new content provider implementation
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / directory / DirectoryContentProvider.java
index 8b6eb6bbd4b2d8e73413dfa5aaae82383f44a472..ab84aef37131b4a780fb92644f9ed4a96754161f 100644 (file)
@@ -1,15 +1,11 @@
 package org.argeo.cms.acr.directory;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-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.spi.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
@@ -17,38 +13,39 @@ import org.argeo.api.acr.spi.ProvidedSession;
 import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.api.cms.directory.UserDirectory;
-import org.argeo.cms.acr.AbstractContent;
+import org.argeo.cms.acr.AbstractSimpleContentProvider;
 import org.argeo.cms.acr.ContentUtils;
 import org.osgi.service.useradmin.User;
 
-public class DirectoryContentProvider implements ContentProvider {
-       private String mountPath;
-       private String mountName;
+/** A {@link ContentProvider} based on a {@link CmsUserManager} service. */
+public class DirectoryContentProvider extends AbstractSimpleContentProvider<CmsUserManager> {
 
-       private CmsUserManager userManager;
+       public DirectoryContentProvider(CmsUserManager service, String mountPath) {
+               super(ArgeoNamespace.LDAP_NAMESPACE_URI, ArgeoNamespace.LDAP_DEFAULT_PREFIX, service, mountPath);
+       }
 
-       public DirectoryContentProvider(String mountPath, CmsUserManager userManager) {
-               this.mountPath = mountPath;
-               List<String> mountSegments = ContentUtils.toPathSegments(mountPath);
-               this.mountName = mountSegments.get(mountSegments.size() - 1);
-               this.userManager = userManager;
+       @Override
+       protected Iterator<Content> firstLevel(ProvidedSession session) {
+               List<Content> res = new ArrayList<>();
+               for (UserDirectory userDirectory : getService().getUserDirectories()) {
+                       DirectoryContent content = new DirectoryContent(session, DirectoryContentProvider.this, userDirectory);
+                       res.add(content);
+               }
+               return res.iterator();
        }
 
        @Override
-       public ProvidedContent get(ProvidedSession session, String relativePath) {
-               List<String> segments = ContentUtils.toPathSegments(relativePath);
-               if (segments.size() == 0)
-                       return new UserManagerContent(session);
+       public ProvidedContent get(ProvidedSession session, List<String> segments) {
                String userDirectoryName = segments.get(0);
                UserDirectory userDirectory = null;
-               userDirectories: for (UserDirectory ud : userManager.getUserDirectories()) {
+               userDirectories: for (UserDirectory ud : getService().getUserDirectories()) {
                        if (userDirectoryName.equals(ud.getName())) {
                                userDirectory = ud;
                                break userDirectories;
                        }
                }
                if (userDirectory == null)
-                       throw new ContentNotFoundException(session, mountPath + "/" + relativePath,
+                       throw new ContentNotFoundException(session, getMountPath() + "/" + ContentUtils.toPath(segments),
                                        "Cannot find user directory " + userDirectoryName);
                if (segments.size() == 1) {
                        return new DirectoryContent(session, this, userDirectory);
@@ -73,7 +70,7 @@ public class DirectoryContentProvider implements ContentProvider {
                        HierarchyUnit hierarchyUnit = userDirectory.getHierarchyUnit(pathWithinUserDirectory);
                        if (hierarchyUnit == null)
                                throw new ContentNotFoundException(session,
-                                               mountPath + "/" + relativePath + "/" + pathWithinUserDirectory,
+                                               getMountPath() + "/" + ContentUtils.toPath(segments) + "/" + pathWithinUserDirectory,
                                                "Cannot find " + pathWithinUserDirectory + " within " + userDirectoryName);
                        return new HierarchyUnitContent(session, this, hierarchyUnit);
                }
@@ -81,75 +78,19 @@ public class DirectoryContentProvider implements ContentProvider {
 
        @Override
        public boolean exists(ProvidedSession session, String relativePath) {
-               // TODO Auto-generated method stub
-               return false;
-       }
-
-       @Override
-       public String getMountPath() {
-               return mountPath;
-       }
-
-       @Override
-       public String getNamespaceURI(String prefix) {
-               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 (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;
+               // TODO optimise?
+               return exists(session, relativePath);
        }
 
-       public CmsUserManager getUserManager() {
-               return userManager;
-       }
+//     public void setUserManager(CmsUserManager userManager) {
+//             this.userManager = userManager;
+//     }
 
-       UserManagerContent getRootContent(ProvidedSession session) {
-               return new UserManagerContent(session);
+       CmsUserManager getUserManager() {
+               return getService();
        }
 
-       /*
-        * COMMON UTILITIES
-        */
-       class UserManagerContent extends AbstractContent {
-
-               public UserManagerContent(ProvidedSession session) {
-                       super(session);
-               }
-
-               @Override
-               public ContentProvider getProvider() {
-                       return DirectoryContentProvider.this;
-               }
-
-               @Override
-               public QName getName() {
-                       return new ContentName(mountName);
-               }
-
-               @Override
-               public Content getParent() {
-                       return null;
-               }
-
-               @Override
-               public Iterator<Content> iterator() {
-                       List<Content> res = new ArrayList<>();
-                       for (UserDirectory userDirectory : userManager.getUserDirectories()) {
-                               DirectoryContent content = new DirectoryContent(getSession(), DirectoryContentProvider.this,
-                                               userDirectory);
-                               res.add(content);
-                       }
-                       return res.iterator();
-               }
-
+       ServiceContent getRootContent(ProvidedSession session) {
+               return new ServiceContent(session);
        }
 }