|  | @@ -25,7 +25,6 @@ import java.util.Iterator;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
		
			
				|  |  |  import java.util.Set;
 | 
	
		
			
				|  |  | -import java.util.Vector;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.sql.DataSource;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -51,7 +50,6 @@ import org.springframework.security.acls.sid.PrincipalSid;
 | 
	
		
			
				|  |  |  import org.springframework.security.acls.sid.Sid;
 | 
	
		
			
				|  |  |  import org.springframework.security.util.FieldUtils;
 | 
	
		
			
				|  |  |  import org.springframework.util.Assert;
 | 
	
		
			
				|  |  | -import org.springframework.util.StringUtils;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
	
		
			
				|  | @@ -100,30 +98,30 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |      private static String computeRepeatingSql(String repeatingSql, int requiredRepetitions) {
 | 
	
		
			
				|  |  |          Assert.isTrue(requiredRepetitions >= 1, "Must be => 1");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        String startSql = "select acl_object_identity.object_id_identity, " 
 | 
	
		
			
				|  |  | -	        + "acl_entry.ace_order,  "
 | 
	
		
			
				|  |  | -	        + "acl_object_identity.id as acl_id, " 
 | 
	
		
			
				|  |  | -	        + "acl_object_identity.parent_object, "
 | 
	
		
			
				|  |  | -	        + "acl_object_identity.entries_inheriting, " 
 | 
	
		
			
				|  |  | -	        + "acl_entry.id as ace_id, "
 | 
	
		
			
				|  |  | -	        + "acl_entry.mask,  "
 | 
	
		
			
				|  |  | -	        + "acl_entry.granting,  "
 | 
	
		
			
				|  |  | -	        + "acl_entry.audit_success, " 
 | 
	
		
			
				|  |  | -	        + "acl_entry.audit_failure,  "
 | 
	
		
			
				|  |  | -	        + "acl_sid.principal as ace_principal, " 
 | 
	
		
			
				|  |  | -	        + "acl_sid.sid as ace_sid,  "
 | 
	
		
			
				|  |  | -	        + "acli_sid.principal as acl_principal, " 
 | 
	
		
			
				|  |  | -	        + "acli_sid.sid as acl_sid, "
 | 
	
		
			
				|  |  | -	        + "acl_class.class " 
 | 
	
		
			
				|  |  | -	        + "from acl_object_identity " 
 | 
	
		
			
				|  |  | -	        + "left join acl_sid acli_sid on  acli_sid.id = acl_object_identity.owner_sid " 
 | 
	
		
			
				|  |  | -	        + "left join acl_class on acl_class.id = acl_object_identity.object_id_class   "
 | 
	
		
			
				|  |  | -	        + "left join acl_entry on acl_object_identity.id = acl_entry.acl_object_identity " 
 | 
	
		
			
				|  |  | -	        + "left join acl_sid on acl_entry.sid = acl_sid.id  "
 | 
	
		
			
				|  |  | -	        + "where ( ";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        String endSql = ") order by acl_object_identity.object_id_identity" 
 | 
	
		
			
				|  |  | -        	+ " asc, acl_entry.ace_order asc";
 | 
	
		
			
				|  |  | +        String startSql = "select acl_object_identity.object_id_identity, "
 | 
	
		
			
				|  |  | +            + "acl_entry.ace_order,  "
 | 
	
		
			
				|  |  | +            + "acl_object_identity.id as acl_id, "
 | 
	
		
			
				|  |  | +            + "acl_object_identity.parent_object, "
 | 
	
		
			
				|  |  | +            + "acl_object_identity.entries_inheriting, "
 | 
	
		
			
				|  |  | +            + "acl_entry.id as ace_id, "
 | 
	
		
			
				|  |  | +            + "acl_entry.mask,  "
 | 
	
		
			
				|  |  | +            + "acl_entry.granting,  "
 | 
	
		
			
				|  |  | +            + "acl_entry.audit_success, "
 | 
	
		
			
				|  |  | +            + "acl_entry.audit_failure,  "
 | 
	
		
			
				|  |  | +            + "acl_sid.principal as ace_principal, "
 | 
	
		
			
				|  |  | +            + "acl_sid.sid as ace_sid,  "
 | 
	
		
			
				|  |  | +            + "acli_sid.principal as acl_principal, "
 | 
	
		
			
				|  |  | +            + "acli_sid.sid as acl_sid, "
 | 
	
		
			
				|  |  | +            + "acl_class.class "
 | 
	
		
			
				|  |  | +            + "from acl_object_identity "
 | 
	
		
			
				|  |  | +            + "left join acl_sid acli_sid on  acli_sid.id = acl_object_identity.owner_sid "
 | 
	
		
			
				|  |  | +            + "left join acl_class on acl_class.id = acl_object_identity.object_id_class   "
 | 
	
		
			
				|  |  | +            + "left join acl_entry on acl_object_identity.id = acl_entry.acl_object_identity "
 | 
	
		
			
				|  |  | +            + "left join acl_sid on acl_entry.sid = acl_sid.id  "
 | 
	
		
			
				|  |  | +            + "where ( ";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        String endSql = ") order by acl_object_identity.object_id_identity"
 | 
	
		
			
				|  |  | +            + " asc, acl_entry.ace_order asc";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          StringBuffer sqlStringBuffer = new StringBuffer();
 | 
	
		
			
				|  |  |          sqlStringBuffer.append(startSql);
 | 
	
	
		
			
				|  | @@ -148,11 +146,8 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |       * @param inputMap the unconverted <code>AclImpl</code>s
 | 
	
		
			
				|  |  |       * @param currentIdentity the current<code>Acl</code> that we wish to convert (this may be
 | 
	
		
			
				|  |  |       *
 | 
	
		
			
				|  |  | -     * @return
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @throws IllegalStateException DOCUMENT ME!
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    private AclImpl convert(Map inputMap, Long currentIdentity) {
 | 
	
		
			
				|  |  | +    private AclImpl convert(Map<Long,AclImpl> inputMap, Long currentIdentity) {
 | 
	
		
			
				|  |  |          Assert.notEmpty(inputMap, "InputMap required");
 | 
	
		
			
				|  |  |          Assert.notNull(currentIdentity, "CurrentIdentity required");
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -177,31 +172,31 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |          // Copy the "aces" from the input to the destination
 | 
	
		
			
				|  |  |          Field fieldAces = FieldUtils.getField(AclImpl.class, "aces");
 | 
	
		
			
				|  |  |          Field fieldAcl = FieldUtils.getField(AccessControlEntryImpl.class, "acl");
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  | -         	fieldAces.setAccessible(true);
 | 
	
		
			
				|  |  | +            fieldAces.setAccessible(true);
 | 
	
		
			
				|  |  |              fieldAcl.setAccessible(true);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Obtain the "aces" from the input ACL
 | 
	
		
			
				|  |  |              Iterator i = ((List) fieldAces.get(inputAcl)).iterator();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Create a list in which to store the "aces" for the "result" AclImpl instance
 | 
	
		
			
				|  |  | -            List acesNew = new ArrayList();
 | 
	
		
			
				|  |  | +            List<AccessControlEntryImpl> acesNew = new ArrayList<AccessControlEntryImpl>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Iterate over the "aces" input and replace each nested AccessControlEntryImpl.getAcl() with the new "result" AclImpl instance
 | 
	
		
			
				|  |  |              // This ensures StubAclParent instances are removed, as per SEC-951
 | 
	
		
			
				|  |  |              while(i.hasNext()) {
 | 
	
		
			
				|  |  | -	            AccessControlEntryImpl ace = (AccessControlEntryImpl) i.next();
 | 
	
		
			
				|  |  | -	            fieldAcl.set(ace, result);
 | 
	
		
			
				|  |  | -	            acesNew.add(ace);
 | 
	
		
			
				|  |  | +                AccessControlEntryImpl ace = (AccessControlEntryImpl) i.next();
 | 
	
		
			
				|  |  | +                fieldAcl.set(ace, result);
 | 
	
		
			
				|  |  | +                acesNew.add(ace);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              // Finally, now that the "aces" have been converted to have the "result" AclImpl instance, modify the "result" AclImpl instance
 | 
	
		
			
				|  |  |              fieldAces.set(result, acesNew);
 | 
	
		
			
				|  |  |          } catch (IllegalAccessException ex) {
 | 
	
		
			
				|  |  |              throw new IllegalStateException("Could not obtain or set AclImpl or AccessControlEntryImpl fields");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return result;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -214,10 +209,8 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |       * @param rs the ResultSet focused on a current row
 | 
	
		
			
				|  |  |       *
 | 
	
		
			
				|  |  |       * @throws SQLException if something goes wrong converting values
 | 
	
		
			
				|  |  | -     * @throws IllegalStateException DOCUMENT ME!
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    private void convertCurrentResultIntoObject(Map acls, ResultSet rs)
 | 
	
		
			
				|  |  | -        throws SQLException {
 | 
	
		
			
				|  |  | +    private void convertCurrentResultIntoObject(Map<Long,AclImpl> acls, ResultSet rs) throws SQLException {
 | 
	
		
			
				|  |  |          Long id = new Long(rs.getLong("acl_id"));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // If we already have an ACL for this ID, just create the ACE
 | 
	
	
		
			
				|  | @@ -262,7 +255,7 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              int mask = rs.getInt("mask");
 | 
	
		
			
				|  |  | -			Permission permission = convertMaskIntoPermission(mask);
 | 
	
		
			
				|  |  | +            Permission permission = convertMaskIntoPermission(mask);
 | 
	
		
			
				|  |  |              boolean granting = rs.getBoolean("granting");
 | 
	
		
			
				|  |  |              boolean auditSuccess = rs.getBoolean("audit_success");
 | 
	
		
			
				|  |  |              boolean auditFailure = rs.getBoolean("audit_failure");
 | 
	
	
		
			
				|  | @@ -271,11 +264,11 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |                      auditSuccess, auditFailure);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              Field acesField = FieldUtils.getField(AclImpl.class, "aces");
 | 
	
		
			
				|  |  | -            List aces;
 | 
	
		
			
				|  |  | +            List<AccessControlEntryImpl> aces;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              try {
 | 
	
		
			
				|  |  |                  acesField.setAccessible(true);
 | 
	
		
			
				|  |  | -                aces = (List) acesField.get(acl);
 | 
	
		
			
				|  |  | +                aces = (List<AccessControlEntryImpl>) acesField.get(acl);
 | 
	
		
			
				|  |  |              } catch (IllegalAccessException ex) {
 | 
	
		
			
				|  |  |                  throw new IllegalStateException("Could not obtain AclImpl.ace field: cause[" + ex.getMessage() + "]");
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -287,23 +280,20 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	protected Permission convertMaskIntoPermission(int mask) {
 | 
	
		
			
				|  |  | -		return BasePermission.buildFromMask(mask);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +    protected Permission convertMaskIntoPermission(int mask) {
 | 
	
		
			
				|  |  | +        return BasePermission.buildFromMask(mask);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Looks up a batch of <code>ObjectIdentity</code>s directly from the database.<p>The caller is responsible
 | 
	
		
			
				|  |  |       * for optimization issues, such as selecting the identities to lookup, ensuring the cache doesn't contain them
 | 
	
		
			
				|  |  |       * already, and adding the returned elements to the cache etc.</p>
 | 
	
		
			
				|  |  | -     *  <p>This subclass is required to return fully valid <code>Acl</code>s, including properly-configured
 | 
	
		
			
				|  |  | +     * <p>
 | 
	
		
			
				|  |  | +     * This subclass is required to return fully valid <code>Acl</code>s, including properly-configured
 | 
	
		
			
				|  |  |       * parent ACLs.</p>
 | 
	
		
			
				|  |  |       *
 | 
	
		
			
				|  |  | -     * @param objectIdentities DOCUMENT ME!
 | 
	
		
			
				|  |  | -     * @param sids DOCUMENT ME!
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @return DOCUMENT ME!
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    private Map lookupObjectIdentities(final ObjectIdentity[] objectIdentities, Sid[] sids) {
 | 
	
		
			
				|  |  | +    private Map<ObjectIdentity, Acl> lookupObjectIdentities(final ObjectIdentity[] objectIdentities, Sid[] sids) {
 | 
	
		
			
				|  |  |          Assert.notEmpty(objectIdentities, "Must provide identities to lookup");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          final Map acls = new HashMap(); // contains Acls with StubAclParents
 | 
	
	
		
			
				|  | @@ -331,14 +321,14 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }, new ProcessResultSet(acls, sids));
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // Lookup the parents, now that our JdbcTemplate has released the database connection (SEC-547)
 | 
	
		
			
				|  |  |          if (parentsToLookup.size() > 0) {
 | 
	
		
			
				|  |  | -        	lookupPrimaryKeys(acls, parentsToLookup, sids);
 | 
	
		
			
				|  |  | +            lookupPrimaryKeys(acls, parentsToLookup, sids);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Finally, convert our "acls" containing StubAclParents into true Acls
 | 
	
		
			
				|  |  | -        Map resultMap = new HashMap();
 | 
	
		
			
				|  |  | +        Map<ObjectIdentity, Acl> resultMap = new HashMap<ObjectIdentity, Acl>();
 | 
	
		
			
				|  |  |          Iterator iter = acls.values().iterator();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          while (iter.hasNext()) {
 | 
	
	
		
			
				|  | @@ -380,10 +370,10 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }, new ProcessResultSet(acls, sids));
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // Lookup the parents, now that our JdbcTemplate has released the database connection (SEC-547)
 | 
	
		
			
				|  |  |          if (parentsToLookup.size() > 0) {
 | 
	
		
			
				|  |  | -        	lookupPrimaryKeys(acls, parentsToLookup, sids);
 | 
	
		
			
				|  |  | +            lookupPrimaryKeys(acls, parentsToLookup, sids);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -400,29 +390,29 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |       * @return a <tt>Map</tt> where keys represent the {@link ObjectIdentity} of the located {@link Acl} and values
 | 
	
		
			
				|  |  |       *         are the located {@link Acl} (never <tt>null</tt> although some entries may be missing; this method
 | 
	
		
			
				|  |  |       *         should not throw {@link NotFoundException}, as a chain of {@link LookupStrategy}s may be used
 | 
	
		
			
				|  |  | -     *         to automatically create entries if required) 
 | 
	
		
			
				|  |  | +     *         to automatically create entries if required)
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    public Map readAclsById(ObjectIdentity[] objects, Sid[] sids) {
 | 
	
		
			
				|  |  | +    public Map<ObjectIdentity, Acl> readAclsById(ObjectIdentity[] objects, Sid[] sids) {
 | 
	
		
			
				|  |  |          Assert.isTrue(batchSize >= 1, "BatchSize must be >= 1");
 | 
	
		
			
				|  |  |          Assert.notEmpty(objects, "Objects to lookup required");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Map<ObjectIdentity,Acl>
 | 
	
		
			
				|  |  | -        Map result = new HashMap(); // contains FULLY loaded Acl objects
 | 
	
		
			
				|  |  | +        Map<ObjectIdentity, Acl> result = new HashMap<ObjectIdentity, Acl>(); // contains FULLY loaded Acl objects
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        Set currentBatchToLoad = new HashSet(); // contains ObjectIdentitys
 | 
	
		
			
				|  |  | +        Set<ObjectIdentity> currentBatchToLoad = new HashSet<ObjectIdentity>(); // contains ObjectIdentitys
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          for (int i = 0; i < objects.length; i++) {
 | 
	
		
			
				|  |  | -        	boolean aclFound = false;
 | 
	
		
			
				|  |  | +            boolean aclFound = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        	// Check we don't already have this ACL in the results
 | 
	
		
			
				|  |  | +            // Check we don't already have this ACL in the results
 | 
	
		
			
				|  |  |              if (result.containsKey(objects[i])) {
 | 
	
		
			
				|  |  |                  aclFound = true;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Check cache for the present ACL entry
 | 
	
		
			
				|  |  |              if (!aclFound) {
 | 
	
		
			
				|  |  | -            	Acl acl = aclCache.getFromCache(objects[i]);
 | 
	
		
			
				|  |  | -            	
 | 
	
		
			
				|  |  | +                Acl acl = aclCache.getFromCache(objects[i]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  // Ensure any cached element supports all the requested SIDs
 | 
	
		
			
				|  |  |                  // (they should always, as our base impl doesn't filter on SID)
 | 
	
		
			
				|  |  |                  if (acl != null) {
 | 
	
	
		
			
				|  | @@ -436,7 +426,7 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              // Load the ACL from the database
 | 
	
		
			
				|  |  |              if (!aclFound) {
 | 
	
		
			
				|  |  |                  currentBatchToLoad.add(objects[i]);
 | 
	
	
		
			
				|  | @@ -444,21 +434,21 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Is it time to load from JDBC the currentBatchToLoad?
 | 
	
		
			
				|  |  |              if ((currentBatchToLoad.size() == this.batchSize) || ((i + 1) == objects.length)) {
 | 
	
		
			
				|  |  | -            	if (currentBatchToLoad.size() > 0) {
 | 
	
		
			
				|  |  | -            		Map loadedBatch = lookupObjectIdentities((ObjectIdentity[]) currentBatchToLoad.toArray(new ObjectIdentity[] {}), sids);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	                // Add loaded batch (all elements 100% initialized) to results
 | 
	
		
			
				|  |  | -	                result.putAll(loadedBatch);
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	                // Add the loaded batch to the cache
 | 
	
		
			
				|  |  | -	                Iterator loadedAclIterator = loadedBatch.values().iterator();
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	                while (loadedAclIterator.hasNext()) {
 | 
	
		
			
				|  |  | -	                    aclCache.putInCache((AclImpl) loadedAclIterator.next());
 | 
	
		
			
				|  |  | -	                }
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	                currentBatchToLoad.clear();
 | 
	
		
			
				|  |  | -            	}
 | 
	
		
			
				|  |  | +                if (currentBatchToLoad.size() > 0) {
 | 
	
		
			
				|  |  | +                    Map<ObjectIdentity, Acl> loadedBatch = lookupObjectIdentities(currentBatchToLoad.toArray(new ObjectIdentity[] {}), sids);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // Add loaded batch (all elements 100% initialized) to results
 | 
	
		
			
				|  |  | +                    result.putAll(loadedBatch);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // Add the loaded batch to the cache
 | 
	
		
			
				|  |  | +                    Iterator<Acl> loadedAclIterator = loadedBatch.values().iterator();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    while (loadedAclIterator.hasNext()) {
 | 
	
		
			
				|  |  | +                        aclCache.putInCache((AclImpl) loadedAclIterator.next());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    currentBatchToLoad.clear();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -493,7 +483,7 @@ public final class BasicLookupStrategy implements LookupStrategy {
 | 
	
		
			
				|  |  |           * @throws DataAccessException
 | 
	
		
			
				|  |  |           */
 | 
	
		
			
				|  |  |          public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
 | 
	
		
			
				|  |  | -            Set parentIdsToLookup = new HashSet(); // Set of parent_id Longs
 | 
	
		
			
				|  |  | +            Set<Long> parentIdsToLookup = new HashSet<Long>(); // Set of parent_id Longs
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              while (rs.next()) {
 | 
	
		
			
				|  |  |                  // Convert current row into an Acl (albeit with a StubAclParent)
 |