package com.cadrlife.devsearch.agent.service.cvs;
import java.io.File;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.netbeans.lib.cvsclient.Client;
import org.netbeans.lib.cvsclient.command.Command;
import org.netbeans.lib.cvsclient.command.GlobalOptions;
import org.netbeans.lib.cvsclient.command.checkout.CheckoutCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cadrlife.devsearch.agent.service.RepoService;
import com.cadrlife.devsearch.cvsnavigator.CvsConnection;
import com.cadrlife.devsearch.cvsnavigator.CvsCredentials;
import com.cadrlife.devsearch.cvsnavigator.CvsErrorCollectingListener;
import com.cadrlife.devsearch.cvsnavigator.CvsModuleList;
import com.cadrlife.devsearch.domain.Project;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
public class CvsService extends RepoService {
private static final Logger LOG = LoggerFactory.getLogger(CvsService.class);
private String cvsTempDir;
private CvsCredentials cvsCredentials;
private Client client;
private GlobalOptions cvsOptions;
private CvsErrorCollectingListener errorListener = new CvsErrorCollectingListener();
public CvsService(CvsCredentials cvsCredentials, String cvsTempDir, String checkoutDir) {
this.cvsCredentials = cvsCredentials;
this.cvsTempDir = cvsTempDir;
client = CvsConnection.openClient(cvsCredentials.getCvsRoot(), cvsCredentials.getPassword(), checkoutDir);
client.getEventManager().addCVSListener(errorListener);
cvsOptions = new GlobalOptions();
cvsOptions.setCVSRoot(cvsCredentials.getCvsRoot());
}
public List <Project> findAllProjects() {
try {
List <String> projectNames = new CvsModuleList().getModules(cvsCredentials, cvsTempDir);
projectNames.remove("CVSROOT");
LOG.info("Found " + projectNames.size() + " projects in CVS:[" + StringUtils.join(projectNames, ", ") + "]");
return findProjectsByAnyName(projectNames);
}
catch (Exception e) {
throw new RuntimeException("Could not get modules", e);
}
}
@Override
public void updateProject(File file, Project project) {
String projectName = project.getName();
checkout(file, projectName);
setLastChanged(file, project);
}
private void setLastChanged(File file, Project project) {
project.setLastChangedDate(FileListingVisitor.findLastModifiedDate(file.toPath()));
}
private void executeCommand(Command command) {
try {
errorListener.clear();
boolean success = client.executeCommand(command, cvsOptions);
if (!success) {
LOG.error("{} {} Error dump: {}", command.getCVSCommand(), command.getCVSArguments(), errorListener.getErrorMessages());
throw new RuntimeException("CVS Command returned failure. See log above.");
}
}
catch (Exception e) {
LOG.error("{} {} Error dump: {}", command.getCVSCommand(), command.getCVSArguments(), errorListener.getErrorMessages());
throw new RuntimeException("CVS Command blew up. See stacktrace and log above", e);
}
}
private void checkout(File file, String projectName) {
String absolutePath = file.getAbsolutePath();
CheckoutCommand command = new CheckoutCommand();
command.setModule(projectName);
client.setLocalPath(file.toPath().getParent().toString());
LOG.info("CHECKOUT on {} to '{}'", projectName, absolutePath);
executeCommand(command);
}
@Override
public String getSourceType() {
return "cvs";
}
public CvsCredentials getCvsCredentials() {
return cvsCredentials;
}
//
}