package com.ldbc.driver;
import com.ldbc.driver.client.CalculateWorkloadStatisticsMode;
import com.ldbc.driver.client.ClientMode;
import com.ldbc.driver.client.CreateValidationParamsMode;
import com.ldbc.driver.client.ExecuteWorkloadMode;
import com.ldbc.driver.client.PrintHelpMode;
import com.ldbc.driver.client.ValidateDatabaseMode;
import com.ldbc.driver.control.ConsoleAndFileDriverConfiguration;
import com.ldbc.driver.control.ControlService;
import com.ldbc.driver.control.DriverConfiguration;
import com.ldbc.driver.control.DriverConfigurationException;
import com.ldbc.driver.control.LocalControlService;
import com.ldbc.driver.control.Log4jLoggingServiceFactory;
import com.ldbc.driver.control.LoggingService;
import com.ldbc.driver.control.LoggingServiceFactory;
import com.ldbc.driver.runtime.ConcurrentErrorReporter;
import com.ldbc.driver.temporal.SystemTimeSource;
import com.ldbc.driver.temporal.TimeSource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static java.lang.String.format;
// TODO Validate Workload to work with short reads
public class Client
{
private static final long RANDOM_SEED = 42;
public static void main( String[] args ) throws ClientException
{
ControlService controlService = null;
boolean detailedStatus = false;
LoggingServiceFactory loggingServiceFactory = new Log4jLoggingServiceFactory( detailedStatus );
LoggingService loggingService = loggingServiceFactory.loggingServiceFor( Client.class.getSimpleName() );
try
{
TimeSource systemTimeSource = new SystemTimeSource();
ConsoleAndFileDriverConfiguration configuration = ConsoleAndFileDriverConfiguration.fromArgs( args );
// TODO this method will not work with multiple processes - should come from controlService
long workloadStartTimeAsMilli = systemTimeSource.nowAsMilli() + TimeUnit.SECONDS.toMillis( 5 );
controlService = new LocalControlService(
workloadStartTimeAsMilli,
configuration,
loggingServiceFactory,
systemTimeSource );
Client client = new Client();
ClientMode clientMode = client.getClientModeFor( controlService );
clientMode.init();
clientMode.startExecutionAndAwaitCompletion();
}
catch ( DriverConfigurationException e )
{
String errMsg = format( "Error parsing parameters: %s", e.getMessage() );
loggingService.info( errMsg );
System.exit( 1 );
}
catch ( Exception e )
{
loggingService.info( "Client terminated unexpectedly\n" + ConcurrentErrorReporter.stackTraceToString( e ) );
System.exit( 1 );
}
finally
{
if ( null != controlService )
{
controlService.shutdown();
}
}
}
// TODO should not be doing things like ConsoleAndFileDriverConfiguration.DB_ARG
// TODO ConsoleAndFileDriverConfiguration could maybe have a DriverParam(enum)-to-String(arg) method?
public ClientMode getClientModeFor( ControlService controlService ) throws ClientException
{
if ( controlService.configuration().shouldPrintHelpString() )
{
// Print Help
return new PrintHelpMode( controlService );
}
else if ( null != controlService.configuration().validationParamsCreationOptions() )
{
// Create Validation Parameters
DriverConfiguration configuration = controlService.configuration();
List<String> missingParams = new ArrayList<>();
if ( null == configuration.dbClassName() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.DB_ARG );
}
if ( null == configuration.workloadClassName() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.WORKLOAD_ARG );
}
if ( 0 == configuration.operationCount() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.OPERATION_COUNT_ARG );
}
if ( false == missingParams.isEmpty() )
{
throw new ClientException( format( "Missing required parameters: %s", missingParams.toString() ) );
}
return new CreateValidationParamsMode( controlService, RANDOM_SEED );
}
else if ( null != controlService.configuration().databaseValidationFilePath() )
{
// Validate Database
DriverConfiguration configuration = controlService.configuration();
List<String> missingParams = new ArrayList<>();
if ( null == configuration.dbClassName() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.DB_ARG );
}
if ( null == configuration.workloadClassName() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.WORKLOAD_ARG );
}
if ( false == missingParams.isEmpty() )
{
throw new ClientException( format( "Missing required parameters: %s", missingParams.toString() ) );
}
return new ValidateDatabaseMode( controlService );
}
else if ( controlService.configuration().calculateWorkloadStatistics() )
{
// Calculate Statistics
DriverConfiguration configuration = controlService.configuration();
List<String> missingParams = new ArrayList<>();
if ( null == configuration.workloadClassName() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.WORKLOAD_ARG );
}
if ( 0 == configuration.operationCount() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.OPERATION_COUNT_ARG );
}
if ( false == missingParams.isEmpty() )
{
throw new ClientException( format( "Missing required parameters: %s", missingParams.toString() ) );
}
return new CalculateWorkloadStatisticsMode( controlService, RANDOM_SEED );
}
else
{
// Execute Workload
DriverConfiguration configuration = controlService.configuration();
List<String> missingParams = new ArrayList<>();
if ( null == configuration.dbClassName() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.DB_ARG );
}
if ( null == configuration.workloadClassName() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.WORKLOAD_ARG );
}
if ( 0 == configuration.operationCount() )
{
missingParams.add( ConsoleAndFileDriverConfiguration.OPERATION_COUNT_ARG );
}
if ( false == missingParams.isEmpty() )
{
throw new ClientException( format( "Missing required parameters: %s", missingParams.toString() ) );
}
return new ExecuteWorkloadMode( controlService, new SystemTimeSource(), RANDOM_SEED );
}
}
}