dlestrat 2004/12/23 08:55:23 Modified: applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt RoleMgtRenderUtil.java RoleMgtPortlet.java RoleActionForm.java RoleTreeTable.java applications/security/src/java/org/apache/jetspeed/portlets/security ChangePasswordPortlet.java applications/security/src/java/org/apache/jetspeed/portlets/security/resources RoleMgtResources.properties applications/security/src/webapp/WEB-INF/security/rolemgt role-add.jsp Added: applications/security/src/test/org/apache/jetspeed/portlets/security TestSecurityApplicationUtils.java applications/security/src/java/org/apache/jetspeed/portlets/security SecurityApplicationUtils.java SecurityApplicationResources.java Log: http://nagoya.apache.org/jira/browse/JS2-23#action_57015 Revision Changes Path 1.2 +26 -0 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleMgtRenderUtil.java Index: RoleMgtRenderUtil.java =================================================================== RCS file: /home/cvs/jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleMgtRenderUtil.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RoleMgtRenderUtil.java 29 Nov 2004 21:11:57 -0000 1.1 +++ RoleMgtRenderUtil.java 23 Dec 2004 16:55:23 -0000 1.2 @@ -24,6 +24,7 @@ import javax.faces.component.UIComponent; import org.apache.myfaces.custom.tabbedpane.HtmlPanelTabbedPane; +import org.apache.myfaces.custom.tree.HtmlTree; /** * <p> @@ -59,6 +60,31 @@ } return tabbedPane; + } + + /** + * <p> + * Utility method used to locate the tree table component. + * </p> + * + * @param component The component. + * @return The [EMAIL PROTECTED] HtmlTree}. + */ + public static HtmlTree findTree(UIComponent component) + { + HtmlTree tree = null; + + UIComponent parent = component.getParent(); + if (parent instanceof HtmlTree) + { + tree = (HtmlTree) parent; + } + else + { + tree = findTree(parent); + } + + return tree; } /** 1.2 +12 -60 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleMgtPortlet.java Index: RoleMgtPortlet.java =================================================================== RCS file: /home/cvs/jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleMgtPortlet.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RoleMgtPortlet.java 29 Nov 2004 21:11:57 -0000 1.1 +++ RoleMgtPortlet.java 23 Dec 2004 16:55:23 -0000 1.2 @@ -15,19 +15,15 @@ */ package org.apache.jetspeed.portlets.security.rolemgt; -import java.util.prefs.BackingStoreException; -import java.util.prefs.Preferences; - import javax.faces.context.FacesContext; import javax.portlet.PortletConfig; import javax.portlet.PortletException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.jetspeed.security.BasePrincipal; -import org.apache.myfaces.custom.tree.DefaultMutableTreeNode; -import org.apache.myfaces.custom.tree.model.DefaultTreeModel; -import org.apache.myfaces.custom.tree.model.TreeModel; +import org.apache.jetspeed.portlets.security.SecurityApplicationResources; +import org.apache.jetspeed.portlets.security.SecurityApplicationUtils; +import org.apache.jetspeed.security.RoleManager; import org.apache.portals.bridges.myfaces.FacesPortlet; /** @@ -35,15 +31,9 @@ */ public class RoleMgtPortlet extends FacesPortlet { - + /** The logger. */ private static final Log log = LogFactory.getLog(RoleMgtPortlet.class); - - /** Role tree table binding variable. */ - private static final String ROLE_TREE_TABLE = "roleTreeTable"; - /** The role tree model. */ - TreeModel roleTreeModel = new DefaultTreeModel(); - /** * @see javax.portlet.Portlet#init(javax.portlet.PortletConfig) */ @@ -51,10 +41,11 @@ { super.init(config); - Preferences prefs = Preferences.userRoot().node( - (BasePrincipal.PREFS_ROLE_ROOT).substring(0, (BasePrincipal.PREFS_ROLE_ROOT).length() - 1)); - - roleTreeModel = buildTreeModel(prefs); + RoleManager roleMgr = (RoleManager) getPortletContext().getAttribute(SecurityApplicationResources.CPS_ROLE_MANAGER_COMPONENT); + if (null == roleMgr) + { + throw new PortletException("Failed to find the role manager on portlet initialization."); + } } /** @@ -62,49 +53,10 @@ */ protected void preProcessFaces(FacesContext context) { - context.getExternalContext().getSessionMap().put(ROLE_TREE_TABLE, new RoleTreeTable(roleTreeModel)); - } - - /** - * <p> - * Build the tree model. - * </p> - * - * @param prefs The preferences. - * @return The tree model. - */ - private TreeModel buildTreeModel(Preferences prefs) - { - DefaultMutableTreeNode root = new DefaultMutableTreeNode(new RoleTreeItem(prefs.absolutePath(), prefs.name())); - processPreferences(prefs, root); - - return new DefaultTreeModel(root); - } - - /** - * <p> - * Recursively processes the preferences to build the role tree model. - * </p> - * - * @param prefs The preferences. - * @param parent The parent to add the role item to. - */ - protected void processPreferences(Preferences prefs, DefaultMutableTreeNode parent) - { - try - { - String[] names = prefs.childrenNames(); - for (int i = 0; i < names.length; i++) - { - Preferences childPrefs = prefs.node(names[i]); - DefaultMutableTreeNode child = new DefaultMutableTreeNode(new RoleTreeItem(childPrefs.absolutePath(), names[i])); - parent.insert(child); - processPreferences(childPrefs, child); - } - } - catch (BackingStoreException bse) + if (null == context.getExternalContext().getSessionMap().get(SecurityApplicationResources.ROLE_TREE_TABLE)) { - log.warn("can't find children of " + prefs.absolutePath(), bse); + context.getExternalContext().getSessionMap().put(SecurityApplicationResources.ROLE_TREE_TABLE, + new RoleTreeTable(SecurityApplicationUtils.buildRoleTreeModel())); } } 1.2 +69 -4 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleActionForm.java Index: RoleActionForm.java =================================================================== RCS file: /home/cvs/jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleActionForm.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RoleActionForm.java 29 Nov 2004 21:11:57 -0000 1.1 +++ RoleActionForm.java 23 Dec 2004 16:55:23 -0000 1.2 @@ -16,14 +16,40 @@ package org.apache.jetspeed.portlets.security.rolemgt; import java.io.Serializable; +import java.util.Collection; +import java.util.Map; + +import javax.faces.context.ExternalContext; +import javax.faces.context.FacesContext; +import javax.faces.el.VariableResolver; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jetspeed.portlets.security.SecurityApplicationResources; +import org.apache.jetspeed.portlets.security.SecurityApplicationUtils; +import org.apache.jetspeed.security.Role; +import org.apache.jetspeed.security.RoleManager; +import org.apache.jetspeed.security.SecurityException; +import org.apache.myfaces.custom.tree.TreeNode; +import org.apache.myfaces.custom.tree.model.DefaultTreeModel; /** * @author <a href="mailto:[EMAIL PROTECTED]">David Le Strat </a> */ public class RoleActionForm implements Serializable { + + /** The logger. */ + private static final Log log = LogFactory.getLog(RoleActionForm.class); + /** The role action form bean. */ public final static String ROLE_ACTION_FORM = "roleActionForm"; + + /** The default parent role path. */ + private final static String DEFAULT_PARENT_ROLE_PATH = "/role"; + + /** The default parent role name. */ + private final static String DEFAULT_PARENT_ROLE_NAME = "role"; /** The parent role. */ private RoleTreeItem parentRole; @@ -44,7 +70,7 @@ */ public RoleActionForm() { - this.parentRole = new RoleTreeItem("/role", "role"); + this.parentRole = new RoleTreeItem(DEFAULT_PARENT_ROLE_PATH, DEFAULT_PARENT_ROLE_NAME); } /** @@ -118,9 +144,48 @@ */ public void addRole() { - // Call the role manager. Add the role. - String newRoleFullPath = getParentRole().getFullPath() + "/" + getRoleName(); - System.out.println("******* New Full Path: " + newRoleFullPath); + ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); + Map appMap = (Map) externalContext.getApplicationMap(); + RoleManager roleMgr = (RoleManager) appMap.get(SecurityApplicationResources.CPS_ROLE_MANAGER_COMPONENT); + try + { + String roleToAddPath = getRoleName(); + // If the role to add is relative to a selected parent. + if (!getParentRole().getRoleName().equals(DEFAULT_PARENT_ROLE_NAME)) + { + roleToAddPath = getParentRole().getRoleName() + "." + roleToAddPath; + } + if (log.isDebugEnabled()) + { + log.debug("Adding role: " + roleToAddPath); + } + // Add role. + roleMgr.addRole(roleToAddPath); + // Get the newly added role. + Role addedRole = roleMgr.getRole(roleToAddPath); + // Resolve the tree table. + FacesContext facesContext = FacesContext.getCurrentInstance(); + VariableResolver vr = facesContext.getApplication().getVariableResolver(); + RoleTreeTable roleTree = (RoleTreeTable) vr.resolveVariable(facesContext, RoleTreeTable.ROLE_TREE_TABLE); + // Get the listeners registered. + Collection listeners = roleTree.getTreeModel().getTreeModelListeners(); + // TODO We could be more sophisticated and not rebuild the old tree. For now this will do. + roleTree.setTreeModel(SecurityApplicationUtils.buildRoleTreeModel()); + // Get the new tree model. + DefaultTreeModel treeModel = roleTree.getTreeModel(); + // Add the old listeners back... + treeModel.getTreeModelListeners().addAll(listeners); + // Get the index of the new node. + TreeNode parentNode = SecurityApplicationUtils.findTreeNode(roleTree, getParentRole().getFullPath()); + TreeNode childNode = SecurityApplicationUtils.findTreeNode(roleTree, addedRole.getPreferences().absolutePath()); + int [] childIndices = {treeModel.getIndexOfChild(parentNode, childNode)}; + // Send the node inserted event. + treeModel.nodesWereInserted(parentNode, childIndices); + } + catch (SecurityException se) + { + log.error("Error adding role " + getRoleName() + ". " + se); + } } } 1.2 +9 -4 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleTreeTable.java Index: RoleTreeTable.java =================================================================== RCS file: /home/cvs/jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/rolemgt/RoleTreeTable.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RoleTreeTable.java 29 Nov 2004 21:11:57 -0000 1.1 +++ RoleTreeTable.java 23 Dec 2004 16:55:23 -0000 1.2 @@ -30,6 +30,9 @@ */ public class RoleTreeTable implements Serializable { + /** The role tree table bean. */ + public final static String ROLE_TREE_TABLE = "roleTreeTable"; + private DefaultTreeModel treeModel; /** @@ -47,13 +50,15 @@ */ public RoleTreeTable() { - DefaultMutableTreeNode root = new DefaultMutableTreeNode(new RoleTreeItem("/role/XY", "XY")); + DefaultMutableTreeNode root = new DefaultMutableTreeNode(new RoleTreeItem("/role", "role")); + DefaultMutableTreeNode xy = new DefaultMutableTreeNode(new RoleTreeItem("/role/XY", "XY")); + root.insert(xy); DefaultMutableTreeNode a = new DefaultMutableTreeNode(new RoleTreeItem("/role/XY/A", "A")); - root.insert(a); + xy.insert(a); DefaultMutableTreeNode b = new DefaultMutableTreeNode(new RoleTreeItem("/role/XY/B", "B")); - root.insert(b); + xy.insert(b); DefaultMutableTreeNode c = new DefaultMutableTreeNode(new RoleTreeItem("/role/XY/C", "C")); - root.insert(c); + xy.insert(c); DefaultMutableTreeNode node = new DefaultMutableTreeNode(new RoleTreeItem("/role/XY/A/a1", "a1")); a.insert(node); 1.1 jakarta-jetspeed-2/applications/security/src/test/org/apache/jetspeed/portlets/security/TestSecurityApplicationUtils.java Index: TestSecurityApplicationUtils.java =================================================================== /* * Copyright 2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.portlets.security; import org.apache.jetspeed.portlets.security.rolemgt.RoleTreeItem; import org.apache.jetspeed.portlets.security.rolemgt.RoleTreeTable; import org.apache.myfaces.custom.tree.DefaultMutableTreeNode; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * <p> * Test case for the [EMAIL PROTECTED] SecurityApplicationUtils}. * * @author <a href="[EMAIL PROTECTED]">David Le Strat</a> */ public class TestSecurityApplicationUtils extends TestCase { /** * @param name The test name. */ public TestSecurityApplicationUtils(String name) { super(name); } /** * <p> * Start the tests. * </p> * * @param args the arguments. Not used */ public static void main(String args[]) { junit.awtui.TestRunner.main( new String[] { TestSecurityApplicationUtils.class.getName() } ); } /** * <p> * Creates the test suite. * </p> * * @return a test suite (<code>TestSuite</code>) that includes all methods * starting with "test" */ public static Test suite() { // All methods starting with "test" will be executed in the test suite. return new TestSuite(TestSecurityApplicationUtils.class); } /** * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); } /** * @see junit.framework.TestCase#tearDown() */ protected void tearDown() throws Exception { } /** * <p> * Test getNodePathDepth. * </p> */ public void testGetNodePathDepth() { String nodePath = "/role/manager/sales"; int depth = SecurityApplicationUtils.getNodePathDepth(nodePath); assertEquals(3, depth); } /** * <p> * Test getNodePathAtDepth(String nodePath, int depth). * </p> */ public void testGetNodePathAtDepth() { String nodePath = "/role/manager/sales"; String depthNodePath = SecurityApplicationUtils.getNodePathAtDepth(nodePath, 0); assertEquals("/role", depthNodePath); depthNodePath = SecurityApplicationUtils.getNodePathAtDepth(nodePath, 1); assertEquals("/role/manager", depthNodePath); depthNodePath = SecurityApplicationUtils.getNodePathAtDepth(nodePath, 2); assertEquals("/role/manager/sales", depthNodePath); } public void testFindTreeNode() { DefaultMutableTreeNode treeNode = SecurityApplicationUtils.findTreeNode(new RoleTreeTable(), "/role/XY/A/a1"); assertNotNull(treeNode); assertEquals("/role/XY/A/a1", ((RoleTreeItem) treeNode.getUserObject()).getFullPath()); } } 1.4 +2 -3 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/ChangePasswordPortlet.java Index: ChangePasswordPortlet.java =================================================================== RCS file: /home/cvs/jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/ChangePasswordPortlet.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ChangePasswordPortlet.java 25 Nov 2004 02:25:58 -0000 1.3 +++ ChangePasswordPortlet.java 23 Dec 2004 16:55:23 -0000 1.4 @@ -57,13 +57,12 @@ public static final String WHY = "why"; public static final String REQUIRED = "required"; public static final String CANCELLED = "cancelled"; - public static final String CPS_USER_MANAGER_COMPONENT = "cps:UserManager"; public void init(PortletConfig config) throws PortletException { super.init(config); - manager = (UserManager) getPortletContext().getAttribute(CPS_USER_MANAGER_COMPONENT); + manager = (UserManager) getPortletContext().getAttribute(SecurityApplicationResources.CPS_USER_MANAGER_COMPONENT); if (null == manager) { throw new PortletException("Failed to find the User Manager on portlet initialization"); 1.1 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/SecurityApplicationUtils.java Index: SecurityApplicationUtils.java =================================================================== /* * Copyright 2000-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.portlets.security; import java.util.Iterator; import java.util.StringTokenizer; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jetspeed.portlets.security.rolemgt.RoleTreeItem; import org.apache.jetspeed.portlets.security.rolemgt.RoleTreeTable; import org.apache.jetspeed.security.BasePrincipal; import org.apache.myfaces.custom.tree.DefaultMutableTreeNode; import org.apache.myfaces.custom.tree.model.DefaultTreeModel; /** * <p> * Utility class for the security application. * </p> * * @author <a href="[EMAIL PROTECTED]">David Le Strat</a> */ public class SecurityApplicationUtils { /** The logger. */ private static final Log log = LogFactory.getLog(SecurityApplicationUtils.class); /** Node path delimiter. */ private static final String PATH_DELIMITER = "/"; /** * <p> * Build the role tree model. * </p> * * @return The tree model. */ public static DefaultTreeModel buildRoleTreeModel() { DefaultTreeModel roleTreeModel = buildTreeModel(BasePrincipal.PREFS_ROLE_ROOT); return roleTreeModel; } /** * <p> * Build the tree model. * </p> * * @param prefs The preferences. * @return The tree model. */ private static DefaultTreeModel buildTreeModel(String prefsRoot) { Preferences prefs = Preferences.userRoot().node(prefsRoot.substring(0, prefsRoot.length() - 1)); DefaultMutableTreeNode root = new DefaultMutableTreeNode(new RoleTreeItem(prefs.absolutePath(), prefs.name())); processPreferences(prefs, root); return new DefaultTreeModel(root); } /** * <p> * Recursively processes the preferences to build the role tree model. * </p> * * @param prefs The preferences. * @param parent The parent to add the role item to. */ private static void processPreferences(Preferences prefs, DefaultMutableTreeNode parent) { try { String[] names = prefs.childrenNames(); for (int i = 0; i < names.length; i++) { Preferences childPrefs = prefs.node(names[i]); DefaultMutableTreeNode child = new DefaultMutableTreeNode(new RoleTreeItem(childPrefs.absolutePath(), names[i])); System.out.println("++++++ Rebuilding tree - Adding to tree: " + childPrefs.absolutePath()); parent.insert(child); processPreferences(childPrefs, child); } } catch (BackingStoreException bse) { log.warn("can't find children of " + prefs.absolutePath(), bse); } } /** * <p> * Finds a tree node in the tree model given the nodePath of the node to find. * </p> * * @param treeModel The tree model. * @param nodePath The path of the node to find. * @return The [EMAIL PROTECTED] DefaultMutableTreeNode}. */ public static DefaultMutableTreeNode findTreeNode(RoleTreeTable treeModel, String nodePath) { DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) treeModel.getTreeModel().getRoot(); int nodePathDepth = getNodePathDepth(nodePath); for (int i = 1; i < nodePathDepth; i++) { if (null != treeNode) { treeNode = findTreeNodeAtDepth(getNodePathAtDepth(nodePath, i), treeNode.children()); } } return treeNode; } /** * <p> * Finds the current child matching the sub node path where the node path is the path * matching the level of the children. * </p> * * @param nodePath The node path to find the child at. * @param children The children at the given level. * @return */ protected static DefaultMutableTreeNode findTreeNodeAtDepth(String nodePath, Iterator children) { DefaultMutableTreeNode nodeAtDepth = null; while (children.hasNext()) { DefaultMutableTreeNode currNode = (DefaultMutableTreeNode) children.next(); RoleTreeItem currItem = (RoleTreeItem) currNode.getUserObject(); if (currItem.getFullPath().equals(nodePath)) { nodeAtDepth = currNode; break; } } return nodeAtDepth; } /** * <p> * Gets a subset of the node path at the given depth. * </p> * * @param nodePath The node path. * @param depth The depth where depth starts at 0; * @return The subset of the node path. */ protected static String getNodePathAtDepth(String nodePath, int depth) { StringTokenizer tokens = new StringTokenizer(nodePath, PATH_DELIMITER); int nodeDepth = tokens.countTokens(); String nodePathAtDepth = nodePath; if (depth < nodeDepth) { nodePathAtDepth = PATH_DELIMITER; for (int i = 0; i <= depth; i ++) { nodePathAtDepth += tokens.nextToken(); if ((depth > 0) && (i <= depth - 1)) { nodePathAtDepth += PATH_DELIMITER; } } } return nodePathAtDepth; } /** * <p> * The depth represented in the node path. * </p> * * @param nodePath The node path. * @return The depth. */ protected static int getNodePathDepth(String nodePath) { StringTokenizer tokens = new StringTokenizer(nodePath, PATH_DELIMITER); return tokens.countTokens(); } } 1.1 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/SecurityApplicationResources.java Index: SecurityApplicationResources.java =================================================================== /* * Copyright 2000-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.portlets.security; /** * <p> * Common resources used by the security applications. * </p> * * @author <a href="[EMAIL PROTECTED]">David Le Strat</a> */ public class SecurityApplicationResources { /** The role manager component. */ public final static String CPS_ROLE_MANAGER_COMPONENT = "cps:RoleManager"; /** The user manager component. */ public static final String CPS_USER_MANAGER_COMPONENT = "cps:UserManager"; /** Role tree table binding variable. */ public static final String ROLE_TREE_TABLE = "roleTreeTable"; } 1.2 +2 -0 jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/resources/RoleMgtResources.properties Index: RoleMgtResources.properties =================================================================== RCS file: /home/cvs/jakarta-jetspeed-2/applications/security/src/java/org/apache/jetspeed/portlets/security/resources/RoleMgtResources.properties,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RoleMgtResources.properties 29 Nov 2004 21:11:11 -0000 1.1 +++ RoleMgtResources.properties 23 Dec 2004 16:55:23 -0000 1.2 @@ -16,6 +16,8 @@ currentRolePath = Current Role Path: currentRoleName = Current Role Name: +addRoleInfo=To add more than 1 role in the role hierarchy, use "." as a separator. E.g. manager.sales will create the role hierarchy /manager/sales. + availableUsersHeader = Available Users selectedUsersHeader = Selected Users 1.2 +2 -0 jakarta-jetspeed-2/applications/security/src/webapp/WEB-INF/security/rolemgt/role-add.jsp Index: role-add.jsp =================================================================== RCS file: /home/cvs/jakarta-jetspeed-2/applications/security/src/webapp/WEB-INF/security/rolemgt/role-add.jsp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- role-add.jsp 29 Nov 2004 21:12:45 -0000 1.1 +++ role-add.jsp 23 Dec 2004 16:55:23 -0000 1.2 @@ -28,6 +28,8 @@ <f:verbatim> </f:verbatim>
<h:outputText value="#{roleActionForm.parentRole.roleName}" /> <f:verbatim><br><br></f:verbatim> +<h:outputText value="#{roleMgtMessages['addRoleInfo']}" styleClass="portlet-msg-info" /> +<f:verbatim><br><br></f:verbatim> <h:form id="addRoleForm" name="addRoleForm"> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]