package hudson.plugins.javanet;
import hudson.model.AbstractProject;
import hudson.model.Job;
import hudson.model.JobProperty;
import hudson.model.JobPropertyDescriptor;
import hudson.scm.CVSSCM;
import hudson.scm.SCM;
import hudson.scm.SubversionSCM;
import hudson.scm.SubversionSCM.ModuleLocation;
import hudson.Extension;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* {@link JobProperty} so that this plugin can contribute
* {@link JavaNetStatsAction} to the project, which in turn
* displays a link in the project page.
*
* @author Kohsuke Kawaguchi
*/
public class StatsProperty extends JobProperty<AbstractProject<?,?>> {
public JavaNetStatsAction getJobAction(AbstractProject<?,?> job) {
String jnp = getJavaNetProject(job);
if(jnp==null)
return null;
return new JavaNetStatsAction(job,jnp);
}
private String getJavaNetProject(AbstractProject<?,?> job) {
String v = JavaNetStatsAction.readOverrideFile(job);
if(v!=null) return v;
return getJavaNetProject(job.getScm());
}
/**
* Determines if this SCM is a java.net project,
* and if so, return the project name, otherwise null.
*/
private String getJavaNetProject(SCM scm) {
if (scm instanceof SubversionSCM) {
SubversionSCM sscm = (SubversionSCM) scm;
for (ModuleLocation loc : sscm.getLocations()) {
Matcher m = SVN_URL.matcher(loc.remote);
if(m.matches())
return m.group(1);
}
}
if (scm instanceof CVSSCM) {
CVSSCM cscm = (CVSSCM) scm;
if(CVS_URL.matcher(cscm.getCvsRoot()).matches()) {
StringTokenizer tokens = new StringTokenizer(
cscm.getAllModules(), // TODO: use getAllModulesNormalized
" /\\");
return tokens.nextToken();
}
}
return null;
}
private static final Pattern SVN_URL = Pattern.compile("https://[^.]+.dev.java.net/svn/([^/]+)(/.*)?");
private static final String USERNAME = "([A-Za-z0-9_\\-])+";
private static final String HOST = "(.*.dev.java.net|kohsuke.sfbay.*)";
private static final Pattern CVS_URL = Pattern.compile(
":pserver:"+USERNAME+"@"+HOST+":/cvs");
@Extension
public static final class DescriptorImpl extends JobPropertyDescriptor {
public boolean isApplicable(Class<? extends Job> jobType) {
return AbstractProject.class.isAssignableFrom(jobType);
}
public String getDisplayName() {
return null;
}
public StatsProperty newInstance(StaplerRequest req, JSONObject formData) throws FormException {
return new StatsProperty();
}
}
}