import org.lilie.services.eliot.securite.AutorisationException
import org.lilie.services.eliot.textes.CahierDeTextesImport
import org.lilie.services.eliot.applications.textes.importexport.erreur.TextesErreurGenerale
+import org.springframework.transaction.TransactionStatus
+import org.lilie.services.eliot.textes.CahierDeTextes
+import org.hibernate.SessionFactory
/**
* Service principal des imports de cahiers de textes depuis des fichiers XML
TextesXml03Service textesXml03Service
TextesImportTransformService textesImportTransformService
TextesImportLoaderService textesImportLoaderService
+ SessionFactory sessionFactory
/**
* Importe les données de l'application eliot-textes
}
listeCahiers.each {CahierDeTextesInfo cdt ->
- importeCdt(securiteSession, cdt, rapportPrincipal, cahierDeTextesImport)
+ executeDansTransaction(rapportPrincipal){
+ importeCdt(securiteSession, cdt, rapportPrincipal, cahierDeTextesImport)
+ }
}
- // si un seul cahier est en échec, l'import de tous les cahiers sera rollbacké
- if (rapportPrincipal.nombreCdtCreer < rapportPrincipal.nombreCdtParse){
- rapportPrincipal.nombreCdtCreer = 0
- rapportPrincipal.listWarnings = []
- } else {
- textesImportLoaderService.metAJourDateFinImport(cahierDeTextesImport)
- }
+ textesImportLoaderService.metAJourDateFinImport(cahierDeTextesImport)
return rapportPrincipal
CahierDeTextesInfo cahierInfo,
TextesImportRapport rapportPrincipal,
CahierDeTextesImport cahierDeTextesImport) {
+ // vide la liste des warnings temporaires
+ rapportPrincipal.listWarningsTemporaires = []
- try {
- rapportPrincipal.incNombreCdtParse()
+ rapportPrincipal.incNombreCdtParse()
- ImportCahierCommand cahierCommand = textesImportTransformService.transform(
- cahierInfo,
- rapportPrincipal
- )
+ ImportCahierCommand cahierCommand = textesImportTransformService.transform(
+ cahierInfo,
+ rapportPrincipal
+ )
- textesImportLoaderService.load(
- securiteSession,
- cahierCommand,
- cahierDeTextesImport
- )
+ textesImportLoaderService.load(
+ securiteSession,
+ cahierCommand,
+ cahierDeTextesImport
+ )
- rapportPrincipal.incNombreCdtCreer()
- }
- catch (CahierDeTextesInvalideException e) {
- traiteErreurConnue(e, rapportPrincipal)
- }
- catch (RecherchePersonneUniqueException e) {
- traiteErreurConnue(e, rapportPrincipal)
- }
- catch (CreationContenuException e) {
- traiteErreurConnue(e, rapportPrincipal)
- }
- catch (AutorisationException e){
- traiteErreurConnue(e, rapportPrincipal)
- }
- catch (Exception e) {
- traiteErreurInconnue(e, rapportPrincipal)
+ rapportPrincipal.incNombreCdtCreer()
+
+ // passe les warnings de l'état temporaire à l'état permanent
+ if (rapportPrincipal.listWarningsTemporaires.size() > 0){
+ rapportPrincipal.listWarnings << rapportPrincipal.listWarningsTemporaires
}
}
rapportPrincipal.ajouterErreur(new TextesErreurInconnue(erreur: e))
}
+
+ /**
+ * Exécution transactionnelle
+ * @param rapport
+ * @param closure
+ */
+ private void executeDansTransaction(TextesImportRapport rapportPrincipal,
+ Closure closure) {
+ CahierDeTextes.withTransaction { TransactionStatus status ->
+ try {
+ closure()
+ sessionFactory.currentSession.flush()
+ }
+ catch (CahierDeTextesInvalideException e) {
+ status.setRollbackOnly()
+ traiteErreurConnue(e, rapportPrincipal)
+ }
+ catch (RecherchePersonneUniqueException e) {
+ status.setRollbackOnly()
+ traiteErreurConnue( e, rapportPrincipal)
+ }
+ catch (CreationContenuException e) {
+ status.setRollbackOnly()
+ traiteErreurConnue(e, rapportPrincipal)
+ }
+ catch (AutorisationException e){
+ status.setRollbackOnly()
+ traiteErreurConnue(e, rapportPrincipal)
+ }
+ catch (Exception e) {
+ status.setRollbackOnly()
+ traiteErreurInconnue(e, rapportPrincipal)
+ }
+ }
+ }
}
import org.lilie.services.eliot.applications.textes.importexport.rapport.TextesImportRapport
import org.lilie.services.eliot.applications.textes.importexport.erreur.TextesErreurImport
import grails.plugin.spock.UnitSpec
+import org.lilie.services.eliot.textes.CahierDeTextes
+import org.springframework.transaction.TransactionStatus
/**
* @author agia
textesImportTransformService : textesImportTransformService,
textesImportLoaderService : textesImportLoaderService
)
+
+ TransactionStatus mockStatus = Mock()
+ CahierDeTextes.metaClass.'static'.withTransaction = {Closure c -> c.call(mockStatus)}
}
- def 'importeCdt - erreur inconnue'() {
+ def 'executeDansTransaction - erreur inconnue'() {
setup:
SecuriteSession securiteSession = Mock()
TextesImportRapport rapportPrincipal = new TextesImportRapport()
- CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo(
- niveau: niveau,
- structureEnseignementType: structureEnseignementType,
- structureEnseignementCode: structureEnseignementCode
- )
+ CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo()
textesImportTransformService.transform(
cahierDeTextesInfo,
rapportPrincipal) >>
{throw new NullPointerException(erreurMessage)}
when:
- textesImportService.importeCdt(
- securiteSession,
- cahierDeTextesInfo,
- rapportPrincipal,
- cahierDeTextesImport
- )
+ textesImportService.executeDansTransaction(rapportPrincipal,{
+ textesImportService.importeCdt(
+ securiteSession,
+ cahierDeTextesInfo,
+ rapportPrincipal,
+ cahierDeTextesImport
+ )
+ })
then:
- rapportPrincipal.nombreCdtParse == 1
- rapportPrincipal.nombreCdtCreer == 0
- rapportPrincipal.listTexteErreursImport.size() == 1
TextesErreurImport erreur = rapportPrincipal.listTexteErreursImport.get(0)
erreur.getMessage() ==
"Erreur - Une erreur inattendue s'est produite durant l'import : ${erreurMessage}"
where:
- niveau = 1
- structureEnseignementType = "classe"
- structureEnseignementCode = "003"
erreurMessage = "NPE"
cahierDeTextesImport = null
}
- def 'importeCdt - erreur connue : RecherchePersonneUniqueException'() {
+ def 'executeDansTransaction - erreur connue : RecherchePersonneUniqueException'() {
setup:
SecuriteSession securiteSession = Mock()
TextesImportRapport rapportPrincipal = new TextesImportRapport()
- CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo(
- niveau: niveau,
- structureEnseignementType: structureEnseignementType,
- structureEnseignementCode: structureEnseignementCode
- )
+ CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo()
textesImportTransformService.transform(
cahierDeTextesInfo,
rapportPrincipal) >>
{throw new RecherchePersonneUniqueException(erreurMessage)}
when:
- textesImportService.importeCdt(
- securiteSession,
- cahierDeTextesInfo,
- rapportPrincipal,
- cahierDeTextesImport
- )
+ textesImportService.executeDansTransaction(rapportPrincipal,{
+ textesImportService.importeCdt(
+ securiteSession,
+ cahierDeTextesInfo,
+ rapportPrincipal,
+ cahierDeTextesImport
+ )
+ })
then:
- rapportPrincipal.nombreCdtParse == 1
- rapportPrincipal.nombreCdtCreer == 0
- rapportPrincipal.listTexteErreursImport.size() == 1
TextesErreurImport erreur = rapportPrincipal.listTexteErreursImport.get(0)
erreur.getMessage() ==
"Erreur - Le cahier de textes n'a pas été importé : ${erreurMessage}"
where:
- niveau = 1
- structureEnseignementType = "classe"
- structureEnseignementCode = "003"
erreurMessage = "Plusieurs personnes ont le même \n nom : PHILO," +
"\n même prénom : Sophie," +
"\n même date de naissance : null"
cahierDeTextesImport = null
}
- def 'importeCdt - erreur connue : CreationContenuException'() {
+ def 'executeDansTransaction - erreur connue : CreationContenuException'() {
setup:
SecuriteSession securiteSession = Mock()
TextesImportRapport rapportPrincipal = new TextesImportRapport()
- CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo(
- niveau: niveau,
- structureEnseignementType: structureEnseignementType,
- structureEnseignementCode: structureEnseignementCode
- )
+ CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo()
textesImportTransformService.transform(
cahierDeTextesInfo,
rapportPrincipal) >>
{throw new CreationContenuException(erreurMessage)}
when:
- textesImportService.importeCdt(
- securiteSession,
- cahierDeTextesInfo,
- rapportPrincipal,
- cahierDeTextesImport
- )
+ textesImportService.executeDansTransaction(rapportPrincipal,{
+ textesImportService.importeCdt(
+ securiteSession,
+ cahierDeTextesInfo,
+ rapportPrincipal,
+ cahierDeTextesImport
+ )
+ })
then:
- rapportPrincipal.nombreCdtParse == 1
- rapportPrincipal.nombreCdtCreer == 0
- rapportPrincipal.listTexteErreursImport.size() == 1
TextesErreurImport erreur = rapportPrincipal.listTexteErreursImport.get(0)
erreur.getMessage() ==
"Erreur - Le cahier de textes n'a pas été importé : ${erreurMessage}"
where:
- niveau = 1
- structureEnseignementType = "classe"
- structureEnseignementCode = "003"
erreurMessage = """Echec de la création de l'activité Recherche sur le loto
(cahier: MATHEMATIQUES - 1ES2, chapitre parent: Statistiques)"""
cahierDeTextesImport = null
setup:
SecuriteSession securiteSession = Mock()
TextesImportRapport rapportPrincipal = new TextesImportRapport()
- CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo(
- niveau: niveau,
- structureEnseignementType: structureEnseignementType,
- structureEnseignementCode: structureEnseignementCode
+ CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo()
+
+ when:
+ textesImportService.importeCdt(
+ securiteSession,
+ cahierDeTextesInfo,
+ rapportPrincipal,
+ cahierDeTextesImport
)
+ then:
+ rapportPrincipal.nombreCdtParse == 1
+ rapportPrincipal.nombreCdtCreer == 1
+ rapportPrincipal.listTexteErreursImport.size() == 0
+
+ where:
+ cahierDeTextesImport = null
+ }
+
+ def 'importeCdt - warning'() {
+ setup:
+ SecuriteSession securiteSession = Mock()
+ List<String> listWarningsTemporaires =
+ ["Information - Le cahier de textes de classe a été créé en tant que privé"]
+ TextesImportRapport rapportPrincipal = new TextesImportRapport()
+ CahierDeTextesInfo cahierDeTextesInfo = new CahierDeTextesInfo()
+ textesImportLoaderService.load(
+ securiteSession,
+ cahierCommand,
+ cahierDeTextesImport
+ ) >> {rapportPrincipal.listWarningsTemporaires = listWarningsTemporaires}
+
when:
textesImportService.importeCdt(
securiteSession,
rapportPrincipal.nombreCdtParse == 1
rapportPrincipal.nombreCdtCreer == 1
rapportPrincipal.listTexteErreursImport.size() == 0
+ rapportPrincipal.listWarnings.get (0) ==
+ "Information - Le cahier de textes de classe a été créé en tant que privé"
where:
- niveau = 1
- structureEnseignementType = "classe"
- structureEnseignementCode = "003"
cahierDeTextesImport = null
}
cahierDeTextesImport = null
message = "message d'erreur"
}
+
+ def cleanup(){
+ CahierDeTextes.metaClass = null
+ }
}