Working JCR based preferences
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 3 Oct 2011 14:29:48 +0000 (14:29 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 3 Oct 2011 14:29:48 +0000 (14:29 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4787 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

14 files changed:
demo/plugins/org.argeo.demo.i18n/META-INF/MANIFEST.MF
demo/plugins/org.argeo.demo.i18n/META-INF/spring/editors.xml
demo/plugins/org.argeo.demo.i18n/META-INF/spring/jcr.xml [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/META-INF/spring/osgi.xml
demo/plugins/org.argeo.demo.i18n/plugin.xml
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/preferences/LocaleSettingsPage.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrPreferenceStore.java
security/runtime/org.argeo.security.jackrabbit/src/main/java/org/argeo/security/jackrabbit/ArgeoSecurityManager.java
server/plugins/org.argeo.jcr.ui.explorer/META-INF/MANIFEST.MF
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/editors/NodeRightsManagementPage.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/JackrabbitAuthorizations.java
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoTypes.java
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java
server/runtime/org.argeo.server.jcr/src/main/resources/org/argeo/jcr/argeo.cnd

index 6ba788ac8e1dc784622310ce1a3c4104f70cd7fe..68d10e5b01e11e32373a864b28a9fe5a30cb6608 100644 (file)
@@ -13,12 +13,15 @@ Require-Bundle: org.eclipse.ui;resolution:=optional,
  org.eclipse.core.runtime;resolution:=optional,
  org.eclipse.rap.ui;resolution:=optional,
  org.eclipse.rap.ui.workbench;resolution:=optional
-Import-Package: org.apache.commons.io,
+Import-Package: javax.jcr;version="2.0.0",
+ org.apache.commons.io,
  org.apache.commons.logging,
  org.argeo,
  org.argeo.eclipse.spring,
  org.argeo.eclipse.ui,
+ org.argeo.eclipse.ui.jcr,
  org.argeo.eclipse.ui.utils,
+ org.argeo.jcr.spring,
  org.eclipse.ui.forms,
  org.eclipse.ui.forms.editor,
  org.eclipse.ui.forms.widgets
index 6d0951720aca75d16d26345d7c2abe8a20d799dd..12c9c3b99b6776bbb014af9a88a8eb13e8c88b01 100644 (file)
@@ -8,4 +8,14 @@
        <bean id="simpleMultitabEditor" class="org.argeo.demo.i18n.editors.SimpleMultitabEditor"
                scope="prototype">
        </bean>
+
+       <!-- Preferences -->
+       <bean id="localeSettingsPage" class="org.argeo.demo.i18n.preferences.LocaleSettingsPage"
+               scope="prototype">
+               <!-- TODO: internationalize -->
+               <property name="description"
+                       value="A demonstration of a preference page implementation" />
+               <property name="preferenceStore" ref="jcrPreferenceStore" />
+       </bean>
+
 </beans>
diff --git a/demo/plugins/org.argeo.demo.i18n/META-INF/spring/jcr.xml b/demo/plugins/org.argeo.demo.i18n/META-INF/spring/jcr.xml
new file mode 100644 (file)
index 0000000..11986aa
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
+
+       <bean id="nodeSession" class="org.argeo.jcr.spring.ThreadBoundSession">
+               <property name="repository" ref="nodeRepository" />
+       </bean>
+
+       <bean id="jcrPreferenceStore" init-method="init"
+               class="org.argeo.eclipse.ui.jcr.JcrPreferenceStore" scope="prototype">
+               <property name="session" ref="nodeSession" />
+               <property name="bundleContext" ref="bundleContext" />
+       </bean>
+
+       <!-- <bean id="jcrKeyring" class="org.argeo.jcr.security.JcrKeyring"> -->
+       <!-- <property name="session" ref="nodeSession" /> -->
+       <!-- <property name="defaultCallbackHandler" ref="defaultCallbackHandler" 
+               /> -->
+       <!-- </bean> -->
+
+</beans>
index 83ab12d74f499aef77748b7fbd71ee6f6aafae4e..14ce7af5ec4cd39da6f480e7d731e347826fc150 100644 (file)
@@ -8,4 +8,7 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"\r
        osgi:default-timeout="30000">\r
 \r
+       <reference id="nodeRepository" interface="javax.jcr.Repository"\r
+               filter="(argeo.jcr.repository.alias=node)" />\r
+\r
 </beans:beans>
\ No newline at end of file
index b7a16db6055e447750f5582f8f67c7ff8cb7f907..0b7bd09979605d9775e572deaf4b311e0a4c240a 100644 (file)
@@ -70,7 +70,7 @@
        <extension
        point="org.eclipse.ui.preferencePages">
                <page 
-                       class="org.argeo.demo.i18n.preferences.LocaleSettingsPage"
+                       class="org.argeo.eclipse.spring.SpringExtensionFactory"
                        id="org.argeo.demo.i18n.localeSettingsPage"
                        name="%LocaleSettingsPage_Title">
                </page>
index 50df00f5a0e1b9fabb026cb0eae685c33fcfb117..fa6e34dccafe8a42538fc0c7245196d84abcbdeb 100644 (file)
@@ -1,6 +1,5 @@
 package org.argeo.demo.i18n.preferences;
 
-import org.argeo.demo.i18n.I18nDemoPlugin;
 import org.eclipse.jface.preference.BooleanFieldEditor;
 import org.eclipse.jface.preference.FieldEditorPreferencePage;
 import org.eclipse.jface.preference.RadioGroupFieldEditor;
@@ -31,7 +30,6 @@ public class LocaleSettingsPage extends FieldEditorPreferencePage implements
 
        @Override
        public void init(IWorkbench workbench) {
-               setPreferenceStore(I18nDemoPlugin.getDefault().getPreferenceStore());
-               setDescription("A demonstration of a preference page implementation");
        }
+
 }
index f8dc23f47c2b6bab131ade2c4e37c6ddb9919d29..1018ddd29774846b7d8eba3c243a0b8c27f52f69 100644 (file)
@@ -10,30 +10,60 @@ import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.version.VersionManager;
 
 import org.apache.commons.io.IOUtils;
 import org.argeo.ArgeoException;
 import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.ArgeoTypes;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.jface.preference.PreferenceStore;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+import org.osgi.framework.BundleContext;
 
-/** Persist preferences as key/value pairs under ~/argeo:preferences */
-public class JcrPreferenceStore extends PreferenceStore {
+/**
+ * Persist preferences as key/value pairs under ~/argeo:preferences.<br>
+ * TODO: better integrate JCR and Eclipse:<br>
+ * - typing<br>
+ * - use eclipse preferences<br>
+ * - better integrate with {@link ScopedPreferenceStore} provided by RAP
+ */
+public class JcrPreferenceStore extends PreferenceStore implements ArgeoNames {
        private Session session;
+       private BundleContext bundleContext;
 
        /** Retrieves the preference node */
        protected Node getPreferenceNode() {
                try {
+                       if (session.hasPendingChanges())
+                               session.save();
                        Node userHome = JcrUtils.getUserHome(session);
+                       if (userHome == null)
+                               throw new ArgeoException("No user home for "
+                                               + session.getUserID());
                        Node preferences;
-                       if (!userHome.hasNode(ArgeoNames.ARGEO_PREFERENCES)) {
-                               preferences = userHome.addNode(ArgeoNames.ARGEO_PREFERENCES);
+                       if (!userHome.hasNode(ARGEO_PREFERENCES)) {
+                               preferences = userHome.addNode(ARGEO_PREFERENCES);
+                               preferences.addMixin(ArgeoTypes.ARGEO_PREFERENCE_NODE);
                                session.save();
-                       } else {
-                               preferences = userHome.getNode(ArgeoNames.ARGEO_PREFERENCES);
-                       }
-                       return preferences;
+                       } else
+                               preferences = userHome.getNode(ARGEO_PREFERENCES);
+
+                       String pluginPreferencesName = bundleContext.getBundle()
+                                       .getSymbolicName();
+                       Node pluginPreferences;
+                       if (!preferences.hasNode(pluginPreferencesName)) {
+                               VersionManager vm = session.getWorkspace().getVersionManager();
+                               vm.checkout(preferences.getPath());
+                               pluginPreferences = preferences.addNode(pluginPreferencesName);
+                               pluginPreferences.addMixin(ArgeoTypes.ARGEO_PREFERENCE_NODE);
+                               session.save();
+                               vm.checkin(preferences.getPath());
+                       } else
+                               pluginPreferences = preferences.getNode(pluginPreferencesName);
+                       return pluginPreferences;
                } catch (RepositoryException e) {
+                       e.printStackTrace();
                        JcrUtils.discardQuietly(session);
                        throw new ArgeoException("Cannot retrieve preferences", e);
                }
@@ -49,7 +79,7 @@ public class JcrPreferenceStore extends PreferenceStore {
                        PropertyIterator it = getPreferenceNode().getProperties();
                        while (it.hasNext()) {
                                Property p = it.nextProperty();
-                               if (!p.isMultiple()) {
+                               if (!p.isMultiple() && !p.getDefinition().isProtected()) {
                                        props.setProperty(p.getName(), p.getValue().getString());
                                }
                        }
@@ -58,6 +88,7 @@ public class JcrPreferenceStore extends PreferenceStore {
                        in = new ByteArrayInputStream(out.toByteArray());
                        load(in);
                } catch (Exception e) {
+                       e.printStackTrace();
                        throw new ArgeoException("Cannot load preferences", e);
                } finally {
                        IOUtils.closeQuietly(in);
@@ -69,31 +100,48 @@ public class JcrPreferenceStore extends PreferenceStore {
        public void save() throws IOException {
                ByteArrayOutputStream out = null;
                ByteArrayInputStream in = null;
-               Node preferences = null;
+               Node pluginPreferences = null;
                try {
                        out = new ByteArrayOutputStream();
                        save(out, "");
                        in = new ByteArrayInputStream(out.toByteArray());
                        Properties props = new Properties();
                        props.load(in);
-                       preferences = getPreferenceNode();
+                       pluginPreferences = getPreferenceNode();
+                       VersionManager vm = pluginPreferences.getSession().getWorkspace()
+                                       .getVersionManager();
+                       vm.checkout(pluginPreferences.getPath());
                        for (Object key : props.keySet()) {
                                String name = key.toString();
                                String value = props.getProperty(name);
-                               preferences.setProperty(name, value);
+                               pluginPreferences.setProperty(name, value);
                        }
-                       preferences.getSession().save();
+                       JcrUtils.updateLastModified(pluginPreferences);
+                       pluginPreferences.getSession().save();
+                       vm.checkin(pluginPreferences.getPath());
                } catch (Exception e) {
-                       JcrUtils.discardUnderlyingSessionQuietly(preferences);
-                       throw new ArgeoException("Cannot load preferences", e);
+                       JcrUtils.discardUnderlyingSessionQuietly(pluginPreferences);
+                       throw new ArgeoException("Cannot save preferences", e);
                } finally {
                        IOUtils.closeQuietly(in);
                        IOUtils.closeQuietly(out);
                }
        }
 
+       public void init() {
+               try {
+                       load();
+               } catch (IOException e) {
+                       throw new ArgeoException("Cannot initialize preference store", e);
+               }
+       }
+
        public void setSession(Session session) {
                this.session = session;
        }
 
+       public void setBundleContext(BundleContext bundleContext) {
+               this.bundleContext = bundleContext;
+       }
+
 }
index bf33b8a2808369f5e0795f465aaba9620a0d3d66..c68a0c9785637d14693b932c0ffc40ffc87ef5cb 100644 (file)
@@ -2,15 +2,18 @@ package org.argeo.security.jackrabbit;
 
 import java.security.Principal;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.jcr.Node;
+import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.security.AccessControlList;
-import javax.jcr.security.AccessControlManager;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
 import javax.jcr.security.AccessControlPolicy;
 import javax.jcr.security.AccessControlPolicyIterator;
 import javax.jcr.security.Privilege;
@@ -18,6 +21,9 @@ import javax.security.auth.Subject;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlPolicy;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.api.security.user.UserManager;
@@ -100,35 +106,44 @@ public class ArgeoSecurityManager extends DefaultSecurityManager {
                String userId = "<not yet set>";
                try {
                        userId = user.getID();
-                       Node userHome = JcrUtils.getUserHome(getSystemSession(), userId);
-                       // autocreate home node?
-//                     if (userHome == null)
-//                             userHome = JcrUtils.createUserHome(getSystemSession(),
-//                                             HOME_BASE_PATH, userId);
+                       Node userHome = null;
+                       try {
+                               userHome = JcrUtils.getUserHome(getSystemSession(), userId);
+                               if (userHome == null)
+                                       userHome = JcrUtils.createUserHome(getSystemSession(),
+                                                       HOME_BASE_PATH, userId);
+                       } catch (Exception e) {
+                               // silent
+                       }
 
                        if (userHome != null) {
                                String path = userHome.getPath();
-                               AccessControlPolicy policy = null;
-                               AccessControlManager acm = getSystemSession()
+                               Principal principal = user.getPrincipal();
+
+                               JackrabbitAccessControlManager acm = (JackrabbitAccessControlManager) getSystemSession()
                                                .getAccessControlManager();
-                               AccessControlPolicyIterator policyIterator = acm
-                                               .getApplicablePolicies(path);
-                               if (policyIterator.hasNext()) {
-                                       policy = policyIterator.nextAccessControlPolicy();
-                               } else {
-                                       AccessControlPolicy[] existingPolicies = acm
-                                                       .getPolicies(path);
-                                       policy = existingPolicies[0];
-                               }
-                               if (policy instanceof AccessControlList) {
-                                       Privilege[] privileges = { acm
-                                                       .privilegeFromName(Privilege.JCR_ALL) };
-                                       ((AccessControlList) policy).addAccessControlEntry(
-                                                       user.getPrincipal(), privileges);
-                                       acm.setPolicy(path, policy);
+                               JackrabbitAccessControlPolicy[] ps = acm
+                                               .getApplicablePolicies(principal);
+                               if (ps.length == 0) {
+                                       log.warn("No ACL found for " + user);
+                                       return;
                                }
+
+                               JackrabbitAccessControlList list = (JackrabbitAccessControlList) ps[0];
+
+                               // add entry
+                               Privilege[] privileges = new Privilege[] { acm
+                                               .privilegeFromName(Privilege.JCR_ALL) };
+                               Map<String, Value> restrictions = new HashMap<String, Value>();
+                               ValueFactory vf = getSystemSession().getValueFactory();
+                               restrictions.put("rep:nodePath",
+                                               vf.createValue(path, PropertyType.PATH));
+                               restrictions.put("rep:glob", vf.createValue("*"));
+                               list.addEntry(principal, privileges, true /* allow or deny */,
+                                               restrictions);
                        }
                } catch (Exception e) {
+                       e.printStackTrace();
                        log.warn("Cannot set authorization on user node for " + userId
                                        + ": " + e.getMessage());
                }
index 4572f0a44a618cf8ef00f2a988b835b5a320a38f..49269f09fa1419324dbbd1e3a3cb981f520c8fa7 100644 (file)
@@ -15,6 +15,7 @@ Bundle-ActivationPolicy: lazy
 Import-Package: javax.jcr,
  javax.jcr.nodetype,
  javax.jcr.observation,
+ javax.jcr.security;version="2.0.0",
  javax.jcr.version,
  org.apache.commons.io,
  org.apache.commons.logging,
index e5c1752bb6ddc1e4bbb965124fb76a4b6c89ad54..d941cff192595dff41cb779e671850c1c78e4b17 100644 (file)
@@ -1,10 +1,21 @@
 package org.argeo.jcr.ui.explorer.editors;
 
 import javax.jcr.Node;
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.Privilege;
 
+import org.argeo.ArgeoException;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.ui.forms.IManagedForm;
 import org.eclipse.ui.forms.editor.FormEditor;
 import org.eclipse.ui.forms.editor.FormPage;
@@ -19,6 +30,8 @@ public class NodeRightsManagementPage extends FormPage {
 
        private Node currentNode;
 
+       private TableViewer viewer;
+
        public NodeRightsManagementPage(FormEditor editor, String title,
                        Node currentNode) {
                super(editor, "NodeRightsManagementPage", title);
@@ -26,15 +39,81 @@ public class NodeRightsManagementPage extends FormPage {
        }
 
        protected void createFormContent(IManagedForm managedForm) {
-               try {
-                       ScrolledForm form = managedForm.getForm();
-                       GridLayout twt = new GridLayout(1, false);
-                       twt.marginWidth = twt.marginHeight = 0;
-                       form.getBody().setLayout(twt);
-                       Label lbl = new Label(form.getBody(), SWT.NONE);
-                       lbl.setText("Implement this for node " + currentNode.getPath());
-               } catch (Exception e) {
-                       e.printStackTrace();
+               ScrolledForm form = managedForm.getForm();
+               form.setText("Rights");
+               FillLayout mainLayout = new FillLayout();
+               form.getBody().setLayout(mainLayout);
+               createRightsPart(form.getBody());
+       }
+
+       /** Creates the rights section */
+       protected void createRightsPart(Composite parent) {
+               Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+               table.setLinesVisible(true);
+               table.setHeaderVisible(true);
+               viewer = new TableViewer(table);
+
+               // check column
+               TableViewerColumn column = createTableViewerColumn(viewer, "checked",
+                               20);
+               column.setLabelProvider(new ColumnLabelProvider() {
+                       public String getText(Object element) {
+                               return null;
+                       }
+
+                       public Image getImage(Object element) {
+                               return null;
+                       }
+               });
+               // column.setEditingSupport(new RoleEditingSupport(rolesViewer, part));
+
+               // role column
+               column = createTableViewerColumn(viewer, "Role", 200);
+               column.setLabelProvider(new ColumnLabelProvider() {
+                       public String getText(Object element) {
+                               Privilege p = (Privilege) element;
+                               return p.getName();
+                       }
+
+                       public Image getImage(Object element) {
+                               return null;
+                       }
+               });
+               viewer.setContentProvider(new RightsContentProvider());
+               viewer.setInput(getEditorSite());
+       }
+
+       protected TableViewerColumn createTableViewerColumn(TableViewer viewer,
+                       String title, int bound) {
+               final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
+                               SWT.NONE);
+               final TableColumn column = viewerColumn.getColumn();
+               column.setText(title);
+               column.setWidth(bound);
+               column.setResizable(true);
+               column.setMoveable(true);
+               return viewerColumn;
+       }
+
+       private class RightsContentProvider implements IStructuredContentProvider {
+
+               public void dispose() {
+               }
+
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+
+               public Object[] getElements(Object inputElement) {
+                       try {
+                               AccessControlManager accessControlManager = currentNode
+                                               .getSession().getAccessControlManager();
+                               Privilege[] privileges = accessControlManager
+                                               .getPrivileges(currentNode.getPath());
+                               return privileges;
+                       } catch (Exception e) {
+                               throw new ArgeoException("Cannot retrieve rights", e);
+                       }
                }
+
        }
 }
index 8c1204c0e09b57b2296015cadd00520bf0ea7be2..3a731df58a74b9c47c5fc5c36585ebb3567d70a6 100644 (file)
@@ -17,6 +17,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
+import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.argeo.ArgeoException;
@@ -87,31 +88,37 @@ public class JackrabbitAuthorizations {
                                Group group = (Group) um.getAuthorizable(groupName);
                                if (group == null)
                                        group = um.createGroup(groupName);
-
-                               AccessControlPolicy policy = null;
-                               AccessControlPolicyIterator policyIterator = acm
-                                               .getApplicablePolicies(path);
-                               if (policyIterator.hasNext()) {
-                                       policy = policyIterator.nextAccessControlPolicy();
-                               } else {
-                                       AccessControlPolicy[] existingPolicies = acm
-                                                       .getPolicies(path);
-                                       policy = existingPolicies[0];
-                               }
-                               if (policy instanceof AccessControlList) {
-                                       ((AccessControlList) policy).addAccessControlEntry(
-                                                       group.getPrincipal(),
-                                                       privs.toArray(new Privilege[privs.size()]));
-                                       acm.setPolicy(path, policy);
-                               }
-                               if (log.isDebugEnabled())
-                                       log.debug("Added privileges " + privileges + " to "
-                                                       + groupName + " on " + path);
+                               addPrivileges(session, group, path, privs);
                        }
                }
                session.save();
        }
 
+       public static void addPrivileges(JackrabbitSession session,
+                       Authorizable authorizable, String path, List<Privilege> privs)
+                       throws RepositoryException {
+               JackrabbitAccessControlManager acm = (JackrabbitAccessControlManager) session
+                               .getAccessControlManager();
+               AccessControlPolicy policy = null;
+               AccessControlPolicyIterator policyIterator = acm
+                               .getApplicablePolicies(path);
+               if (policyIterator.hasNext()) {
+                       policy = policyIterator.nextAccessControlPolicy();
+               } else {
+                       AccessControlPolicy[] existingPolicies = acm.getPolicies(path);
+                       policy = existingPolicies[0];
+               }
+               if (policy instanceof AccessControlList) {
+                       ((AccessControlList) policy).addAccessControlEntry(
+                                       authorizable.getPrincipal(),
+                                       privs.toArray(new Privilege[privs.size()]));
+                       acm.setPolicy(path, policy);
+               }
+               if (log.isDebugEnabled())
+                       log.debug("Added privileges " + privs + " to " + authorizable
+                                       + " on " + path);
+       }
+
        public void setGroupPrivileges(Map<String, String> groupPrivileges) {
                this.groupPrivileges = groupPrivileges;
        }
index 7416759b8fae8f0bc265d7f0032694cdab4e19a2..f59c97749adc209a99ee9c8432a4beac0ac64c6a 100644 (file)
@@ -6,6 +6,7 @@ public interface ArgeoTypes {
        public final static String ARGEO_USER_HOME = "argeo:userHome";
        public final static String ARGEO_USER_PROFILE = "argeo:userProfile";
        public final static String ARGEO_REMOTE_REPOSITORY = "argeo:remoteRepository";
+       public final static String ARGEO_PREFERENCE_NODE = "argeo:preferenceNode";
 
        // tabular
        public final static String ARGEO_TABLE = "argeo:table";
index 760e6600969e9e5666468e47afe1cd230be7bc1b..d9da84ab3f0a5c8e9631407d7f9130f3e5c30c58 100644 (file)
@@ -223,6 +223,26 @@ public class JcrUtils implements ArgeoJcrConstants {
                return path.substring(index + 1);
        }
 
+       /**
+        * Routine that get the child with this name, adding id it does not already
+        * exist
+        */
+       public static Node getOrAdd(Node parent, String childName,
+                       String childPrimaryNodeType) throws RepositoryException {
+               return parent.hasNode(childName) ? parent.getNode(childName) : parent
+                               .addNode(childName, childPrimaryNodeType);
+       }
+
+       /**
+        * Routine that get the child with this name, adding id it does not already
+        * exist
+        */
+       public static Node getOrAdd(Node parent, String childName)
+                       throws RepositoryException {
+               return parent.hasNode(childName) ? parent.getNode(childName) : parent
+                               .addNode(childName);
+       }
+
        /** Creates the nodes making path, if they don't exist. */
        public static Node mkdirs(Session session, String path) {
                return mkdirs(session, path, null, null, false);
index 315e2c244daad1ab65af2f395dd1c1ff2a1d7651..48bb997c61f09b794441976011c9736accbf0e3f 100644 (file)
@@ -13,12 +13,16 @@ mixin
 - argeo:userID (STRING) m
 + argeo:profile (argeo:userProfile)
 + argeo:keyring (argeo:pbeSpec)
-+ argeo:preferences (nt:unstructured)
++ argeo:preferences (argeo:preferenceNode)
 
 [argeo:userProfile] > mix:created, mix:lastModified, mix:title, mix:versionable
 mixin
 - argeo:userID (STRING) m
 
+[argeo:preferenceNode] > mix:lastModified, mix:versionable
+mixin
++ * (argeo:preferenceNode) * version
+
 [argeo:remoteRepository] > nt:unstructured
 - argeo:uri (STRING)
 - argeo:userID (STRING)