You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@turbine.apache.org by gk...@apache.org on 2017/12/14 14:28:25 UTC

svn commit: r1818135 - in /turbine/fulcrum/trunk/security: api/src/java/org/apache/fulcrum/security/model/turbine/ api/src/java/org/apache/fulcrum/security/model/turbine/entity/ api/src/test/org/apache/fulcrum/security/model/turbine/test/ torque/src/ja...

Author: gk
Date: Thu Dec 14 14:28:25 2017
New Revision: 1818135

URL: http://svn.apache.org/viewvc?rev=1818135&view=rev
Log:
- added lazy loading option if retrieving attachedObjects. If, where and how lazy loading is used the managers decide.
 
By default torque group and role managers use it, while permission, user, basic, dynamic managers not. Configurable with attribute lazy per manager.
for this reason the TorqueAbstractTurbineTurbineSecurityEntity methods (getUserGroupRoleSet) may throw a DataBackendException.

Added:
    turbine/fulcrum/trunk/security/torque/src/test/TurbineDefaultLazyWithPeersComponentConfig.xml   (with props)
    turbine/fulcrum/trunk/security/torque/src/test/org/apache/fulcrum/security/torque/turbine/TurbineDefaultModelManagerLazyTest.java   (with props)
Modified:
    turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/AbstractTurbineModelManager.java
    turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java
    turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineModelManager.java
    turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/entity/TurbineUserGroupRoleEntity.java
    turbine/fulcrum/trunk/security/api/src/test/org/apache/fulcrum/security/model/turbine/test/AbstractTurbineModelManagerTest.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractGroupManager.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractPermissionManager.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractRoleManager.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractUserManager.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicGroup.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicUser.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicGroup.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicPermission.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicRole.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicUser.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/TorqueAbstractSecurityEntity.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/turbine/TorqueAbstractTurbineTurbineSecurityEntity.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineGroup.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbinePermission.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineRole.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineGroup.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbinePermission.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineRole.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineGroupManagerImpl.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineModelManagerImpl.java
    turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineRoleManagerImpl.java

Modified: turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/AbstractTurbineModelManager.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/AbstractTurbineModelManager.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/AbstractTurbineModelManager.java (original)
+++ turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/AbstractTurbineModelManager.java Thu Dec 14 14:28:25 2017
@@ -25,6 +25,7 @@ import org.apache.fulcrum.security.entit
 import org.apache.fulcrum.security.entity.Permission;
 import org.apache.fulcrum.security.entity.Role;
 import org.apache.fulcrum.security.entity.User;
+import org.apache.fulcrum.security.model.turbine.entity.TurbineGroup;
 import org.apache.fulcrum.security.model.turbine.entity.TurbineRole;
 import org.apache.fulcrum.security.model.turbine.entity.TurbineUser;
 import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole;
