/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or any later version.
*
* Squale is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
package org.squale.squalecommon.datatransfertobject.transform.stats;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import org.squale.squalecommon.datatransfertobject.stats.ApplicationStatsDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.access.UserAccessBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditDateComparator;
/**
* Transformation d'une application sous forme BO en dto repr�sentatif des statistiques niveau application
*/
public class ApplicationStatsTransformer
{
/**
* Transformation en DTO des statistiques d'une application
*
* @param pApplicationBO l'application
* @param pDaysForTerminatedAudit le nombre de jours max pour lesquels il doit y avoir au moins un audit r�ussi pour
* que l'application soit active
* @param pDaysForAllAudits le nombre de jours d�fini pour compter les audits
* @return les statistiques sous forme DTO
*/
public static ApplicationStatsDTO bo2Dto( ApplicationBO pApplicationBO, int pDaysForTerminatedAudit,
int pDaysForAllAudits )
{
ApplicationStatsDTO stat = new ApplicationStatsDTO();
// On tri les audits selon leur date d'ex�cution
List sortedAudits = new ArrayList( pApplicationBO.getAudits() );
Collections.sort( sortedAudits, new AuditDateComparator( true ) );
AuditBO firstTerminatedAudit = getFirstTerminatedAudit( sortedAudits );
Collections.reverse( sortedAudits );
AuditBO lastExecutedAudit = getLastExecutedAudit( sortedAudits );
// On calcule la date limite pour d�finir l'activation d'une application
Calendar minDate = Calendar.getInstance();
minDate.add( Calendar.DAY_OF_MONTH, -pDaysForTerminatedAudit );
stat.setApplicationName( pApplicationBO.getName() );
stat.setActivatedApplication( hasTerminatedAuditSince( sortedAudits, pDaysForTerminatedAudit ) );
if ( null != firstTerminatedAudit )
{
stat.setFirstTerminatedAuditDate( firstTerminatedAudit.getDate() );
}
if ( pApplicationBO.getUserAccesses().size() > 0 )
{
stat.setLastAccess( ( (UserAccessBO) pApplicationBO.getUserAccesses().get( 0 ) ).getDate() );
}
if ( null != lastExecutedAudit )
{
stat.setLastAuditDuration( lastExecutedAudit.getDuration() );
stat.setLastAuditIsTerminated( lastExecutedAudit.getStatus() == AuditBO.TERMINATED );
}
AuditBO lastFailedAudit = getLastAudit( sortedAudits, new int[] { AuditBO.FAILED, AuditBO.PARTIAL } );
if ( null != lastFailedAudit )
{
stat.setLastFailedAuditDate( lastFailedAudit.getDate() );
}
AuditBO lastTerminatedAudit = getLastAudit( sortedAudits, new int[] { AuditBO.TERMINATED } );
if ( null != lastTerminatedAudit )
{
stat.setLastTerminatedAuditDate( lastTerminatedAudit.getDate() );
}
stat.setNbAudits( getNbAuditsSince( sortedAudits, pDaysForAllAudits ) );
stat.setNbPartialOrFaliedAudits( getNbPartialOrFailedAudits( sortedAudits ) );
stat.setNbTerminatedAudits( getNbTerminatedAudits( sortedAudits ) );
if ( null != pApplicationBO.getServeurBO() )
{
// Peut �tre nul dans le cas des applications non valid�es
stat.setServerName( pApplicationBO.getServeurBO().getName() );
}
stat.setValidatedApplication( pApplicationBO.getStatus() == ApplicationBO.VALIDATED );
stat.setPurgeFrequency( pApplicationBO.getResultsStorageOptions() );
return stat;
}
/**
* @param pAudits la liste tri�e des audits (ordre inverse)
* @param pDaysForTerminatedAudit le nombre de jours max pour lesquels il doit y avoir au moins un audit r�ussi pour
* que l'application soit active
* @return true si l'application a un audit r�ussi dans le <code>pDaysForTerminatedAudit</code> derniers jours
*/
private static boolean hasTerminatedAuditSince( List pAudits, int pDaysForTerminatedAudit )
{
boolean has = false;
// On calcule la date limite pour compter les audits
Calendar minDate = Calendar.getInstance();
minDate.add( Calendar.DAY_OF_MONTH, -pDaysForTerminatedAudit );
boolean dateInTime = true;
AuditBO currentAudit = null;
for ( int i = 0; i < pAudits.size() && !has && dateInTime; i++ )
{
currentAudit = (AuditBO) pAudits.get( i );
// On teste si on est encore dans la p�riode de temps souhaiter
if ( null != currentAudit.getDate() && currentAudit.getDate().compareTo( minDate.getTime() ) < 0 )
{
dateInTime = false;
}
has = ( dateInTime && currentAudit.getStatus() == AuditBO.TERMINATED );
}
return has;
}
/**
* @param pAudits la liste tri�e des audits (ordre inverse)
* @return le dernier audit ex�cut�
*/
private static AuditBO getLastExecutedAudit( List pAudits )
{
AuditBO lastAudit = null;
// On parcours les audits jusqu'� un trouv� le dernier ex�cut�
// (i.e. le premier qui n'est pas en attente dans la liste)
AuditBO currentAudit = null;
for ( int i = 0; i < pAudits.size() && null == lastAudit; i++ )
{
currentAudit = (AuditBO) pAudits.get( i );
if ( currentAudit.getStatus() != AuditBO.NOT_ATTEMPTED && currentAudit.getStatus() != AuditBO.RUNNING )
{
lastAudit = currentAudit;
}
}
return lastAudit;
}
/**
* @param pAudits les audits
* @return ne nombre d'audits partiel ou en �chec
*/
private static int getNbPartialOrFailedAudits( List pAudits )
{
int nbAudits = 0;
AuditBO currentAudit = null;
for ( int i = 0; i < pAudits.size(); i++ )
{
currentAudit = (AuditBO) pAudits.get( i );
if ( currentAudit.getStatus() == AuditBO.FAILED || currentAudit.getStatus() == AuditBO.PARTIAL )
{
// On veut le nombre d'audits en �chec ou patiel
nbAudits++;
}
}
return nbAudits;
}
/**
* @param pAudits les audits
* @return ne nombre d'audits r�ussis
*/
private static int getNbTerminatedAudits( List pAudits )
{
int nbAudits = 0;
AuditBO currentAudit = null;
for ( int i = 0; i < pAudits.size(); i++ )
{
currentAudit = (AuditBO) pAudits.get( i );
if ( currentAudit.getStatus() == AuditBO.TERMINATED )
{
// On veut le nombre d'audits en �chec ou patiel
nbAudits++;
}
}
return nbAudits;
}
/**
* Compte les audits dont le statut est "en echec", "partiel" ou "r�ussi" r�alis�s durant les
* <code>pDaysForAllAudits</code> derniers jours
*
* @param pAudits les audits tri�s par date d'ex�cution (ordre inverse)
* @param pDaysForAllAudits le nombre de jours d�fini pour compter les audits
* @return le nombre d'audits r�alis�s durant les <code>pDaysForAllAudits</code> derniers jours
*/
private static int getNbAuditsSince( List pAudits, int pDaysForAllAudits )
{
int nbAudits = 0;
// On calcule la date limite pour compter les audits
Calendar minDate = Calendar.getInstance();
minDate.add( Calendar.DAY_OF_MONTH, -pDaysForAllAudits );
boolean dateInTime = true;
AuditBO currentAudit = null;
for ( int i = 0; i < pAudits.size() && dateInTime; i++ )
{
currentAudit = (AuditBO) pAudits.get( i );
// On teste si on est encore dans la p�riode de temps souhaiter
if ( null != currentAudit.getDate() && currentAudit.getDate().compareTo( minDate.getTime() ) < 0 )
{
dateInTime = false;
}
// On ne prend pas les status "en cours", "supprim�" et "en attente"
if ( dateInTime && currentAudit.getStatus() != AuditBO.NOT_ATTEMPTED
&& currentAudit.getStatus() != AuditBO.DELETED && currentAudit.getStatus() != AuditBO.RUNNING )
{
// On veut le nombre d'audits ex�cut�s donc on prend tous les audits
// sauf ceux en attente
nbAudits++;
}
}
return nbAudits;
}
/**
* @param pAudits les audits tri�s par date d'ex�cution (ordre inverse)
* @param pStatus les statuts � rechercher
* @return le dernier audit r�ussi
*/
private static AuditBO getLastAudit( List pAudits, int[] pStatus )
{
// Initialisation
AuditBO lastTerminatedAudit = null;
// On tri le tableau des status pour pouvoir utiliser la recherche
Arrays.sort( pStatus );
// On parcours les audits jusqu'� un trouver un r�ussi
AuditBO currentAudit = null;
int curStatus = 0;
for ( int i = 0; i < pAudits.size() && null == lastTerminatedAudit; i++ )
{
currentAudit = (AuditBO) pAudits.get( i );
// On affecte le int pour flusher l'objet
curStatus = currentAudit.getStatus();
int id = Arrays.binarySearch( pStatus, curStatus );
if ( id >= 0 && id < pStatus.length )
{
lastTerminatedAudit = currentAudit;
}
}
return lastTerminatedAudit;
}
/**
* @param pAudits les audits tri�s par date d'ex�cution
* @return le premier audit r�ussi
*/
private static AuditBO getFirstTerminatedAudit( List pAudits )
{
AuditBO firstTerminatedAudit = null;
// On parcours les audits jusqu'� un trouv� un r�ussi
AuditBO currentAudit = null;
for ( int i = 0; i < pAudits.size() && null == firstTerminatedAudit; i++ )
{
currentAudit = (AuditBO) pAudits.get( i );
if ( currentAudit.getStatus() == AuditBO.TERMINATED )
{
firstTerminatedAudit = currentAudit;
}
}
return firstTerminatedAudit;
}
}