Oolite 1.91.0.7665-250419-c535bfe
All Classes Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
OOOXPVerifier(OOPrivate) Category Reference

Instance Methods

(id) - initWithPath:
 
(void) - run
 
(void) - setUpLogOverrides
 
(void) - registerBaseStages
 
(void) - buildDependencyGraph
 
(void) - runStages
 
(BOOL) - setUpDependencies:forStage:
 
(void) - setUpDependents:forStage:
 
(void) - dumpDebugGraphviz
 

Detailed Description

Definition at line 53 of file OOOXPVerifier.m.

Method Documentation

◆ buildDependencyGraph

- (void) buildDependencyGraph

Extends class OOOXPVerifier.

Definition at line 382 of file OOOXPVerifier.m.

383{
384 NSAutoreleasePool *pool = nil;
385 NSArray *stageKeys = nil;
386 NSEnumerator *stageEnum = nil;
387 NSString *stageKey = nil;
388 OOOXPVerifierStage *stage = nil;
389 NSString *name = nil;
390 NSMutableDictionary *dependenciesByStage = nil,
391 *dependentsByStage = nil;
392 NSSet *dependencies = nil,
393 *dependents = nil;
394 NSValue *key = nil;
395
396 pool = [[NSAutoreleasePool alloc] init];
397
398 /* Iterate over all stages, getting dependency and dependent sets.
399 This is done in advance so that -dependencies and -dependents may
400 register stages.
401 */
402 dependenciesByStage = [NSMutableDictionary dictionary];
403 dependentsByStage = [NSMutableDictionary dictionary];
404
405 for (;;)
406 {
407 /* Loop while there are stages whose dependency lists haven't been
408 checked. This is an indeterminate loop since new ones can be
409 added.
410 */
411 stage = [_waitingStages anyObject];
412 if (stage == nil) break;
413 [_waitingStages removeObject:stage];
414
415 key = [NSValue valueWithNonretainedObject:stage];
416
417 dependencies = [stage dependencies];
418 if (dependencies != nil)
419 {
420 [dependenciesByStage setObject:dependencies
421 forKey:key];
422 }
423
424 dependents = [stage dependents];
425 if (dependents != nil)
426 {
427 [dependentsByStage setObject:dependents
428 forKey:key];
429 }
430 }
431 [_waitingStages release];
432 _waitingStages = nil;
433 _openForRegistration = NO;
434
435 // Iterate over all stages, resolving dependencies.
436 stageKeys = [_stagesByName allKeys]; // Get the keys up front because we may need to remove entries from dictionary.
437
438 for (stageEnum = [stageKeys objectEnumerator]; (stageKey = [stageEnum nextObject]); )
439 {
440 stage = [_stagesByName objectForKey:stageKey];
441 if (stage == nil) continue;
442
443 // Sanity check
444 name = [stage name];
445 if (![stageKey isEqualToString:name])
446 {
447 OOLog(@"verifyOXP.buildDependencyGraph.badName", @"***** Stage name appears to have changed from \"%@\" to \"%@\" for verifier stage %@, removing.", stageKey, name, stage);
448 [_stagesByName removeObjectForKey:stageKey];
449 continue;
450 }
451
452 // Get dependency set
453 key = [NSValue valueWithNonretainedObject:stage];
454 dependencies = [dependenciesByStage objectForKey:key];
455
456 if (dependencies != nil && ![self setUpDependencies:dependencies forStage:stage])
457 {
458 [_stagesByName removeObjectForKey:stageKey];
459 }
460 }
461
462 /* Iterate over all stages again, resolving reverse dependencies.
463 This is done in a separate pass because reverse dependencies are "weak"
464 while forward dependencies are "strong".
465 */
466 stageKeys = [_stagesByName allKeys];
467
468 for (stageEnum = [stageKeys objectEnumerator]; (stageKey = [stageEnum nextObject]); )
469 {
470 stage = [_stagesByName objectForKey:stageKey];
471 if (stage == nil) continue;
472
473 // Get dependent set
474 key = [NSValue valueWithNonretainedObject:stage];
475 dependents = [dependentsByStage objectForKey:key];
476
477 if (dependents != nil)
478 {
479 [self setUpDependents:dependents forStage:stage];
480 }
481 }
482
483 _waitingStages = [[NSMutableSet alloc] initWithArray:[_stagesByName allValues]];
484 [_waitingStages makeObjectsPerformSelector:@selector(dependencyRegistrationComplete)];
485
486 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"oxp-verifier-dump-debug-graphviz"])
487 {
488 [self dumpDebugGraphviz];
489 }
490
491 [pool release];
492}
#define OOLog(class, format,...)
Definition OOLogging.h:88
return nil

