Implement MachineKey.Protect and MachineKey.Unprotect
[mono.git] / mcs / class / System.ComponentModel.Composition / Tests / ComponentModelUnitTest / System / ComponentModel / Composition / Factories / ExportProviderFactory.RecomposableExportProvider.cs
1 // -----------------------------------------------------------------------\r
2 // Copyright (c) Microsoft Corporation.  All rights reserved.\r
3 // -----------------------------------------------------------------------\r
4 using System;\r
5 using System.Linq;\r
6 using System.ComponentModel.Composition;\r
7 using System.ComponentModel.Composition.Hosting;\r
8 using System.ComponentModel.Composition.Primitives;\r
9 using System.Collections.Generic;\r
10 using System.Linq.Expressions;\r
11 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
12 \r
13 namespace System.ComponentModel.Composition.Factories\r
14 {\r
15     partial class ExportProviderFactory\r
16     {\r
17         public class RecomposableExportProvider : ExportProvider\r
18         {\r
19             public static Dictionary<string, object> EmptyMetadataDictionary = new Dictionary<string, object>();\r
20             public List<Export> _exports = new List<Export>();\r
21 \r
22             public void AddExport(string contractName, object value)\r
23             {\r
24                 Export export = CreateExport(contractName, value);\r
25                 var exports = this._exports.ToList();\r
26 \r
27                 exports.Add(export);\r
28                 ChangeExports(exports);\r
29             }\r
30 \r
31             public void RemoveExport(string contractName)\r
32             {\r
33                 int index = FindExport(contractName);\r
34                 Assert.IsTrue(index >= 0);\r
35 \r
36                 var exports = this._exports.ToList();\r
37 \r
38                 exports.RemoveAt(index);\r
39 \r
40                 ChangeExports(exports);\r
41             }\r
42 \r
43             public void ReplaceExportValue(string contractName, object newValue)\r
44             {\r
45                 int index = FindExport(contractName);\r
46                 Assert.IsTrue(index >= 0);\r
47 \r
48                 var exports = this._exports.ToList();\r
49 \r
50                 exports.RemoveAt(index);\r
51                 exports.Add(CreateExport(contractName, newValue));\r
52 \r
53                 ChangeExports(exports);\r
54             }\r
55 \r
56             private void ChangeExports(List<Export> newExports)\r
57             {\r
58                 using (var atomicComposition = new AtomicComposition())\r
59                 {\r
60                     atomicComposition.AddCompleteAction(() => this._exports = newExports);\r
61                     atomicComposition.SetValue(this, newExports);\r
62 \r
63                     var addedExports = newExports.Except(this._exports).Select(export => export.Definition);\r
64                     var removedExports = this._exports.Except(newExports).Select(export => export.Definition);\r
65 \r
66                     this.OnExportsChanging(new ExportsChangeEventArgs(addedExports, removedExports, atomicComposition));\r
67 \r
68                     atomicComposition.AddCompleteAction(() => this.OnExportsChanged(\r
69                         new ExportsChangeEventArgs(addedExports, removedExports, null)));\r
70 \r
71                     atomicComposition.Complete();\r
72                 }\r
73             }\r
74 \r
75             private int FindExport(string contractName)\r
76             {\r
77                 for (int i = 0; i < _exports.Count; i++)\r
78                 {\r
79                     if (_exports[i].Definition.ContractName == contractName)\r
80                     {\r
81                         return i;\r
82                     }\r
83                 }\r
84                 return -1;\r
85             }\r
86 \r
87             private Export CreateExport(string contractName, object value)\r
88             {\r
89                 return new Export(new ExportDefinition(contractName, EmptyMetadataDictionary), () => value);\r
90             }\r
91 \r
92             protected override IEnumerable<Export> GetExportsCore(ImportDefinition importDefinition, AtomicComposition context)\r
93             {\r
94                 IEnumerable<Export> contextExports;\r
95 \r
96                 if (context == null || !context.TryGetValue(this, out contextExports))\r
97                 {\r
98                     contextExports = this._exports;\r
99                 }\r
100 \r
101                 List<Export> exports = new List<Export>();\r
102                 var func = importDefinition.Constraint.Compile();\r
103                 foreach (Export export in contextExports)\r
104                 {\r
105                     if (func(export.Definition))\r
106                     {\r
107                         exports.Add(export);\r
108                     }\r
109                 }\r
110                 return exports;\r
111             }\r
112         }\r
113     }\r
114 }\r