Index: pom.xml =================================================================== --- pom.xml (revision 17146) +++ pom.xml (working copy) @@ -22,7 +22,7 @@ <dependency> <groupId>org.jvnet.its</groupId> <artifactId>issuetracker-stats</artifactId> - <version>1.1</version> + <version>1.3-SNAPSHOT</version> </dependency> <!-- TODO: dependency resolution isn't working correctly. Index: src/main/java/hudson/plugins/javanet/JavaNetStatsAction.java =================================================================== --- src/main/java/hudson/plugins/javanet/JavaNetStatsAction.java (revision 17146) +++ src/main/java/hudson/plugins/javanet/JavaNetStatsAction.java (working copy) @@ -23,6 +23,8 @@ * @author Kohsuke Kawaguchi */ public class JavaNetStatsAction implements Action { + private static final String JAVA_NET_PROJECT_SUBCOMPONENT_NAMES_FILE = "java.net.project.subcomponentNames"; + /** * Project that owns this action. */ @@ -33,20 +35,30 @@ */ private String projectName; + /** + * Sub component names in the Java.net project. + */ + private String subcomponentNames; + private File reportDir; - public JavaNetStatsAction(AbstractProject<?, ?> project, String projectName) { + public JavaNetStatsAction(AbstractProject<?, ?> project, String projectName, String subcomponentNames) { this.project = project; this.projectName = projectName; this.reportDir = getReportDirectory(); + this.subcomponentNames = subcomponentNames; } public String getProjectName() { return projectName; } + public String getSubcomponentNames() { + return subcomponentNames; + } + public void scheduleGeneration() { - new ReportGenerator(projectName,reportDir).schedule(); + new ReportGenerator(projectName,subcomponentNames,reportDir).schedule(); } public String getIconFileName() { @@ -107,11 +119,20 @@ projectName = name.trim(); reportDir = getReportDirectory(); - FileUtils.writeStringToFile(getOverrideFile(),projectName,"UTF-8"); + FileUtils.writeStringToFile(getProjectNameOverrideFile(),projectName,"UTF-8"); + getSubcomponentOverrideFile().delete(); rsp.sendRedirect2("."); } + public void doChangeSubcomponents(StaplerRequest req, StaplerResponse rsp,@QueryParameter("name") String name) throws IOException, ServletException { + project.checkPermission(CONFIGURE); + + subcomponentNames = name.trim(); + FileUtils.writeStringToFile(getSubcomponentOverrideFile(),subcomponentNames,"UTF-8"); + rsp.sendRedirect2("."); + } + /** * Manually trigger the regeneration. */ @@ -131,13 +152,28 @@ * File that stores the java.net project name, to manually override * the default project name inference. */ - private File getOverrideFile() { + private File getProjectNameOverrideFile() { return new File(project.getRootDir(),"java.net.projectName"); } - /*package*/ static String readOverrideFile(AbstractProject<?,?> project) { + /** + * File that stores the java.net project sub component name. + */ + private File getSubcomponentOverrideFile() { + return new File(project.getRootDir(),JAVA_NET_PROJECT_SUBCOMPONENT_NAMES_FILE); + } + + /*package*/ static String readProjectNameOverrideFile(AbstractProject<?,?> project) { + return readOverrideFile(project, "java.net.projectName"); + } + + /*package*/ static String readSubComponentNameOverrideFile(AbstractProject<?,?> project) { + return readOverrideFile(project, JAVA_NET_PROJECT_SUBCOMPONENT_NAMES_FILE); + } + + private static String readOverrideFile(AbstractProject<?,?> project, String filename) { try { - return FileUtils.readFileToString(new File(project.getRootDir(),"java.net.projectName"),"UTF-8").trim(); + return FileUtils.readFileToString(new File(project.getRootDir(),filename),"UTF-8").trim(); } catch (IOException e) { return null; } Index: src/main/java/hudson/plugins/javanet/ReportGenerator.java =================================================================== --- src/main/java/hudson/plugins/javanet/ReportGenerator.java (revision 17146) +++ src/main/java/hudson/plugins/javanet/ReportGenerator.java (working copy) @@ -1,5 +1,6 @@ package hudson.plugins.javanet; +import hudson.Util; import hudson.util.DaemonThreadFactory; import org.jvnet.its.Generator; import org.kohsuke.jnt.JavaNet; @@ -7,6 +8,8 @@ import java.io.File; import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -22,9 +25,11 @@ class ReportGenerator implements Runnable { private final String projectName; private final File reportDir; + private final String subcomponentNames; - ReportGenerator(String projectName, File reportDir) { + ReportGenerator(String projectName, String subcomponentNames, File reportDir) { this.projectName = projectName; + this.subcomponentNames = subcomponentNames; this.reportDir = reportDir; } @@ -39,12 +44,16 @@ Generator gen = new Generator(); long start = System.currentTimeMillis(); - LOGGER.info("Starting to generate java.net issue tracker stats for "+projectName); + LOGGER.info("Starting to generate java.net issue tracker stats for "+projectName+(subcomponentNames == null ? "" : "(" + subcomponentNames + ")")); String oldName = Thread.currentThread().getName(); Thread.currentThread().setName("java.net issue tracker stat generation for "+projectName); reportDir.mkdirs(); try { - gen.generate(JavaNet.connect().getProject(projectName), reportDir); + if (Util.fixEmpty(subcomponentNames) == null) { + gen.generate(JavaNet.connect().getProject(projectName), reportDir); + } else { + gen.generate(JavaNet.connect().getProject(projectName), new HashSet<String>(Arrays.asList(subcomponentNames.split(","))), reportDir); + } } catch (ProcessingException e) { LOGGER.log(Level.SEVERE, "Failed to generate java.net stat report for "+projectName,e); } catch (IOException e) { Index: src/main/java/hudson/plugins/javanet/StatsProperty.java =================================================================== --- src/main/java/hudson/plugins/javanet/StatsProperty.java (revision 17146) +++ src/main/java/hudson/plugins/javanet/StatsProperty.java (working copy) @@ -1,5 +1,6 @@ package hudson.plugins.javanet; +import hudson.Util; import hudson.model.AbstractProject; import hudson.model.Job; import hudson.model.JobProperty; @@ -31,15 +32,19 @@ String jnp = getJavaNetProject(job); if(jnp==null) return null; - return new JavaNetStatsAction(job,jnp); + return new JavaNetStatsAction(job,jnp,getJavaNetSubcomponent(job)); } private String getJavaNetProject(AbstractProject<?,?> job) { - String v = JavaNetStatsAction.readOverrideFile(job); + String v = JavaNetStatsAction.readProjectNameOverrideFile(job); if(v!=null) return v; return getJavaNetProject(job.getScm()); } + private String getJavaNetSubcomponent(AbstractProject<?,?> job) { + return Util.fixEmpty(JavaNetStatsAction.readSubComponentNameOverrideFile(job)); + } + /** * Determines if this SCM is a java.net project, * and if so, return the project name, otherwise null. Index: src/main/resources/hudson/plugins/javanet/JavaNetStatsAction/index.jelly =================================================================== --- src/main/resources/hudson/plugins/javanet/JavaNetStatsAction/index.jelly (revision 17146) +++ src/main/resources/hudson/plugins/javanet/JavaNetStatsAction/index.jelly (working copy) @@ -10,6 +10,13 @@ <input type="submit" value="Submit" class="submit-button"/> </form> </l:expandButton> + <br/> + <l:expandButton title="But, this project is only a sub component of the main project!"> + <form method="post" action="changeSubcomponents"> + Comma separated list of Java.net subcomponent names: <input type="text" name="name" value="${it.subcomponentNames}" /> + <input type="submit" value="Submit" class="submit-button"/> + </form> + </l:expandButton> </div> </j:if> <j:choose>