References buildDependencyGraph, OOOXPVerifierStage::dependencies, OOOXPVerifierStage::dependents, OOOXPVerifier::dumpDebugGraphviz, OOOXPVerifierStage::name, nil, OOLog, and OOOXPVerifier::setUpDependents:forStage:.

Referenced by buildDependencyGraph.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dumpDebugGraphviz

- (void) dumpDebugGraphviz

Extends class OOOXPVerifier.

Definition at line 632 of file OOOXPVerifier.m.

633{
634 NSMutableString *graphViz = nil;
635 NSDictionary *graphVizTemplate = nil;
636 NSString *template = nil,
637 *startTemplate = nil,
638 *endTemplate = nil;
639 NSEnumerator *stageEnum = nil;
640 OOOXPVerifierStage *stage = nil;
641 NSSet *deps = nil;
642 NSEnumerator *depEnum = nil;
643 OOOXPVerifierStage *dep = nil;
644
645 graphVizTemplate = [self configurationDictionaryForKey:@"debugGraphvizTempate"];
646 graphViz = [NSMutableString stringWithFormat:[graphVizTemplate oo_stringForKey:@"preamble"], [NSDate date]];
647
648 /* Pass 1: enumerate over graph setting node attributes for each stage.
649 We use pointers as node names for simplicity of generation.
650 */
651 template = [graphVizTemplate oo_stringForKey:@"node"];
652 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [stageEnum nextObject]); )
653 {
654 [graphViz appendFormat:template, stage, [stage class], [stage name]];
655 }
656
657 [graphViz appendString:[graphVizTemplate oo_stringForKey:@"forwardPreamble"]];
658
659 /* Pass 2: enumerate over graph setting forward arcs for each dependency.
660 */
661 template = [graphVizTemplate oo_stringForKey:@"forwardArc"];
662 startTemplate = [graphVizTemplate oo_stringForKey:@"startArc"];
663 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [stageEnum nextObject]); )
664 {
665 deps = [stage resolvedDependencies];
666 if ([deps count] != 0)
667 {
668 for (depEnum = [deps objectEnumerator]; (dep = [depEnum nextObject]); )
669 {
670 [graphViz appendFormat:template, dep, stage];
671 }
672 }
673 else
674 {
675 [graphViz appendFormat:startTemplate, stage];
676 }
677 }
678
679 [graphViz appendString:[graphVizTemplate oo_stringForKey:@"backwardPreamble"]];
680
681 /* Pass 3: enumerate over graph setting backward arcs for each dependent.
682 */
683 template = [graphVizTemplate oo_stringForKey:@"backwardArc"];
684 endTemplate = [graphVizTemplate oo_stringForKey:@"endArc"];
685 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [stageEnum nextObject]); )
686 {
687 deps = [stage resolvedDependents];
688 if ([deps count] != 0)
689 {
690 for (depEnum = [deps objectEnumerator]; (dep = [depEnum nextObject]); )
691 {
692 [graphViz appendFormat:template, dep, stage];
693 }
694 }
695 else
696 {
697 [graphViz appendFormat:endTemplate, stage];
698 }
699 }
700
701 [graphViz appendString:[graphVizTemplate oo_stringForKey:@"postamble"]];
702
703 // Write file
704 [ResourceManager writeDiagnosticString:graphViz toFileNamed:@"OXPVerifierStageDependencies.dot"];
705}
unsigned count
BOOL writeDiagnosticString:toFileNamed:(NSString *string,[toFileNamed] NSString *name)

References OOOXPVerifier::configurationDictionaryForKey:, count, dumpDebugGraphviz, OOOXPVerifierStage::name, nil, OOOXPVerifierStage::resolvedDependencies, OOOXPVerifierStage::resolvedDependents, and ResourceManager::writeDiagnosticString:toFileNamed:.

