timeToLiveSeconds="3600"
/>
+ <!-- Espace de stockage des requêtes qui remontent la valeur des permissions -->
+ <cache name="query.Permissions"
+ maxElementsInMemory="10000"
+ timeToIdleSeconds="0"
+ timeToLiveSeconds="600"
+ />
<!-- ***** Les cache des Personne, Autorité et Autorisation ****** -->
<!--timeToLiveSeconds="0"-->
<!--/>-->
- <!--<!–-->
- <!--Espace de stockage des requêtes de recherche des Autorisations.-->
- <!--–>-->
- <!--<cache name="query.Autorisation"-->
- <!--maxElementsInMemory="10000"-->
- <!--timeToIdleSeconds="0"-->
- <!--timeToLiveSeconds="600"-->
- <!--/>-->
</ehcache>
\ No newline at end of file
package org.lilie.services.eliot.securite.impl
+import org.hibernate.SessionFactory
class Autorisation implements org.lilie.services.eliot.securite.Autorisation {
Boolean proprietaire = Boolean.FALSE // Autorite est propriétaire d'Item
Autorisation autorisationHeritee
+ SessionFactory sessionFactory
+
static belongsTo = [Item, Autorite]
static constraints = {
//cache usage: 'nonstrict-read-write'
}
- static transients = ['valeurPermissions', 'valeurPermissionsDefaut']
+ static transients = [
+ 'valeurPermissions',
+ 'valeurPermissionsDefaut',
+ 'sessionFactory'
+ ]
/**
* Méthode retournant l'autorité concernée par l'autorisation
/**
* Verifie si une permission est la permission par defaut
- * @param permission
* @return true si permission par defaut
*/
Boolean estPermissionParDefaut(int permission) {
}
- //**** Les requetes cacheables ****
- // Le cache est désactivé car nécessite une phase de validation par les tests de perf
-
- static Autorisation findByAutoriteAndItemCachable(Autorite autorite, Item item) {
- return findByItemAndAutoriteCachable(item, autorite)
- }
-
- static Autorisation findByItemAndAutoriteCachable(Item item, Autorite autorite) {
- return findByItemIdAndAutoriteIdCachable(item.id, autorite.id)
- }
-
- static Autorisation findByItemIdAndAutoriteIdCachable(Long itemId, Long autoriteId) {
- return Autorisation.createCriteria().get {
- eq('item.id', itemId)
- eq('autorite.id', autoriteId)
- cache false
- //cacheRegion 'query.Autorisation'
- }
- }
-
-
- static Autorite findProprietaireByItemCachable(Item item) {
- return findProprietaireByItemIdCachable(item.id)
- }
-
- static Autorite findProprietaireByItemIdCachable(Long itemId) {
+ static Autorite findProprietaireByItemId(Long itemId) {
return Autorisation.createCriteria().get {
eq('item.id', itemId)
eq('proprietaire', true)
projections {
property('autorite')
}
- cache false
- //cacheRegion 'query.Autorisation'
}
}
+ transient beforeInsert = {
+ evictCacheQueryPermissions()
+ }
- static List<Autorisation> findAllByItemCachable(Item item) {
- return findAllByItemIdCachable(item.id)
+ transient beforeUpdate = {
+ evictCacheQueryPermissions()
}
- static List<Autorisation> findAllByItemIdCachable(Long itemId) {
- return Autorisation.withCriteria {
- eq('item.id', itemId)
- cache false
- //cacheRegion 'query.Autorisation'
- }
+ transient beforeDelete = {
+ evictCacheQueryPermissions()
+ }
+
+ private void evictCacheQueryPermissions() {
+ sessionFactory.evictQueries('query.Permissions')
}
}
\ No newline at end of file
* Méthode retournant les permissions de l'autorité sur l'item passé en paramètre
*/
public int findPermissionsOnItem(org.lilie.services.eliot.securite.Item item) {
- return Autorisation.findByAutoriteAndItemCachable(this, item)?.valeurPermissions ?: 0;
+ return Autorisation.findByAutoriteAndItem(this, item)?.valeurPermissions ?: 0;
}
/**
* Retourne le pripriétaire de l'agenda
*/
Autorite getProprietaire() {
- return itemId ? Autorisation.findProprietaireByItemIdCachable(itemId) : null
+ return itemId ? Autorisation.findProprietaireByItemId(itemId) : null
}
/**
Autorite getProprietaire() {
if (proprietaire == null) {
if (itemId) {
- proprietaire = Autorisation.findProprietaireByItemIdCachable(itemId)
+ proprietaire = Autorisation.findProprietaireByItemId(itemId)
}
}
return proprietaire
if (this && this.item && autorite) {
Autorisation autorisation =
- Autorisation.findByItemAndAutoriteCachable(this.item, autorite)
+ Autorisation.findByItemAndAutorite(this.item, autorite)
if (autorisation) {
RelDossierAutorisationCahier rel =
RelDossierAutorisationCahier.findByAutorisation(autorisation)
CahierDeTextes cdt,\r
Autorite autorite) {\r
RelDossierAutorisationCahier rel\r
- Autorisation auto = Autorisation.findByAutoriteAndItemCachable(autorite, cdt.item)\r
+ Autorisation auto = Autorisation.findByAutoriteAndItem(autorite, cdt.item)\r
\r
if (auto) {\r
rel = RelDossierAutorisationCahier.findByDossierAndAutorisation(dossier, auto)\r
* @return l'autorisation de l'autorité sur l'item si elle existe, sinon null
*/
Autorisation findAutorisation(Autorite autorite, Item item) {
- return Autorisation.findByAutoriteAndItemCachable(autorite, item)
+ return Autorisation.findByAutoriteAndItem(autorite, item)
}
}
Item itemAgenda = agenda.getItem()
agenda.delete(flush: true)
// Suppression de toutes les autorisations
- List<Autorisation> autorisations = Autorisation.findAllByItemCachable(itemAgenda)
+ List<Autorisation> autorisations = Autorisation.findAllByItem(itemAgenda)
autorisations.each {
it.delete()
}
import org.hibernate.SQLQuery
import org.lilie.services.eliot.securite.Item
import org.lilie.services.eliot.securite.Permission
+import org.hibernate.Hibernate
class AbstractACLSession {
return (List<Autorisation>) autorisations
}
+ private static final PERMISSION_ALIAS = 'permissions'
+ private static final QUERY_REGION = 'query.Permissions'
+ private static final ITEM_ID = 'itemId'
+ private static final AUTOROTE_IDS = 'autoriteIds'
private static final FIND_VALEUR_PERMISSIONS_SQL =
"""
- SELECT bit_or(
- CASE
- WHEN proprietaire THEN ${Permission.MAX_VALUE}
- ELSE valeur_permissions_explicite
- END
- )
+ SELECT bit_or(CASE
+ WHEN proprietaire THEN ${Permission.MAX_VALUE}
+ ELSE valeur_permissions_explicite
+ END) AS ${PERMISSION_ALIAS}
FROM securite.autorisation
WHERE item_id = :itemId
AND autorite_id IN (:autoriteIds)
"""
- private static final ITEM_ID = 'itemId'
- private static final AUTOROTE_IDS = 'autoriteIds'
-
/**
* Retourne la valeur des permissions sur un item de la session.
* La méthode tient compte de la notion de propriété sur l'item en affectant
sqlQuery.setLong(ITEM_ID, item.id)
sqlQuery.setParameterList(AUTOROTE_IDS, autorites*.id)
+ sqlQuery.addScalar(PERMISSION_ALIAS, Hibernate.INTEGER)
+ sqlQuery.setCacheable(true)
+ sqlQuery.setCacheRegion(QUERY_REGION)
List res = sqlQuery.list()
SecuriteSession session)
throws AutorisationException {
super(item, autorite, session);
- autorisation = Autorisation.findByAutoriteAndItemCachable(autorite, item)
+ autorisation = Autorisation.findByAutoriteAndItem(autorite, item)
}
/**
}
private Autorisation findAutorisation() {
- return Autorisation.findByItemAndAutoriteCachable(item, autorite)
+ return Autorisation.findByItemAndAutorite(item, autorite)
}
private void actualisePM(DefaultPermissionsManager pm) {
Item item = cdt.item
assertNotNull item
Autorisation autorisation =
- Autorisation.findByItemAndAutoriteCachable(item, enseignant)
+ Autorisation.findByItemAndAutorite(item, enseignant)
assertNotNull autorisation
assertTrue autorisation.proprietaire
Item item2 = cdt2.item
assertNotNull item2
Autorisation autorisation2 =
- Autorisation.findByItemAndAutoriteCachable(item2, enseignant2)
+ Autorisation.findByItemAndAutorite(item2, enseignant2)
assertNotNull autorisation2
assertTrue autorisation2.proprietaire
assertNotNull("Le cdt de test doit exister à la fin du test.", cdt)
assertNull("Le service du cdt doit être null", cdt.service)
- List<Autorisation> autorisations = Autorisation.findAllByItemCachable(cdt.item)
+ List<Autorisation> autorisations = Autorisation.findAllByItem(cdt.item)
assertEquals(
"Il ne doit y avoir qu'une seule autorisation sur le cdt",
1,
)
// Autorisation propriétaire du cdt
- Autorisation autorisation = Autorisation.findByItemAndAutoriteCachable(
+ Autorisation autorisation = Autorisation.findByItemAndAutorite(
cahierDeTextes.item,
autoriteScolarite
)
private void copieDroitsCahierDeTextes(CahierDeTextes source, CahierDeTextes cible) {
- List<Autorisation> allAutorisation = Autorisation.findAllByItemCachable(source.item)
+ List<Autorisation> allAutorisation = Autorisation.findAllByItem(source.item)
allAutorisation.each {Autorisation autorisationSource ->
cahier.save(flush: true, failOnError: true)
// pour chaque droit sur le cdt maître, on vérifie si on doit supprimer ou non ce droit
- List<Autorisation> allAutorisationSurCahierMaitre = Autorisation.findAllByItemCachable(cahierMaitre.item)
+ List<Autorisation> allAutorisationSurCahierMaitre = Autorisation.findAllByItem(cahierMaitre.item)
allAutorisationSurCahierMaitre.each {Autorisation autorisationSurCahierMaitre ->
cahierMaitre.cahiersIncorpores?.each { CahierDeTextes cahierFusionne ->
- Autorisation droitSurCahierFusionne = Autorisation.findByItemAndAutoriteCachable(
+ Autorisation droitSurCahierFusionne = Autorisation.findByItemAndAutorite(
cahierFusionne.item,
autorisationSurCahierMaitre.autorite
)
private Autorisation findAutorisationProprietaireDuCahierDeTextes(CahierDeTextes cahierDeTextes,
Autorite autorite) {
List<Autorisation> autorisations =
- Autorisation.findAllByItemCachable(cahierDeTextes.item)
+ Autorisation.findAllByItem(cahierDeTextes.item)
Autorisation autorisation = (Autorisation) autorisations.find {
Autorisation aut ->
private Autorisation findAutorisationSurCahierDeTextes(CahierDeTextes cahierDeTextes,
Autorite autorite) {
List<Autorisation> autorisations =
- Autorisation.findAllByItemCachable(cahierDeTextes.item)
+ Autorisation.findAllByItem(cahierDeTextes.item)
Autorisation autorisation = (Autorisation) autorisations.find {
Autorisation aut ->