@@ -45,7 +46,12 @@ public abstract class AbstractTurbineMod
 {
 	
     
-	private String globalGroupName;
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    
+    private String globalGroupName;
 	// ---------------- Avalon Lifecycle Methods ---------------------
     /**
      * Avalon component lifecycle method
@@ -89,7 +95,7 @@ public abstract class AbstractTurbineMod
     }
 
     /**
-     * Revokes all permissions and groups from a Role.
+     * Revokes all permissions from a Role.
      * 
      * This method is used when deleting a Role.
      * 
@@ -152,7 +158,39 @@ public abstract class AbstractTurbineMod
         {
             throw new UnknownEntityException("Unknown user '" + user.getName() + "'");
         }
+    }
+    
+    /**
+     * Revokes all roles and users from a Group.
+     * 
+     * This method is used when deleting a User.
+     * 
+     * @param group
+     *            the Group
+     * @throws DataBackendException
+     *             if there was an error accessing the data backend.
+     * @throws UnknownEntityException
+     *             if the Group is not present.
+     */
+    @Override
+    public synchronized void revokeAll(Group group) throws DataBackendException, UnknownEntityException
+    {
+        boolean groupExists = false;
+        groupExists = getGroupManager().checkExists(group);
+        if (groupExists)
+        {
 
+            Object userGroupRoles[] = ((TurbineGroup) group).getUserGroupRoleSet().toArray();
+            for (Object userGroupRole : userGroupRoles)
+            {
+                TurbineUserGroupRole ugr = (TurbineUserGroupRole) userGroupRole;
+                revoke(ugr.getUser(), group, ugr.getRole());
+            }
+        }
+        else
+        {
+            throw new UnknownEntityException("Unknown group '" + group.getName() + "'");
+        }
     }
 
 	@Override

Modified: turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java (original)
+++ turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineACLFactory.java Thu Dec 14 14:28:25 2017
@@ -74,11 +74,11 @@ public class TurbineACLFactory extends A
     @Override
     public <T extends AccessControlList> T getAccessControlList(User user)
     {
-    	TurbineUser tu = (TurbineUser)user;
-    	Set<TurbineUserGroupRole> tugr = tu.getUserGroupRoleSet();
-
         try
         {
+            TurbineUser tu = (TurbineUser)user;
+            Set<TurbineUserGroupRole> tugr = tu.getUserGroupRoleSet();
+            
             @SuppressWarnings("unchecked")
 			T aclInstance = (T) getAclInstance(tugr);
 			return aclInstance;
@@ -87,6 +87,10 @@ public class TurbineACLFactory extends A
         {
             throw new RuntimeException(uue.getMessage(), uue);
         }
+        catch ( DataBackendException e )
+        {
+            throw new RuntimeException(e.getMessage(), e);
+        }
     }
 
     /**

Modified: turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineModelManager.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineModelManager.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineModelManager.java (original)
+++ turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/TurbineModelManager.java Thu Dec 14 14:28:25 2017
@@ -83,9 +83,10 @@ public interface TurbineModelManager ext
      * @throws DataBackendException
      *             if there was an error accessing the data backend.
      * @throws UnknownEntityException
-     *             if the user or group is not present.
+     *             if the role or permission is not present.
      */
     void revoke(Role role, Permission permission) throws DataBackendException, UnknownEntityException;
+    
 
     /**
      * Revokes all roles from an User.
@@ -114,6 +115,20 @@ public interface TurbineModelManager ext
      *             if the Role is not present.
      */
     void revokeAll(Role role) throws DataBackendException, UnknownEntityException;
+    
+    /**
+     * Revokes all roles and users from a Group.
+     * 
+     * This method is typically used when deleting a Group.
+     * 
+     * @param group
+     *            the Group
+     * @throws DataBackendException
+     *             if there was an error accessing the data backend.
+     * @throws UnknownEntityException
+     *             if the Group is not present.
+     */
+    void revokeAll(Group role) throws DataBackendException, UnknownEntityException;
 
     /**
      * Grant an User a Role in a Group.

Modified: turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/entity/TurbineUserGroupRoleEntity.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/entity/TurbineUserGroupRoleEntity.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/entity/TurbineUserGroupRoleEntity.java (original)
+++ turbine/fulcrum/trunk/security/api/src/java/org/apache/fulcrum/security/model/turbine/entity/TurbineUserGroupRoleEntity.java Thu Dec 14 14:28:25 2017
@@ -21,6 +21,8 @@ package org.apache.fulcrum.security.mode
 
 import java.util.Set;
 
+import org.apache.fulcrum.security.util.DataBackendException;
+
 /**
  * Represents the "turbine" model where permissions are in a many to many
  * relationship to roles, roles are related to groups are related to users, all
@@ -35,8 +37,9 @@ public interface TurbineUserGroupRoleEnt
      * Get the User/Group/Role set associated with this entity
      *
      * @return a set of User/Group/Role relations
+     * @throws DataBackendException 
      */
-    public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet();
+    public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() throws DataBackendException;
 
     /**
      * Set the User/Group/Role set associated with this entity
@@ -51,14 +54,16 @@ public interface TurbineUserGroupRoleEnt
      *
      * @param userGroupRole
      *            a User/Group/Role relation to add
+     * @throws DataBackendException 
      */
-    public void addUserGroupRole(TurbineUserGroupRole userGroupRole);
+    public void addUserGroupRole(TurbineUserGroupRole userGroupRole) throws DataBackendException;
 
     /**
      * Remove a User/Group/Role relation from this entity
      *
      * @param userGroupRole
      *            a User/Group/Role relation to remove
+     * @throws DataBackendException 
      */
-    public void removeUserGroupRole(TurbineUserGroupRole userGroupRole);
+    public void removeUserGroupRole(TurbineUserGroupRole userGroupRole) throws DataBackendException;
 }

Modified: turbine/fulcrum/trunk/security/api/src/test/org/apache/fulcrum/security/model/turbine/test/AbstractTurbineModelManagerTest.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/api/src/test/org/apache/fulcrum/security/model/turbine/test/AbstractTurbineModelManagerTest.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/api/src/test/org/apache/fulcrum/security/model/turbine/test/AbstractTurbineModelManagerTest.java (original)
+++ turbine/fulcrum/trunk/security/api/src/test/org/apache/fulcrum/security/model/turbine/test/AbstractTurbineModelManagerTest.java Thu Dec 14 14:28:25 2017
@@ -180,8 +180,10 @@ public abstract class AbstractTurbineMod
         modelManager.grant(user, group, role);
 
         group = groupManager.getGroupById(group.getId());
-        Set<TurbineUserGroupRole> userGroupRoleSet = ((TurbineGroup) group).getUserGroupRoleSet();
+        Set<TurbineUserGroupRole> userGroupRoleSet =  ((TurbineUser)user).getUserGroupRoleSet();
         assertEquals(1, userGroupRoleSet.size());
+//        Set<TurbineUserGroupRole> userGroupRoleSet = ((TurbineGroup) group).getUserGroupRoleSet();
+//        assertEquals(1, userGroupRoleSet.size());
         Set<TurbineUserGroupRole> userGroupRoleSet2 = ((TurbineGroup) group).getUserGroupRoleSet();
         assertEquals(1, userGroupRoleSet2.size());
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractGroupManager.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractGroupManager.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractGroupManager.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractGroupManager.java Thu Dec 14 14:28:25 2017
@@ -45,15 +45,18 @@ public abstract class TorqueAbstractGrou
     
 	/** Serial version */
 	private static final long serialVersionUID = -3735730556110100621L;
-
-	/**
+	
+    private static final String LAZY_LOADING = "lazy";
+    protected Boolean lazyLoading = false;
+	
+    /**
      * Avalon Service lifecycle method
      */
     @Override
-	public void configure(Configuration conf) throws ConfigurationException
+    public void configure(Configuration conf) throws ConfigurationException
     {
        super.configure( conf );
-
+       lazyLoading = conf.getAttributeAsBoolean( LAZY_LOADING, false);
     }
     
     /**
@@ -199,7 +202,7 @@ public abstract class TorqueAbstractGrou
             group = doSelectByName(name, con);
 
             // Add dependent objects if they exist
-            ((TorqueAbstractSecurityEntity)group).retrieveAttachedObjects(con);
+            ((TorqueAbstractSecurityEntity)group).retrieveAttachedObjects(con, getLazyLoading());
 
             Transaction.commit(con);
             con = null;
@@ -250,7 +253,7 @@ public abstract class TorqueAbstractGrou
             for (Group group : groups)
             {
                 // Add dependent objects if they exist
-                ((TorqueAbstractSecurityEntity)group).retrieveAttachedObjects(con);
+                ((TorqueAbstractSecurityEntity)group).retrieveAttachedObjects(con, getLazyLoading());
 
                 groupSet.add(group);
             }
@@ -350,7 +353,7 @@ public abstract class TorqueAbstractGrou
                 group = doSelectById((Integer)id, con);
 
                 // Add dependent objects if they exist
-                ((TorqueAbstractSecurityEntity)group).retrieveAttachedObjects(con);
+                ((TorqueAbstractSecurityEntity)group).retrieveAttachedObjects(con, getLazyLoading());
 
                 Transaction.commit(con);
                 con = null;
@@ -378,4 +381,14 @@ public abstract class TorqueAbstractGrou
 
         return group;
     }
+
+    public Boolean getLazyLoading()
+    {
+        return lazyLoading;
+    }
+
+    public void setLazyLoading( Boolean lazyLoading )
+    {
+        this.lazyLoading = lazyLoading;
+    }
 }

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractPermissionManager.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractPermissionManager.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractPermissionManager.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractPermissionManager.java Thu Dec 14 14:28:25 2017
@@ -44,6 +44,8 @@ public abstract class TorqueAbstractPerm
     
 	/** Serial version */
 	private static final long serialVersionUID = 194503017446833485L;
+	
+	// no lazyLoading
 
 	/**
      * Avalon Service lifecycle method
@@ -212,7 +214,7 @@ public abstract class TorqueAbstractPerm
             for (Permission p : permissions)
             {
                 // Add attached objects if they exist
-                ((TorqueAbstractSecurityEntity)p).retrieveAttachedObjects(con);
+                ((TorqueAbstractSecurityEntity)p).retrieveAttachedObjects(con, false);
                 permissionSet.add(p);
             }
 
@@ -312,7 +314,7 @@ public abstract class TorqueAbstractPerm
                 permission = doSelectById((Integer)id, con);
 
                 // Add attached objects if they exist
-                ((TorqueAbstractSecurityEntity)permission).retrieveAttachedObjects(con);
+                ((TorqueAbstractSecurityEntity)permission).retrieveAttachedObjects(con, false);
 
                 Transaction.commit(con);
                 con = null;
@@ -363,7 +365,7 @@ public abstract class TorqueAbstractPerm
             permission = doSelectByName(name, con);
 
             // Add attached objects if they exist
-            ((TorqueAbstractSecurityEntity)permission).retrieveAttachedObjects(con);
+            ((TorqueAbstractSecurityEntity)permission).retrieveAttachedObjects(con, false);
 
             Transaction.commit(con);
             con = null;

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractRoleManager.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractRoleManager.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractRoleManager.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractRoleManager.java Thu Dec 14 14:28:25 2017
@@ -44,16 +44,20 @@ public abstract class TorqueAbstractRole
     
 	/** Serial version */
 	private static final long serialVersionUID = 4258137881250800204L;
-
-	/**
+	
+	private static final String LAZY_LOADING = "lazy";
+    protected Boolean lazyLoading = false;
+    
+    /**
      * Avalon Service lifecycle method
      */
     @Override
-	public void configure(Configuration conf) throws ConfigurationException
+    public void configure(Configuration conf) throws ConfigurationException
     {
        super.configure( conf );
- 
+       lazyLoading = conf.getAttributeAsBoolean( LAZY_LOADING, false);
     }
+
     
     /**
      * Get all specialized Roles
@@ -253,8 +257,8 @@ public abstract class TorqueAbstractRole
 
             for (Role role : roles)
             {
-                // Add attached objects if they exist
-                ((TorqueAbstractSecurityEntity)role).retrieveAttachedObjects(con);
+               // Add attached objects if they exist
+               ((TorqueAbstractSecurityEntity)role).retrieveAttachedObjects(con, getLazyLoading());
 
                 roleSet.add(role);
             }
@@ -304,7 +308,7 @@ public abstract class TorqueAbstractRole
                 role = doSelectById((Integer)id, con);
 
                 // Add attached objects if they exist
-                ((TorqueAbstractSecurityEntity)role).retrieveAttachedObjects(con);
+                ((TorqueAbstractSecurityEntity)role).retrieveAttachedObjects(con, getLazyLoading());
 
                 Transaction.commit(con);
                 con = null;
@@ -355,7 +359,7 @@ public abstract class TorqueAbstractRole
             role = doSelectByName(name, con);
 
             // Add attached objects if they exist
-            ((TorqueAbstractSecurityEntity)role).retrieveAttachedObjects(con);
+            ((TorqueAbstractSecurityEntity)role).retrieveAttachedObjects(con, getLazyLoading());
 
             Transaction.commit(con);
             con = null;
@@ -382,4 +386,16 @@ public abstract class TorqueAbstractRole
 
         return role;
     }
+
+
+    public Boolean getLazyLoading()
+    {
+        return lazyLoading;
+    }
+
+
+    public void setLazyLoading( Boolean lazyLoading )
+    {
+        this.lazyLoading = lazyLoading;
+    }
 }

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractUserManager.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractUserManager.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractUserManager.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/TorqueAbstractUserManager.java Thu Dec 14 14:28:25 2017
@@ -44,15 +44,14 @@ public abstract class TorqueAbstractUser
     
 	/** Serial version */
 	private static final long serialVersionUID = 2050218990148719292L;
-
-	/**
+    
+    /**
      * Avalon Service lifecycle method
      */
     @Override
-	public void configure(Configuration conf) throws ConfigurationException
+    public void configure(Configuration conf) throws ConfigurationException
     {
        super.configure( conf );
-
     }
     
 
@@ -249,7 +248,7 @@ public abstract class TorqueAbstractUser
             user = doSelectByName(userName.toLowerCase(), con);
 
             // Add attached objects if they exist
-            ((TorqueAbstractSecurityEntity)user).retrieveAttachedObjects(con);
+            ((TorqueAbstractSecurityEntity)user).retrieveAttachedObjects(con, false );
 
             Transaction.commit(con);
             con = null;
@@ -299,7 +298,7 @@ public abstract class TorqueAbstractUser
             for (User user : users)
             {
                 // Add attached objects if they exist
-                ((TorqueAbstractSecurityEntity)user).retrieveAttachedObjects(con);
+                ((TorqueAbstractSecurityEntity)user).retrieveAttachedObjects(con, false);
 
                 userSet.add(user);
             }
@@ -349,7 +348,7 @@ public abstract class TorqueAbstractUser
                 user = doSelectById((Integer)id, con);
 
                 // Add attached objects if they exist
-                ((TorqueAbstractSecurityEntity)user).retrieveAttachedObjects(con);
+                ((TorqueAbstractSecurityEntity)user).retrieveAttachedObjects(con, false); // 
 
                 Transaction.commit(con);
                 con = null;
@@ -377,5 +376,6 @@ public abstract class TorqueAbstractUser
 
         return user;
     }
