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); } }