- Torque module: use by default Turbinegroup not TurbineRole from generated doSelectJoinTurbine.. method, as this will be used as key in lookup in acl roleSets.
- add groupSet to interface
- add transient avalon logger to TurbineAccessControlList and use it to check group in constructor
- use model manager to fetch global group (model manager should be set always)

git-svn-id: https://svn.apache.org/repos/asf/turbine/fulcrum/trunk/security@1891978 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java b/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java
index d8e3f0b..42461d7 100644
--- a/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java
+++ b/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java
@@ -151,7 +151,7 @@
         {

             accessControlList =

                 new TurbineAccessControlListImpl(turbineUserGroupRoleSet,

-                        groupManager, roleManager, modelManager);

+                        groupManager, roleManager, modelManager, getLogger());

         }

         catch (FulcrumSecurityException e)

         {

diff --git a/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java b/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java
index 564529b..39a68bc 100644
--- a/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java
+++ b/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlList.java
@@ -57,7 +57,7 @@
     /**

      * Retrieves a set of Roles an user is assigned in the global Group.

      *

-     * @return the set of Roles this user has within the global Group.

+     * @return the set of Roles this user has within the global Group or null.

      */

     RoleSet getRoles();

 

@@ -208,4 +208,11 @@
      * from within WebMacro/Velocity template

      */

     Group[] getAllGroups();

+

+    /**

+     * Retrieves a set of Groups an user is assigned to.

+     *

+     * @return the set of Groups this user is assigned to.

+     */

+    GroupSet getGroupSet();

 }

diff --git a/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlListImpl.java b/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlListImpl.java
index 94a1091..34b9957 100644
--- a/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlListImpl.java
+++ b/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineAccessControlListImpl.java
@@ -23,6 +23,7 @@
 import java.util.Map;

 import java.util.Set;

 

+import org.apache.avalon.framework.logger.Logger;

 import org.apache.fulcrum.security.GroupManager;

 import org.apache.fulcrum.security.RoleManager;

 import org.apache.fulcrum.security.entity.Group;

@@ -75,6 +76,9 @@
     

     /** the distinct list of permissions that this user has */

     private PermissionSet permissionSet = new PermissionSet();

+    

+    /** the Avalon logger */

+    private transient Logger logger;

 

     /**

      * Constructs a new AccessControlList.

@@ -90,21 +94,30 @@
      *            The set of user/group/role relations that this acl is built from

      * @param groupManager the Group manager

      * @param roleManager the Role manager

-     * @param modelManager he model Manager

+     * @param modelManager the model Manager

+     * @param logger 

      *

      * @throws FulcrumSecurityException if the global group cannot be retrieved

      */

     public TurbineAccessControlListImpl(

     		Set<? extends TurbineUserGroupRole> turbineUserGroupRoleSet,

-    		GroupManager groupManager, RoleManager roleManager, TurbineModelManager modelManager) throws FulcrumSecurityException

+    		GroupManager groupManager, RoleManager roleManager, TurbineModelManager modelManager, Logger logger) throws FulcrumSecurityException

     {

         this.roleSets = new HashMap<Group, RoleSet>();

         this.permissionSets = new HashMap<Group, PermissionSet>();

         this.groupManager = groupManager;

+        

+        this.logger = logger;

 

         for (TurbineUserGroupRole ugr : turbineUserGroupRoleSet)

         {

             Group group = ugr.getGroup();

+            // check if group matches

+            if (this.logger != null && this.groupManager != null && group.getClass() != this.groupManager.getGroupInstance().getClass()) {

+                this.logger.warn( "Turbine group classes do not match, some lookup might fail, check in componentConfiguration.xml. Expected class: " +

+                        this.groupManager.getGroupInstance().getClass() + ", actual class: " +group.getClass()

+            );

+            }

             groupSet.add(group);

 

             Role role = ugr.getRole();

@@ -147,13 +160,9 @@
             }

         }

         // this check might be not needed any more, required for custom group

-        if (groupManager != null)

+        if (modelManager != null)

         {

-        	this.globalGroup = groupManager.getGroupByName(modelManager.getGlobalGroupName());

-        }

