/**
* 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.squaleweb.applicationlayer.action.results.project;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.jraf.helper.AccessDelegateHelper;
import org.squale.jraf.spi.accessdelegate.IApplicationComponent;
import org.squale.squalecommon.datatransfertobject.component.AuditDTO;
import org.squale.squalecommon.datatransfertobject.component.ComponentDTO;
import org.squale.squalecommon.datatransfertobject.result.ResultsDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ComponentType;
import org.squale.squalecommon.util.SqualeCommonConstants;
import org.squale.squaleweb.applicationlayer.action.ActionUtils;
import org.squale.squaleweb.applicationlayer.action.accessRights.ReaderAction;
import org.squale.squaleweb.applicationlayer.formbean.results.ComponentForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ComponentListForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ResultListForm;
import org.squale.squaleweb.applicationlayer.tracker.TrackerStructure;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.squaleweb.transformer.ComponentListTransformer;
import org.squale.squaleweb.transformer.ComponentTransformer;
import org.squale.squaleweb.transformer.ProjectTransformer;
import org.squale.squaleweb.transformer.ResultListTransformer;
import org.squale.squaleweb.util.SqualeWebConstants;
import org.squale.welcom.struts.transformer.WTransformerFactory;
/**
* Action charg�e de g�rer la r�cup�ration des r�sultats des composants d'un projet.
*
* @version 1.0
* @author
*/
public class ProjectComponentsAction
extends ReaderAction
{
/**
* Nombre d'�l�ments � r�cup�rer pour le traceur
*/
private static final int NUMBER_COMPONENT_TRACER = 4;
/** Nombre maximum de composants remont�s */
private static final int MAX_COMPONENTS = 1000;
/**
* Nom de l'attibut en session pour indiquer � l'utilisateur que tous ces composants ne sont pas affich�s.
*/
public static final String TOO_MUCH_COMPONENTS_MSG = "tooMuchComponentsMsg";
/**
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward root( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionForward forward = null;
ActionErrors errors = new ActionErrors();
try
{
// R�cup�ration de l'audit courant
AuditDTO auditDTO = null;
List auditDTOList = ActionUtils.getCurrentAuditsAsDTO( pRequest );
if ( null != auditDTOList )
{
auditDTO = (AuditDTO) auditDTOList.get( 0 );
}
// Si on passe par l� c'est qu'on est pass� par le menu et non par un composant directement
// on met donc � jour la variable qui sert � savoir de quelle vue on vient
changeWay( pRequest, "true" );
// Il faut r�initialiser le traceur historique quand on passe par l�
resetTracker( pRequest );
// R�cup�ration des packages
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
ComponentDTO projectDTO =
(ComponentDTO) WTransformerFactory.formToObj( ProjectTransformer.class,
ActionUtils.getCurrentProject( pRequest ) )[0];
String language = projectDTO.getLanguage();
pRequest.setAttribute( SqualeWebConstants.LANGUAGE, language );
String which = pRequest.getParameter( "which" );
Object[] paramIn;
Collection dtos = new ArrayList( 0 );
if ( which.equals( SqualeCommonConstants.EXCLUDED_FROM_PLAN_COMPONENTS ) )
{
paramIn = new Object[] { auditDTO, projectDTO };
dtos = (Collection) ac.execute( "getExcluded", paramIn );
pRequest.setAttribute( "excluded", "true" );
}
else
{
paramIn = new Object[] { projectDTO, null, auditDTO, ( (ComponentForm) pForm ).getFilter() };
dtos = getChildren( pRequest, ac, paramIn );
}
Object[] obj = { dtos };
ComponentListForm packagesList = ComponentListTransformer.objToFormWithLanguage( obj, language );
// s'il n'y a qu'un seul package,
if ( packagesList.getList().size() == 1
&& !which.equals( SqualeCommonConstants.EXCLUDED_FROM_PLAN_COMPONENTS ) )
{
// stock l'ID du composant a recuperer
pRequest.setAttribute( "component",
Long.toString( ( (ComponentForm) packagesList.getList().get( 0 ) ).getId() ) );
// On enl�ve le filtre sur les enfants
( (ComponentForm) pForm ).setFilter( "" );
forward = component( pMapping, pForm, pRequest, pResponse, which );
}
else
{
// R�cup�ration des fichiers
ComponentListForm filesList = new ComponentListForm();
Object results[] = { packagesList, filesList };
pRequest.getSession().setAttribute( SqualeWebConstants.CHILDREN_KEY, results );
forward = pMapping.findForward( "component_root" );
}
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
}
// les erreurs sont affich�es sur la page speciale
if ( !errors.isEmpty() )
{
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward component( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
// appel de la m�thode priv�e qui fait le travail avec en param�tre le status null car on n'en tient pas compte
return component( pMapping, pForm, pRequest, pResponse, null );
}
/**
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @param pWhich le status du composant par rapport au plan d'action
* @return l'action � r�aliser.
*/
private ActionForward component( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse, String pWhich )
{
ActionForward forward = null;
ActionErrors errors = new ActionErrors();
try
{
// Obtention de l'id du composant dans la requ�te
String param = (String) pRequest.getParameter( "component" );
if ( null == param )
{
param = (String) pRequest.getAttribute( "component" );
}
if ( null != param )
{
ComponentDTO dto = new ComponentDTO();
Long value = new Long( param );
dto.setID( value.longValue() );
dto.setNumberOfChildren( 1 );
// Obtention des informations sp�cifiques � ce composant
AuditDTO auditDTO = null;
List auditDTOList = ActionUtils.getCurrentAuditsAsDTO( pRequest );
if ( null != auditDTOList )
{
auditDTO = (AuditDTO) auditDTOList.get( 0 );
}
forward = getComponentFeatures( pMapping, pForm, pRequest, pResponse, dto, auditDTO );
}
else
{
// Pas de composant identifi�, on affiche les informations
// de plus haut niveau
forward = root( pMapping, pForm, pRequest, pResponse );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions
handleException( e, errors, pRequest );
}
if ( !errors.isEmpty() )
{
// Sauvegarde des message et transfert vers la page d'erreur
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* R�cup�re les composants et les enfants.
*
* @param pMapping le mapping
* @param pForm le form
* @param pRequest la requ�te
* @param pResponse la r�ponse
* @param pDto le composant dont on veut les projets
* @param pAuditDTO l'audit pour lequel on veut les r�sultats
* @return le forward
* @throws Exception si un probl�me appara�t.
*/
private ActionForward getComponentFeatures( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse, ComponentDTO pDto,
final AuditDTO pAuditDTO )
throws Exception
{
String language = (String) pRequest.getParameter( SqualeWebConstants.LANGUAGE );
if ( language == null )
{
language = (String) pRequest.getAttribute( SqualeWebConstants.LANGUAGE );
}
else
{
pRequest.setAttribute( SqualeWebConstants.LANGUAGE, language );
}
ActionForward forward = null;
boolean reload = true;
String which = ( (String) pRequest.getParameter( "which" ) );
boolean excluded = ( which != null && which.equals( "components.excluded" ) );
ComponentDTO compo = pDto;
// R�cup�ration du composant
while ( reload )
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
Object[] paramIn = { compo };
compo = (ComponentDTO) ac.execute( "get", paramIn );
// Initialise le form
ComponentTransformer.objToFormWithLanguage( new Object[] { compo }, language, (ComponentForm) pForm );
// R�cup�ration des parents et composition du mot complet
List parentDtoList = getParentList( compo );
// R�cup�ration de la liste pour l'onglet "info g�n�rale"
Object[] infoListTab = new Object[1];
infoListTab[0] = parentDtoList;
ComponentListForm infoList = ComponentListTransformer.objToFormWithLanguage( infoListTab, language );
infoList.copyValues( (ComponentForm) pForm );
pRequest.getSession().setAttribute( SqualeWebConstants.GEN_INFO, infoList );
// Mise en place du traceur
int size = parentDtoList.size();
Object[] list = new Object[1];
if ( size > NUMBER_COMPONENT_TRACER )
{
list[0] = new ArrayList( parentDtoList.subList( size - NUMBER_COMPONENT_TRACER, size ) );
}
else
{
list[0] = parentDtoList;
}
updateTrackerComponent( ( (ComponentForm) pForm ).getId(), ( (ComponentForm) pForm ).getName(), pRequest );
// R�cup�ration des r�sultats du composant
Map results = getComponentResults( ( (ComponentForm) pForm ), pAuditDTO );
( (ComponentForm) pForm ).setResults( (ResultListForm) results.get( SqualeWebConstants.RESULTS_KEY ) );
( (ComponentForm) pForm ).setPractices( (ResultListForm) results.get( SqualeWebConstants.PRACTICES_KEY ) );
// gestion du traceur, cas du composant � ajouter en fin de synth�se
if ( "true".equals( pRequest.getSession().getAttribute( SqualeWebConstants.TRACKER_RESET ) ) )
{
// Dans ce cas, on doit ajouter le composant � la vue historique et ne pas changer
// de type de traceur
// pour enlever ce qui est inutile d'afficher
StringTokenizer st = new StringTokenizer( ( (ComponentForm) pForm ).getName(), "(" );
String url =
"project_component.do?action=component&component="
+ new Long( pRequest.getParameter( "component" ) ).longValue();
updateHistTracker( st.nextToken(), url, TrackerStructure.COMPONENT_VIEW, pRequest, false );
}
// R�cup�ration des enfants
reload = false;
( (ComponentForm) pForm ).setChildren( null );
// On ne fait rien dans le cas d'une m�thode ou d'une page JSP -- suppos�e ne pas contenir de
// descendants afin de ne pas afficher l'onglet "contenu du composant"
if ( !( (ComponentForm) pForm ).getType().startsWith( ComponentType.METHOD )
&& !( (ComponentForm) pForm ).getType().startsWith( ComponentType.JSP ) )
{
Object[] paramIn3 = { compo, null, pAuditDTO, ( (ComponentForm) pForm ).getFilter() };
Collection childrenDTO = getChildren( pRequest, ac, paramIn3 );
ComponentListForm childrenList =
ComponentListTransformer.objToFormWithLanguage( new Object[] { childrenDTO }, language );
childrenList.copyValues( (ComponentForm) pForm );
( (ComponentForm) pForm ).setChildren( childrenList );
// Dans le cas d'un package avec un seul fils, on descend
// dans la hi�rarchie pour afficher directement le premier package
// pertinent
if ( childrenList.getList().size() == 1 && ( (ComponentForm) pForm ).getResults().getList().size() == 0 )
{
ComponentForm child = (ComponentForm) childrenList.getList().get( 0 );
if ( child.getType().startsWith( ComponentType.PACKAGE ) )
{
compo.setID( child.getId() );
reload = true;
// reset du form
( (ComponentForm) pForm ).reset( pMapping, pRequest );
}
}
}
}
forward = pMapping.findForward( "component" );
return forward;
}
/**
* @param pRequest la requ�te
* @param ac l'application component access
* @param paramIn les param�tres d'appel
* @return les enfants
* @throws JrafEnterpriseException si erreur
*/
private Collection getChildren( HttpServletRequest pRequest, IApplicationComponent ac, Object[] paramIn )
throws JrafEnterpriseException
{
// On supprime le message en session si il existe
pRequest.getSession().removeAttribute( TOO_MUCH_COMPONENTS_MSG );
Integer nbcomponents = (Integer) ac.execute( "countChildren", paramIn );
if ( nbcomponents.intValue() > MAX_COMPONENTS )
{
// On affichera un message d'avertissement que l'on met en session
// car on veut qu'il s'affiche tous le temps
String message =
(String) WebMessages.getString( pRequest.getLocale(), "only.thousand.components",
new String[] { nbcomponents.toString() } );
pRequest.getSession().setAttribute( TOO_MUCH_COMPONENTS_MSG, message );
}
return (Collection) ac.execute( "getChildren", paramIn );
}
/**
* R�cup�re les r�sultats d'un composant.
*
* @param pComponent le composant pour lequel on d�sire les r�sultats.
* @param pAudit l'audit des r�sultats.
* @return une map contenant les r�sultats.
* @throws Exception si un probl�me de transformation ou JRAF appara�t.
*/
private Map getComponentResults( final ComponentForm pComponent, final AuditDTO pAudit )
throws Exception
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Results" );
ComponentDTO dto = (ComponentDTO) ( WTransformerFactory.formToObj( ComponentTransformer.class, pComponent )[0] );
Map results = new TreeMap();
ResultListForm measures = new ResultListForm();
ResultListForm practices = new ResultListForm();
// Mesures
Object[] paramIn = { pAudit, dto, Boolean.TRUE };
ResultsDTO resultsDTO = (ResultsDTO) ac.execute( "getComponentResults", paramIn );
LinkedList values = new LinkedList();
// Ajout des valeurs de mesures
if ( null != resultsDTO )
{
values.addAll( (Collection) resultsDTO.getResultMap().get( dto ) );
Object obj[] = { resultsDTO.getResultMap().get( null ), values };
measures = (ResultListForm) WTransformerFactory.objToForm( ResultListTransformer.class, obj );
}
// Pratiques
paramIn[2] = Boolean.FALSE;
ResultsDTO practicesDTO = (ResultsDTO) ac.execute( "getComponentResults", paramIn );
values = new LinkedList();
// Ajout des valeurs de pratiques
if ( null != practicesDTO )
{
values.addAll( (Collection) practicesDTO.getResultMap().get( dto ) );
Object obj[] = { practicesDTO.getResultMap().get( null ), values };
practices = (ResultListForm) WTransformerFactory.objToForm( ResultListTransformer.class, obj );
}
results.put( SqualeWebConstants.RESULTS_KEY, measures );
results.put( SqualeWebConstants.PRACTICES_KEY, practices );
return results;
}
/**
* Permet de r�cup�rer la liste des ComponentrDTO parents
*
* @param pDTO ComponentDTO fils
* @return List de ComponentDTO parents tri�s
* @throws Exception exception Jraf
*/
private List getParentList( ComponentDTO pDTO )
throws Exception
{
// Initialisation
List parentDtoList = null;
Object[] paramIn = { pDTO, null };
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
parentDtoList = (List) ac.execute( "getParentsComponent", paramIn );
return parentDtoList;
}
/**
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward update( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionForward forward = null;
ActionErrors errors = new ActionErrors();
try
{
// Obtention du langage dans la requ�te
String language = (String) pRequest.getParameter( SqualeWebConstants.LANGUAGE );
// Obtention de l'id du composant dans la requ�te
String param = (String) pRequest.getParameter( "component" );
ComponentDTO dto = new ComponentDTO();
Long value = new Long( param );
dto.setID( value.longValue() );
dto.setNumberOfChildren( 1 );
// Obtention des informations sp�cifiques � ce composant
AuditDTO auditDTO = null;
List auditDTOList = ActionUtils.getCurrentAuditsAsDTO( pRequest );
if ( null != auditDTOList )
{
auditDTO = (AuditDTO) auditDTOList.get( 0 );
}
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
pRequest.setAttribute( "component", value.toString() );
// R�cup�re les informations li�es � la modification
String justif = ( (ComponentForm) pForm ).getJustification();
boolean excluded = ( (ComponentForm) pForm ).getExcludedFromActionPlan();
if ( excluded )
{
pRequest.setAttribute( "which", "components.excluded" );
}
// Rempli le form avec les autres caract�ristiques m�tiers necessaires pour la transformation
// pr�alable � l'enregistrement en base
forward = getComponentFeatures( pMapping, pForm, pRequest, pResponse, dto, auditDTO );
// remet les bonnes valeurs concernant la justification et l'exclusion dans le form
( (ComponentForm) pForm ).setExcludedFromActionPlan( excluded );
( (ComponentForm) pForm ).setJustification( justif );
ComponentDTO componentToUpdate =
(ComponentDTO) ( ComponentTransformer.formToObjWithLanguage( (ComponentForm) pForm, language ) )[0];
Object[] paramIn = new Object[] { componentToUpdate };
ac.execute( "updateComponent", paramIn );
forward = pMapping.findForward( "component" );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions
handleException( e, errors, pRequest );
}
if ( !errors.isEmpty() )
{
// Sauvegarde des message et transfert vers la page d'erreur
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
}