public void Publish()
 {
     foreach (object persistenceParticipant in persistenceParticipants)
     {
         System.Activities.Persistence.PersistenceParticipant legacyPersistenceParticipant = persistenceParticipant as System.Activities.Persistence.PersistenceParticipant;
         if (legacyPersistenceParticipant != null)
         {
             legacyPersistenceParticipant.PublishValues(readWriteView);
         }
         else
         {
             (persistenceParticipant as IPersistenceParticipant)?.PublishValues(readWriteView);
         }
     }
 }
 protected void Abort()
 {
     foreach (object persistenceParticipant in persistenceParticipants)
     {
         System.Activities.Persistence.PersistenceParticipant legacyPersistenceParticipant = persistenceParticipant as System.Activities.Persistence.PersistenceParticipant;
         if (legacyPersistenceParticipant != null && legacyPersistenceParticipant.IsIOParticipant())
         {
             (legacyPersistenceParticipant as System.Activities.Persistence.PersistenceIOParticipant).Abort();
         }
         else
         {
             (persistenceParticipant as IPersistenceIOParticipant)?.Abort();
         }
     }
 }
        public void Map()
        {
            List <Tuple <object, IDictionary <XName, object> > > pendingValues = null;

            foreach (object persistenceParticipant in persistenceParticipants)
            {
                IDictionary <XName, object> mappedValues = null;

                System.Activities.Persistence.PersistenceParticipant legacyPersistenceParticipant = persistenceParticipant as System.Activities.Persistence.PersistenceParticipant;
                if (legacyPersistenceParticipant != null)
                {
                    mappedValues = legacyPersistenceParticipant.MapValues(readWriteView, writeOnlyView);
                }
                else
                {
                    mappedValues = (persistenceParticipant as IPersistenceParticipant)?.MapValues(readWriteView, writeOnlyView);
                }

                if (mappedValues != null)
                {
                    if (pendingValues == null)
                    {
                        pendingValues = new List <Tuple <object, IDictionary <XName, object> > >();
                    }
                    pendingValues.Add(new Tuple <object, IDictionary <XName, object> >(persistenceParticipant, mappedValues));
                }
            }

            if (pendingValues != null)
            {
                foreach (Tuple <object, IDictionary <XName, object> > writeOnlyValues in pendingValues)
                {
                    foreach (KeyValuePair <XName, object> value in writeOnlyValues.Item2)
                    {
                        try
                        {
                            instanceValues.Add(value.Key, new InstanceValue(value.Value, InstanceValueOptions.WriteOnly | InstanceValueOptions.Optional));
                        }
                        catch (ArgumentException exception)
                        {
                            throw new InvalidOperationException($"Name collision on key '{value.Key}' during map in extension '{writeOnlyValues.Item1.GetType().GetFriendlyName()}'.", exception);
                        }
                    }
                }

                writeOnlyView.ResetCaches();
            }
        }
        public void Collect()
        {
            foreach (object persistenceParticipant in persistenceParticipants)
            {
                IDictionary <XName, object> readWriteValues = null;
                IDictionary <XName, object> writeOnlyValues = null;

                System.Activities.Persistence.PersistenceParticipant legacyPersistenceParticipant = persistenceParticipant as System.Activities.Persistence.PersistenceParticipant;
                if (legacyPersistenceParticipant != null)
                {
                    legacyPersistenceParticipant.CollectValues(out readWriteValues, out writeOnlyValues);
                }
                else
                {
                    (persistenceParticipant as IPersistenceParticipant)?.CollectValues(out readWriteValues, out writeOnlyValues);
                }

                if (readWriteValues != null)
                {
                    foreach (KeyValuePair <XName, object> value in readWriteValues)
                    {
                        try
                        {
                            instanceValues.Add(value.Key, new InstanceValue(value.Value));
                        }
                        catch (ArgumentException exception)
                        {
                            throw new InvalidOperationException($"Name collision on key '{value.Key}' during collect in extension '{persistenceParticipant.GetType().GetFriendlyName()}'.", exception);
                        }
                    }
                }
                if (persistWriteOnlyValues && writeOnlyValues != null)
                {
                    foreach (KeyValuePair <XName, object> value in writeOnlyValues)
                    {
                        try
                        {
                            instanceValues.Add(value.Key, new InstanceValue(value.Value, InstanceValueOptions.WriteOnly | InstanceValueOptions.Optional));
                        }
                        catch (ArgumentException exception)
                        {
                            throw new InvalidOperationException($"Name collision on key '{value.Key}' during collect in extension '{persistenceParticipant.GetType().GetFriendlyName()}'.", exception);
                        }
                    }
                }
            }
        }
 // TODO Handle timeout correctly, ie. decrement remaining time in each for loop.
 public async Task OnLoadAsync(TimeSpan timeout)
 {
     try
     {
         foreach (object persistenceParticipant in persistenceParticipants)
         {
             System.Activities.Persistence.PersistenceParticipant legacyPersistenceParticipant = persistenceParticipant as System.Activities.Persistence.PersistenceParticipant;
             if (legacyPersistenceParticipant != null && legacyPersistenceParticipant.IsIOParticipant())
             {
                 await(legacyPersistenceParticipant as System.Activities.Persistence.PersistenceIOParticipant).OnLoadAsync(readWriteView, timeout);
             }
             else
             {
                 await((persistenceParticipant as IPersistenceIOParticipant)?.OnLoadAsync(readWriteView, timeout) ?? TaskConstants.Completed);
             }
         }
     }
     catch
     {
         Abort();
         // TODO Original pipeline seems to drop this to the floor, but the reference source is insufficient.
         throw;
     }
 }
 public static void PublishValues(this System.Activities.Persistence.PersistenceParticipant persistenceParticipant,
                                  IDictionary <XName, object> readWriteValues)
 {
     publishValues(persistenceParticipant, readWriteValues);
 }
 public static IDictionary <XName, object> MapValues(this System.Activities.Persistence.PersistenceParticipant persistenceParticipant,
                                                     IDictionary <XName, object> readWriteValues, IDictionary <XName, object> writeOnlyValues) =>
 mapValues(persistenceParticipant, readWriteValues, writeOnlyValues);
 public static void CollectValues(this System.Activities.Persistence.PersistenceParticipant persistenceParticipant,
                                  out IDictionary <XName, object> readWriteValues, out IDictionary <XName, object> writeOnlyValues)
 {
     collectValues(persistenceParticipant, out readWriteValues, out writeOnlyValues);
 }
 public static bool IsIOParticipant(this System.Activities.Persistence.PersistenceParticipant persistenceParticipant) =>
 isIOParticipant(persistenceParticipant);