-        else

-        {

-        	this.globalGroup = groupSet.getByName(TurbineModelManager.GLOBAL_GROUP_NAME);

+        	this.globalGroup = modelManager.getGlobalGroup();

         }

     }

 

@@ -176,7 +185,7 @@
     /**

      * Retrieves a set of Roles an user is assigned in the global Group.

      *

-     * @return the set of Roles this user has within the global Group.

+     * @return the set of Roles this user has within the global Group or null.

      */

     @Override

     public RoleSet getRoles()

@@ -502,11 +511,18 @@
     {

         try

         {

-            return groupManager.getAllGroups().toArray(new Group[0]);

+            return (groupManager != null)? groupManager.getAllGroups().toArray(new Group[0])

+                    : new Group[0];

         }

         catch (FulcrumSecurityException e)

         {

             return new Group[0];

         }

     }

+

+    @Override

+    public GroupSet getGroupSet()

+    {

+        return groupSet;

+    }

 }

diff --git a/api/src/test/org/apache/fulcrum/security/model/ACLFactoryTest.java b/api/src/test/org/apache/fulcrum/security/model/ACLFactoryTest.java
index 955583f..45cf646 100644
--- a/api/src/test/org/apache/fulcrum/security/model/ACLFactoryTest.java
+++ b/api/src/test/org/apache/fulcrum/security/model/ACLFactoryTest.java
@@ -46,8 +46,12 @@
 import org.apache.fulcrum.security.model.turbine.entity.impl.TurbinePermissionImpl;
 import org.apache.fulcrum.security.model.turbine.entity.impl.TurbineRoleImpl;
 import org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl;
+import org.apache.fulcrum.security.util.RoleSet;
 import org.apache.fulcrum.testcontainer.BaseUnit5Test;
 
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.junit.jupiter.api.Test;
 
@@ -97,6 +101,15 @@
         assertTrue(acl instanceof TurbineAccessControlList);
         TurbineAccessControlList tacl = (TurbineAccessControlList) acl;
         assertTrue(tacl.hasPermission(permission, group));
+        
+        RoleSet roleSet = tacl.getRoles( group );
+        assertTrue(roleSet.contains( role ), "expect group "+ group +  " has role "+ role);
+        
+        assertNull( tacl.getRoles(), "expect no role in global group");
+//        assertTrue(tacl.getAllGroups().length > 0, 
+//                "expect length for all group set:" + tacl.getAllGroups());
+        assertTrue(tacl.getGroupSet().size() > 0, 
+                "expect length for all group set:" + tacl.getAllGroups());
     }
 
     @Test
diff --git a/pom.xml b/pom.xml
index 0955318..a080c86 100644
--- a/pom.xml
+++ b/pom.xml
@@ -131,6 +131,12 @@
           <version>${turbine.log4j2.version}</version>

           <scope>test</scope>

         </dependency>

+        <dependency>

+            <groupId>org.apache.avalon.framework</groupId>

+            <artifactId>avalon-framework-api</artifactId>

+            <version>4.3.1</version>

+             <scope>provided</scope>

+           </dependency>

       </dependencies>

     </dependencyManagement>

     

diff --git a/torque/src/java/org/apache/fulcrum/security/torque/om/TorqueTurbineUserGroupRolePeerImpl.java b/torque/src/java/org/apache/fulcrum/security/torque/om/TorqueTurbineUserGroupRolePeerImpl.java
index 3b96aa5..e9e86e6 100644
--- a/torque/src/java/org/apache/fulcrum/security/torque/om/TorqueTurbineUserGroupRolePeerImpl.java
+++ b/torque/src/java/org/apache/fulcrum/security/torque/om/TorqueTurbineUserGroupRolePeerImpl.java
@@ -23,11 +23,10 @@
     /** Serial version */
     private static final long serialVersionUID = 1608546448609L;
 