Referenced by dumpDebugGraphviz.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ initWithPath:

- (id) initWithPath: (NSString *) path

Extends class OOOXPVerifier.

Definition at line 256 of file OOOXPVerifier.m.

256 :(NSString *)path
257{
258 self = [super init];
259
261
262 NSString *verifierPListPath = [[[ResourceManager builtInPath] stringByAppendingPathComponent:@"Config"] stringByAppendingPathComponent:@"verifyOXP.plist"];
263 _verifierPList = [[NSDictionary dictionaryWithContentsOfFile:verifierPListPath] retain];
264
265 _basePath = [path copy];
266 _displayName = [[NSFileManager defaultManager] displayNameAtPath:_basePath];
267 if (_displayName == nil) _displayName = [_basePath lastPathComponent];
268 [_displayName retain];
269
270 _stagesByName = [[NSMutableDictionary alloc] init];
271 _waitingStages = [[NSMutableSet alloc] init];
272
273 if (_verifierPList == nil ||
274 _basePath == nil)
275 {
276 OOLog(@"verifyOXP.setup.failed", @"%@", @"***** ERROR: failed to set up OXP verifier.");
277 [self release];
278 return nil;
279 }
280
281 _openForRegistration = YES;
282
283 return self;
284}
void OOSetStandardsForOXPVerifierMode(void)
NSString * builtInPath()

References ResourceManager::builtInPath, nil, OOLog, and OOSetStandardsForOXPVerifierMode().

+ Here is the call graph for this function:

◆ registerBaseStages

- (void) registerBaseStages

Extends class OOOXPVerifier.

Definition at line 342 of file OOOXPVerifier.m.

343{
344 NSAutoreleasePool *pool = nil;
345 NSSet *stages = nil;
346 NSSet *excludeStages = nil;
347 NSEnumerator *stageEnum = nil;
348 NSString *stageName = nil;
349 Class stageClass = Nil;
350 OOOXPVerifierStage *stage = nil;
351
352 pool = [[NSAutoreleasePool alloc] init];
353
354 // Load stages specified as array of class names in verifyOXP.plist
355 stages = [self configurationSetForKey:@"stages"];
356 excludeStages = [self configurationSetForKey:@"excludeStages"];
357 if ([excludeStages count] != 0)
358 {
359 stages = [[stages mutableCopy] autorelease];
360 [(NSMutableSet *)stages minusSet:excludeStages];
361 }
362 for (stageEnum = [stages objectEnumerator]; (stageName = [stageEnum nextObject]); )
363 {
364 if ([stageName isKindOfClass:[NSString class]])
365 {
366 stageClass = NSClassFromString(stageName);
367 if (stageClass == Nil)
368 {
369 OOLog(@"verifyOXP.registration.failed", @"Attempt to register unknown class %@ as a verifier stage, ignoring.", stageName);
370 continue;
371 }
372 stage = [[stageClass alloc] init];
373 [self registerStage:stage];
374 [stage release];
375 }
376 }
377
378 [pool release];
379}

References OOOXPVerifier::configurationSetForKey:, count, nil, OOLog, registerBaseStages, and OOOXPVerifier::registerStage:.

Referenced by registerBaseStages.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ run

- (void) run

Extends class OOOXPVerifier.

Definition at line 287 of file OOOXPVerifier.m.

288{
289 NoteVerificationStage(_displayName, @"");
290
291 [self setUpLogOverrides];
292
293 /* We need to be able to look up internal files, but not other OXP files.
294 To do this without clobbering the disk cache, we disable cache writes.
295 */
298 /* FIXME: the OXP verifier should load files from OXPs which have
299 * been explicitly listed as required_oxps in the
300 * manifest. Reading the manifest from the OXP being verified and
301 * setting 'id:<its identifier>' below will do this. */
302 [ResourceManager setUseAddOns:SCENARIO_OXP_DEFINITION_NONE];
303
304 SwitchLogFile(_displayName);
305 OOLog(@"verifyOXP.start", @"Running OXP verifier for %@", _basePath);//_displayName);
306
307 [self registerBaseStages];
308 [self buildDependencyGraph];
309 [self runStages];
310
311 NoteVerificationStage(_displayName, @"");
312 OOLog(@"verifyOXP.done", @"%@", @"OXP verification complete.");
313
314 OpenLogFile(_displayName);
315}
static void SwitchLogFile(NSString *name)
static void NoteVerificationStage(NSString *displayName, NSString *stage)
static void OpenLogFile(NSString *name)
void setAllowCacheWrites:(BOOL flag)
OOCacheManager * sharedCache()
void setUseAddOns:(NSString *useAddOns)

