54- (instancetype)init:(NSArray*)arguments withExecuteCallback:(
ExecuteCallback)executeCallback withLogCallback:(
LogCallback)logCallback withLogRedirectionStrategy:(LogRedirectionStrategy)logRedirectionStrategy {
64 _logs = [[NSMutableArray alloc] init];
65 _logsLock = [[NSRecursiveLock alloc] init];
66 _state = SessionStateCreated;
89- (NSDate*)getCreateTime {
93- (NSDate*)getStartTime {
97- (NSDate*)getEndTime {
104 if (startTime != nil && endTime != nil) {
105 return [[NSNumber numberWithDouble:([endTime timeIntervalSinceDate:startTime]*1000)] longValue];
111- (NSArray*)getArguments {
115- (NSString*)getCommand {
119- (void)waitForAsynchronousMessagesInTransmit:(
int)timeout {
120 NSDate* expireDate = [[NSDate date] dateByAddingTimeInterval:((double)timeout)/1000];
121 dispatch_semaphore_t
semaphore = dispatch_semaphore_create(0);
123 while ([
self thereAreAsynchronousMessagesInTransmit] && ([[NSDate date] timeIntervalSinceDate:expireDate] < 0)) {
124 dispatch_semaphore_wait(
semaphore, dispatch_time(DISPATCH_TIME_NOW, 100 * NSEC_PER_MSEC));
128- (NSArray*)getAllLogsWithTimeout:(
int)waitTimeout {
129 [
self waitForAsynchronousMessagesInTransmit:waitTimeout];
131 if ([
self thereAreAsynchronousMessagesInTransmit]) {
132 NSLog(
@"getAllLogsWithTimeout was called to return all logs but there are still logs being transmitted for session id %ld.",
_sessionId);
135 return [
self getLogs];
138- (NSArray*)getAllLogs {
139 return [
self getAllLogsWithTimeout:AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit];
144 NSArray* logsCopy = [_logs copy];
150- (NSString*)getAllLogsAsStringWithTimeout:(
int)waitTimeout {
151 [
self waitForAsynchronousMessagesInTransmit:waitTimeout];
153 if ([
self thereAreAsynchronousMessagesInTransmit]) {
154 NSLog(
@"getAllLogsAsStringWithTimeout was called to return all logs but there are still logs being transmitted for session id %ld.",
_sessionId);
157 return [
self getLogsAsString];
160- (NSString*)getAllLogsAsString {
161 return [
self getAllLogsAsStringWithTimeout:AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit];
164- (NSString*)getLogsAsString {
165 NSMutableString* concatenatedString = [[NSMutableString alloc] init];
168 for (
int i=0; i < [_logs count]; i++) {
169 [concatenatedString appendString:[[_logs objectAtIndex:i] getMessage]];
173 return concatenatedString;
176- (NSString*)getOutput {
177 return [
self getAllLogsAsString];
180- (SessionState)getState {
188- (NSString*)getFailStackTrace {
192- (LogRedirectionStrategy)getLogRedirectionStrategy {
196- (BOOL)thereAreAsynchronousMessagesInTransmit {
200- (void)addLog:(
Log*)log {
202 [_logs addObject:log];
206- (void)startRunning {
207 _state = SessionStateRunning;
213 _state = SessionStateCompleted;
217- (void)fail:(NSException*)exception {
218 _failStackTrace = [NSString stringWithFormat:@"%@", [exception callStackSymbols]];
219 _state = SessionStateFailed;
234 if (
_state == SessionStateRunning) {
ExecuteCallback _executeCallback
NSString * _failStackTrace
NSRecursiveLock * _logsLock
LogRedirectionStrategy _logRedirectionStrategy
int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit
static AtomicLong * sessionIdGenerator
void addSessionToSessionHistory(id< Session > session)
void(^ ExecuteCallback)(id< Session > session)
static LogCallback logCallback
static ExecuteCallback executeCallback
static dispatch_semaphore_t semaphore
void(^ LogCallback)(Log *log)
NSString * argumentsToString:(NSArray *arguments)
void cancel:(long sessionId)