/* * Copyright (c) 2013 Oracle Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Winston Prakash */ package org.eclipse.hudson.security.team; import hudson.Extension; import hudson.model.Item; import hudson.model.Job; import hudson.model.listeners.ItemListener; import java.io.IOException; import java.util.List; import org.eclipse.hudson.security.HudsonSecurityEntitiesHolder; import org.eclipse.hudson.security.team.TeamManager.TeamNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A simple helper to listen to job creation, deletion and renaming and * accordingly add, delete or rename it in the current users team. * * @since 3.1.0 * @author Winston Prakash */ @Extension public class TeamJobListener extends ItemListener { private transient Logger logger = LoggerFactory.getLogger(TeamJobListener.class); @Override public void onCreated(Item item) { if (item instanceof Job<?, ?>) { if (!HudsonSecurityEntitiesHolder.getHudsonSecurityManager().getTeamManager().isTeamManagementEnabled()) { addToPublicTeam(item.getName()); } else if (getTeamManager().findJobOwnerTeam(item.getName()) == null) { // Job going to other than default user team must already be added, else... addToCurrentUserTeam(item.getName()); } } } @Override public void onRenamed(Item item, String oldJobName, String newJobName) { if (item instanceof Job<?, ?>) { removeJob(oldJobName); if (!HudsonSecurityEntitiesHolder.getHudsonSecurityManager().getTeamManager().isTeamManagementEnabled()) { addToPublicTeam(newJobName); } else if (getTeamManager().findJobOwnerTeam(newJobName) == null) { // Job going to other than default user team must already be added, else... addToCurrentUserTeam(newJobName); } } } @Override public void onDeleted(Item item) { if (item instanceof Job<?, ?>) { removeJob(item.getName()); } } private void logFailedToAdd(String jobName, String teamName, Exception ex) { logger.error("Failed to add job "+jobName+" to "+teamName+" team", ex); } private void addToCurrentUserTeam(String jobName) { try { //getTeamManager().addJobToCurrentUserTeam(jobName); List<Team> userTeams = getTeamManager().getCurrentUserTeamsWithPermission(Item.CREATE); if (!userTeams.isEmpty()){ getTeamManager().addJob(userTeams.get(0), jobName); }else{ // As a last resort add as a public scoped job addToPublicTeam(jobName); } } catch (IOException ex) { logFailedToAdd(jobName, "current user", ex); } catch (TeamNotFoundException ex) { logFailedToAdd(jobName, "current user", ex); } } private void addToPublicTeam(String jobName) { Team publicTeam = getTeamManager().getPublicTeam(); try { publicTeam.addJob(new TeamJob(jobName)); } catch (IOException ex) { logFailedToAdd(jobName, "public", ex); } } private void removeJob(String jobName) { Team team = getTeamManager().findJobOwnerTeam(jobName); if (team != null) { try { team.removeJob(jobName); } catch (IOException ex) { logger.error("Failed to remove job "+jobName+" in team"+team.getName(), ex); } } } private TeamManager getTeamManager() { return HudsonSecurityEntitiesHolder.getHudsonSecurityManager().getTeamManager(); } }