/** * 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.tracker; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.squale.squaleweb.util.SqualeWebConstants; /** * Classe g�rant le traitement du traceur pseudo-historique */ public class Tracker { /** le tracker courant */ private List mTracker; /** * Affiche le traceur * * @param ts l'objet repr�sentant l'�l�ment courant � ajouter au traceur * @param pRequest la requ�te HTTP. * @param pReset indique si on est repass� par un menu auquel cas on red�marre une s�rie historique */ public void updateHistTracker( TrackerStructure ts, HttpServletRequest pRequest, boolean pReset ) { // test pour savoir si le traceur doit etre r�initialis� ou pas, // il l'est si on repasse par un menu if ( pReset ) { this.reset( pRequest ); } // on r�cup�re le traceur courant ArrayList currentTracker = (ArrayList) pRequest.getSession().getAttribute( SqualeWebConstants.TRACKER_HIST ); mTracker = new ArrayList( 0 ); if ( null != currentTracker ) { mTracker = currentTracker; } // Ajout // on v�rifie qu'on est pas d�j� pass� par l�, // si oui on ne fait que r�ajuster la liste du d�but jusqu'au chemin courant // en effa�ant les parcours post�rieurs. String aux = ""; int j; boolean canExit = false; // premier parcours n�cessaire pour v�rifier qu'on a pas cliqu� // sur le traceur for ( int i = 0; i < mTracker.size() && !canExit; i++ ) { canExit = false; aux = ( (String) ( (TrackerStructure) mTracker.get( i ) ).getDisplayName() ); // on est d�j� pass� par l� (typiquement on a utilis� le traceur) // efface les �l�ments post�rieurs en effa�ant l'�l�ment courant // qui sera de toute fa�on ajout� � la fin (factorisation de code) if ( aux != null && aux.equals( ts.getDisplayName() ) ) { for ( j = i; j < mTracker.size();/* la taille diminue par le remove */) { mTracker.remove( j ); } canExit = true; } } // si �a ne vient pas du traceur if ( !canExit ) { for ( int i = 0; i < mTracker.size() && !canExit; i++ ) { newTrackerAccessWay( ts, i ); } } // r�ajuste la liste ( (ArrayList) mTracker ).trimToSize(); // on ajoute l'�l�ment courant mTracker.add( ts ); pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_HIST, mTracker ); } /** * une m�thode qui met � jour le tracker pour un chemin in�dit * * @param pTs la Structure du tracker * @param pIndex la position de l'�l�ment courant compar� dans le tracker courant */ private void newTrackerAccessWay( TrackerStructure pTs, int pIndex ) { boolean canExit = false; // les �l�ments n'ont pas le type ind�fini mais ont le meme type if ( pTs.getType() != TrackerStructure.UNDEFINED && pTs.getType() == ( (TrackerStructure) mTracker.get( pIndex ) ).getType() ) { // il faut v�rifier qu'il y a d�j� un �l�ment d'un autre type pr�sent // sinon on efface lors de facteurs-criteres-pratiques... // car facteur et pratique ont le meme type if ( pTs.getType() == TrackerStructure.FACTOR_VIEW ) { for ( int j = mTracker.size() - 1; j > -1; j-- ) { if ( TrackerStructure.COMPONENT_VIEW == ( (TrackerStructure) mTracker.get( j ) ).getType() ) { // on doit v�rifier qu'il y a aussi un element de type facteur view d�ja pr�sent // pour le cas o� on passe par les tops for ( int k = j - 1; k > -1 && !canExit; k-- ) { if ( TrackerStructure.FACTOR_VIEW == ( (TrackerStructure) mTracker.get( k ) ).getType() ) { // si oui, on peut tout effacer while ( j > -1 ) { mTracker.remove( j-- ); } canExit = true; } } } } } } } /** * @param pRequest la requ�te http */ public void reset( HttpServletRequest pRequest ) { pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_RESET, "false" ); pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_HIST, new ArrayList() ); pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_COMPONENT, new ArrayList() ); } }