package hudson.plugins.createjobadvanced;
import hudson.Extension;
import hudson.model.Hudson;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.listeners.ItemListener;
import hudson.security.AuthorizationMatrixProperty;
import hudson.security.Permission;
import hudson.security.SecurityMode;
import hudson.tasks.LogRotator;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.kohsuke.stapler.DataBoundConstructor;
@Extension
public class ItemListenerImpl extends ItemListener {
static Logger log = Logger.getLogger(CreateJobAdvancedPlugin.class.getName());
@DataBoundConstructor
public ItemListenerImpl() {
// log.info("ItemListenerImpl started");
}
@SuppressWarnings("unchecked")
@Override
public void onRenamed(Item item, String oldName, String newName) {
log.info("renamed " + oldName + " to " + newName);
if (!(item instanceof Job))
return;
final Job job = (Job) item;
CreateJobAdvancedPlugin cja = Hudson.getInstance().getPlugin(CreateJobAdvancedPlugin.class);
if (cja.isReplaceSpace()) {
renameJob(job);
}
}
@SuppressWarnings("unchecked")
@Override
public void onCreated(Item item) {
if (!(item instanceof Job))
return;
final Job job = (Job) item;
CreateJobAdvancedPlugin cja = Hudson.getInstance().getPlugin(CreateJobAdvancedPlugin.class);
if (cja.isReplaceSpace()) {
renameJob(job);
}
// hudson must activate security mode for using
if (!Hudson.getInstance().getSecurity().equals(SecurityMode.UNSECURED)) {
if (cja.isAutoOwnerRights()) {
String sid = Hudson.getAuthentication().getName();
securityGrantPermissions(job, sid, Item.CONFIGURE,Item.BUILD, Item.READ,Item.DELETE, Item.WORKSPACE );
}
if (cja.isAutoPublicBrowse()) {
securityGrantPermissions(job, "anonymous",Item.READ,Item.WORKSPACE);
}
}
if (cja.isActiveLogRotator()) {
activateLogRotator(job, cja);
}
}
@SuppressWarnings("unchecked")
private void activateLogRotator(final Job job, final CreateJobAdvancedPlugin cja) {
// if template, it's possible that log rotator is already defined
if (job.getLogRotator() != null) {
return;
}
LogRotator logrotator = new LogRotator(cja.getDaysToKeep(), cja.getNumToKeep(), cja.getArtifactDaysToKeep(),
cja.getArtifactNumToKeep());
job.setLogRotator(logrotator);
}
@SuppressWarnings("unchecked")
private void renameJob(final Job job) {
if (job.getName().indexOf(" ") != -1) {
try {
job.renameTo(job.getName().replaceAll(" ", "-"));
} catch (IOException e) {
log.log(Level.SEVERE, "error during rename", e);
}
}
}
@SuppressWarnings("unchecked")
private void securityGrantPermissions(final Job job, String sid, Permission ... hudsonPermissions) {
Map<Permission, Set<String>> permissions = initPermissions(job);
for(Permission perm : hudsonPermissions) {
configurePermission(permissions,perm, sid);
}
try {
AuthorizationMatrixProperty authProperty = new AuthorizationMatrixProperty(permissions);
job.addProperty(authProperty);
log.info("Granding rights to [" + sid + "] for newly-created job " + job.getDisplayName());
} catch (IOException e) {
log.log(Level.SEVERE, "problem to add granted permissions", e);
}
}
@SuppressWarnings("unchecked")
private Map<Permission, Set<String>> initPermissions(final Job job){
Map<Permission, Set<String>> permissions = null;
// if you create the job with template, need to get informations
AuthorizationMatrixProperty auth = (AuthorizationMatrixProperty) job
.getProperty(AuthorizationMatrixProperty.class);
if (auth != null) {
permissions = new HashMap<Permission, Set<String>>(auth.getGrantedPermissions());
try {
job.removeProperty(AuthorizationMatrixProperty.class);
} catch (IOException e) {
log.log(Level.SEVERE, "problem to remove granted permissions (template or copy job)", e);
}
} else {
permissions = new HashMap<Permission, Set<String>>();
}
return permissions;
}
private void configurePermission(Map<Permission, Set<String>> permissions, Permission permission, String sid) {
Set<String> sidPermission = permissions.get(permission);
if (sidPermission == null) {
Set<String> sidSet = new HashSet<String>();
sidSet.add(sid);
permissions.put(permission, sidSet);
} else {
if (!sidPermission.contains(sid)) {
sidPermission.add(sid);
}
}
}
}