[Yanel-commits] rev 47397 - public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager

michi at wyona.com michi at wyona.com
Mon Feb 1 22:31:59 CET 2010


Author: michi
Date: 2010-02-01 22:31:59 +0100 (Mon, 01 Feb 2010)
New Revision: 47397

Modified:
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java
Log:
allow custom properties

Modified: public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java	2010-02-01 15:09:33 UTC (rev 47396)
+++ public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java	2010-02-01 21:31:59 UTC (rev 47397)
@@ -4,12 +4,17 @@
 
 package org.wyona.yanel.impl.resources.policymanager;
 
+import org.wyona.commons.xml.XMLHelper;
 import org.wyona.security.core.api.AccessManagementException;
+import org.wyona.security.core.api.Group;
+import org.wyona.security.core.api.GroupManager;
+import org.wyona.security.core.api.Identity;
 import org.wyona.security.core.api.IdentityManager;
 import org.wyona.security.core.api.Item;
 import org.wyona.security.core.api.Policy;
 import org.wyona.security.core.api.PolicyManager;
 import org.wyona.security.core.api.User;
+import org.wyona.security.core.api.UserManager;
 import org.wyona.yanel.core.attributes.viewable.View;
 import org.wyona.yanel.core.util.PathUtil;
 import org.wyona.yanel.impl.resources.BasicXMLResource;
@@ -17,6 +22,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -156,13 +162,59 @@
         }
         return new ByteArrayInputStream(sb.toString().getBytes("utf-8"));
     }
-    
+
     /**
+     * Interface/template in order to get custom properties of user or group
+     */
+    public interface SecurityItemExtraPropertiesGetter<I extends Item> {
+
+        /**
+         * Get custom properties
+         * @param item User, group, host, etc.
+         */
+        Map<String, String> getExtraProperties(I item);
+    }
+
+    /**
+     * Default implementation of getter for user
+     */
+    protected SecurityItemExtraPropertiesGetter<User> getUserExtraPropertiesGetter() {
+        return userNoExtraPropertiesGetter; 
+    }
+
+    /**
+     * Default user properties which will be used by default implementation #getUserExtraPropertiesGetter
+     */
+    private static final SecurityItemExtraPropertiesGetter<User> userNoExtraPropertiesGetter = new SecurityItemExtraPropertiesGetter<User>() {
+        @Override
+        public Map<String, String> getExtraProperties(User item) {
+            return Collections.emptyMap();// no extra properties to add for standard Yanel users
+        }
+    }; 
+
+    /**
+     * Default implementation of getter for group
+     */
+    protected SecurityItemExtraPropertiesGetter<Group> getGroupExtraPropertiesGetter() {
+        return groupNoExtraPropertiesGetter; 
+    }
+
+    /**
+     * Default group properties which will be used by default implementation #getGroupExtraPropertiesGetter
+     */
+    private static final SecurityItemExtraPropertiesGetter<Group> groupNoExtraPropertiesGetter = new SecurityItemExtraPropertiesGetter<Group>() {
+        @Override
+        public Map<String, String> getExtraProperties(Group item) {
+            return Collections.emptyMap();// no extra properties to add for standard Yanel users
+        }
+    }; 
+
+    /**
      *
      */
     private String getIdentitiesAndRightsAsXML(IdentityManager im, PolicyManager pm, String language) {
-        org.wyona.security.core.api.UserManager um = im.getUserManager();
-        org.wyona.security.core.api.GroupManager gm = im.getGroupManager();
+        UserManager um = im.getUserManager();
+        GroupManager gm = im.getGroupManager();
 
         StringBuffer sb = new StringBuffer("<?xml version=\"1.0\"?>");
         sb.append("<access-control xmlns=\"http://www.wyona.org/security/1.0\">");
@@ -177,19 +229,11 @@
 
             User[] users = refreshUsers ? um.getUsers(true) : um.getUsers();
             Arrays.sort(users, new ItemIDComparator());
-            sb.append("<users>");
-            for (int i = 0; i < users.length; i++) {
-                sb.append("<user id=\"" + users[i].getID() + "\">" + users[i].getName() + "</user>");
-            }
-            sb.append("</users>");
+            appendSecurityItemsAsXML(users, getUserExtraPropertiesGetter(), "user", sb);
 
-            org.wyona.security.core.api.Group[] groups = gm.getGroups();
+            Group[] groups = gm.getGroups();
             Arrays.sort(groups, new ItemIDComparator());
-            sb.append("<groups>");
-            for (int i = 0; i < groups.length; i++) {
-                sb.append("<group id=\"" + groups[i].getID() + "\">" + groups[i].getName() + "</group>");
-            }
-            sb.append("</groups>");
+            appendSecurityItemsAsXML(groups, getGroupExtraPropertiesGetter(), "group", sb);
 
             sb.append("<rights>");
             String[] rights = pm.getUsecases();
@@ -206,7 +250,53 @@
         sb.append("</access-control>");
         return sb.toString();
     }
-    
+
+    /**
+     * Overwrite this method in order to get namespaces
+     */
+    protected Map<String, String> getExtraXMLnamespaceDeclarations() throws Exception {
+        return Collections.emptyMap();// no extra XML namespace declarations to add for standard Yanel groups
+    }
+
+    /**
+     * Get XML for all users or groups
+     * @param items Users or groups
+     * @param itemExtraPropertiesGetter Custom properties getter
+     * @param itemXMLelementQName Element name, either user or group
+     * @param a Appendable in order to write XML
+     */
+    private <I extends Item> void appendSecurityItemsAsXML(I[] items, SecurityItemExtraPropertiesGetter<I> itemExtraPropertiesGetter, String itemXMLelementQName, Appendable a) throws Exception {
+        log.warn("DEBUG: Users or Groups ...");
+        Map<String, String> extraXMLnamespaceDeclarations = getExtraXMLnamespaceDeclarations();
+        a.append("<"+itemXMLelementQName+"s ");
+        for (Map.Entry<String, String> declaration : extraXMLnamespaceDeclarations.entrySet()) {
+            a.append("xmlns:"+declaration.getKey());
+            a.append("=\""+declaration.getValue()+"\"");
+        }
+        a.append(">");
+        for (int i = 0; i < items.length; i++) {
+            I item = items[i];
+            log.warn("DEBUG: User/Group: " + item.getName());
+            appendSecurityItemAsXML(item, itemExtraPropertiesGetter.getExtraProperties(item), itemXMLelementQName, a);
+        }
+        a.append("</"+itemXMLelementQName+"s>");
+    }
+
+    /**
+     * Get XML for one user or one group
+     */
+    private void appendSecurityItemAsXML(Item item, Map<String, String> extraItemProperties, String itemXMLelementQName, Appendable a) throws Exception {
+        a.append("<"+itemXMLelementQName+" id=\"" + item.getID() + "\"");
+        for (Map.Entry<String, String> property : extraItemProperties.entrySet()) {
+            a.append(property.getKey());//XXX: the name should be safe, so don't escape it
+            a.append("=\""+XMLHelper.replaceEntities(property.getValue())+"\"");
+        }
+        a.append(">" + item.getName() + "</"+itemXMLelementQName+">");
+    }
+
+    /**
+     *
+     */
     public class ItemIDComparator implements Comparator<Item> {
         public int compare(Item item1, Item item2) {
             try {



More information about the Yanel-commits mailing list