From 334405fb88a044668a70b94bf737b559479ab74b Mon Sep 17 00:00:00 2001 From: kohsuke Date: Mon, 1 Jan 2007 20:10:49 +0000 Subject: [PATCH] Trigger is shared between both kinds of Projects. git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@1590 71c3de6d-444a-0410-be80-ed276b4c234a --- core/src/main/java/hudson/maven/MavenJob.java | 16 +-- .../java/hudson/model/AbstractProject.java | 100 ++++++++++++++++++ core/src/main/java/hudson/model/Project.java | 87 ++------------- .../main/java/hudson/triggers/SCMTrigger.java | 6 +- .../main/java/hudson/triggers/Trigger.java | 16 +-- 5 files changed, 120 insertions(+), 105 deletions(-) diff --git a/core/src/main/java/hudson/maven/MavenJob.java b/core/src/main/java/hudson/maven/MavenJob.java index a9881575fa..01641e9037 100644 --- a/core/src/main/java/hudson/maven/MavenJob.java +++ b/core/src/main/java/hudson/maven/MavenJob.java @@ -20,17 +20,6 @@ public final class MavenJob extends AbstractProject { super(parent, name); } - protected void onLoad(Hudson root, String name) throws IOException { - super.onLoad(root, name); - - this.builds = new RunMap(); - this.builds.load(this,new Constructor() { - public MavenBuild create(File dir) throws IOException { - return new MavenBuild(MavenJob.this,dir); - } - }); - } - @Override public MavenBuild newBuild() throws IOException { MavenBuild lastBuild = new MavenBuild(this); @@ -38,6 +27,11 @@ public final class MavenJob extends AbstractProject { return lastBuild; } + @Override + protected MavenBuild loadBuild(File dir) throws IOException { + return new MavenBuild(this,dir); + } + /** * Creates a fresh {@link MavenEmbedder} instance. * diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 2b10721b00..d2f890de51 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -2,6 +2,10 @@ package hudson.model; import hudson.FilePath; import hudson.Launcher; +import hudson.model.RunMap.Constructor; +import hudson.model.Descriptor.FormException; +import hudson.triggers.Trigger; +import hudson.triggers.Triggers; import hudson.Launcher.LocalLauncher; import hudson.maven.MavenJob; import hudson.scm.NullSCM; @@ -13,6 +17,9 @@ import javax.servlet.ServletException; import java.io.File; import java.io.IOException; import java.util.SortedMap; +import java.util.List; +import java.util.Vector; +import java.util.Map; /** * Base implementation of {@link Job}s that build software. @@ -75,6 +82,11 @@ public abstract class AbstractProject

,R extends A private String authToken = null; + /** + * List of all {@link Trigger}s for this project. + */ + protected List triggers = new Vector(); + protected AbstractProject(Hudson parent, String name) { super(parent, name); @@ -85,6 +97,24 @@ public abstract class AbstractProject

,R extends A } } + @Override + protected void onLoad(Hudson root, String name) throws IOException { + super.onLoad(root,name); + + this.builds = new RunMap(); + this.builds.load(this,new Constructor() { + public R create(File dir) throws IOException { + return loadBuild(dir); + } + }); + + if(triggers==null) + // it didn't exist in < 1.28 + triggers = new Vector(); + for (Trigger t : triggers) + t.start(this,false); + } + /** * If this project is configured to be always built on this node, * return that {@link Node}. Otherwise null. @@ -181,6 +211,12 @@ public abstract class AbstractProject

,R extends A */ protected abstract R newBuild() throws IOException; + /** + * Loads an existing build record from disk. + */ + protected abstract R loadBuild(File dir) throws IOException; + + /** * Gets the {@link Node} where this project was last built on. * @@ -253,6 +289,48 @@ public abstract class AbstractProject

,R extends A this.scm = scm; } + /** + * Adds a new {@link Trigger} to this {@link Project} if not active yet. + */ + public void addTrigger(Trigger trigger) throws IOException { + addToList(trigger,triggers); + } + + public void removeTrigger(Descriptor trigger) throws IOException { + removeFromList(trigger,triggers); + } + + protected final synchronized > + void addToList( T item, List collection ) throws IOException { + for( int i=0; i> + void removeFromList(Descriptor item, List collection) throws IOException { + for( int i=0; i< collection.size(); i++ ) { + if(collection.get(i).getDescriptor()==item) { + // found it + collection.remove(i); + save(); + return; + } + } + } + + public synchronized Map,Trigger> getTriggers() { + return Descriptor.toMap(triggers); + } + // // // actions @@ -322,6 +400,28 @@ public abstract class AbstractProject

,R extends A } else { enableRemoteTrigger = false; } + + try { + for (Trigger t : triggers) + t.stop(); + buildDescribable(req, Triggers.TRIGGERS, triggers, "trigger"); + for (Trigger t : triggers) + t.start(this,true); + } catch (FormException e) { + throw new ServletException(e); + } + } + + protected final > void buildDescribable(StaplerRequest req, List> descriptors, List result, String prefix) + throws FormException { + + result.clear(); + for( int i=0; i< descriptors.size(); i++ ) { + if(req.getParameter(prefix +i)!=null) { + T instance = descriptors.get(i).newInstance(req); + result.add(instance); + } + } } /** diff --git a/core/src/main/java/hudson/model/Project.java b/core/src/main/java/hudson/model/Project.java index 3eb569d191..66d9237bb4 100644 --- a/core/src/main/java/hudson/model/Project.java +++ b/core/src/main/java/hudson/model/Project.java @@ -3,7 +3,6 @@ package hudson.model; import hudson.FilePath; import hudson.model.Descriptor.FormException; import hudson.model.Fingerprint.RangeSet; -import hudson.model.RunMap.Constructor; import hudson.scm.SCMS; import hudson.tasks.BuildStep; import hudson.tasks.BuildTrigger; @@ -13,7 +12,6 @@ import hudson.tasks.Builder; import hudson.tasks.Fingerprinter; import hudson.tasks.Publisher; import hudson.triggers.Trigger; -import hudson.triggers.Triggers; import hudson.util.EditDistance; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -41,11 +39,6 @@ import java.util.Vector; */ public class Project extends AbstractProject { - /** - * List of all {@link Trigger}s for this project. - */ - private List triggers = new Vector(); - /** * List of active {@link Builder}s configured for this project. */ @@ -80,23 +73,10 @@ public class Project extends AbstractProject { protected void onLoad(Hudson root, String name) throws IOException { super.onLoad(root, name); - if(triggers==null) - // it didn't exist in < 1.28 - triggers = new Vector(); if(buildWrappers==null) // it didn't exist in < 1.64 buildWrappers = new Vector(); - this.builds = new RunMap(); - this.builds.load(this,new Constructor() { - public Build create(File dir) throws IOException { - return new Build(Project.this,dir); - } - }); - - for (Trigger t : triggers) - t.start(this,false); - updateTransientActions(); } @@ -109,10 +89,6 @@ public class Project extends AbstractProject { return super.getIconColor(); } - public synchronized Map,Trigger> getTriggers() { - return Descriptor.toMap(triggers); - } - public synchronized Map,Builder> getBuilders() { return Descriptor.toMap(builders); } @@ -125,44 +101,6 @@ public class Project extends AbstractProject { return Descriptor.toMap(buildWrappers); } - private synchronized > - void addToList( T item, List collection ) throws IOException { - for( int i=0; i> - void removeFromList(Descriptor item, List collection) throws IOException { - for( int i=0; i< collection.size(); i++ ) { - if(collection.get(i).getDescriptor()==item) { - // found it - collection.remove(i); - save(); - return; - } - } - } - - /** - * Adds a new {@link Trigger} to this {@link Project} if not active yet. - */ - public void addTrigger(Trigger trigger) throws IOException { - addToList(trigger,triggers); - } - - public void removeTrigger(Descriptor trigger) throws IOException { - removeFromList(trigger,triggers); - } - /** * Adds a new {@link BuildStep} to this {@link Project} and saves the configuration. */ @@ -184,6 +122,11 @@ public class Project extends AbstractProject { return lastBuild; } + @Override + protected Build loadBuild(File dir) throws IOException { + return new Build(this,dir); + } + /** * Returns the root directory of the checked-out module. * @@ -297,15 +240,9 @@ public class Project extends AbstractProject { buildDescribable(req, BuildStep.BUILDERS, builders, "builder"); buildDescribable(req, BuildStep.PUBLISHERS, publishers, "publisher"); - for (Trigger t : triggers) - t.stop(); - buildDescribable(req, Triggers.TRIGGERS, triggers, "trigger"); - for (Trigger t : triggers) - t.start(this,true); + super.doConfigSubmit(req,rsp); updateTransientActions(); - - super.doConfigSubmit(req,rsp); } catch (FormException e) { sendError(e,req,rsp); } @@ -378,18 +315,6 @@ public class Project extends AbstractProject { return pa; } - private > void buildDescribable(StaplerRequest req, List> descriptors, List result, String prefix) - throws FormException { - - result.clear(); - for( int i=0; i< descriptors.size(); i++ ) { - if(req.getParameter(prefix +i)!=null) { - T instance = descriptors.get(i).newInstance(req); - result.add(instance); - } - } - } - /** * @deprecated * left for legacy config file compatibility diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index 119c1f8e91..c8d55cb3f6 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -7,6 +7,8 @@ import hudson.model.Build; import hudson.model.Descriptor; import hudson.model.Project; import hudson.model.TaskListener; +import hudson.model.AbstractBuild; +import hudson.model.AbstractProject; import hudson.util.StreamTaskListener; import org.kohsuke.stapler.StaplerRequest; @@ -95,7 +97,7 @@ public class SCMTrigger extends Trigger { * Start polling if it's scheduled. */ public synchronized void startPolling() { - Build b = project.getLastBuild(); + AbstractBuild b = project.getLastBuild(); if(b!=null && b.isBuilding()) return; // build in progress @@ -207,7 +209,7 @@ public class SCMTrigger extends Trigger { * Action object for {@link Project}. Used to display the polling log. */ public final class SCMAction implements Action { - public Project getOwner() { + public AbstractProject getOwner() { return project; } diff --git a/core/src/main/java/hudson/triggers/Trigger.java b/core/src/main/java/hudson/triggers/Trigger.java index e8106a1b4b..5c9e80097f 100644 --- a/core/src/main/java/hudson/triggers/Trigger.java +++ b/core/src/main/java/hudson/triggers/Trigger.java @@ -9,7 +9,9 @@ import hudson.model.FingerprintCleanupThread; import hudson.model.Hudson; import hudson.model.Project; import hudson.model.WorkspaceCleanupThread; +import hudson.model.AbstractProject; import hudson.scheduler.CronTabList; +import hudson.scheduler.CronTab; import java.io.InvalidObjectException; import java.io.ObjectStreamException; @@ -41,15 +43,7 @@ public abstract class Trigger implements Describable, ExtensionPoint { * True if this is a newly created trigger first attached to the {@link Project}. * False if this is invoked for a {@link Project} loaded from disk. */ - public void start(Project project, boolean newInstance) { - start(project); // compatibility - } - - /** - * @deprecated as of 1.61. - * Use {@link #start(Project, boolean)}. - */ - public void start(Project project) { + public void start(AbstractProject project, boolean newInstance) { this.project = project; } @@ -84,7 +78,7 @@ public abstract class Trigger implements Describable, ExtensionPoint { protected final String spec; protected transient CronTabList tabs; - protected transient Project project; + protected transient AbstractProject project; /** * Creates a new {@link Trigger} that gets {@link #run() run} @@ -101,7 +95,7 @@ public abstract class Trigger implements Describable, ExtensionPoint { */ protected Trigger() { this.spec = ""; - this.tabs = new CronTabList(Collections.EMPTY_LIST); + this.tabs = new CronTabList(Collections.emptyList()); } /** -- GitLab