package com.linkedin.databus.util;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.log4j.Logger;
import com.linkedin.databus2.core.DatabusException;
import com.linkedin.databus2.relay.config.DatabusRelaySourcesInFiles;
import com.linkedin.databus2.relay.config.LogicalSourceConfig;
import com.linkedin.databus2.relay.config.PhysicalSourceConfig;
import com.linkedin.databus2.schemas.FileSystemSchemaRegistryService;
import com.linkedin.databus2.schemas.VersionedSchema;
import com.linkedin.databus2.schemas.utils.SchemaHelper;
public class DevRelayConfigGenerator
{
public static final Logger LOG = Logger.getLogger(DevRelayConfigGenerator.class);
public static final String NAME = DevRelayConfigGenerator.class.getName();
public static class Cli
{
public static final char SCHEMA_REGISTRY_LOCATION_OPT_CHAR = 'l';
public static final char SCHEMA_NAME_OPT_CHAR = 'd';
public static final char DB_URI_OPT_CHAR = 'u';
public static final char SRC_NAMES_OPT_CHAR = 's';
public static final char HELP_OPT_CHAR = 'h';
public static final char OUTPUT_DIRECTORY_OPT_CHAR = 'o';
public static final String SCHEMA_REGISTRY_LOCATION_LONG_STR = "schema_registry";
public static final String SCHEMA_NAME_LONG_STR = "schema_name";
public static final String DB_URI_LONG_STR = "source_uri";
public static final String SRC_NAMES_LONG_STR = "source_names";
public static final String HELP_OPT_LONG_NAME = "help";
public static final String OUTPUT_DIRECTORY_LONG_STR = "output_directory";
private final String _usage;
protected Options _cliOptions;
protected CommandLine _cmd;
HelpFormatter _helpFormatter;
private String _schemaRegistryLocation;
private String _schemaName;
private String _dbUri;
private List<String> _srcNames;
private String _outputDirectory;
public Cli()
{
_usage = "java " + NAME + " [options]";
_cliOptions = new Options();
constructCommandLineOptions();
_helpFormatter = new HelpFormatter();
_helpFormatter.setWidth(150);
}
/**
* Creates the command-line options
*/
@SuppressWarnings("static-access")
private void constructCommandLineOptions()
{
Option helpOption = OptionBuilder.withLongOpt(HELP_OPT_LONG_NAME)
.withDescription("Prints command-line options info")
.create(HELP_OPT_CHAR);
Option schemaRegistryLocation = OptionBuilder.withLongOpt(SCHEMA_REGISTRY_LOCATION_LONG_STR)
.withDescription("Absolute path to the Schema Registry directory")
.hasArg().create(SCHEMA_REGISTRY_LOCATION_OPT_CHAR);
Option schemaNameOption = OptionBuilder.withLongOpt(SCHEMA_NAME_LONG_STR)
.withDescription("DB Schema (Database) name in which the tables/views to be databusified is present")
.hasArg().create(SCHEMA_NAME_OPT_CHAR);
Option dbUriOption = OptionBuilder.withLongOpt(DB_URI_LONG_STR)
.withDescription("The URI for Oracle (Format : jdbc:oracle:thin:<user>/<password>@<dbhost>:1521:<SID>) or GG trail file location (Format : gg:///mnt/gg/extract/dbext<num>:x<num>)")
.hasArg().create(DB_URI_OPT_CHAR);
Option srcNamesOption = OptionBuilder.withLongOpt(SRC_NAMES_LONG_STR)
.withDescription("Comma seperated list of source names (e.g : com.linkedin.events.liar.jobrelay.LiarJobRelay,com.linkedin.events.liar.memberrelay.LiarMemberRelay)")
.hasArg().create(SRC_NAMES_OPT_CHAR);
Option outputDirectoryOption = OptionBuilder.withLongOpt(OUTPUT_DIRECTORY_LONG_STR)
.withDescription("Output Directory to generate the relay configs")
.hasArg().create(OUTPUT_DIRECTORY_OPT_CHAR);
_cliOptions.addOption(helpOption);
_cliOptions.addOption(schemaRegistryLocation);
_cliOptions.addOption(schemaNameOption);
_cliOptions.addOption(dbUriOption);
_cliOptions.addOption(srcNamesOption);
_cliOptions.addOption(outputDirectoryOption);
}
public void printCliHelp()
{
_helpFormatter.printHelp(getUsage(), _cliOptions);
}
public String getUsage()
{
return _usage;
}
public boolean processCommandLineArgs(String[] cliArgs) throws IOException, DatabusException
{
CommandLineParser cliParser = new GnuParser();
_cmd = null;
try
{
_cmd = cliParser.parse(_cliOptions, cliArgs);
} catch (ParseException pe)
{
System.err.println(NAME + ": failed to parse command-line options: " + pe.toString());
printCliHelp();
return false;
}
if (_cmd.hasOption(HELP_OPT_CHAR))
{
printCliHelp();
return false;
}
if (!_cmd.hasOption(SCHEMA_REGISTRY_LOCATION_OPT_CHAR))
{
System.err.println("Please specify the schema registry location");
return false;
} else {
_schemaRegistryLocation = _cmd.getOptionValue(SCHEMA_REGISTRY_LOCATION_OPT_CHAR);
File f = new File(_schemaRegistryLocation);
if (!f.isDirectory())
{
System.err.println("Schema Registry (" + _schemaRegistryLocation + ") is not a valid directory !! Please specify one");
return false;
}
}
if (!_cmd.hasOption(OUTPUT_DIRECTORY_OPT_CHAR))
{
System.err.println("Please specify the output directory");
return false;
} else {
_outputDirectory = _cmd.getOptionValue(OUTPUT_DIRECTORY_LONG_STR);
File f = new File(_outputDirectory);
if (!f.isDirectory())
{
System.err.println("Output Directory (" + _outputDirectory + ") is not a valid directory !! Please specify one");
return false;
}
}
if (!_cmd.hasOption(SCHEMA_NAME_OPT_CHAR))
{
System.out.println("Please specify the Schema name !!");
return false;
} else {
_schemaName = _cmd.getOptionValue(SCHEMA_NAME_OPT_CHAR);
}
if ( !_cmd.hasOption(DB_URI_OPT_CHAR))
{
System.err.println("Plase specify the DB URI !!");
return false;
} else {
_dbUri = _cmd.getOptionValue(DB_URI_OPT_CHAR);
}
if ( !_cmd.hasOption(SRC_NAMES_OPT_CHAR))
{
System.err.println("Please specify comma seperated list of source names");
return false;
} else {
_srcNames = Arrays.asList(_cmd.getOptionValue(SRC_NAMES_LONG_STR).split(","));
}
return true;
}
public String getOutputDirectory()
{
return _outputDirectory;
}
public String get_usage()
{
return _usage;
}
public String getSchemaRegistryLocation()
{
return _schemaRegistryLocation;
}
public String getSchemaName()
{
return _schemaName;
}
public String getDbUri()
{
return _dbUri;
}
public List<String> getSrcNames()
{
return _srcNames;
}
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{
Cli cli = new Cli();
if (! cli.processCommandLineArgs(args))
{
return;
}
generateRelayConfig(cli.getSchemaRegistryLocation(),
cli.getSchemaName(),
cli.getDbUri(),
cli.getOutputDirectory(),
cli.getSrcNames(),
new SchemaMetaDataManager(cli.getSchemaRegistryLocation()));
System.out.println("DONE !!");
}
public static void generateRelayConfig(String schemaRegistryLocation,
String dbName,
String uri,
String outputDir,
List<String> srcNames,
SchemaMetaDataManager manager)
throws Exception
{
PhysicalSourceConfig config = new PhysicalSourceConfig();
FileSystemSchemaRegistryService s = FileSystemSchemaRegistryService.build(
new FileSystemSchemaRegistryService.StaticConfig(new File(schemaRegistryLocation), 0, false, false));
dbName = dbName.trim().toLowerCase();
config.setName(dbName);
config.setUri(uri);
for (String srcName : srcNames)
{
VersionedSchema schema = null;
schema = s.fetchLatestVersionedSchemaBySourceName(srcName);
String dbObjectName = SchemaHelper.getMetaField(schema.getSchema(), "dbFieldName");
LogicalSourceConfig c = new LogicalSourceConfig();
c.setId(manager.getSrcId(srcName));
c.setName(srcName);
c.setUri(dbName + "." + dbObjectName);
c.setPartitionFunction("constant:1");
config.addSource(c);
}
DatabusRelaySourcesInFiles relaySourcesInFiles = new DatabusRelaySourcesInFiles(outputDir);
relaySourcesInFiles.add(dbName, config);
boolean success = relaySourcesInFiles.save();
if ( ! success )
throw new RuntimeException("Unable to create the dev relay config for DB :" + dbName);
}
}