public CompletionReport TestBehavior(Behavior b)
        {
            IOperationalBehavior operBehavior = null;
            try {
                testMode = true;
                Console.WriteLine("Testing behavior " + b.ToString() + " -- type " + b.GetType().Name);

                cachedCompletionReport = new SuccessCompletionReport(b.GetType());
                HandleDecorators(b.Decorators);
                operBehavior = MapBehavior(b);
                operBehavior.Initialize(b);
                operBehavior.Process(null);

                Console.WriteLine("Result: " + cachedCompletionReport.ToString());

                cachedCompletionReport.BehaviorId = b.UniqueId();

                return cachedCompletionReport;
            }
            catch (Exception ex) {
                TraceSource.TraceEvent(TraceEventType.Error, 0, "error testing behavior {0}: {1}", b.GetType(), ex);
                throw;
            }
            finally {
                if (operBehavior != null && operBehavior is IDisposable) {
                    ((IDisposable)operBehavior).Dispose();
                }
            }
        }
 private IOperationalBehavior MapBehavior(Behavior b)
 {
     BehaviorBuidler builder;
     if (behaviorMap.TryGetValue(b.GetType(), out builder)) {
         return builder();
     }
     else {
         TraceSource.TraceEvent(TraceEventType.Warning, 2, "behavior type {0} does not have a mapping", b.GetType());
         throw new ArgumentException("Behavior type " + b.GetType().Name + " does not have a mapping");
     }
 }
        public void OnBehaviorReceived(Behavior b)
        {
            Trace.CorrelationManager.StartLogicalOperation("OnBehaviorReceived");

            Services.Dataset.MarkOperation("behavior rate", LocalCarTimeProvider.LocalNow);

            try {
                // write the trace output
                if (TraceSource.Switch.ShouldTrace(TraceEventType.Verbose)) {
                    // write a verbose output
                    TraceSource.TraceEvent(TraceEventType.Verbose, 1, "recevied behavior: {0}", b);
                }
                else {
                    TraceSource.TraceEvent(TraceEventType.Information, 1, "received behavior: {0}", b.GetType());
                }

                if (b != null) {
                    HandleDecorators(b.Decorators);
                }

                if (b is NullBehavior)
                    return;

                if (currentBehavior != null) {
                    try {
                        currentBehavior.OnBehaviorReceived(b);
                    }
                    catch (Exception ex) {
                        TraceSource.TraceEvent(TraceEventType.Warning, 2, "current behavior ({0}) threw exception in OnBehaviorReceived: {1}", currentBehavior, ex);
                        throw;
                    }
                }
                else {
                    Execute(b, null, false);
                }
            }
            finally {
                Trace.CorrelationManager.StopLogicalOperation();
            }
        }