+
     
 }

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicGroup.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicGroup.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicGroup.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicGroup.java Thu Dec 14 14:28:25 2017
@@ -134,7 +134,9 @@ public abstract class TorqueAbstractBasi
     /**
      * Retrieve attached objects such as users, permissions,....
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    @Override
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.userSet = new UserSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicUser.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicUser.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicUser.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/basic/TorqueAbstractBasicUser.java Thu Dec 14 14:28:25 2017
@@ -133,7 +133,9 @@ public abstract class TorqueAbstractBasi
     /**
      * Retrieve attached objects such as users, permissions,....
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    @Override
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.groupSet = new GroupSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicGroup.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicGroup.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicGroup.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicGroup.java Thu Dec 14 14:28:25 2017
@@ -230,9 +230,11 @@ public abstract class TorqueAbstractDyna
     }
 
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    @Override
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.userSet = new UserSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicPermission.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicPermission.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicPermission.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicPermission.java Thu Dec 14 14:28:25 2017
@@ -138,9 +138,11 @@ public abstract class TorqueAbstractDyna
     }
 
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    @Override
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.roleSet = new RoleSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicRole.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicRole.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicRole.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicRole.java Thu Dec 14 14:28:25 2017
@@ -231,9 +231,11 @@ public abstract class TorqueAbstractDyna
     }
 
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    @Override
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.permissionSet = new PermissionSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicUser.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicUser.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicUser.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/dynamic/TorqueAbstractDynamicUser.java Thu Dec 14 14:28:25 2017
@@ -245,9 +245,11 @@ public abstract class TorqueAbstractDyna
     }
 
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    @Override
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.groupSet = new GroupSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/TorqueAbstractSecurityEntity.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/TorqueAbstractSecurityEntity.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/TorqueAbstractSecurityEntity.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/TorqueAbstractSecurityEntity.java Thu Dec 14 14:28:25 2017
@@ -67,8 +67,9 @@ public abstract class TorqueAbstractSecu
      * Retrieve attached objects such as users, permissions, ...
      *
      * @param con A database connection
+     * @param lazy if <code>true</code>, may load some or all relationships later
      */
-    public abstract void retrieveAttachedObjects(Connection con) throws TorqueException;
+    public abstract void retrieveAttachedObjects(Connection con, Boolean lazy) throws TorqueException;
 
     /**
      * Update this instance to the database with all dependent objects

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/turbine/TorqueAbstractTurbineTurbineSecurityEntity.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/turbine/TorqueAbstractTurbineTurbineSecurityEntity.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/turbine/TorqueAbstractTurbineTurbineSecurityEntity.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/security/turbine/TorqueAbstractTurbineTurbineSecurityEntity.java Thu Dec 14 14:28:25 2017
@@ -23,6 +23,7 @@ import java.util.Set;
 import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole;
 import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRoleEntity;
 import org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity;
+import org.apache.fulcrum.security.util.DataBackendException;
 /**
  * This abstract class provides the SecurityInterface to the managers.
  * 
@@ -41,18 +42,20 @@ public abstract class TorqueAbstractTurb
     private Set<? extends TurbineUserGroupRole> userGroupRoleSet = null;
 
     /**
+     * @throws DataBackendException 
      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineGroup#addUserGroupRole(org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole)
      */
-    public void addUserGroupRole(TurbineUserGroupRole userGroupRole)
+    public void addUserGroupRole(TurbineUserGroupRole userGroupRole) throws DataBackendException
     {
         getUserGroupRoleSet().add(userGroupRole);
     }
 
     /**
+     * @throws DataBackendException if loaded lazily
      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineGroup#getUserGroupRoleSet()
      */
     @SuppressWarnings("unchecked")
-	public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet()
+	public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() throws DataBackendException
     {
         if (userGroupRoleSet == null)
         {
@@ -63,9 +66,10 @@ public abstract class TorqueAbstractTurb
     }
 
     /**
+     * @throws DataBackendException 
      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineGroup#removeUserGroupRole(org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole)
      */
-    public void removeUserGroupRole(TurbineUserGroupRole userGroupRole)
+    public void removeUserGroupRole(TurbineUserGroupRole userGroupRole) throws DataBackendException
     {
         getUserGroupRoleSet().remove(userGroupRole);
     }
@@ -84,4 +88,12 @@ public abstract class TorqueAbstractTurb
             this.userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
         }
     }
