/** * 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/>. */ //Source file: D:\\cc_views\\squale_v0_0_act_M400843\\squale\\src\\squaleCommon\\src\\org\\squale\\squalecommon\\enterpriselayer\\businessobject\\component\\ApplicationBO.java package org.squale.squalecommon.enterpriselayer.businessobject.component; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang.builder.ToStringBuilder; import org.squale.squalecommon.enterpriselayer.businessobject.UnexpectedRelationException; import org.squale.squalecommon.enterpriselayer.businessobject.access.UserAccessBO; import org.squale.squalecommon.enterpriselayer.businessobject.config.AuditFrequencyBO; import org.squale.squalecommon.enterpriselayer.businessobject.config.ServeurBO; import org.squale.squalecommon.enterpriselayer.businessobject.profile.UserBO; import org.squale.squalecommon.enterpriselayer.businessobject.sharedrepository.ApplicationExportBO; /** * Repr�sente une application * * @author m400842 * @hibernate.subclass lazy="true" discriminator-value="Application" */ public class ApplicationBO extends AbstractComplexComponentBO { /** * Generated UID */ private static final long serialVersionUID = 3347680528535207656L; /** * L'application est en cr�ation (non valid�e) */ public static final int IN_CREATION = 0; /** * L'application est valid�e. */ public static final int VALIDATED = 1; /** * L'application est supprim�e. */ public static final int DELETED = 2; /** * Fr�quence d'audit en nombre de jour */ private int mAuditFrequency; /** * R�gle de purge */ private int mResultsStorageOptions; /** * indique si l'application �tait d�ja en production au moment de sa cr�ation dans SQUALE */ private boolean mIsInProduction; /** * Indique si l'application a �t� d�velopp� en externe */ private boolean mExternalDev; /** * Contient le status du projet (non valid�, en cr�ation, ...) */ private int mStatus; /** * Date de derni�re modification du projet */ private Date mLastUpdate; /** * Nom du dernier utilisateur ayant modifi� l'application */ private String mLastUser; /** * Contient le nom des trois derniers acc�s utilisateur non administrateur Squale */ private List mUserAccesses = new ArrayList(); /** * Site sur lequel les sources sont h�berg�es (Valbonne, ...) */ private ServeurBO mServeurBO; /** * Application publique */ private boolean mPublic; /** * List of all source code recovering termination task. Attribute use when the source code recovering optimization * is enabled */ private HashSet<Object> sourceCodeTerminationTask; /** * Does the quality approach started at the beginning of the project */ private boolean mIsQualityApproachOnStart; /** * Does the application is in its initial development phase */ private boolean mIsInInitialDev; /** * Global cost of the application */ private int globalCost; /** * The development cost of the application in its initial development phase. Only available when the project is on * its initial development phase. */ private int devCost; /** * The last export of the application */ private ApplicationExportBO lastExport; /** * Set of user which have rights for this application */ private Set<UserBO> userList = new HashSet<UserBO>(); /** * Instancie un nouveau composant. * * @param pName Nom du composant. * @roseuid 42AFF0B3011B */ public ApplicationBO( final String pName ) { super(); setName( pName ); } /** * Access method for the mAuditFrequency property. * * @return the current value of the mAuditFrequency property * @hibernate.property name="auditFrequency" column="AuditFrequency" type="integer" length="10" not-null="false" * unique="false" insert="true" update="true" * @roseuid 42BACECB0380 */ public int getAuditFrequency() { return mAuditFrequency; } /** * Sets the value of the mAuditFrequency property. * * @param pAuditFrequency the new value of the mAuditFrequency property * @roseuid 42BACECB0381 */ public void setAuditFrequency( int pAuditFrequency ) { mAuditFrequency = pAuditFrequency; } /** * Access method for the mResultsStorageOptions property. * * @return the current value of the mResultsStorageOptions property * @hibernate.property column="ResultsStorageOptions" type="integer" length="10" not-null="false" unique="false" * insert="true" update="true" name="resultsStorageOptions" * @roseuid 42BACECB0383 */ public int getResultsStorageOptions() { return mResultsStorageOptions; } /** * Sets the value of the mResultsStorageOptions property. * * @param pResultsStorageOptions the new value of the mResultsStorageOptions property * @roseuid 42BACECB0390 */ public void setResultsStorageOptions( int pResultsStorageOptions ) { mResultsStorageOptions = pResultsStorageOptions; } /** * Retourne le statut de l'application * * @return the mStatus property is true * @hibernate.property name="status" column="Status" type="integer" length="10" unique="false" insert="true" * update="true" * @roseuid 42CAA72C0133 */ public int getStatus() { return mStatus; } /** * Sets the value of the mStatus property. * * @param pStatus le status du projet * @roseuid 42CAA72C020E */ public void setStatus( int pStatus ) { mStatus = pStatus; } /** * Constructeur par d�faut. * * @roseuid 42CB9778032A */ public ApplicationBO() { super(); sourceCodeTerminationTask = new HashSet<Object>(); } /** * Constructeur complet. * * @param pName nom du composant * @param pAuditFrequency fr�quence d'audit * @param pResultsStorageOptions options de stockage des r�sultats * @param pStatus projet valid� ou non * @param pAudits Collection des audits * @param pChildren Collection d'enfants * @param pSiteId le site de l'application * @param pExternalDev le bool�en indiquant si c'est un d�veloppement externe * @param pIsInProduction un bool�en indiquant si l'application �tait d�j� en production au moment de sa cr�ation * dans SQUALE * @throws UnexpectedRelationException si la relation ne peut etre ajout� * @roseuid 42CB9779000D */ public ApplicationBO( String pName, int pAuditFrequency, int pResultsStorageOptions, int pStatus, Collection pAudits, Collection pChildren, long pSiteId, boolean pExternalDev, boolean pIsInProduction ) throws UnexpectedRelationException { super( pName, pChildren, null ); mAuditFrequency = pAuditFrequency; mResultsStorageOptions = pResultsStorageOptions; mStatus = pStatus; mAudits = pAudits; mServeurBO = new ServeurBO(); mServeurBO.setServeurId( pSiteId ); mExternalDev = pExternalDev; mIsInProduction = pIsInProduction; sourceCodeTerminationTask = new HashSet<Object>(); } /** * R�cup�re l'attribut mPublic * * @return projet est-il public * @hibernate.property column="PublicApplication" type="boolean" unique="false" insert="true" update="true" * name="public" */ public boolean getPublic() { return mPublic; } /** * Affecte pPublic � l'attribut mPublic. * * @param pPublic projet est-il publique * @roseuid 42CE36C203DF */ public void setPublic( boolean pPublic ) { mPublic = pPublic; } /** * R�cup�re l'attribut mLastUpdate * * @return la date de derni�re modification. * @hibernate.property name="lastUpdate" column="LastUpdate" type="timestamp" not-null="false" unique="false" * insert="true" update="true" */ public Date getLastUpdate() { return mLastUpdate; } /** * Modifie l'attribut mLastUpdate * * @param pDate la date */ public void setLastUpdate( Date pDate ) { mLastUpdate = pDate; } /** * Affecte la date courante � l'attribut mLastUpdate */ public void setLastUpdate() { Calendar cal = new GregorianCalendar(); mLastUpdate = cal.getTime(); } /** * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals( Object pObj ) { boolean ret = false; if ( pObj instanceof ApplicationBO ) { ApplicationBO appli = (ApplicationBO) pObj; ret = ( getName() != null ) && ( appli.getName() != null ) && getName().equals( appli.getName() ) && ( getStatus() == appli.getStatus() ); } return ret; } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return getName() == null ? super.hashCode() : getName().hashCode(); } /** * @see java.lang.Object#toString() */ public String toString() { ToStringBuilder stringBuilder = new ToStringBuilder( this ); stringBuilder.append( "Name", mName ); return stringBuilder.toString(); } /** * @return le bool�en indiquant si le dev a �t� fait en externe ou pas * @hibernate.property column="EXTERNAL_DEV" type="boolean" unique="false" insert="true" update="true" * name="externalDev" */ public boolean getExternalDev() { return mExternalDev; } /** * @return le bool�en indiquant si l'application �tait d�j� en production au moment de sa cr�ation dans squale * @hibernate.property name="inProduction" column="IN_PRODUCTION" type="boolean" unique="false" insert="true" * update="true" */ public boolean getInProduction() { return mIsInProduction; } /** * @param pExternal le bool�en indiquant si le dev a �t� fait en externe */ public void setExternalDev( boolean pExternal ) { mExternalDev = pExternal; } /** * @param pInProduction le bool�en indiquant si l'application �tait d�j� en production au */ public void setInProduction( boolean pInProduction ) { mIsInProduction = pInProduction; } /** * @return le dernier utilisateur ayant modifi� l'application * @hibernate.property column="lastUser" type="string" length="1024" unique="false" insert="true" update="true" * name="lastUser" */ public String getLastUser() { return mLastUser; } /** * @param pUser le dernier utilisateur ayant modifi� l'application */ public void setLastUser( String pUser ) { mLastUser = pUser; } /** * Retourne le serveur de l'application * * @return le serveur de l'application * @hibernate.many-to-one column="Serveur" * class="org.squale.squalecommon.enterpriselayer.businessobject.config.ServeurBO" * not-null="false" insert="true" update="true" cascade="none" outer-join="auto" */ // name="serveurBO" public ServeurBO getServeurBO() { return mServeurBO; } /** * Modifie le serveur de l'application * * @param pServeurBO le serveur de l'application */ public void setServeurBO( ServeurBO pServeurBO ) { mServeurBO = pServeurBO; } /** * @return les 3 derniers acc�s utilisateur * @hibernate.list table="UserAccess" cascade="all" lazy="false" * @hibernate.key column="ApplicationId" * @hibernate.index column="AccessIndex" type="long" length="19" * @hibernate.one-to-many class="org.squale.squalecommon.enterpriselayer.businessobject.access.UserAccessBO" */ public List getUserAccesses() { return mUserAccesses; } /** * @param pAccessBOs les acc�s utilisateur */ public void setUserAccesses( List pAccessBOs ) { mUserAccesses = pAccessBOs; } /** * Ajoute un acc�s en supprimant le dernier �l�ment du tableau et en d�calant les autres �lements afin d'ajouter * l'acc�s en premier * * @param pAccessBO l'acc�s � ajouter * @param maxSize le nombre limite d'acc�s � conserver */ public void addUserAccess( UserAccessBO pAccessBO, int maxSize ) { // On n'ajoute l'�l�ment seulement si il n'existe pas d�j� if ( !mUserAccesses.contains( pAccessBO ) ) { // On affecte l'application pAccessBO.setApplication( this ); // On ajoute l'�l�ment en d�but de liste mUserAccesses.add( 0, pAccessBO ); // Si la taille max est atteinte, on supprime le dernier �l�ment int stackSize = mUserAccesses.size(); if ( stackSize > maxSize ) { mUserAccesses.remove( stackSize - 1 ); } } } /** * @param pFrequencies les fr�quences max autoris�es * @return true si on a chang� la fr�quence de l'application */ public boolean changeFrequency( Collection pFrequencies ) { boolean hasChanged = false; if ( null != mUserAccesses && mUserAccesses.size() > 0 ) { // Le dernier acc�s utilisateur Date lastAccess = ( (UserAccessBO) mUserAccesses.get( 0 ) ).getDate(); // On fait ensuite une recherche sur le nombre de jours max des fr�quences // afin de v�rifier que la fr�quence de l'application respecte la configuration SQUALIX int nbDaysMax = findFrequency( lastAccess, pFrequencies ); // On v�rifie la fr�quence (> 0 car peut avoir que des audits de jalon) if ( mAuditFrequency > 0 && mAuditFrequency < nbDaysMax ) { // On change la fr�quence setAuditFrequency( nbDaysMax ); hasChanged = true; } } return hasChanged; } /** * @param lastAccess le dernier acc�s utilisateur * @param pFrequencies les fr�quences. La collection ne doit pas �tre nulle ni vide. * @return la fr�quence */ private int findFrequency( Date lastAccess, Collection pFrequencies ) { // initialisation int frequencyToChange = -1; // Si la fr�quence ne doit pas �tre chang�e, on retourne -1 // constantes pour le calcul du nombre de jour final int HOURS_IN_DAY = 24; final int MINUTES_IN_HOUR = 60; final int SECONDS_IN_MINUTE = 60; final int MILLI_IN_SECOND = 1000; // On r�cup�re le nombre de jours depuis le dernier acc�s Calendar today = Calendar.getInstance(); Calendar access = Calendar.getInstance(); access.setTime( lastAccess ); // on compte le nombre de jours qui s�parent les deux dates int nbDays = new Long( ( today.getTimeInMillis() - access.getTimeInMillis() ) / HOURS_IN_DAY / MINUTES_IN_HOUR / SECONDS_IN_MINUTE / MILLI_IN_SECOND ).intValue(); // On va cr�er la liste des fr�quences tri�es par nombre de jours List frequencies = new ArrayList( pFrequencies ); Collections.sort( frequencies ); AuditFrequencyBO frequency = null; frequency = (AuditFrequencyBO) frequencies.get( 0 ); int curFreq = frequency.getDays(); if ( curFreq < nbDays ) { boolean found = false; // Tant qu'on a pas trouv� la limite on it�re for ( int i = 1; !found && i < frequencies.size(); i++ ) { frequency = (AuditFrequencyBO) frequencies.get( i ); if ( frequency.getDays() < nbDays ) { curFreq = frequency.getFrequency(); } else { found = true; } } frequencyToChange = curFreq; } return frequencyToChange; } /** * {@inheritDoc} * * @see org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComponentBO#accept(org.squale.squalecommon.enterpriselayer.businessobject.component.ComponentVisitor, * java.lang.Object) */ public Object accept( ComponentVisitor pVisitor, Object pArgument ) { return pVisitor.visit( this, pArgument ); } /** * Get the list of source code recovering termination task which should be done at the end of the audit * * @return The list of source code recovering termination task */ public HashSet<Object> getSourceCodeTerminationTask() { return sourceCodeTerminationTask; } /** * Set the list of source code recovering termination task which should be done at the end of the audit * * @param pSourceCodeTerminationTask The list of source code recovering termination task */ public void setSourceCodeTerminationTask( HashSet<Object> pSourceCodeTerminationTask ) { sourceCodeTerminationTask = pSourceCodeTerminationTask; } /** * Getter method for the attribute isQualityApproachOnStart * * @hibernate.property name="qualityApproachOnStart" column="QualityApproachOnStart" type="boolean" unique="false" * insert="true" update="true" * @return true if the quality approach started at the beginning of the project */ public boolean getQualityApproachOnStart() { return ( mIsQualityApproachOnStart ); } /** * Setter method for the attribute isQualityApproachOnStart * * @param pIsQualityApproachOnStart The new value for the attribute isQualityApproachOnStart */ public void setQualityApproachOnStart( boolean pIsQualityApproachOnStart ) { mIsQualityApproachOnStart = pIsQualityApproachOnStart; } /** * Getter method for the attribute isInInitialDev * * @hibernate.property name="inInitialDev" column="InInitialDev" type="boolean" unique="false" insert="true" * update="true" * @return true if the application is in initial development phase */ public boolean getInInitialDev() { return mIsInInitialDev; } /** * Setter method for the attribute isInInitialDev * * @param pIsInInitialDev The new value for the attribute isInInitialDev */ public void setInInitialDev( boolean pIsInInitialDev ) { mIsInInitialDev = pIsInInitialDev; } /** * Getter method for the attribute globalCost * * @hibernate.property name="globalCost" column="GlobalCost" type="integer" length="10" unique="false" insert="true" * update="true" * @return The global cost of the application */ public int getGlobalCost() { return globalCost; } /** * Setter method for the attribute globalCost * * @param pGlobalCost The new value for globalcost attribute */ public void setGlobalCost( int pGlobalCost ) { globalCost = pGlobalCost; } /** * Getter method for the attribute devCost * * @hibernate.property name="devCost" column="DevCost" type="integer" length="10" unique="false" insert="true" * update="true" * @return the development cost of the application */ public int getDevCost() { return devCost; } /** * Setter method for the devCost attribute * * @param pDevCost The new value for the devcost attribute */ public void setDevCost( int pDevCost ) { devCost = pDevCost; } /** * Getter for the attribute last export * * @hibernate.one-to-one * class="org.squale.squalecommon.enterpriselayer.businessobject.sharedrepository.ApplicationExportBO" * property-ref="application" cascade="all" lazy="no-proxy" fetch="join" * @return information on the last export */ public ApplicationExportBO getLastExport() { return lastExport; } /** * Setter for the attribut last export * * @param pLastExport The new information set of the last export */ public void setLastExport( ApplicationExportBO pLastExport ) { lastExport = pLastExport; } /** * Verify if the audit given in argument is obsolete. The audit should be an audit of the current application * * @param audit The audit to verify * @return true if the audit is obsolete */ public boolean isAuditObsolete( AuditBO audit ) { boolean obsolete = true; Calendar cal = GregorianCalendar.getInstance(); Calendar calAuditDate = GregorianCalendar.getInstance(); calAuditDate.setTime( audit.getRealBeginningDate() ); calAuditDate.add( Calendar.DATE, mResultsStorageOptions ); if ( calAuditDate.after( cal ) ) { obsolete = false; } return obsolete; } /** * Getter method for the attribute userList * * @return the list of user which have rights for this application * @hibernate.set cascade="none" lazy="true" table="User_Rights" inverse="true" sort="unsorted" * @hibernate.key column="ApplicationId" * @hibernate.many-to-many class="org.squale.squalecommon.enterpriselayer.businessobject.profile.UserBO" * column="UserId" outer-join="auto" */ public Set<UserBO> getUserList() { return userList; } /** * Setter method for the attribute userList * * @param pUserList The new list of user which have rights for the application */ public void setUserList( Set<UserBO> pUserList ) { userList = pUserList; } }