References OOOXPVerifier::buildDependencyGraph, OOCacheManager::flush, NoteVerificationStage(), OOLog, OpenLogFile(), OOOXPVerifier::registerBaseStages, run, OOOXPVerifier::runStages, OOCacheManager::setAllowCacheWrites:, OOOXPVerifier::setUpLogOverrides, ResourceManager::setUseAddOns:, OOCacheManager::sharedCache, and SwitchLogFile().

Referenced by run.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ runStages

- (void) runStages

Extends class OOOXPVerifier.

Definition at line 495 of file OOOXPVerifier.m.

496{
497 NSAutoreleasePool *pool = nil;
498 NSEnumerator *stageEnum = nil;
499 OOOXPVerifierStage *candidateStage = nil,
500 *stageToRun = nil;
501 NSString *stageName = nil;
502
503 // Loop while there are still stages to run.
504 for (;;)
505 {
506 pool = [[NSAutoreleasePool alloc] init];
507
508 // Look through queue for a stage that's ready
509 stageToRun = nil;
510 for (stageEnum = [_waitingStages objectEnumerator]; (candidateStage = [stageEnum nextObject]); )
511 {
512 if ([candidateStage canRun])
513 {
514 stageToRun = candidateStage;
515 break;
516 }
517 }
518 if (stageToRun == nil)
519 {
520 // No more runnable stages
521 [pool release];
522 break;
523 }
524
525 stageName = nil;
527 @try
528 {
529 stageName = [stageToRun name];
530 if ([stageToRun shouldRun])
531 {
532 NoteVerificationStage(_displayName, stageName);
533 OOLog(@"verifyOXP.runStage", @"%@", stageName);
534 OOLogIndent();
535 [stageToRun performRun];
536 }
537 else
538 {
539 OOLog(@"verifyOXP.verbose.skipStage", @"- Skipping stage: %@ (nothing to do).", stageName);
540 [stageToRun noteSkipped];
541 }
542 }
543 @catch (NSException *exception)
544 {
545 if (stageName == nil) stageName = [[stageToRun class] description];
546 OOLog(@"verifyOXP.exception", @"***** Exception occurred when running OXP verifier stage \"%@\": %@: %@", stageName, [exception name], [exception reason]);
547 }
549
550 [_waitingStages removeObject:stageToRun];
551 [pool release];
552 }
553
554 pool = [[NSAutoreleasePool alloc] init];
555
556 if ([_waitingStages count] != 0)
557 {
558 OOLog(@"verifyOXP.incomplete", @"%@", @"Some verifier stages could not be run:");
559 OOLogIndent();
560 for (stageEnum = [_waitingStages objectEnumerator]; (candidateStage = [stageEnum nextObject]); )
561 {
562 OOLog(@"verifyOXP.incomplete.item", @"%@", candidateStage);
563 }
564 OOLogOutdent();
565 }
566 [_waitingStages release];
567 _waitingStages = nil;
568
569 [pool release];
570}
void OOLogPushIndent(void)
Definition OOLogging.m:316
void OOLogPopIndent(void)
Definition OOLogging.m:340
void OOLogOutdent(void)
Definition OOLogging.m:376
void OOLogIndent(void)
Definition OOLogging.m:366

References count, nil, NoteVerificationStage(), OOLog, OOLogIndent(), OOLogOutdent(), OOLogPopIndent(), OOLogPushIndent(), and runStages.

Referenced by runStages.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ setUpDependencies:forStage:

- (BOOL) setUpDependencies: (NSSet *) dependencies
forStage: (OOOXPVerifierStage *) stage 

Extends class OOOXPVerifier.

Definition at line 573 of file OOOXPVerifier.m.