+    
+//    /**
+//     * Retrieve attached objects 
+//     *
+//     * @param con A database connection
+//     * @param lazy if <code>true</code>, does not retrieve user group role relationships
+//     */
+//    public abstract void retrieveAttachedObjects(Connection con, boolean lazy) throws TorqueException;
 }

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineGroup.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineGroup.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineGroup.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineGroup.java Thu Dec 14 14:28:25 2017
@@ -27,9 +27,11 @@ import org.apache.fulcrum.security.model
 import org.apache.fulcrum.security.torque.om.TurbineGroupPeer;
 import org.apache.fulcrum.security.torque.om.TurbineUserGroupRolePeer;
 import org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntity;
+import org.apache.fulcrum.security.util.DataBackendException;
 import org.apache.torque.TorqueException;
 import org.apache.torque.criteria.Criteria;
 import org.apache.torque.om.SimpleKey;
+import org.apache.torque.util.Transaction;
 /**
  * This abstract class provides the SecurityInterface to the managers.
  *
@@ -61,26 +63,61 @@ public abstract class DefaultAbstractTur
         return TurbineUserGroupRolePeer.doSelectJoinTurbineRole(criteria, con);
     }
     
+    
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see TorqueAbstractTurbineTurbineSecurityEntity#retrieveAttachedObjects(Connection, boolean)
      */
     @Override
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    public void retrieveAttachedObjects( Connection con, Boolean lazy ) throws TorqueException
     {
-        Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
-
-        List<org.apache.fulcrum.security.torque.om.TurbineUserGroupRole> ugrs = getTurbineUserGroupRolesJoinTurbineRole(new Criteria(), con);
-
-        for (org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr : ugrs)
-        {
-            TurbineUserGroupRole ugr = new TurbineUserGroupRole();
-            ugr.setGroup(this);
-            ugr.setRole(ttugr.getTurbineRole());
-            ugr.setUser(ttugr.getTurbineUser(con));
-            userGroupRoleSet.add(ugr);
+        if (!lazy) {
+            Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
+            
+            List<org.apache.fulcrum.security.torque.om.TurbineUserGroupRole> ugrs = getTurbineUserGroupRolesJoinTurbineRole(new Criteria(), con);
+    
+            for (org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr : ugrs)
+            {
+                TurbineUserGroupRole ugr = new TurbineUserGroupRole();
+                ugr.setGroup(this);
+                ugr.setRole(ttugr.getTurbineRole());
+                ugr.setUser(ttugr.getTurbineUser(con));
+                userGroupRoleSet.add(ugr);
+            }
+    
+            setUserGroupRoleSet(userGroupRoleSet);
         }
-
-        setUserGroupRoleSet(userGroupRoleSet);
+    }
+    
+   
+    @Override
+    public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() throws DataBackendException
+    {
+        if (super.getUserGroupRoleSet() == null || super.getUserGroupRoleSet().isEmpty()) {
+            Connection con = null;
+            try
+            {
+                con = Transaction.begin();
+               
+                retrieveAttachedObjects( con, false ); // not configurable, we set it
+    
+                Transaction.commit(con);
+                con = null;
+            }
+            catch (TorqueException e)
+            {
+                throw new DataBackendException("Error retrieving group information", e);
+            }
+            finally
+            {
+                if (con != null)
+                {
+                    Transaction.safeRollback(con);
+                }
+            }
+        }
+        
+        return super.getUserGroupRoleSet();
+        
     }
 
     /**
@@ -89,27 +126,26 @@ public abstract class DefaultAbstractTur
     @Override
     public void update(Connection con) throws TorqueException
     {
-    	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
-        if (userGroupRoleSet != null && !userGroupRoleSet.isEmpty())
+        try
         {
-            Criteria criteria = new Criteria();
-
-            /* remove old entries */
-            criteria.where(TurbineUserGroupRolePeer.GROUP_ID, getEntityId());
-            TurbineUserGroupRolePeer.doDelete(criteria, con);
-
-            for (TurbineUserGroupRole ugr : userGroupRoleSet)
+            Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
+            if (userGroupRoleSet != null && !userGroupRoleSet.isEmpty())
             {
-                org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr = new org.apache.fulcrum.security.torque.om.TurbineUserGroupRole();
-                ttugr.setGroupId((Integer)ugr.getGroup().getId());
-                ttugr.setUserId((Integer)ugr.getUser().getId());
-                ttugr.setRoleId((Integer)ugr.getRole().getId());
-                ttugr.save(con);
+                Criteria criteria = new Criteria();
+    
+                /* remove old entries */
+                criteria.where(TurbineUserGroupRolePeer.GROUP_ID, getEntityId());
+                TurbineUserGroupRolePeer.doDelete(criteria, con);
+    
+                for (TurbineUserGroupRole ugr : userGroupRoleSet)
+                {
+                    org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr = new org.apache.fulcrum.security.torque.om.TurbineUserGroupRole();
+                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
+                    ttugr.setUserId((Integer)ugr.getUser().getId());
+                    ttugr.setRoleId((Integer)ugr.getRole().getId());
+                    ttugr.save(con);
+                }
             }
-        }
-
-        try
-        {
             save(con);
         }
         catch (Exception e)

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbinePermission.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbinePermission.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbinePermission.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbinePermission.java Thu Dec 14 14:28:25 2017
@@ -138,10 +138,11 @@ public abstract class DefaultAbstractTur
 
 
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
     @Override
-	public void retrieveAttachedObjects(Connection con) throws TorqueException
+	public void retrieveAttachedObjects( Connection con, Boolean lazy )
+	    throws TorqueException
     {
         this.roleSet = new RoleSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineRole.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineRole.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineRole.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineRole.java Thu Dec 14 14:28:25 2017
@@ -30,10 +30,12 @@ import org.apache.fulcrum.security.torqu
 import org.apache.fulcrum.security.torque.om.TurbineRolePermissionPeer;
 import org.apache.fulcrum.security.torque.om.TurbineUserGroupRolePeer;
 import org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntity;
+import org.apache.fulcrum.security.util.DataBackendException;
 import org.apache.fulcrum.security.util.PermissionSet;
 import org.apache.torque.TorqueException;
 import org.apache.torque.criteria.Criteria;
 import org.apache.torque.om.SimpleKey;
+import org.apache.torque.util.Transaction;
 /**
  * This abstract class provides the SecurityInterface to the managers.
  *
@@ -158,11 +160,13 @@ public abstract class DefaultAbstractTur
         setPermissions(new PermissionSet(permissions));
     }
 
+    
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see TorqueAbstractTurbineTurbineSecurityEntity#retrieveAttachedObjects(Connection, boolean)
      */
     @Override
-	public void retrieveAttachedObjects(Connection con) throws TorqueException
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.permissionSet = new PermissionSet();
 
@@ -173,22 +177,56 @@ public abstract class DefaultAbstractTur
             permissionSet.add(ttrp.getTurbinePermission());
         }
 
-        Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
-
-        List<org.apache.fulcrum.security.torque.om.TurbineUserGroupRole> ugrs = getTurbineUserGroupRolesJoinTurbineGroup(new Criteria(), con);
-
-        for (org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr : ugrs)
-        {
-            TurbineUserGroupRole ugr = new TurbineUserGroupRole();
-            ugr.setRole(this);
-            ugr.setGroup(ttugr.getTurbineGroup());
-            ugr.setUser(ttugr.getTurbineUser(con));
-            userGroupRoleSet.add(ugr);
+        if (!lazy) {
+            Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
+    
+            List<org.apache.fulcrum.security.torque.om.TurbineUserGroupRole> ugrs = getTurbineUserGroupRolesJoinTurbineGroup(new Criteria(), con);
+    
+            for (org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr : ugrs)
+            {
+                TurbineUserGroupRole ugr = new TurbineUserGroupRole();
+                ugr.setRole(this);
+                ugr.setGroup(ttugr.getTurbineGroup());
+                ugr.setUser(ttugr.getTurbineUser(con));
+                userGroupRoleSet.add(ugr);
+            }
+    
+            setUserGroupRoleSet(userGroupRoleSet);
+        
         }
-
-        setUserGroupRoleSet(userGroupRoleSet);
     }
     
