Java tutorial
/** * 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 tche SQUALIX. En consquence, cette classe hrite 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 paramtres. <br /> * Les autres paramtres sont initialiss dans la mthode <code>init()</code>. * * @see ClearCaseTask#init() */ public ClearCaseTask() { mName = "ClearCaseTask"; } /** * @param projectParam le paramtre qu'on va ventuellement essayer d'ajuster */ private void adjustParameters(ProjectParameterBO projectParam) { if (projectParam instanceof StringParameterBO) { // On ajuste le paramtre String oldParam = ((StringParameterBO) projectParam).getValue(); // on commence par remplacer tous les \ par des / String newValue = oldParam.replaceAll("\\\\", "/"); // et si la chaine n'est pas prfixe par /vobs/, on le rajoute if (!newValue.startsWith("/vobs/")) { // si ya dj 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 paramtres de la map Map map = ((MapParameterBO) projectParam).getParameters(); Set keys = map.keySet(); Iterator it = keys.iterator(); // On parcours donc tous les paramtres 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 paramtres de la liste List list = ((ListParameterBO) projectParam).getParameters(); Iterator it = list.iterator(); // On parcours donc tous les paramtres et on les ajuste en fonction // de leur type while (it.hasNext()) { adjustParameters((ProjectParameterBO) it.next()); } } } } } /** Ajuste les diffrents paramtres */ private void adjustParamsForClearcase() { // On reformate les diffrentes paramtres du projet car l'utilisateur a pu entr // des '/' ou des '\' comme sparateur et si le fichier dfini 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 dmonter. */ if (checkViewOrStorageDirectoryExistence()) { LOGGER.info(ClearCaseMessages.getString("logs.view.umounting")); /* si elle ne se dmonte 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 paramtres temporaires . */ modifyTempMap(); // positionne les donnes sur la taille du file System affectFileSystemSize(mConfiguration.getWriteDirectory(), true); } catch (Exception e) { throw new TaskException(e); } } /** * Cette mthode modifie le paramtre <code>view_path</code> de la <code> * HashMap</code> des paramtres * temporaires de l'objet <code> * ProjectBO</code>. * * @throws Exception exception lors du traitement. */ private void modifyTempMap() throws Exception { /* * on rcupre le chemin du dossier dans lequel ont t mis les fichiers de la vue, et on met cette valeur dans * la hashmap de paramtres. */ 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 mthode vrifie si une vue est actuellement monte sur la machine et/ou si le rpertoire de stockage de la * vue existe dj. * * @throws Exception si le processus ne peut tre lanc. * @return <code>true</code> si elle est actuellement monte et/ou si le rpertoire de stockage de la vue existe * dj, <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 mthode monte la vue ClearCase. * * @return <code>true</code> en cas de succs, <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 / dmonte la vue ClearCase * * @throws Exception si la commande UNIX produit des erreurs. * @return <code>true</code> si la vue est correctement dmonte, <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 rcursivement le rpertoire // soit c'est le rpertoire qui n'existe plus, mais la vue existe et il faut supprimer le .vws if (!cleaningOk) { // Commande de suppression du rpertoire String removeDircommand = mConfiguration.getRemoveDirectoryCommand(); // Teste l'existence du rpertoire, 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 considrations de test unitaire uniquement. * * @return mConfiguration la configuration de la tche. */ public ClearCaseConfiguration getConfiguration() { return mConfiguration; } /** * Setter. Pour des considrations de test unitaire uniquement. * * @param pConfiguration la configuration de la tche. */ 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); } } }