package hudson.plugins.perforce;
import com.tek42.perforce.PerforceException;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.Node;
import hudson.model.Project;
import hudson.model.TaskListener;
import hudson.model.User;
import hudson.tasks.MailAddressResolver;
import hudson.util.StreamTaskListener;
import java.io.File;
import java.util.logging.Logger;
/**
* Implementation of {@link MailAddressResolver} for looking up the email address of a user in the Perforce repository.
*
* @author Mike
* Date: Apr 22, 2008 2:01:37 PM
*/
@Extension
public class PerforceMailResolver extends MailAddressResolver {
private static final Logger LOGGER = Logger.getLogger(PerforceMailResolver.class.getName());
@SuppressWarnings("unchecked")
public String findMailAddressFor(User u) {
LOGGER.fine("Email address for " + u.getId() + " requested.");
for (AbstractProject p : u.getProjects()) {
if (p.isDisabled()) continue;
if (p.getScm() instanceof PerforceSCM) {
LOGGER.finer("Checking " + p.getName() + "'s SCM for " + u.getId() + "'s address.");
PerforceSCM pscm = (PerforceSCM) p.getScm();
TaskListener listener = new StreamTaskListener(System.out);
Node node = p.getLastBuiltOn();
// If the node is offline, skip the project.
// The node needs to be online for us to execute commands.
if (node == null) {
LOGGER.finer("Build doesn't seem to have been run before. Cannot resolve email address using this project.");
continue;
}
if (node.getChannel() == null) {
LOGGER.finer("Node " + node.getDisplayName() + " is not up, cannot resolve email address using this project.");
continue;
}
// TODO: replace this with p.getLastBuild().getWorkspace()
// which is the way it should be, but doesn't work with this version of hudson.
for (int tries = 0; tries < 5; tries++) {
FilePath workspace = p.getLastBuiltOn().getRootPath();
Launcher launcher = p.getLastBuiltOn().createLauncher(listener);
com.tek42.perforce.model.User pu = null;
try {
LOGGER.finer("Trying to get email address from perforce for " + u.getId());
pu = pscm.getDepot(launcher, workspace).getUsers().getUser(u.getId());
} catch (Exception e) {
LOGGER.fine("Could not get email address from Perforce: " + e.getMessage());
e.printStackTrace(listener.getLogger());
}
if (pu != null && pu.getEmail() != null && !pu.getEmail().equals("")) {
LOGGER.fine("Got email (" + pu.getEmail() + ") from perforce for " + u.getId());
return pu.getEmail();
}
try {
//gradually increase sleep time
Thread.sleep(tries*300);
} catch (InterruptedException e){
return null;
}
}
}
}
return null;
}
}