+    @Override
+    public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() throws DataBackendException
+    {
+        if (super.getUserGroupRoleSet() == null || super.getUserGroupRoleSet().isEmpty()) {
+            Connection con = null;
+            try
+            {
+                con = Transaction.begin();
+               
+                retrieveAttachedObjects( con, false ); // not configurable, we set it
+    
+                Transaction.commit(con);
+                con = null;
+            }
+            catch (TorqueException e)
+            {
+                throw new DataBackendException("Error retrieving group information", e);
+            }
+            finally
+            {
+                if (con != null)
+                {
+                    Transaction.safeRollback(con);
+                }
+            }
+        }
+        
+        return super.getUserGroupRoleSet();
+    }
+    
+    
     /**
      * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#update(java.sql.Connection)
      * 
@@ -214,27 +252,26 @@ public abstract class DefaultAbstractTur
             }
         }
 
-    	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
-        if (userGroupRoleSet != null && !userGroupRoleSet.isEmpty())
+        try
         {
-            Criteria criteria = new Criteria();
-
-            /* remove old entries */
-            criteria.where(TurbineUserGroupRolePeer.ROLE_ID, getEntityId());
-            TurbineUserGroupRolePeer.doDelete(criteria, con);
-
-            for (TurbineUserGroupRole ugr : userGroupRoleSet)
+            Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
+            if (userGroupRoleSet != null && !userGroupRoleSet.isEmpty())
             {
-                org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr = new org.apache.fulcrum.security.torque.om.TurbineUserGroupRole();
-                ttugr.setGroupId((Integer)ugr.getGroup().getId());
-                ttugr.setUserId((Integer)ugr.getUser().getId());
-                ttugr.setRoleId((Integer)ugr.getRole().getId());
-                ttugr.save(con);
-            }
-        }
+                Criteria criteria = new Criteria();
 
-        try
-        {
+                /* remove old entries */
+                criteria.where(TurbineUserGroupRolePeer.ROLE_ID, getEntityId());
+                TurbineUserGroupRolePeer.doDelete(criteria, con);
+
+                for (TurbineUserGroupRole ugr : userGroupRoleSet)
+                {
+                    org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr = new org.apache.fulcrum.security.torque.om.TurbineUserGroupRole();
+                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
+                    ttugr.setUserId((Integer)ugr.getUser().getId());
+                    ttugr.setRoleId((Integer)ugr.getRole().getId());
+                    ttugr.save(con);
+                }
+            }
             save(con);
         }
         catch (Exception e)

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/DefaultAbstractTurbineUser.java Thu Dec 14 14:28:25 2017
@@ -63,31 +63,35 @@ public abstract class DefaultAbstractTur
         return TurbineUserGroupRolePeer.doSelectJoinTurbineRole(criteria, con);
     }
 
-
+    
+    
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see TorqueAbstractTurbineTurbineSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
     @Override
-	public void retrieveAttachedObjects(Connection con) throws TorqueException
+    public void retrieveAttachedObjects( Connection con, Boolean lazy ) throws TorqueException
     {
-        Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
-
-        List<org.apache.fulcrum.security.torque.om.TurbineUserGroupRole> ugrs = getTurbineUserGroupRolesJoinTurbineRole(new Criteria(), con);
-
-        for (org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr : ugrs)
-        {
-            TurbineUserGroupRole ugr = new TurbineUserGroupRole();
-            ugr.setUser((User) this);
-            ugr.setRole(ttugr.getTurbineRole());
-            // org.apache.fulcrum.security.torque.om.TurbineGroup implements 
-            // org.apache.fulcrum.security.model.turbine.entity.TurbineGroup
-            // but may be hides it? 
-            ugr.setGroup(ttugr.getTurbineGroup(con));
-            userGroupRoleSet.add(ugr);
+        if (!lazy) {
+            Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
+    
+            List<org.apache.fulcrum.security.torque.om.TurbineUserGroupRole> ugrs = getTurbineUserGroupRolesJoinTurbineRole(new Criteria(), con);
+    
+            for (org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr : ugrs)
+            {
+                TurbineUserGroupRole ugr = new TurbineUserGroupRole();
+                ugr.setUser((User) this);
+                ugr.setRole(ttugr.getTurbineRole());
+                // org.apache.fulcrum.security.torque.om.TurbineGroup implements 
+                // org.apache.fulcrum.security.model.turbine.entity.TurbineGroup
+                // but may be hides it? 
+                ugr.setGroup(ttugr.getTurbineGroup(con));
+                userGroupRoleSet.add(ugr);
+            }
+    
+            setUserGroupRoleSet(userGroupRoleSet);
         }
-
-        setUserGroupRoleSet(userGroupRoleSet);
     }
+    
 
     /**
      * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#update(java.sql.Connection)
@@ -95,27 +99,26 @@ public abstract class DefaultAbstractTur
     @Override
 	public void update(Connection con) throws TorqueException
     {
-    	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
-        if (userGroupRoleSet != null && !userGroupRoleSet.isEmpty())
+        try
         {
-            Criteria criteria = new Criteria();
-
-            /* remove old entries */
-            criteria.where(TurbineUserGroupRolePeer.USER_ID, getEntityId());
-            TurbineUserGroupRolePeer.doDelete(criteria, con);
-
-            for (TurbineUserGroupRole ugr : userGroupRoleSet)
+            Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
+            if (userGroupRoleSet != null && !userGroupRoleSet.isEmpty())
             {
-                org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr = new org.apache.fulcrum.security.torque.om.TurbineUserGroupRole();
-                ttugr.setGroupId((Integer)ugr.getGroup().getId());
-                ttugr.setUserId((Integer)ugr.getUser().getId());
-                ttugr.setRoleId((Integer)ugr.getRole().getId());
-                ttugr.save(con);
-            }
-        }
+                Criteria criteria = new Criteria();
 
-        try
-        {
+                /* remove old entries */
+                criteria.where(TurbineUserGroupRolePeer.USER_ID, getEntityId());
+                TurbineUserGroupRolePeer.doDelete(criteria, con);
+
+                for (TurbineUserGroupRole ugr : userGroupRoleSet)
+                {
+                    org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr = new org.apache.fulcrum.security.torque.om.TurbineUserGroupRole();
+                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
+                    ttugr.setUserId((Integer)ugr.getUser().getId());
+                    ttugr.setRoleId((Integer)ugr.getRole().getId());
+                    ttugr.save(con);
+                }
+            }
             save(con);
         }
         catch (Exception e)

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineGroup.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineGroup.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineGroup.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineGroup.java Thu Dec 14 14:28:25 2017
@@ -28,9 +28,11 @@ import org.apache.fulcrum.security.torqu
 import org.apache.fulcrum.security.torque.om.TorqueTurbineUserGroupRole;
 import org.apache.fulcrum.security.torque.om.TorqueTurbineUserGroupRolePeer;
 import org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntity;
+import org.apache.fulcrum.security.util.DataBackendException;
 import org.apache.torque.TorqueException;
 import org.apache.torque.criteria.Criteria;
 import org.apache.torque.om.SimpleKey;