573 :(NSSet *)dependencies
574 forStage:(OOOXPVerifierStage *)stage
575{
576 NSString *depName = nil;
577 NSEnumerator *depEnum = nil;
578 OOOXPVerifierStage *depStage = nil;
579
580 // Iterate over dependencies, connecting them up.
581 for (depEnum = [dependencies objectEnumerator]; (depName = [depEnum nextObject]); )
582 {
583 depStage = [_stagesByName objectForKey:depName];
584 if (depStage == nil)
585 {
586 OOLog(@"verifyOXP.buildDependencyGraph.unresolved", @"Verifier stage %@ has unresolved dependency \"%@\", skipping.", stage, depName);
587 return NO;
588 }
589
590 if ([depStage isDependentOf:stage])
591 {
592 OOLog(@"verifyOXP.buildDependencyGraph.circularReference", @"Verifier stages %@ and %@ have a dependency loop, skipping.", stage, depStage);
593 [_stagesByName removeObjectForKey:depName];
594 return NO;
595 }
596
597 [stage registerDependency:depStage];
598 }
599
600 return YES;
601}

References nil, and OOLog.

◆ setUpDependents:forStage:

- (void) setUpDependents: (NSSet *) dependents
forStage: (OOOXPVerifierStage *) stage 

Extends class OOOXPVerifier.

Definition at line 604 of file OOOXPVerifier.m.

604 :(NSSet *)dependents
605 forStage:(OOOXPVerifierStage *)stage
606{
607 NSString *depName = nil;
608 NSEnumerator *depEnum = nil;
609 OOOXPVerifierStage *depStage = nil;
610
611 // Iterate over dependents, connecting them up.
612 for (depEnum = [dependents objectEnumerator]; (depName = [depEnum nextObject]); )
613 {
614 depStage = [_stagesByName objectForKey:depName];
615 if (depStage == nil)
616 {
617 OOLog(@"verifyOXP.buildDependencyGraph.unresolved", @"Verifier stage %@ has unresolved dependent \"%@\".", stage, depName);
618 continue; // Unresolved/conflicting dependents are non-fatal
619 }
620
621 if ([stage isDependentOf:depStage])
622 {
623 OOLog(@"verifyOXP.buildDependencyGraph.circularReference", @"Verifier stage %@ lists %@ as both dependent and dependency (possibly indirectly); will execute %@ after %@.", stage, depStage, stage, depStage);
624 continue;
625 }
626
627 [depStage registerDependency:stage];
628 }
629}

References nil, and OOLog.

◆ setUpLogOverrides

- (void) setUpLogOverrides

Extends class OOOXPVerifier.

Definition at line 318 of file OOOXPVerifier.m.

319{
320 NSDictionary *overrides = nil;
321 NSEnumerator *messageClassEnum = nil;
322 NSString *messageClass = nil;
323 id verbose = nil;
324
325 OOLogSetShowMessageClassTemporary([_verifierPList oo_boolForKey:@"logShowMessageClassOverride" defaultValue:NO]);
326
327 overrides = [_verifierPList oo_dictionaryForKey:@"logControlOverride"];
328 for (messageClassEnum = [overrides keyEnumerator]; (messageClass = [messageClassEnum nextObject]); )
329 {
330 OOLogSetDisplayMessagesInClass(messageClass, [overrides oo_boolForKey:messageClass defaultValue:NO]);
331 }
332
333 /* Since actually editing logControlOverride is a pain, we also allow
334 overriding verifyOXP.verbose through user defaults. This is at least
335 as much a pain under GNUstep, but very convenient under OS X.
336 */
337 verbose = [[NSUserDefaults standardUserDefaults] objectForKey:@"oxp-verifier-verbose-logging"];
338 if (verbose != nil) OOLogSetDisplayMessagesInClass(@"verifyOXP.verbose", OOBooleanFromObject(verbose, NO));
339}
BOOL OOBooleanFromObject(id object, BOOL defaultValue)
void OOLogSetDisplayMessagesInClass(NSString *inClass, BOOL inFlag)
Definition OOLogging.m:182
void OOLogSetShowMessageClassTemporary(BOOL flag)
Definition OOLogging.m:579

References nil, OOBooleanFromObject(), OOLogSetDisplayMessagesInClass(), OOLogSetShowMessageClassTemporary(), and setUpLogOverrides.

Referenced by setUpLogOverrides.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

The documentation for this category was generated from the following file: