/** * The MIT License * * Copyright (c) 2007-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Erik Ramfelt, * Henrik Lynggaard, Peter Liljenberg, Andrew Bayer, Vincent Latombe * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package hudson.plugins.clearcase; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Computer; import hudson.model.FreeStyleProject; import hudson.model.Hudson; import hudson.model.Item; import hudson.model.ItemGroup; import hudson.model.TopLevelItem; import hudson.model.listeners.ItemListener; import hudson.plugins.clearcase.util.BuildVariableResolver; import hudson.scm.SCM; import hudson.util.StreamTaskListener; import hudson.util.VariableResolver; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; @Extension public class ItemListenerImpl extends ItemListener { private static class JobNameOverrideBuildVariableResolver extends BuildVariableResolver { private String jobName; public JobNameOverrideBuildVariableResolver(String jobName, AbstractBuild<?, ?> build, Computer computer) { super(build); this.jobName = jobName; } @Override public String resolve(String key) { if ("JOB_NAME".equals(key)) { return jobName; } else { return super.resolve(key); } } } /** * Delete the view when the job is renamed */ @Override public void onRenamed(Item item, String oldName, String newName) { Hudson hudson = getHudsonFromItem(item); if (item instanceof AbstractProject<?, ?>) { @SuppressWarnings("unchecked") AbstractProject project = (AbstractProject) item; SCM scm = project.getScm(); if (scm instanceof AbstractClearCaseScm) { try { AbstractClearCaseScm ccScm = (AbstractClearCaseScm) scm; if (!ccScm.isRemoveViewOnRename()) { return; } StreamTaskListener listener = StreamTaskListener.fromStdout(); Launcher launcher = hudson.createLauncher(listener); AbstractBuild<?, ?> build = (AbstractBuild<?, ?>) project.getSomeBuildWithWorkspace(); if (build != null) { VariableResolver<String> variableResolver = new JobNameOverrideBuildVariableResolver(oldName, build, ccScm.getBuildComputer(build)); String normalizedViewName = ccScm.generateNormalizedViewName(variableResolver); FilePath workspace; if (isFreeStyleProjectAndHasCustomWorkspace(project)) { workspace = new FilePath(launcher.getChannel(), ((FreeStyleProject) project).getCustomWorkspace()); } else { if (build.getBuiltOn() == hudson) { workspace = build.getWorkspace().getParent().getParent().child(newName).child("workspace"); } else { workspace = build.getWorkspace(); } } ClearTool ct = ccScm.createClearTool(null, ccScm.createClearToolLauncher(listener, workspace, launcher)); if (ct.doesViewExist(normalizedViewName)) { String viewPath = ccScm.getViewPath(new VariableResolver.ByMap<String>(build.getEnvironment(listener))); if (workspace.child(viewPath).exists()) { ct.rmview(viewPath); } else { ct.rmviewtag(normalizedViewName); } } } } catch (Exception e) { Logger.getLogger(AbstractClearCaseScm.class.getName()).log(Level.WARNING, "Failed to remove ClearCase view", e); } } } } private boolean isFreeStyleProjectAndHasCustomWorkspace(@SuppressWarnings("unchecked") AbstractProject project) { if (project instanceof FreeStyleProject) { FreeStyleProject fsProject = (FreeStyleProject) project; return StringUtils.isNotEmpty(fsProject.getCustomWorkspace()); } else { return false; } } private Hudson getHudsonFromItem(Item item) { ItemGroup<? extends Item> itemGroup = item.getParent(); Hudson hudson = null; // Go up to Hudson instance while (hudson == null) { if (itemGroup instanceof Hudson) { hudson = (Hudson) itemGroup; } else if (itemGroup instanceof TopLevelItem) { hudson = ((TopLevelItem) itemGroup).getParent(); } else { itemGroup = ((Item) itemGroup).getParent(); } } return hudson; } /** * Delete the view when the job is deleted */ @Override public void onDeleted(Item item) { Hudson hudson = getHudsonFromItem(item); if (item instanceof AbstractProject<?, ?>) { AbstractProject<?, ?> project = (AbstractProject<?, ?>) item; SCM scm = project.getScm(); if (scm instanceof AbstractClearCaseScm) { try { AbstractClearCaseScm ccScm = (AbstractClearCaseScm) scm; if (!ccScm.isCreateDynView()) { return; } StreamTaskListener listener = StreamTaskListener.fromStdout(); Launcher launcher = hudson.createLauncher(listener); ClearTool ct = ccScm.createClearTool(null, ccScm.createClearToolLauncher(listener, project.getSomeWorkspace().getParent().getParent(), launcher)); // Adding checks to avoid NPE in HUDSON-4869 if (project.getLastBuild() != null) { // Create a variable resolver using the last build's computer - HUDSON-5364 VariableResolver<String> variableResolver = new BuildVariableResolver(project.getLastBuild()); // Workspace has already been removed, so the view needs to be unregistered String normalizedViewName = ccScm.generateNormalizedViewName(variableResolver); ct.rmviewtag(normalizedViewName); } } catch (Exception e) { Logger.getLogger(AbstractClearCaseScm.class.getName()).log(Level.WARNING, "Failed to remove ClearCase view", e); } } } } }