+import org.apache.torque.util.Transaction;
 /**
  * This abstract class provides the SecurityInterface to the managers.
  *
@@ -62,27 +64,57 @@ public abstract class FulcrumAbstractTur
         return TorqueTurbineUserGroupRolePeer.doSelectJoinTorqueTurbineRole(criteria, con);
     }
 
-
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
     @Override
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    public void retrieveAttachedObjects( Connection con, Boolean lazy ) throws TorqueException
     {
-        Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
-
-        List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineRole(new Criteria(), con);
-
-        for (TorqueTurbineUserGroupRole ttugr : ugrs)
-        {
-            TurbineUserGroupRole ugr = new TurbineUserGroupRole();
-            ugr.setGroup(this);
-            ugr.setRole(ttugr.getTorqueTurbineRole());
-            ugr.setUser(ttugr.getTorqueTurbineUser(con));
-            userGroupRoleSet.add(ugr);
+        if (!lazy) {
+            Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
+            List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineRole(new Criteria(), con);
+    
+            for (TorqueTurbineUserGroupRole ttugr : ugrs)
+            {
+                TurbineUserGroupRole ugr = new TurbineUserGroupRole();
+                ugr.setGroup(this);
+                ugr.setRole(ttugr.getTorqueTurbineRole());
+                ugr.setUser(ttugr.getTorqueTurbineUser(con));
+                userGroupRoleSet.add(ugr);
+            }
+    
+            setUserGroupRoleSet(userGroupRoleSet);
         }
-
-        setUserGroupRoleSet(userGroupRoleSet);
+    }
+    
+    @Override
+    public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() throws DataBackendException
+    {
+        if (super.getUserGroupRoleSet() == null || super.getUserGroupRoleSet().isEmpty()) {
+            Connection con = null;
+            try
+            {
+                con = Transaction.begin();
+               
+                retrieveAttachedObjects( con, false ); // not configurable, we set it
+    
+                Transaction.commit(con);
+                con = null;
+            }
+            catch (TorqueException e)
+            {
+                throw new DataBackendException("Error retrieving group information", e);
+            }
+            finally
+            {
+                if (con != null)
+                {
+                    Transaction.safeRollback(con);
+                }
+            }
+        }
+        
+        return super.getUserGroupRoleSet();
     }
 
     /**
@@ -91,27 +123,26 @@ public abstract class FulcrumAbstractTur
     @Override
     public void update(Connection con) throws TorqueException
     {
-    	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
-        if (userGroupRoleSet != null)
+        try
         {
-            Criteria criteria = new Criteria();
-
-            /* remove old entries */
-            criteria.where(TorqueTurbineUserGroupRolePeer.GROUP_ID, getEntityId());
-            TorqueTurbineUserGroupRolePeer.doDelete(criteria, con);
-
-            for (TurbineUserGroupRole ugr : userGroupRoleSet)
+        	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
+            if (userGroupRoleSet != null)
             {
-                TorqueTurbineUserGroupRole ttugr = new TorqueTurbineUserGroupRole();
-                ttugr.setGroupId((Integer)ugr.getGroup().getId());
-                ttugr.setUserId((Integer)ugr.getUser().getId());
-                ttugr.setRoleId((Integer)ugr.getRole().getId());
-                ttugr.save(con);
+                Criteria criteria = new Criteria();
+    
+                /* remove old entries */
+                criteria.where(TorqueTurbineUserGroupRolePeer.GROUP_ID, getEntityId());
+                TorqueTurbineUserGroupRolePeer.doDelete(criteria, con);
+    
+                for (TurbineUserGroupRole ugr : userGroupRoleSet)
+                {
+                    TorqueTurbineUserGroupRole ttugr = new TorqueTurbineUserGroupRole();
+                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
+                    ttugr.setUserId((Integer)ugr.getUser().getId());
+                    ttugr.setRoleId((Integer)ugr.getRole().getId());
+                    ttugr.save(con);
+                }
             }
-        }
-
-        try
-        {
             save(con);
         }
         catch (Exception e)

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbinePermission.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbinePermission.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbinePermission.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbinePermission.java Thu Dec 14 14:28:25 2017
@@ -141,7 +141,9 @@ public abstract class FulcrumAbstractTur
     /**
      * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    @Override
+    public void retrieveAttachedObjects( Connection con, Boolean lazy )
+        throws TorqueException
     {
         this.roleSet = new RoleSet();
 

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineRole.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineRole.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineRole.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineRole.java Thu Dec 14 14:28:25 2017
@@ -31,10 +31,12 @@ import org.apache.fulcrum.security.torqu
 import org.apache.fulcrum.security.torque.om.TorqueTurbineUserGroupRole;
 import org.apache.fulcrum.security.torque.om.TorqueTurbineUserGroupRolePeer;
 import org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntity;
+import org.apache.fulcrum.security.util.DataBackendException;
 import org.apache.fulcrum.security.util.PermissionSet;
 import org.apache.torque.TorqueException;
 import org.apache.torque.criteria.Criteria;
 import org.apache.torque.om.SimpleKey;
+import org.apache.torque.util.Transaction;
 /**
  * This abstract class provides the SecurityInterface to the managers.
  *
@@ -160,11 +162,12 @@ public abstract class FulcrumAbstractTur
     {
         return TorqueTurbineRolePeer.DATABASE_NAME;
     }
-
+    
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
      */
-    public void retrieveAttachedObjects(Connection con) throws TorqueException
+    
+    public void retrieveAttachedObjects(Connection con, Boolean lazy) throws TorqueException
     {
         this.permissionSet = new PermissionSet();
 
@@ -175,20 +178,52 @@ public abstract class FulcrumAbstractTur
             permissionSet.add(ttrp.getTorqueTurbinePermission());
         }
 
-        Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
-
-        List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineGroup(new Criteria(), con);
-
-        for (TorqueTurbineUserGroupRole ttugr : ugrs)
-        {
-            TurbineUserGroupRole ugr = new TurbineUserGroupRole();
-            ugr.setRole(this);
-            ugr.setGroup(ttugr.getTorqueTurbineGroup());
-            ugr.setUser(ttugr.getTorqueTurbineUser(con));
-            userGroupRoleSet.add(ugr);
+        if (!lazy) {
+            Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
+    
+            List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineGroup(new Criteria(), con);
+    
+            for (TorqueTurbineUserGroupRole ttugr : ugrs)
+            {
+                TurbineUserGroupRole ugr = new TurbineUserGroupRole();
+                ugr.setRole(this);
+                ugr.setGroup(ttugr.getTorqueTurbineGroup());
+                ugr.setUser(ttugr.getTorqueTurbineUser(con));
+                userGroupRoleSet.add(ugr);
+            }
+    
+            setUserGroupRoleSet(userGroupRoleSet);
         }
-
-        setUserGroupRoleSet(userGroupRoleSet);
+    }
+    
+    @Override
+    public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() throws DataBackendException
+    {
+        if (super.getUserGroupRoleSet() == null || super.getUserGroupRoleSet().isEmpty()) {
+            Connection con = null;
+            try
+            {
+                con = Transaction.begin();
+               
+                retrieveAttachedObjects( con, false ); // not configurable, we set it
+    
+                Transaction.commit(con);
+                con = null;
+            }
+            catch (TorqueException e)
+            {
+                throw new DataBackendException("Error retrieving group information", e);
+            }
+            finally
+            {
+                if (con != null)
+                {
+                    Transaction.safeRollback(con);
+                }
+            }
+        }
+        
+        return super.getUserGroupRoleSet();
     }
 
     /**
@@ -212,28 +247,27 @@ public abstract class FulcrumAbstractTur
                 rp.save(con);
             }
         }
-
-    	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
-        if (userGroupRoleSet != null)
+        
+        try
         {
-            Criteria criteria = new Criteria();
-
-            /* remove old entries */
-            criteria.where(TorqueTurbineUserGroupRolePeer.ROLE_ID, getEntityId());
-            TorqueTurbineUserGroupRolePeer.doDelete(criteria, con);
-
-            for (TurbineUserGroupRole ugr : userGroupRoleSet)
+        	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
+            if (userGroupRoleSet != null)
             {
-                TorqueTurbineUserGroupRole ttugr = new TorqueTurbineUserGroupRole();
-                ttugr.setGroupId((Integer)ugr.getGroup().getId());
-                ttugr.setUserId((Integer)ugr.getUser().getId());
-                ttugr.setRoleId((Integer)ugr.getRole().getId());
-                ttugr.save(con);
+                Criteria criteria = new Criteria();
+    
+                /* remove old entries */
+                criteria.where(TorqueTurbineUserGroupRolePeer.ROLE_ID, getEntityId());
+                TorqueTurbineUserGroupRolePeer.doDelete(criteria, con);
+    
+                for (TurbineUserGroupRole ugr : userGroupRoleSet)
+                {
+                    TorqueTurbineUserGroupRole ttugr = new TorqueTurbineUserGroupRole();
+                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
+                    ttugr.setUserId((Integer)ugr.getUser().getId());
+                    ttugr.setRoleId((Integer)ugr.getRole().getId());
+                    ttugr.save(con);
+                }
             }
