OLD | NEW |
| (Empty) |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library plugin.src.plugin_impl; | |
6 | |
7 import 'dart:collection'; | |
8 | |
9 import 'package:plugin/manager.dart'; | |
10 import 'package:plugin/plugin.dart'; | |
11 | |
12 /** | |
13 * A concrete implementation of an [ExtensionManager]. | |
14 */ | |
15 class ExtensionManagerImpl implements ExtensionManager { | |
16 /** | |
17 * A table mapping the id's of extension points to the corresponding | |
18 * extension points. | |
19 */ | |
20 Map<String, ExtensionPointImpl> extensionPoints = | |
21 new HashMap<String, ExtensionPointImpl>(); | |
22 | |
23 @override | |
24 void processPlugins(List<Plugin> plugins) { | |
25 for (Plugin plugin in plugins) { | |
26 plugin.registerExtensionPoints((String identifier, | |
27 [ValidateExtension validateExtension]) => | |
28 registerExtensionPoint(plugin, identifier, validateExtension)); | |
29 } | |
30 for (Plugin plugin in plugins) { | |
31 plugin.registerExtensions(registerExtension); | |
32 } | |
33 } | |
34 | |
35 /** | |
36 * Register an [extension] to the extension point with the given unique | |
37 * [identifier]. | |
38 */ | |
39 void registerExtension(String identifier, Object extension) { | |
40 ExtensionPointImpl extensionPoint = extensionPoints[identifier]; | |
41 if (extensionPoint == null) { | |
42 throw new ExtensionError( | |
43 'There is no extension point with the id "$identifier"'); | |
44 } | |
45 extensionPoint.add(extension); | |
46 } | |
47 | |
48 /** | |
49 * Register an extension point being defined by the given [plugin] with the | |
50 * given simple [identifier] and [validateExtension]. | |
51 */ | |
52 ExtensionPoint registerExtensionPoint( | |
53 Plugin plugin, String identifier, ValidateExtension validateExtension) { | |
54 String uniqueIdentifier = Plugin.buildUniqueIdentifier(plugin, identifier); | |
55 if (extensionPoints.containsKey(uniqueIdentifier)) { | |
56 throw new ExtensionError( | |
57 'There is already an extension point with the id "$identifier"'); | |
58 } | |
59 ExtensionPointImpl extensionPoint = | |
60 new ExtensionPointImpl(plugin, identifier, validateExtension); | |
61 extensionPoints[uniqueIdentifier] = extensionPoint; | |
62 return extensionPoint; | |
63 } | |
64 } | |
65 | |
66 /** | |
67 * A concrete representation of an extension point. | |
68 */ | |
69 class ExtensionPointImpl implements ExtensionPoint { | |
70 @override | |
71 final Plugin plugin; | |
72 | |
73 @override | |
74 final String simpleIdentifier; | |
75 | |
76 /** | |
77 * The function used to validate extensions to this extension point. | |
78 */ | |
79 final ValidateExtension validateExtension; | |
80 | |
81 /** | |
82 * The list of extensions to this extension point. | |
83 */ | |
84 final List<Object> _extensions = <Object>[]; | |
85 | |
86 /** | |
87 * Initialize a newly create extension point to belong to the given [plugin] | |
88 * and have the given [simpleIdentifier]. If [validateExtension] is non-`null` | |
89 * it will be used to validate extensions associated with this extension | |
90 * point. | |
91 */ | |
92 ExtensionPointImpl( | |
93 this.plugin, this.simpleIdentifier, this.validateExtension); | |
94 | |
95 /** | |
96 * Return a list containing all of the extensions that have been registered | |
97 * for this extension point. | |
98 */ | |
99 List<Object> get extensions => new UnmodifiableListView(_extensions); | |
100 | |
101 /** | |
102 * Return the identifier used to uniquely identify this extension point. The | |
103 * unique identifier is the identifier for the plugin, followed by a period | |
104 * (`.`), followed by the [simpleIdentifier] for the extension point. | |
105 */ | |
106 String get uniqueIdentifier => | |
107 Plugin.buildUniqueIdentifier(plugin, simpleIdentifier); | |
108 | |
109 /** | |
110 * Validate that the given [extension] is appropriate for this extension | |
111 * point, and if it is then add it to the list of registered exceptions. | |
112 */ | |
113 void add(Object extension) { | |
114 if (validateExtension != null) { | |
115 validateExtension(extension); | |
116 } | |
117 _extensions.add(extension); | |
118 } | |
119 } | |
OLD | NEW |