Continue refactoring of home.
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 28 Feb 2020 09:24:36 +0000 (10:24 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 28 Feb 2020 09:24:36 +0000 (10:24 +0100)
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java
org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java
org.argeo.node.api/bnd.bnd
org.argeo.node.api/src/org/argeo/node/NodeConstants.java
org.argeo.node.api/src/org/argeo/node/NodeUtils.java

index 7b3b8d9783f39588be5de067bf501062bbff262d..cf62493984f7e94da5add9bec3173f1b8e58b705 100644 (file)
@@ -102,8 +102,9 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider {
                }
 
                public boolean skipNode(Node node) throws RepositoryException {
-                       if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME)
-                                       || node.isNodeType(NodeTypes.NODE_GROUP_HOME))
+//                     if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME)
+//                                     || node.isNodeType(NodeTypes.NODE_GROUP_HOME))
+                       if (node.isNodeType(NodeType.NT_HIERARCHY_NODE))
                                return false;
                        return true;
                }
index 48b6b7fc75f3476caab9b7a9be218feca546e8cf..19117a892b2d5bb414e83e664a38f92ab1bf16f2 100644 (file)
@@ -27,7 +27,7 @@ class DataModels implements BundleListener {
 
        public DataModels(BundleContext bc) {
                for (Bundle bundle : bc.getBundles())
-                       processBundle(bundle);
+                       processBundle(bundle, null);
                bc.addBundleListener(this);
        }
 
@@ -45,7 +45,7 @@ class DataModels implements BundleListener {
        @Override
        public void bundleChanged(BundleEvent event) {
                if (event.getType() == Bundle.RESOLVED) {
-                       processBundle(event.getBundle());
+                       processBundle(event.getBundle(), null);
                } else if (event.getType() == Bundle.UNINSTALLED) {
                        BundleWiring wiring = event.getBundle().adapt(BundleWiring.class);
                        List<BundleCapability> providedDataModels = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE);
@@ -58,7 +58,9 @@ class DataModels implements BundleListener {
 
        }
 
-       protected void processBundle(Bundle bundle) {
+       protected void processBundle(Bundle bundle, List<Bundle> scannedBundles) {
+               if (scannedBundles != null && scannedBundles.contains(bundle))
+                       throw new IllegalStateException("Cycle in CMS data model requirements for " + bundle);
                BundleWiring wiring = bundle.adapt(BundleWiring.class);
                if (wiring == null) {
                        int bundleState = bundle.getState();
@@ -77,7 +79,12 @@ class DataModels implements BundleListener {
                List<BundleWire> requiredDataModels = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE);
                // process requirements first
                for (BundleWire bundleWire : requiredDataModels) {
-                       processBundle(bundleWire.getProvider().getBundle());
+                       List<Bundle> nextScannedBundles = new ArrayList<>();
+                       if (scannedBundles != null)
+                               nextScannedBundles.addAll(scannedBundles);
+                       nextScannedBundles.add(bundle);
+                       Bundle providerBundle = bundleWire.getProvider().getBundle();
+                       processBundle(providerBundle, nextScannedBundles);
                }
                for (BundleCapability bundleCapability : providedDataModels) {
                        String name = (String) bundleCapability.getAttributes().get(DataModelNamespace.NAME);
index cc7005be3850932a0a001fee778d5a7878e00cf0..4b46b2cee9c601115686b82629ee32c498fe5161 100644 (file)
@@ -21,7 +21,6 @@ import javax.security.auth.Subject;
 import javax.security.auth.login.LoginContext;
 
 import org.argeo.cms.CmsException;
-import org.argeo.jackrabbit.security.JackrabbitSecurityUtils;
 import org.argeo.jcr.JcrRepositoryWrapper;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.node.NodeConstants;
@@ -42,8 +41,8 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants {
        private SimpleDateFormat usersDatePath = new SimpleDateFormat("YYYY/MM");
 
        private String defaultHomeWorkspace = NodeConstants.HOME;
-       private String defaultGroupsWorkspace = NodeConstants.GROUPS;
-       private String defaultGuestsWorkspace = NodeConstants.GUESTS;
+       private String defaultGroupsWorkspace = NodeConstants.SRV;
+//     private String defaultGuestsWorkspace = NodeConstants.GUESTS;
        private final boolean remote;
 
        public HomeRepository(Repository repository, boolean remote) {
@@ -85,15 +84,15 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants {
                }
        }
 
-       @Override
-       public Session login(Credentials credentials, String workspaceName)
-                       throws LoginException, NoSuchWorkspaceException, RepositoryException {
-               if (workspaceName == null) {
-                       return super.login(credentials, getUserHomeWorkspace());
-               } else {
-                       return super.login(credentials, workspaceName);
-               }
-       }
+//     @Override
+//     public Session login(Credentials credentials, String workspaceName)
+//                     throws LoginException, NoSuchWorkspaceException, RepositoryException {
+//             if (workspaceName == null) {
+//                     return super.login(credentials, getUserHomeWorkspace());
+//             } else {
+//                     return super.login(credentials, workspaceName);
+//             }
+//     }
 
        protected String getUserHomeWorkspace() {
                // TODO base on JAAS Subject metadata
@@ -105,10 +104,10 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants {
                return defaultGroupsWorkspace;
        }
 
-       protected String getGuestsWorkspace() {
-               // TODO base on JAAS Subject metadata
-               return defaultGuestsWorkspace;
-       }
+//     protected String getGuestsWorkspace() {
+//             // TODO base on JAAS Subject metadata
+//             return defaultGuestsWorkspace;
+//     }
 
        @Override
        protected void processNewSession(Session session, String workspaceName) {
@@ -119,7 +118,7 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants {
                        return;
 
                String userHomeWorkspace = getUserHomeWorkspace();
-               if (workspaceName != null && !workspaceName.equals(userHomeWorkspace))
+               if (workspaceName == null || !workspaceName.equals(userHomeWorkspace))
                        return;
 
                if (checkedUsers.contains(username))
@@ -173,7 +172,10 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants {
                                userHome = adminSession.getRootNode().addNode(userId);
 //                             userHome.addMixin(NodeTypes.NODE_USER_HOME);
                                userHome.addMixin(NodeType.MIX_CREATED);
+                               userHome.addMixin(NodeType.MIX_TITLE);
                                userHome.setProperty(Property.JCR_ID, username);
+                               // TODO use display name
+                               userHome.setProperty(Property.JCR_TITLE, userId);
 //                             userHome.setProperty(NodeNames.LDAP_UID, username);
                                adminSession.save();
 
@@ -242,7 +244,9 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants {
 //                     newWorkgroup = JcrUtils.mkdirs(adminSession.getNode(groupsBasePath), relPath, NodeType.NT_UNSTRUCTURED);
 //                     newWorkgroup.addMixin(NodeTypes.NODE_GROUP_HOME);
                        newWorkgroup.addMixin(NodeType.MIX_CREATED);
+                       newWorkgroup.addMixin(NodeType.MIX_TITLE);
                        newWorkgroup.setProperty(Property.JCR_ID, dn.toString());
+                       newWorkgroup.setProperty(Property.JCR_TITLE, cn);
 //                     newWorkgroup.setProperty(NodeNames.LDAP_CN, cn);
                        adminSession.save();
                        JcrUtils.addPrivilege(adminSession, newWorkgroup.getPath(), dn.toString(), Privilege.JCR_ALL);
index 9aeb7602d8c9801ca4c43ebe76721bf727bdb027..c75d38fc88f54c18fc80414ccba8b29acd076a09 100644 (file)
@@ -46,6 +46,7 @@ import org.argeo.cms.ArgeoTypes;
 import org.argeo.cms.CmsException;
 import org.argeo.jcr.ArgeoJcrException;
 import org.argeo.jcr.JcrUtils;
+import org.argeo.node.NodeConstants;
 import org.argeo.node.NodeUtils;
 import org.argeo.node.security.PBEKeySpecCallback;
 
@@ -108,7 +109,7 @@ public class JcrKeyring extends AbstractKeyring implements ArgeoNames {
 
        private Session login() {
                try {
-                       return repository.login();
+                       return repository.login(NodeConstants.HOME);
                } catch (RepositoryException e) {
                        throw new CmsException("Cannot login key ring session", e);
                }
index 5b235f666b8e7d1221dd4b76b13f0b45089ffa37..f0bd0ceaa422e167ca5c8359f3db906f3ddcf1c5 100644 (file)
@@ -1 +1 @@
-Provide-Capability: cms.datamodel;name=node;cnd=/org/argeo/node/ldap.cnd;abstract=true
+Provide-Capability: cms.datamodel;name=ldap;cnd=/org/argeo/node/ldap.cnd;abstract=true
index 067d8c3174af7fc4d5c962f11e6a0d0824f782c1..50647de50ec720904eb74cca0343f91a923074c2 100644 (file)
@@ -24,7 +24,7 @@ public interface NodeConstants {
         */
        String NODE = "node";
        String HOME = "home";
-       String GROUPS = "groups";
+       String SRV = "groups";
        String GUESTS = "guests";
        String PUBLIC = "public";
 
index 378ec3322032a13a9d043374546d999ba72c6684..a735e181fb6b10d3cb9e1134f32fc4537d8ed049 100644 (file)
@@ -182,7 +182,7 @@ public class NodeUtils {
 
        private static void checkGroupWorkspace(Session session, String groupname) {
                String workspaceName = session.getWorkspace().getName();
-               if (!NodeConstants.GROUPS.equals(workspaceName))
+               if (!NodeConstants.SRV.equals(workspaceName))
                        throw new IllegalArgumentException(workspaceName + " is not the group workspace for group " + groupname);
        }