public class PluginMapContext<T> extends java.lang.Object implements java.lang.Iterable<PluginMapEntryContext<T>>
DynamicMap
.
When a plugin extension is invoked a logging tag with the plugin name is set. This way any errors that are triggered by the plugin extension (even if they happen in Gerrit code which is called by the plugin extension) can be easily attributed to the plugin.
Example if all exceptions should be caught and logged:
Mapresults = new HashMap<>(); fooPluginMapContext.runEach( extension -> results.put(extension.getExportName(), extension.get().getFoo());
Example if all exceptions, but one, should be caught and logged:
Mapresults = new HashMap<>(); try { fooPluginMapContext.runEach( extension -> results.put(extension.getExportName(), extension.get().getFoo(), MyException.class); } catch (MyException e) { // handle the exception }
Example if return values should be handled:
Mapresults = new HashMap<>(); for (PluginMapEntryContext c : fooPluginMapContext) { if (c.call(extension -> extension.get().handles(x))) { c.run(extension -> results.put(extension.getExportName(), extension.get().getFoo()); } }
Example if return values and a single exception should be handled:
Mapresults = new HashMap<>(); try { for (PluginMapEntryContext c : fooPluginMapContext) { if (c.call(extension -> extension.handles(x), MyException.class)) { c.run(extension -> results.put(extension.getExportName(), extension.get().getFoo(), MyException.class); } } } catch (MyException e) { // handle the exception }
Example if several exceptions should be handled:
for (ExtensionfooExtension : fooDynamicMap) { try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) { fooExtension.get().doFoo(); } catch (MyException1 | MyException2 | MyException3 e) { // handle the exception } }
Constructor and Description |
---|
PluginMapContext(DynamicMap<T> dynamicMap,
PluginContext.PluginMetrics pluginMetrics) |
Modifier and Type | Method and Description |
---|---|
boolean |
isEmpty()
Checks if no implementations for this extension point have been registered.
|
java.util.Iterator<PluginMapEntryContext<T>> |
iterator()
Iterator that provides contexts for invoking the extensions in this map.
|
java.util.SortedSet<java.lang.String> |
plugins()
Returns a sorted list of the plugins that have registered implementations for this extension
point.
|
void |
runEach(PluginContext.ExtensionConsumer<Extension<T>> extensionConsumer)
Invokes each extension in the map.
|
<X extends java.lang.Exception> |
runEach(PluginContext.ExtensionConsumer<Extension<T>> extensionConsumer,
java.lang.Class<X> exceptionClass)
Invokes each extension in the map.
|
@Inject public PluginMapContext(DynamicMap<T> dynamicMap, PluginContext.PluginMetrics pluginMetrics)
public java.util.Iterator<PluginMapEntryContext<T>> iterator()
This is useful if:
iterator
in interface java.lang.Iterable<PluginMapEntryContext<T>>
public boolean isEmpty()
true
if no implementations for this extension point have been registered,
otherwise false
public java.util.SortedSet<java.lang.String> plugins()
public void runEach(PluginContext.ExtensionConsumer<Extension<T>> extensionConsumer)
The consumer get the Extension
provided that should be invoked. The extension
provides access to the plugin name and the export name.
All extension in the map are invoked, even if invoking some of the extensions failed.
extensionConsumer
- consumer that invokes the extensionpublic <X extends java.lang.Exception> void runEach(PluginContext.ExtensionConsumer<Extension<T>> extensionConsumer, java.lang.Class<X> exceptionClass) throws X extends java.lang.Exception
The consumer get the Extension
provided that should be invoked. The extension
provides access to the plugin name and the export name.
All extension in the map are invoked, even if invoking some of the extensions failed.
extensionConsumer
- consumer that invokes the extensionexceptionClass
- type of the exceptions that should be thrownX
- expected exception from the plugin extensionX extends java.lang.Exception