Skip to content

Commit

Permalink
Fix proposal for JENKINS-16800
Browse files Browse the repository at this point in the history
  • Loading branch information
William Bernardet committed May 28, 2013
1 parent 87030ed commit 97547e3
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 0 deletions.
68 changes: 68 additions & 0 deletions src/main/java/hudson/plugins/templateproject/ItemListenerImpl.java
@@ -0,0 +1,68 @@
package hudson.plugins.templateproject;

import java.io.IOException;
import java.util.Collections;
import java.util.List;

import hudson.matrix.MatrixProject;
import hudson.model.Hudson;
import hudson.model.Project;
import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.listeners.ItemListener;
import hudson.tasks.Builder;
import java.util.logging.Logger;

/**
* This ItemListener implementation will force job using
* template for publisher to regenerate the transient actions list.
*
* To do so we use the {@link UpdateTransientProperty} property which does not do
* anything. This is a bit a hack that relies on the behavior, but
* there does not seem to be any better way to force updating projects transients actions.
*
* @author william.bernardet@gmail.com
*
*/
@Extension
public class ItemListenerImpl extends ItemListener {
private static final Logger LOGGER = Logger.getLogger(ItemListenerImpl.class.getName());

/**
* Let's force the projects using either the ProxyPublisher or the ProxyBuilder
* to update their transient actions.
*/
@Override
public void onLoaded() {
for (AbstractProject<?,?> project : Hudson.getInstance().getAllItems(AbstractProject.class)) {
if (project.getPublishersList().get(ProxyPublisher.class) != null ||
hasBuilder(project, ProxyBuilder.class)) {
try {
project.addProperty(new UpdateTransientProperty());
project.removeProperty(UpdateTransientProperty.class);
} catch (IOException e) {
LOGGER.severe(e.getMessage());
}
}
}
}

private List<Builder> getBuilders(AbstractProject<?, ?> project) {
if (project instanceof Project) {
return ((Project)project).getBuilders();
} else if (project instanceof MatrixProject) {
return ((MatrixProject)project).getBuilders();
} else {
return Collections.emptyList();
}
}

public <T> boolean hasBuilder(AbstractProject<?, ?> project, Class<T> type) {
for (Builder b : getBuilders(project)) {
if (type.isInstance(b)) {
return true;
}
}
return false;
}
}
13 changes: 13 additions & 0 deletions src/main/java/hudson/plugins/templateproject/ProxyBuilder.java
Expand Up @@ -5,6 +5,7 @@
import hudson.matrix.MatrixProject;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.BuildListener;
import hudson.model.Hudson;
import hudson.model.Item;
Expand All @@ -13,9 +14,12 @@
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.Builder;
import hudson.tasks.Messages;
import hudson.tasks.Publisher;
import hudson.util.FormValidation;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

Expand Down Expand Up @@ -97,4 +101,13 @@ public boolean prebuild(AbstractBuild<?, ?> build, BuildListener listener) {
return true;
}

@Override
public Collection<? extends Action> getProjectActions(AbstractProject<?, ?> project) {
List<Action> actions = new ArrayList<Action>();
for (Builder builder : getProjectBuilders()) {
actions.addAll(builder.getProjectActions(project));
}
return actions;
}

}
17 changes: 17 additions & 0 deletions src/main/java/hudson/plugins/templateproject/ProxyPublisher.java
@@ -1,11 +1,15 @@
package hudson.plugins.templateproject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import hudson.Extension;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.BuildListener;
import hudson.model.Hudson;
import hudson.model.Item;
Expand Down Expand Up @@ -69,6 +73,19 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
return true;
}

@Override
public Collection<? extends Action> getProjectActions(AbstractProject<?, ?> project) {
List<Action> actions = new ArrayList<Action>();
// project might not defined when loading the first time
AbstractProject<?, ?> templateProject = getProject();
if (templateProject != null) {
for (Publisher publisher : templateProject.getPublishersList().toList()) {
actions.addAll(publisher.getProjectActions(project));
}
}
return actions;
}

@Extension
public static class DescriptorImpl extends BuildStepDescriptor<Publisher> {

Expand Down
@@ -0,0 +1,33 @@
package hudson.plugins.templateproject;

import org.kohsuke.stapler.DataBoundConstructor;

import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.JobProperty;
import hudson.model.JobPropertyDescriptor;

/**
* A property that is only used to trigger the transient actions creations
* under a project.
*
* @author william.bernardet@gmail.com
*
*/
public class UpdateTransientProperty extends JobProperty<AbstractProject<?, ?>> {

@DataBoundConstructor
public UpdateTransientProperty() {
}

@Extension
public static class DescriptorImpl extends JobPropertyDescriptor {

@Override
public String getDisplayName() {
return "Property used to for job to update transient actions.";
}

}

}

0 comments on commit 97547e3

Please sign in to comment.