提交 9322ba23 编写于 作者: K kohsuke

pushing the transient action support to Project, and completing the test...

pushing the transient action support to Project, and completing the test result aggregation all the way up to the MavenModuleSet.


git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@3020 71c3de6d-444a-0410-be80-ed276b4c234a
上级 ad8aba9c
package hudson.maven;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.ItemGroup;
import hudson.triggers.Trigger;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;
/**
* Common part between {@link MavenModule} and {@link MavenModuleSet}.
*
* @author Kohsuke Kawaguchi
*/
public abstract class AbstractMavenProject<P extends AbstractMavenProject<P,R>,R extends AbstractBuild<P,R>> extends AbstractProject<P,R> {
protected AbstractMavenProject(ItemGroup parent, String name) {
super(parent, name);
}
/*package*/ void updateTransientActions() {
if(transientActions==null)
transientActions = new Vector<Action>(); // happens when loaded from disk
synchronized(transientActions) {
transientActions.clear();
// if we just pick up the project actions from the last build,
// and if the last build failed very early, then the reports that
// kick in later (like test results) won't be displayed.
// so pick up last successful build, too.
Set<Class> added = new HashSet<Class>();
addTransientActionsFromBuild(getLastBuild(),added);
addTransientActionsFromBuild(getLastSuccessfulBuild(),added);
for (Trigger trigger : triggers) {
Action a = trigger.getProjectAction();
if(a!=null)
transientActions.add(a);
}
}
}
protected abstract void addTransientActionsFromBuild(R lastBuild, Set<Class> added);
}
package hudson.maven;
import hudson.model.Action;
import hudson.model.Project;
import hudson.tasks.BuildStep;
import java.util.List;
import java.util.Map;
......@@ -45,4 +47,10 @@ public interface MavenAggregatedReport extends Action {
* which {@link MavenAggregatedReport}.
*/
Class<? extends AggregatableAction> getIndividualActionType();
/**
* Equivalent of {@link BuildStep#getProjectAction(Project)}
* for {@link MavenAggregatedReport}.
*/
Action getProjectAction(MavenModuleSet moduleSet);
}
......@@ -3,7 +3,6 @@ package hudson.maven;
import hudson.CopyOnWrite;
import hudson.FilePath;
import hudson.Util;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.DependencyGraph;
import hudson.model.Descriptor;
......@@ -13,7 +12,6 @@ import hudson.model.Item;
import hudson.model.ItemGroup;
import hudson.model.Job;
import hudson.model.Node;
import hudson.triggers.Trigger;
import hudson.util.DescribableList;
import org.apache.maven.project.MavenProject;
import org.kohsuke.stapler.StaplerRequest;
......@@ -24,18 +22,16 @@ import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
/**
* {@link Job} that builds projects based on Maven2.
*
* @author Kohsuke Kawaguchi
*/
public final class MavenModule extends AbstractProject<MavenModule,MavenBuild> implements DescribableList.Owner {
public final class MavenModule extends AbstractMavenProject<MavenModule,MavenBuild> implements DescribableList.Owner {
private DescribableList<MavenReporter,Descriptor<MavenReporter>> reporters =
new DescribableList<MavenReporter,Descriptor<MavenReporter>>(this);
......@@ -60,15 +56,6 @@ public final class MavenModule extends AbstractProject<MavenModule,MavenBuild> i
@CopyOnWrite
private Set<ModuleName> dependencies;
/**
* {@link Action}s contributed from {@link #triggers} and {@link MavenBuild#projectActionReporters}
* from the last build.
*
* We don't want to persist them separately, and these actions
* come and go as configuration change, so it's kept separate.
*/
private transient /*final*/ List<Action> transientActions = new Vector<Action>();
/*package*/ MavenModule(MavenModuleSet parent, PomInfo pom, int firstBuildNumber) throws IOException {
super(parent, pom.name.toFileSystemName());
reconfigure(pom);
......@@ -218,36 +205,8 @@ public final class MavenModule extends AbstractProject<MavenModule,MavenBuild> i
}
}
public synchronized List<Action> getActions() {
// add all the transient actions, too
List<Action> actions = new Vector<Action>(super.getActions());
actions.addAll(transientActions);
return actions;
}
/*package*/ void updateTransientActions() {
if(transientActions==null)
transientActions = new Vector<Action>(); // happens when loaded from disk
synchronized(transientActions) {
transientActions.clear();
// if we just pick up the project actions from the last build,
// and if the last build failed very early, then the reports that
// kick in later (like test results) won't be displayed.
// so pick up last successful build, too.
Set<Class> added = new HashSet<Class>();
addTransientActionsFromBuild(getLastBuild(),added);
addTransientActionsFromBuild(getLastSuccessfulBuild(),added);
for (Trigger trigger : triggers) {
Action a = trigger.getProjectAction();
if(a!=null)
transientActions.add(a);
}
}
}
private void addTransientActionsFromBuild(MavenBuild build, Set<Class> added) {
@Override
protected void addTransientActionsFromBuild(MavenBuild build, Set<Class> added) {
if(build==null) return;
List<MavenReporter> list = build.projectActionReporters;
if(list==null) return;
......
......@@ -20,8 +20,6 @@ import hudson.model.TopLevelItem;
import hudson.model.TopLevelItemDescriptor;
import hudson.tasks.Maven;
import hudson.tasks.Maven.MavenInstallation;
import hudson.tasks.test.AbstractTestResultAction;
import hudson.tasks.test.TestResultProjectAction;
import hudson.util.CopyOnWriteMap;
import hudson.util.DescribableList;
import org.kohsuke.stapler.StaplerRequest;
......@@ -37,7 +35,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import java.util.logging.Logger;
/**
......@@ -50,7 +47,7 @@ import java.util.logging.Logger;
*
* @author Kohsuke Kawaguchi
*/
public final class MavenModuleSet extends AbstractProject<MavenModuleSet,MavenModuleSetBuild> implements TopLevelItem, ItemGroup<MavenModule>, SCMedItem, DescribableList.Owner {
public final class MavenModuleSet extends AbstractMavenProject<MavenModuleSet,MavenModuleSetBuild> implements TopLevelItem, ItemGroup<MavenModule>, SCMedItem, DescribableList.Owner {
/**
* All {@link MavenModule}s, keyed by their {@link MavenModule#getModuleName()} module name}s.
*/
......@@ -116,19 +113,13 @@ public final class MavenModuleSet extends AbstractProject<MavenModuleSet,MavenMo
return getItem(name);
}
@Override
public List<Action> getActions() {
// TODO: we need a generalized scheme
MavenModuleSetBuild lb = getLastBuild();
if(lb!=null) {
AbstractTestResultAction tra = lb.getTestResultAction();
if(tra!=null) {
List<Action> actions = new Vector<Action>(super.getActions());
actions.add(new TestResultProjectAction(this));
return actions;
}
}
return super.getActions();
protected void addTransientActionsFromBuild(MavenModuleSetBuild build, Set<Class> added) {
if(build==null) return;
for (Action a : build.getActions())
if(a instanceof MavenAggregatedReport)
if(added.add(a.getClass()))
transientActions.add(((MavenAggregatedReport)a).getProjectAction(this));
}
/**
......@@ -249,6 +240,8 @@ public final class MavenModuleSet extends AbstractProject<MavenModuleSet,MavenMo
if(reporters==null)
reporters = new DescribableList<MavenReporter, Descriptor<MavenReporter>>(this);
updateTransientActions();
}
/**
......@@ -409,6 +402,4 @@ public final class MavenModuleSet extends AbstractProject<MavenModuleSet,MavenMo
return Maven.DESCRIPTOR;
}
}
private static final Logger LOGGER = Logger.getLogger(MavenModuleSet.class.getName());
}
......@@ -177,8 +177,10 @@ public final class MavenModuleSetBuild extends AbstractBuild<MavenModuleSet,Mave
}
}
if(modified)
if(modified) {
save();
getProject().updateTransientActions();
}
}
} catch (IOException e) {
LOGGER.log(Level.WARNING,"Failed to update "+this,e);
......
......@@ -7,6 +7,8 @@ import hudson.maven.MavenModuleSet;
import hudson.maven.MavenModuleSetBuild;
import hudson.tasks.test.AbstractTestResultAction;
import hudson.tasks.test.AggregatedTestResultAction;
import hudson.tasks.test.TestResultProjectAction;
import hudson.model.Action;
import java.util.List;
import java.util.Map;
......@@ -29,6 +31,10 @@ public class SurefireAggregatedReport extends AggregatedTestResultAction impleme
return SurefireReport.class;
}
public Action getProjectAction(MavenModuleSet moduleSet) {
return new TestResultProjectAction(moduleSet);
}
@Override
protected String getChildName(AbstractTestResultAction tr) {
return ((MavenModule)tr.owner.getProject()).getModuleName().toString();
......
......@@ -96,6 +96,15 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
*/
protected List<Trigger<?>> triggers = new Vector<Trigger<?>>();
/**
* {@link Action}s contributed from subsidiary objects associated with
* {@link AbstractProject}, such as from triggers, builders, publishers, etc.
*
* We don't want to persist them separately, and these actions
* come and go as configuration change, so it's kept separate.
*/
protected transient /*final*/ List<Action> transientActions = new Vector<Action>();
protected AbstractProject(ItemGroup parent, String name) {
super(parent,name);
......@@ -246,6 +255,13 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
*/
protected abstract R loadBuild(File dir) throws IOException;
public synchronized List<Action> getActions() {
// add all the transient actions, too
List<Action> actions = new Vector<Action>(super.getActions());
actions.addAll(transientActions);
return actions;
}
/**
* Gets the {@link Node} where this project was last built on.
*
......
......@@ -46,15 +46,6 @@ public class Project extends AbstractProject<Project,Build> implements TopLevelI
*/
private List<BuildWrapper> buildWrappers = new Vector<BuildWrapper>();
/**
* {@link Action}s contributed from {@link #triggers}, {@link #builders},
* and {@link #publishers}.
*
* We don't want to persist them separately, and these actions
* come and go as configuration change, so it's kept separate.
*/
private transient /*final*/ List<Action> transientActions = new Vector<Action>();
/**
* Creates a new project.
*/
......@@ -232,13 +223,6 @@ public class Project extends AbstractProject<Project,Build> implements TopLevelI
}
}
public synchronized List<Action> getActions() {
// add all the transient actions, too
List<Action> actions = new Vector<Action>(super.getActions());
actions.addAll(transientActions);
return actions;
}
public List<ProminentProjectAction> getProminentActions() {
List<Action> a = getActions();
List<ProminentProjectAction> pa = new Vector<ProminentProjectAction>();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册