-        }
-
-        try
-        {
             save(con);
         }
         catch (Exception e)

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/FulcrumAbstractTurbineUser.java Thu Dec 14 14:28:25 2017
@@ -64,27 +64,26 @@ public abstract class FulcrumAbstractTur
         return TorqueTurbineUserGroupRolePeer.doSelectJoinTorqueTurbineRole(criteria, con);
     }
 
-
     /**
-     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
+     * @see TorqueAbstractTurbineTurbineSecurityEntity#retrieveAttachedObjects(Connection, boolean)
      */
     @Override
-	public void retrieveAttachedObjects(Connection con) throws TorqueException
+    public void retrieveAttachedObjects(Connection con, Boolean lazy) throws TorqueException
     {
-        Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
-
-        List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineRole(new Criteria(), con);
-
-        for (TorqueTurbineUserGroupRole ttugr : ugrs)
-        {
-            TurbineUserGroupRole ugr = new TurbineUserGroupRole();
-            ugr.setUser((User) this);
-            ugr.setRole(ttugr.getTorqueTurbineRole());
-            ugr.setGroup(ttugr.getTorqueTurbineGroup(con));
-            userGroupRoleSet.add(ugr);
+        if (!lazy) {
+            Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
+            List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineRole(new Criteria(), con);
+    
+            for (TorqueTurbineUserGroupRole ttugr : ugrs)
+            {
+                TurbineUserGroupRole ugr = new TurbineUserGroupRole();
+                ugr.setUser((User) this);
+                ugr.setRole(ttugr.getTorqueTurbineRole());
+                ugr.setGroup(ttugr.getTorqueTurbineGroup(con));
+                userGroupRoleSet.add(ugr);
+            }
+            setUserGroupRoleSet(userGroupRoleSet);
         }
-
-        setUserGroupRoleSet(userGroupRoleSet);
     }
 
     /**
@@ -93,27 +92,26 @@ public abstract class FulcrumAbstractTur
     @Override
 	public void update(Connection con) throws TorqueException
     {
-    	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
-        if (userGroupRoleSet != null)
+        try
         {
-            Criteria criteria = new Criteria();
-
-            /* remove old entries */
-            criteria.where(TorqueTurbineUserGroupRolePeer.USER_ID, getEntityId());
-            TorqueTurbineUserGroupRolePeer.doDelete(criteria, con);
-
-            for (TurbineUserGroupRole ugr : userGroupRoleSet)
+        	Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
+            if (userGroupRoleSet != null)
             {
-                TorqueTurbineUserGroupRole ttugr = new TorqueTurbineUserGroupRole();
-                ttugr.setGroupId((Integer)ugr.getGroup().getId());
-                ttugr.setUserId((Integer)ugr.getUser().getId());
-                ttugr.setRoleId((Integer)ugr.getRole().getId());
-                ttugr.save(con);
+                Criteria criteria = new Criteria();
+    
+                /* remove old entries */
+                criteria.where(TorqueTurbineUserGroupRolePeer.USER_ID, getEntityId());
+                TorqueTurbineUserGroupRolePeer.doDelete(criteria, con);
+    
+                for (TurbineUserGroupRole ugr : userGroupRoleSet)
+                {
+                    TorqueTurbineUserGroupRole ttugr = new TorqueTurbineUserGroupRole();
+                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
+                    ttugr.setUserId((Integer)ugr.getUser().getId());
+                    ttugr.setRoleId((Integer)ugr.getRole().getId());
+                    ttugr.save(con);
+                }
             }
-        }
-
-        try
-        {
             save(con);
         }
         catch (Exception e)

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineGroupManagerImpl.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineGroupManagerImpl.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineGroupManagerImpl.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineGroupManagerImpl.java Thu Dec 14 14:28:25 2017
@@ -19,16 +19,21 @@ package org.apache.fulcrum.security.torq
  */
 import java.sql.Connection;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.fulcrum.security.entity.Group;
+import org.apache.fulcrum.security.model.turbine.entity.TurbineGroup;
+import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole;
 import org.apache.fulcrum.security.torque.om.TorqueTurbineGroupPeer;
 import org.apache.fulcrum.security.torque.peer.TorqueTurbinePeer;
 import org.apache.fulcrum.security.torque.peer.managers.PeerGroupManager;
+import org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity;
 import org.apache.fulcrum.security.util.DataBackendException;
 import org.apache.torque.NoRowsException;
 import org.apache.torque.TooManyRowsException;
 import org.apache.torque.TorqueException;
 import org.apache.torque.criteria.Criteria;
