package com.cadrlife.devsearch.agent.service;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import javax.sql.DataSource;
import com.cadrlife.devsearch.agent.service.cvs.CvsServiceProvider;
import com.cadrlife.devsearch.agent.service.filesystem.FileSystemService;
import com.cadrlife.devsearch.agent.service.ftp.FtpService;
import com.cadrlife.devsearch.agent.service.git.*;
import com.cadrlife.devsearch.agent.service.oracle.DataSourceProvider;
import com.cadrlife.devsearch.agent.service.oracle.OracleService;
//import com.cadrlife.devsearch.agent.service.sqlserver.SqlServerService;
import com.cadrlife.devsearch.cvsnavigator.CvsCredentials;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.google.common.base.Throwables;
import com.google.common.io.Files;
import org.apache.commons.io.FileUtils;
import org.apache.http.impl.client.DefaultHttpClient;
public class RepoCreator {
private Properties properties;
private String checkoutPath;
CvsServiceProvider cvsServiceProvider = new CvsServiceProvider();
public RepoCreator(Properties properties, String checkoutPath) {
this.properties = properties;
this.checkoutPath = checkoutPath;
}
public RepoService createService(String repoName) {
String repoType = properties.getProperty("repo." + repoName + ".type");
if (null == repoType ) {
for (Object kejObject : properties.keySet()) {
String key = kejObject.toString();
String[] tokens = key.split("\\.");
if ("reposource".equals(tokens[0])) {
String repoSourceName = tokens[1];
String prefix = properties.getProperty("reposource." + repoSourceName + ".prefix");
if (null != prefix && repoName.startsWith(prefix)) {
String repoSourceType = properties.getProperty("reposource." + repoSourceName + ".type");
if ("stash".equals(repoSourceType)) {
String stashProjectKey = repoName.substring(prefix.length());
String username = getProperty("reposource." + repoSourceName + ".username");
String password = getProperty("reposource." + repoSourceName + ".password");
String apiBaseUrl = getProperty("reposource." + repoSourceName + ".api.base.url");
GitStashService service = new GitStashService(stashProjectKey, username, password, apiBaseUrl);
return service.setRepoName(repoName);
}
if ("githubuser".equals(repoSourceType)) {
String user = repoName.substring(prefix.length());
return new GithubUserRepoService(user).setRepoName(repoName);
}
if ("githuborg".equals(repoSourceType)) {
String org = repoName.substring(prefix.length());
return new GithubOrgRepoService(org).setRepoName(repoName);
}
}
}
}
throw new RuntimeException("No source type defined for repo '" + repoName + "'");
}
if ("cvs".equals(repoType)) {
String cvsRoot = getProperty("repo." + repoName + ".cvsroot");
String password = getProperty("repo." + repoName + ".password");
CvsCredentials cvsCredentials = new CvsCredentials(cvsRoot, password);
return cvsServiceProvider.provide(cvsCredentials, getProperty("cvs.temp.dir"), checkoutPath, repoName);
}
if ("ftp".equals(repoType)) {
String host = getProperty("repo." + repoName + ".host");
String username = getProperty("repo." + repoName + ".username");
String password = getProperty("repo." + repoName + ".password");
String path = getProperty("repo." + repoName + ".path");
FtpService service = new FtpService(host, username, password, path);
return service.setRepoName(repoName);
}
if ("oracle".equals(repoType)) {
DataSource dataSource = new DataSourceProvider().createFromProperties("repo." +repoName, properties);
OracleService service = new OracleService(dataSource);
service.setRepoName(repoName);
return service;
}
// if ("sqlserver".equals(repoType)) {
// SqlServerService service = new SqlServerService();
// return service.setRepoName(repoName);
// }
if ("filesystem".equals(repoType)) {
String path = getProperty("repo." + repoName + ".path");
String ignore = getOptionalProperty("repo." + repoName + ".ignore", "");
FileSystemService service = new FileSystemService(path, ignore.split(","));
return service.setRepoName(repoName);
}
if ("tabledump".equals(repoType)) {
DataSource dataSource = new DataSourceProvider().createFromProperties("repo." +repoName, properties);
String sqlFile = getProperty("repo." + repoName + ".sqlfile");
String sqlQuery = null;
try {
sqlQuery = FileUtils.readFileToString(new File(sqlFile));
} catch (IOException e) {
Throwables.propagate(e);
}
TableDumpService service = new TableDumpService(sqlQuery, dataSource);
return service.setRepoName(repoName);
}
throw new RuntimeException("Could not create repo '" + repoName + "', source type " + repoType);
}
private String getProperty(String key) {
String val = properties.getProperty(key);
if (Strings.isNullOrEmpty(val)) {
throw new RuntimeException("Propery '" + key + "' must exist to load this repo");
}
return val;
}
private String getOptionalProperty(String key, String defaultVal) {
return properties.getProperty(key, defaultVal);
}
}