提交 334405fb 编写于 作者: K kohsuke

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
上级 a2a2f84c
......@@ -20,17 +20,6 @@ public final class MavenJob extends AbstractProject<MavenJob,MavenBuild> {
super(parent, name);
}
protected void onLoad(Hudson root, String name) throws IOException {
super.onLoad(root, name);
this.builds = new RunMap<MavenBuild>();
this.builds.load(this,new Constructor<MavenBuild>() {
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<MavenJob,MavenBuild> {
return lastBuild;
}
@Override
protected MavenBuild loadBuild(File dir) throws IOException {
return new MavenBuild(this,dir);
}
/**
* Creates a fresh {@link MavenEmbedder} instance.
*
......
......@@ -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<P extends AbstractProject<P,R>,R extends A
private String authToken = null;
/**
* List of all {@link Trigger}s for this project.
*/
protected List<Trigger> triggers = new Vector<Trigger>();
protected AbstractProject(Hudson parent, String name) {
super(parent, name);
......@@ -85,6 +97,24 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
}
}
@Override
protected void onLoad(Hudson root, String name) throws IOException {
super.onLoad(root,name);
this.builds = new RunMap<R>();
this.builds.load(this,new Constructor<R>() {
public R create(File dir) throws IOException {
return loadBuild(dir);
}
});
if(triggers==null)
// it didn't exist in < 1.28
triggers = new Vector<Trigger>();
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<P extends AbstractProject<P,R>,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<P extends AbstractProject<P,R>,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> trigger) throws IOException {
removeFromList(trigger,triggers);
}
protected final synchronized <T extends Describable<T>>
void addToList( T item, List<T> collection ) throws IOException {
for( int i=0; i<collection.size(); i++ ) {
if(collection.get(i).getDescriptor()==item.getDescriptor()) {
// replace
collection.set(i,item);
save();
return;
}
}
// add
collection.add(item);
save();
}
protected final synchronized <T extends Describable<T>>
void removeFromList(Descriptor<T> item, List<T> 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<Descriptor<Trigger>,Trigger> getTriggers() {
return Descriptor.toMap(triggers);
}
//
//
// actions
......@@ -322,6 +400,28 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,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 <T extends Describable<T>> void buildDescribable(StaplerRequest req, List<Descriptor<T>> descriptors, List<T> 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);
}
}
}
/**
......
......@@ -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<Project,Build> {
/**
* List of all {@link Trigger}s for this project.
*/
private List<Trigger> triggers = new Vector<Trigger>();
/**
* List of active {@link Builder}s configured for this project.
*/
......@@ -80,23 +73,10 @@ public class Project extends AbstractProject<Project,Build> {
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<Trigger>();
if(buildWrappers==null)
// it didn't exist in < 1.64
buildWrappers = new Vector<BuildWrapper>();
this.builds = new RunMap<Build>();
this.builds.load(this,new Constructor<Build>() {
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<Project,Build> {
return super.getIconColor();
}
public synchronized Map<Descriptor<Trigger>,Trigger> getTriggers() {
return Descriptor.toMap(triggers);
}
public synchronized Map<Descriptor<Builder>,Builder> getBuilders() {
return Descriptor.toMap(builders);
}
......@@ -125,44 +101,6 @@ public class Project extends AbstractProject<Project,Build> {
return Descriptor.toMap(buildWrappers);
}
private synchronized <T extends Describable<T>>
void addToList( T item, List<T> collection ) throws IOException {
for( int i=0; i<collection.size(); i++ ) {
if(collection.get(i).getDescriptor()==item.getDescriptor()) {
// replace
collection.set(i,item);
save();
return;
}
}
// add
collection.add(item);
save();
}
private synchronized <T extends Describable<T>>
void removeFromList(Descriptor<T> item, List<T> 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> 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<Project,Build> {
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<Project,Build> {
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<Project,Build> {
return pa;
}
private <T extends Describable<T>> void buildDescribable(StaplerRequest req, List<Descriptor<T>> descriptors, List<T> 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
......
......@@ -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;
}
......
......@@ -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<Trigger>, 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<Trigger>, 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<Trigger>, ExtensionPoint {
*/
protected Trigger() {
this.spec = "";
this.tabs = new CronTabList(Collections.EMPTY_LIST);
this.tabs = new CronTabList(Collections.<CronTab>emptyList());
}
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册