+import org.apache.torque.util.Transaction;
 /**
  * This implementation persists to a database via Torque.
  *
@@ -127,5 +132,36 @@ public class TorqueTurbineGroupManagerIm
 
         return groups.get(0);
     }
+
+    
+    public Set<TurbineUserGroupRole> getUserGroupRoleSet(Group group) throws DataBackendException {
+        Connection con = null;
+
+        if (getLazyLoading()) {
+            try
+            {
+                con = Transaction.begin();
+                // Add all dependent objects if they exist
+                ((TorqueAbstractSecurityEntity)group).retrieveAttachedObjects(con, false);
+    
+                Transaction.commit(con);
+                con = null;
+            }
+            catch (TorqueException e)
+            {
+                throw new DataBackendException("Error retrieving group information", e);
+            }
+            finally
+            {
+                if (con != null)
+                {
+                    Transaction.safeRollback(con);
+                }
+            }
+        } 
+        return ((TurbineGroup)group).getUserGroupRoleSet();
+
+        
+    }
   
 }

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineModelManagerImpl.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineModelManagerImpl.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineModelManagerImpl.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineModelManagerImpl.java Thu Dec 14 14:28:25 2017
@@ -160,6 +160,7 @@ public class TorqueTurbineModelManagerIm
             throw new UnknownEntityException("Unknown permission '" + permission.getName() + "'");
         }
     }
+    
 
     @Override
 	public synchronized void grant(User user, Group group, Role role) throws DataBackendException, UnknownEntityException
@@ -189,8 +190,8 @@ public class TorqueTurbineModelManagerIm
                 con = Transaction.begin();
 
                 ((TorqueAbstractSecurityEntity)user).update(con);
-                ((TorqueAbstractSecurityEntity)group).update(con);
-                ((TorqueAbstractSecurityEntity)role).update(con);
+                //((TorqueAbstractSecurityEntity)group).update(con);
+                //((TorqueAbstractSecurityEntity)role).update(con);
 
                 Transaction.commit(con);
                 con = null;

Modified: turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineRoleManagerImpl.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineRoleManagerImpl.java?rev=1818135&r1=1818134&r2=1818135&view=diff
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineRoleManagerImpl.java (original)
+++ turbine/fulcrum/trunk/security/torque/src/java/org/apache/fulcrum/security/torque/turbine/TorqueTurbineRoleManagerImpl.java Thu Dec 14 14:28:25 2017
@@ -124,5 +124,4 @@ public class TorqueTurbineRoleManagerImp
         }
         return roles.get(0);
     }
-   
 }

Added: turbine/fulcrum/trunk/security/torque/src/test/TurbineDefaultLazyWithPeersComponentConfig.xml
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/test/TurbineDefaultLazyWithPeersComponentConfig.xml?rev=1818135&view=auto
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/test/TurbineDefaultLazyWithPeersComponentConfig.xml (added)
+++ turbine/fulcrum/trunk/security/torque/src/test/TurbineDefaultLazyWithPeersComponentConfig.xml Thu Dec 14 14:28:25 2017
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+-->
+<my-system>
+    <securityService/>
+    <authenticator/>
+    <modelManager/>
+    <aclFactory/>
+
+    <!-- have to use peers, as default is fulcrum -->
+    <userManager>
+        <className>org.apache.fulcrum.security.torque.om.TurbineUser</className>
+        <peerClassName>org.apache.fulcrum.security.torque.om.TurbineUserPeerImpl</peerClassName>
+    </userManager>
+    <groupManager lazy="true">
+        <className>org.apache.fulcrum.security.torque.om.TurbineGroup</className>
+         <peerClassName>org.apache.fulcrum.security.torque.om.TurbineGroupPeerImpl</peerClassName>
+    </groupManager>
+    <roleManager lazy="true">
+        <className>org.apache.fulcrum.security.torque.om.TurbineRole</className>
+        <peerClassName>org.apache.fulcrum.security.torque.om.TurbineRolePeerImpl</peerClassName>
+    </roleManager>
+    <permissionManager>
+        <className>org.apache.fulcrum.security.torque.om.TurbinePermission</className>
+        <peerClassName>org.apache.fulcrum.security.torque.om.TurbinePermissionPeerImpl</peerClassName>
+    </permissionManager>
+
+    <torqueService>
+        <configfile>/src/test/TorqueDefault.properties</configfile>
+    </torqueService>
+</my-system>

Propchange: turbine/fulcrum/trunk/security/torque/src/test/TurbineDefaultLazyWithPeersComponentConfig.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: turbine/fulcrum/trunk/security/torque/src/test/org/apache/fulcrum/security/torque/turbine/TurbineDefaultModelManagerLazyTest.java
URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/security/torque/src/test/org/apache/fulcrum/security/torque/turbine/TurbineDefaultModelManagerLazyTest.java?rev=1818135&view=auto
==============================================================================
--- turbine/fulcrum/trunk/security/torque/src/test/org/apache/fulcrum/security/torque/turbine/TurbineDefaultModelManagerLazyTest.java (added)
+++ turbine/fulcrum/trunk/security/torque/src/test/org/apache/fulcrum/security/torque/turbine/TurbineDefaultModelManagerLazyTest.java Thu Dec 14 14:28:25 2017
@@ -0,0 +1,129 @@
+package org.apache.fulcrum.security.torque.turbine;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.junit.Assert.fail;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import org.apache.fulcrum.security.SecurityService;
+import org.apache.fulcrum.security.model.turbine.test.AbstractTurbineModelManagerTest;
+import org.apache.fulcrum.security.torque.HsqlDB;
+import org.apache.fulcrum.security.torque.om.TurbineGroupPeer;
+import org.apache.fulcrum.security.torque.om.TurbinePermissionPeer;
+import org.apache.fulcrum.security.torque.om.TurbineRolePeer;
+import org.apache.fulcrum.security.torque.om.TurbineRolePermissionPeer;
+import org.apache.fulcrum.security.torque.om.TurbineUserGroupRolePeer;
+import org.apache.fulcrum.security.torque.om.TurbineUserPeer;
+import org.apache.torque.TorqueException;
+import org.apache.torque.criteria.Criteria;
+import org.apache.torque.util.Transaction;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
+ * @author <a href="jh@byteaction.de">J&#252;rgen Hoffmann</a>
+ * @version $Id:$
+ */
+public class TurbineDefaultModelManagerLazyTest
+    extends AbstractTurbineModelManagerTest
+{
+    protected static HsqlDB hsqlDB = null;
+
+    @Override
+	@Before
+	public void setUp() throws Exception
+    {
+
+        try
+        {
+            hsqlDB = new HsqlDB("jdbc:hsqldb:.", "src/test/fulcrum-turbine-default-schema.sql");
+            // we do not need id-broker,set native in schema and added identity in hsql
+            // same for both flavors
+            this.setRoleFileName("src/test/TurbineTorqueRoleConfig.xml");
+            // we have to use declared peers 
+            this.setConfigurationFileName("src/test/TurbineDefaultLazyWithPeersComponentConfig.xml");
+            securityService = (SecurityService) lookup(SecurityService.ROLE);
+            super.setUp();
+        }
+        catch (Exception e)
+        {
+            fail(e.toString());
+        }
+
+    }
+
+   
+
+    @Override
+    @After
+	public void tearDown()
+    {
+        // cleanup tables
+    	Connection con = null;
+        try
+        {
+        	con = Transaction.begin();// "default"
+
+        	Criteria criteria = new Criteria();
+            criteria.where(TurbineUserGroupRolePeer.USER_ID, 0, Criteria.GREATER_THAN);
+            
+            TurbineUserGroupRolePeer.doDelete(criteria,con);
+
+            criteria = new Criteria();
+            criteria.where(TurbineRolePermissionPeer.ROLE_ID, 0, Criteria.GREATER_THAN);
+            TurbineRolePermissionPeer.doDelete(criteria,con);
+
+            criteria = new Criteria();
+            criteria.where(TurbineUserPeer.USER_ID, 0, Criteria.GREATER_THAN);
+            TurbineUserPeer.doDelete(criteria,con);
+ 
+            criteria = new Criteria();
+            criteria.where(TurbineGroupPeer.GROUP_ID, 0, Criteria.GREATER_THAN);
+            TurbineGroupPeer.doDelete(criteria,con);
+
+            criteria = new Criteria();
+            criteria.where(TurbineRolePeer.ROLE_ID, 0, Criteria.GREATER_THAN);
+            TurbineRolePeer.doDelete(criteria,con);
+
+            criteria = new Criteria();
+            criteria.where(TurbinePermissionPeer.PERMISSION_ID, 0, Criteria.GREATER_THAN);
+            TurbinePermissionPeer.doDelete(criteria,con);
+            
+            con.commit();
+            con = null;
+        }
+        catch (TorqueException e)
+        {
+        	fail(e.toString());
+        } catch (SQLException e) {
+        	 if (con != null)
+             {
+                 Transaction.safeRollback(con);
+             }
+        	 fail(e.toString());
+		}
+
+        modelManager = null;
+        securityService = null;
+    }
+
+}

Propchange: turbine/fulcrum/trunk/security/torque/src/test/org/apache/fulcrum/security/torque/turbine/TurbineDefaultModelManagerLazyTest.java
------------------------------------------------------------------------------
    svn:eol-style = native