/** * 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\\squale\\src\\squalix\\src\\org\\squale\\squalix\\tools\\clearcase\\ClearCaseTask.java package org.squale.squalix.tools.clearcase.task; import java.io.File; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ListParameterBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.MapParameterBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ParametersConstants; import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ProjectParameterBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.StringParameterBO; import org.squale.squalix.core.AbstractTask; import org.squale.squalix.core.TaskData; import org.squale.squalix.core.TaskException; import org.squale.squalix.tools.clearcase.configuration.ClearCaseConfiguration; import org.squale.squalix.tools.clearcase.configuration.ClearCaseMessages; import org.squale.squalix.util.process.ProcessErrorHandler; import org.squale.squalix.util.process.ProcessManager; /** * Cette classe permet de monter une vue ClearCase snapshot.<br /> * Il s'agit d'une t�che SQUALIX. En cons�quence, cette classe h�rite de la classe <code>Task</code>. * * @author m400832 (by rose) * @version 2.0 * @see org.squale.squalix.core.Task */ public class ClearCaseTask extends AbstractTask implements ProcessErrorHandler { /** * Logger. */ private static final Log LOGGER = LogFactory.getLog( ClearCaseTask.class ); /** * Instance de configuration. */ protected ClearCaseConfiguration mConfiguration; /** * {@inheritDoc} Constructeur. Initialisation des premiers param�tres. <br /> * Les autres param�tres sont initialis�s dans la m�thode <code>init()</code>. * * @see ClearCaseTask#init() */ public ClearCaseTask() { mName = "ClearCaseTask"; } /** * @param projectParam le param�tre qu'on va �ventuellement essayer d'ajuster */ private void adjustParameters( ProjectParameterBO projectParam ) { if ( projectParam instanceof StringParameterBO ) { // On ajuste le param�tre String oldParam = ( (StringParameterBO) projectParam ).getValue(); // on commence par remplacer tous les \ par des / String newValue = oldParam.replaceAll( "\\\\", "/" ); // et si la chaine n'est pas pr�fix�e par /vobs/, on le rajoute if ( !newValue.startsWith( "/vobs/" ) ) { // si ya d�j� un /, on ne rajout que /vobs sinon on rajoute /vobs/ if ( newValue.startsWith( "/" ) ) { newValue = "/vobs" + newValue; } else { newValue = "/vobs/" + newValue; } } ( (StringParameterBO) projectParam ).setValue( newValue ); } else { if ( projectParam instanceof MapParameterBO ) { // On ajuste tous les param�tres de la map Map map = ( (MapParameterBO) projectParam ).getParameters(); Set keys = map.keySet(); Iterator it = keys.iterator(); // On parcours donc tous les param�tres et on les ajuste en fonction // de leur type while ( it.hasNext() ) { adjustParameters( (ProjectParameterBO) it.next() ); } } else { if ( projectParam instanceof ListParameterBO ) { // On ajuste tous les param�tres de la liste List list = ( (ListParameterBO) projectParam ).getParameters(); Iterator it = list.iterator(); // On parcours donc tous les param�tres et on les ajuste en fonction // de leur type while ( it.hasNext() ) { adjustParameters( (ProjectParameterBO) it.next() ); } } } } } /** Ajuste les diff�rents param�tres */ private void adjustParamsForClearcase() { // On reformate les diff�rentes param�tres du projet car l'utilisateur a pu entr� // des '/' ou des '\' comme s�parateur et si le fichier d�fini n'existe pas on essaie de le reconstruire adjustParameters( mProject.getParameter( ParametersConstants.ANT_BUILD_FILE ) ); adjustParameters( mProject.getParameter( ParametersConstants.BRANCH ) ); adjustParameters( mProject.getParameter( ParametersConstants.CLASSPATH ) ); adjustParameters( mProject.getParameter( ParametersConstants.CPP_SCRIPTFILE ) ); adjustParameters( mProject.getParameter( ParametersConstants.CPPTEST_SCRIPT ) ); adjustParameters( mProject.getParameter( ParametersConstants.EXCLUDED_DIRS ) ); adjustParameters( mProject.getParameter( ParametersConstants.JSP ) ); adjustParameters( mProject.getParameter( ParametersConstants.MACKER_CONFIGURATION ) ); adjustParameters( mProject.getParameter( ParametersConstants.PATH ) ); adjustParameters( mProject.getParameter( ParametersConstants.PMD_JAVA_RULESET_NAME ) ); adjustParameters( mProject.getParameter( ParametersConstants.PMD_JSP_RULESET_NAME ) ); adjustParameters( mProject.getParameter( ParametersConstants.SOURCES ) ); adjustParameters( mProject.getParameter( ParametersConstants.VOBS ) ); adjustParameters( mProject.getParameter( ParametersConstants.UMLQUALITY_SOURCE_XMI ) ); } /** * {@inheritDoc} Cr�� la configuration clearcase et charge l'application et le projet en base * * @see org.squale.squalix.core.Task#execute() */ public void execute() throws TaskException { adjustParamsForClearcase(); try { mConfiguration = new ClearCaseConfiguration( mProject, mAudit ); LOGGER.info( ClearCaseMessages.getString( "logs.task.initialized" ) + mProject.getName() ); /* si la vue existe, on essaye de la d�monter. */ if ( checkViewOrStorageDirectoryExistence() ) { LOGGER.info( ClearCaseMessages.getString( "logs.view.umounting" ) ); /* si elle ne se d�monte pas, on lance une exception. */ if ( !cleanView() ) { throw new TaskException( ClearCaseMessages.getString( "exception.view.umount_failed" ) ); } LOGGER.info( ClearCaseMessages.getString( "logs.view.umounted" ) ); } /* on monte la vue. */ if ( mountView() ) { LOGGER.info( ClearCaseMessages.getString( "logs.view.mounted" ) ); /* si la vue ne se monte pas */ } else { /* on lance l'exception en rapport */ throw new TaskException( ClearCaseMessages.getString( "exception.view.mount_failed" ) ); } /* on modifie les param�tres temporaires . */ modifyTempMap(); // positionne les donn�es sur la taille du file System affectFileSystemSize( mConfiguration.getWriteDirectory(), true ); } catch ( Exception e ) { throw new TaskException( e ); } } /** * Cette m�thode modifie le param�tre <code>view_path</code> de la <code> * HashMap</code> des param�tres * temporaires de l'objet <code> * ProjectBO</code>. * * @throws Exception exception lors du traitement. */ private void modifyTempMap() throws Exception { /* * on r�cup�re le chemin du dossier dans lequel ont �t� mis les fichiers de la vue, et on met cette valeur dans * la hashmap de param�tres. */ StringBuffer buf = new StringBuffer( mConfiguration.getUmountViewCommand().trim() ); int length = buf.length(); String viewPath = buf.substring( buf.lastIndexOf( ClearCaseConfiguration.SPACE ) + 1, length ); getData().putData( TaskData.VIEW_PATH, viewPath ); } /** * Cette m�thode v�rifie si une vue est actuellement mont�e sur la machine et/ou si le r�pertoire de stockage de la * vue existe d�j�. * * @throws Exception si le processus ne peut �tre lanc�. * @return <code>true</code> si elle est actuellement mont�e et/ou si le r�pertoire de stockage de la vue existe * d�j�, <code>false</code> sinon. */ protected boolean checkViewOrStorageDirectoryExistence() throws Exception { /* initialisation et lancement du processus */ ProcessManager mgr = new ProcessManager( mConfiguration.getVerifyViewExistenceCommand(), null, new File( "." ) ); String removeCommand = mConfiguration.getRemoveDirectoryCommand(); return ( mgr.startProcess( this ) == 0 || new File( removeCommand.substring( removeCommand.indexOf( "/" ), removeCommand.length() ) ).exists() ); } /** * Cette m�thode monte la vue ClearCase. * * @return <code>true</code> en cas de succ�s, <code>false</code> sinon. * @throws Exception si le script de montage de la vue a produit une ou plusieurs erreurs. */ protected boolean mountView() throws Exception { String cmdLine; /* Vue de travail, i.e. audit de suivi. */ if ( mAudit.getType().equals( AuditBO.NORMAL ) ) { /* on recupere la commande */ cmdLine = mConfiguration.getMountWorkViewCommand(); /* Vue de consultation, i.e. audit de jalon. */ } else if ( mAudit.getType().equals( AuditBO.MILESTONE ) ) { cmdLine = mConfiguration.getMountConsultationViewCommand(); /* Pas de type d'audit trouv�. On ne monte pas de vue. */ } else { /* et on lance l'exception en rapport */ throw new Exception( ClearCaseMessages.getString( "exception.audit.missing_type" ) ); } LOGGER.info( cmdLine ); ProcessManager mgr = new ProcessManager( cmdLine, null, new File( "." ) ); return mgr.startProcess( this ) == 0; } /** * Supprime / d�monte la vue ClearCase * * @throws Exception si la commande UNIX produit des erreurs. * @return <code>true</code> si la vue est correctement d�mont�e, <code> * false</code> sinon. */ protected boolean cleanView() throws Exception { boolean cleaningOk = false; /* initialisation et lancement du processus */ ProcessManager mgr = new ProcessManager( mConfiguration.getUmountViewCommand(), null, new File( "." ) ); cleaningOk = mgr.startProcess( this ) == 0; // Si on a pu supprimer la vue avec la commande normale, c'est bon // sinon 2 cas: soit le .vws n'existe plus, alors on doit supprimer r�cursivement le r�pertoire // soit c'est le r�pertoire qui n'existe plus, mais la vue existe et il faut supprimer le .vws if ( !cleaningOk ) { // Commande de suppression du r�pertoire String removeDircommand = mConfiguration.getRemoveDirectoryCommand(); // Teste l'existence du r�pertoire, on ne tente de le supprimeer que si il existe sinon il faut supprimer // le .vws File f = new File( removeDircommand.substring( removeDircommand.indexOf( "/" ), removeDircommand.length() ) ); if ( f.exists() ) { mgr = new ProcessManager( removeDircommand, null, new File( "." ) ); LOGGER.info( "Remove dir command:" + removeDircommand ); cleaningOk = mgr.startProcess( this ) == 0; } if ( !cleaningOk ) { // sinon c'est le .vws � supprimer mgr = new ProcessManager( mConfiguration.getAuxUmountViewCommand(), null, new File( "." ) ); LOGGER.info( "Remove .view command:" + mConfiguration.getAuxUmountViewCommand() ); cleaningOk = mgr.startProcess( this ) == 0; } } return cleaningOk; } /** * Getter. Pour des consid�rations de test unitaire uniquement. * * @return mConfiguration la configuration de la t�che. */ public ClearCaseConfiguration getConfiguration() { return mConfiguration; } /** * Setter. Pour des consid�rations de test unitaire uniquement. * * @param pConfiguration la configuration de la t�che. */ public void setConfiguration( ClearCaseConfiguration pConfiguration ) { mConfiguration = pConfiguration; } /** * {@inheritDoc} * * @see org.squale.squalix.util.process.ProcessErrorHandler#processError(java.lang.String) */ public void processError( String pErrorMessage ) { // on filtre les erreurs // les 2 messages ci-dessous ne sont pas pris en compte if ( pErrorMessage.toLowerCase().startsWith( "cleartool: " ) && !pErrorMessage.toLowerCase().startsWith( "cleartool: error: no matching entries found for view tag" ) ) { initError( pErrorMessage ); } } }