@PLUGIN@ extension points
==============

The replication plugin exposes an extension point to allow influencing its behaviour from another plugin or a script.
Extension points can be defined from the replication plugin only when it is loaded as [libModule](../../../Documentation/config-gerrit.html#gerrit.installModule) and
implemented by another plugin by declaring a `provided` dependency from the replication plugin.

### Install extension libModule

The replication plugin's extension points are defined in the `c.g.g.p.r.ReplicationExtensionPointModule`
that needs to be configured as libModule.

Create a symbolic link from `$GERRIT_SITE/plugins/replication.jar` into `$GERRIT_SITE/lib`
and then add the replication extension module to the `gerrit.config`.

Example:

```
[gerrit]
  installModule = com.googlesource.gerrit.plugins.replication.ReplicationExtensionPointModule
```

> **NOTE**: Use and configuration of the replication plugin as library module requires a Gerrit server restart and does not support hot plugin install or upgrade.


### Extension points

* `com.googlesource.gerrit.plugins.replication.ReplicationPushFilter`

  Filter out the ref updates pushed to a remote instance.
  Only one filter at a time is supported. Filter implementation needs to bind a `DynamicItem`.

  Default: no filtering

  Example:

  ```
  DynamicItem.bind(binder(), ReplicationPushFilter.class).to(ReplicationPushFilterImpl.class);
  ```

* `com.googlesource.gerrit.plugins.replication.AdminApiFactory`

  Create an instance of `AdminApi` for a given remote URL. The default implementation
  provides API instances for local FS, remote SSH, and remote Gerrit.

  Only one factory at a time is supported. The implementation needs to be bound as a
  `DynamicItem`.

  Example:

  ```
  DynamicItem.bind(binder(), AdminApiFactory.class).to(AdminApiFactoryImpl.class);
  ```
