Index: topia-security/src/java/org/codelutin/topia/security/TopiaSecurityServiceImpl.java diff -u topia-security/src/java/org/codelutin/topia/security/TopiaSecurityServiceImpl.java:1.3 topia-security/src/java/org/codelutin/topia/security/TopiaSecurityServiceImpl.java:1.4 --- topia-security/src/java/org/codelutin/topia/security/TopiaSecurityServiceImpl.java:1.3 Tue Oct 24 12:01:00 2006 +++ topia-security/src/java/org/codelutin/topia/security/TopiaSecurityServiceImpl.java Wed Oct 25 09:13:29 2006 @@ -26,6 +26,7 @@ import java.security.AccessController; import java.security.Permission; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -42,6 +43,7 @@ import org.codelutin.topia.event.TopiaTransactionEvent; import org.codelutin.topia.event.TopiaTransactionVetoable; import org.codelutin.topia.framework.TopiaContextImplementor; +import org.codelutin.topia.persistence.TopiaId; import org.codelutin.topia.security.entities.authorization.TopiaAssociationAuthorizationDAO; import org.codelutin.topia.security.entities.authorization.TopiaAuthorization; import org.codelutin.topia.security.entities.authorization.TopiaAuthorizationDAO; @@ -51,6 +53,7 @@ import org.codelutin.topia.security.entities.authorization.TopiaIdLink; import org.codelutin.topia.security.entities.authorization.TopiaIdLinkDAO; import org.codelutin.topia.security.entities.user.TopiaGroupDAO; +import org.codelutin.topia.security.entities.user.TopiaUser; import org.codelutin.topia.security.entities.user.TopiaUserDAO; import org.codelutin.topia.security.jaas.TopiaConfiguration; import org.codelutin.topia.security.jaas.TopiaPermission; @@ -89,7 +92,8 @@ /* Cache */ transient private TopiaSecurityCaching entitiesLoadingCache = new TopiaSecurityCaching(2); - transient private Map> permissionsCache = new ReferenceMap(ReferenceMap.SOFT, ReferenceMap.SOFT); + transient private Map authorizationsCache = Collections.synchronizedMap(new ReferenceMap(ReferenceMap.SOFT, ReferenceMap.SOFT)); + transient private Map> permissionsCache = Collections.synchronizedMap(new ReferenceMap(ReferenceMap.SOFT, ReferenceMap.SOFT)); /** * Constructeur. Initialise la sécurité à partir du contexte passer en paramètre @@ -240,17 +244,38 @@ Set permissions = new HashSet(); permissionsCache.put(principalName, permissions); + String className = TopiaId.getClassNameAsString(principalName); + // AddEmptyPrincipals précise si il faut les autorisations dont les principals sont vide + boolean addEmptyPrincipals = className.equals(TopiaUser.class.getName()); + for (TopiaAuthorization authorization : authorizations) { Set principals = authorization.getPrincipals(); - if(principals.contains(principalName)) { - Permission topiaPermission = new TopiaPermission(authorization); - permissions.add(topiaPermission); + if(principals.contains(principalName) + || (addEmptyPrincipals && principals.isEmpty())) { + Permission permission = getAuthorizationCache(authorization); + permissions.add(permission); } } return permissions; } /** + * Permet de récupérer dans le cache l'encapsulation de l'autorisation en permission + * et créer l'encapsulation si elle n'existe pas dans le cache + * @param authorization autorisation recherché + * @return permission encapsulation de l'autorisation en permission + */ + private Permission getAuthorizationCache(TopiaAuthorization authorization) { + String topiaIdAuthorization = authorization.getTopiaId(); + Permission permission = authorizationsCache.get(topiaIdAuthorization); + if(permission == null) { + permission = new TopiaPermission(authorization); + authorizationsCache.put(topiaIdAuthorization, permission); + } + return permission; + } + + /** * Permet de récupérer depuis le cache les permissions pour un principal donné. * @param principalName nom du principal * @return permmissions d'un principal