-	@Override
-	public List doSelectJoinTurbineRole(Criteria criteria, Connection con) throws TorqueException {
-		return doSelectJoinTorqueTurbineRole(criteria, con);
-	}
-
-
+    @Override
+    public List doSelectJoinTurbineGroup(Criteria criteria, Connection con) throws TorqueException
+    {
+        return doSelectJoinTorqueTurbineGroup(criteria, con);
+    }
 
 }
diff --git a/torque/src/java/org/apache/fulcrum/security/torque/peer/TorqueTurbineUserGroupRolePeer.java b/torque/src/java/org/apache/fulcrum/security/torque/peer/TorqueTurbineUserGroupRolePeer.java
index 48e85df..a8e5db6 100644
--- a/torque/src/java/org/apache/fulcrum/security/torque/peer/TorqueTurbineUserGroupRolePeer.java
+++ b/torque/src/java/org/apache/fulcrum/security/torque/peer/TorqueTurbineUserGroupRolePeer.java
@@ -37,7 +37,7 @@
     extends Peer
 {
 	
-    List<T> doSelectJoinTurbineRole( Criteria criteria, Connection con ) throws TorqueException;
+    List<T> doSelectJoinTurbineGroup( Criteria criteria, Connection con ) throws TorqueException;
     
     TableMap getTableMap() throws TorqueException;
 
diff --git a/torque/src/java/org/apache/fulcrum/security/torque/peer/managers/PeerGroupManager.java b/torque/src/java/org/apache/fulcrum/security/torque/peer/managers/PeerGroupManager.java
index d5589ce..7b6756e 100644
--- a/torque/src/java/org/apache/fulcrum/security/torque/peer/managers/PeerGroupManager.java
+++ b/torque/src/java/org/apache/fulcrum/security/torque/peer/managers/PeerGroupManager.java
@@ -50,7 +50,6 @@
     {
        super.configure( conf );
        
-       // peerClassName = conf.getChild( PEER_CLASS_NAME_KEY).getValue( "org.apache.fulcrum.security.torque.om.TorqueTurbineGroupPeer" );
         peerClassName = conf.getChild( PEER_CLASS_NAME_KEY).getValue( null );
         if (peerClassName != null) {
             setPeerClassName( peerClassName );
diff --git a/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java b/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java
index e0ac6fe..fa8dc24 100644
--- a/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java
+++ b/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java
@@ -46,11 +46,11 @@
 {
     /** Serial version */
 	private static final long serialVersionUID = -7255623655281852566L;
-
+    
     /**
      * Forward reference to module generated code
      *
-     * Get a list of association objects, pre-populated with their TurbineRole
+     * Get a list of association objects, pre-populated with their TurbineGroup
      * objects.
      * 
      * Does intentionally not initialize the cache collTurbineUserGroupRoles for referenced objects. 
@@ -65,28 +65,29 @@
      * @return a list of User/Group/Role relations
      * @throws TorqueException if any database error occurs
      */
-    protected <T extends TurbineUserGroupRoleModelPeerMapper> List<T> getTurbineUserGroupRolesJoinTurbineRole(Criteria criteria, Connection con)
+    protected <T extends TurbineUserGroupRoleModelPeerMapper> List<T> getTurbineUserGroupRolesJoinTurbineGroup(Criteria criteria, Connection con)
         throws TorqueException, DataBackendException
     {
         criteria.and(TurbineUserGroupRolePeer.USER_ID, getEntityId() );
         try {
-            return (List<T>) TurbineUserGroupRolePeer.doSelectJoinTurbineRole(criteria, con);
+            return (List<T>) TurbineUserGroupRolePeer.doSelectJoinTurbineGroup(criteria, con);
         } catch (  TorqueException e) {
             throw new DataBackendException( e.getMessage(), e );
         }
     }
     
-    /* (non-Javadoc)
+    /** 
      * @see org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntityDefault#retrieveAttachedObjects(java.sql.Connection, java.lang.Boolean, java.util.List)
      */
     @Override
     public <T extends TurbineUserGroupRoleModelPeerMapper> void retrieveAttachedObjects( Connection con, Boolean lazy, List<T> ugrs ) throws DataBackendException, TorqueException
     {
-        if (!lazy ) { // !lazy
+        if (!lazy ) { 
             Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
     
             if (ugrs == null) { // default 
-                ugrs = getTurbineUserGroupRolesJoinTurbineRole(new Criteria(), con);
+                // the groups are the keys in roleset, roles are not expected to be used as keys
+                ugrs = getTurbineUserGroupRolesJoinTurbineGroup(new Criteria(), con);
             } 
     
             maptoModel( con, userGroupRoleSet, ugrs );
@@ -104,8 +105,9 @@
         if (!lazy) {
             Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
             
-            List<TurbineUserGroupRoleModelPeerMapper> ugrs = getTurbineUserGroupRolesJoinTurbineRole(new Criteria(), con);
+            List<TurbineUserGroupRoleModelPeerMapper> ugrs = getTurbineUserGroupRolesJoinTurbineGroup(new Criteria(), con);
     
+            // TODO: Need to call this too to fetch right role object? getTurbineUserGroupRolesJoinTurbineRole
             // org.apache.fulcrum.security.torque.om.TurbineUserGroupRole
             maptoModel( con, userGroupRoleSet, ugrs );
     
@@ -168,11 +170,12 @@
     
     /**
      * @param con data connection
-     * @param userGroupRoleSet U/G/R set
+     * @param userGroupRoleSet U/G/R to be set / target object
      * @param ugrs list of all ugrs
      * @throws TorqueException if data connection could not be found
      */
-    private <T extends TurbineUserGroupRoleModelPeerMapper> void maptoModel( Connection con, Set<TurbineUserGroupRole> userGroupRoleSet,
+    private <T extends TurbineUserGroupRoleModelPeerMapper> void maptoModel( Connection con, 
+            Set<TurbineUserGroupRole> userGroupRoleSet,
                              List<T> ugrs )
         throws DataBackendException
     {
diff --git a/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java b/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java
index aa136ce..cb00dd6 100644
--- a/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java
+++ b/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java
@@ -58,11 +58,11 @@
      *
      * @return a list of User/Group/Role relations
      */
-    protected List<TorqueTurbineUserGroupRole> getTorqueTurbineUserGroupRolesJoinTorqueTurbineRole(Criteria criteria, Connection con)
+    protected List<TorqueTurbineUserGroupRole> getTorqueTurbineUserGroupRolesJoinTorqueTurbineGroup(Criteria criteria, Connection con)
         throws TorqueException
     {
         criteria.and(TorqueTurbineUserGroupRolePeer.USER_ID, getEntityId() );
-        return TorqueTurbineUserGroupRolePeer.doSelectJoinTorqueTurbineRole(criteria, con);
+        return TorqueTurbineUserGroupRolePeer.doSelectJoinTorqueTurbineGroup(criteria, con);
     }
     
     /* (non-Javadoc)
@@ -84,7 +84,7 @@
         try {
             if (!lazy) {
                 Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
-                List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineRole(new Criteria(), con);
+                List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineGroup(new Criteria(), con);
         
                 for (TorqueTurbineUserGroupRole ttugr : ugrs)
                 {
diff --git a/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineUserManagerImpl.java b/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineUserManagerImpl.java
index 0487ac2..54f4001 100644
--- a/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineUserManagerImpl.java
+++ b/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineUserManagerImpl.java
@@ -347,7 +347,7 @@
                   Criteria criteria = new Criteria();
                   // expecting the same name in any custom implementation
                   criteria.where(peerInstance.getTableMap().getColumn(getColumnName4UserGroupRole() ), ( (TorqueAbstractSecurityEntity) user ).getEntityId() );                        
-                  List<TurbineUserGroupRoleModelPeerMapper> ugrs = peerInstance.doSelectJoinTurbineRole( criteria, con );
+                  List<TurbineUserGroupRoleModelPeerMapper> ugrs = peerInstance.doSelectJoinTurbineGroup( criteria, con );
                   
                   if (user instanceof TorqueAbstractTurbineTurbineSecurityEntityDefault) {
                       ((TorqueAbstractTurbineTurbineSecurityEntityDefault)user).retrieveAttachedObjects(con, false, ugrs);