
# 拦截插件
 #### 入口插件
1. 实现Entry插件。 
   devspore-horizon提供了抽象类**Processor** ，用户需要继承这个抽象类，实现抽象方法**doProcess(DataEvent event)** ，把认证和鉴权的处理逻辑写到此方法体内。此方法返回值为**boolean型** 。如果认证或者鉴权的逻辑失败，则返回**false** ，责任链后续节点不再执行，整个请求返回不再执行；如果认证或者鉴权成功，则返回为**true** ，继续执行后续节点。**Processor**代码如下：
   ```
   public abstract class Processor {
       protected MetaDocument metaDoc;
       private String name;
       private Processor next;
       public Processor getNext() {
           return next;
       }
       public void setNext(Processor next) {
           this.next = next;
       }
       public boolean process(DataEvent dataEvent) throws PluginException {
           if (!doProcess(dataEvent)) {
               return false;
           }
           if (null != next) {
               return next.process(dataEvent);
           }
           return true;
       }
       public abstract boolean doProcess(DataEvent dataEvent) throws PluginException;
       public String getName() {
           return name;
       }
   }
   ```
   
   
2. 填写配置信息。 
   - 完成接口实现之后，还需要填写配置信息。有关horizon的入口拦截配置信息如下：
     ```
     devspore.horizon.approvers
     ```
     实现的Entry插件，插件必须注入到spring IOC容器，并提供bean id，赋值给devspore.horizon.processors配置项。**devspore.horizon.processors**配置项是个数组。horizon会读取数组中每个bean id，执行已实现的鉴权、认证等逻辑。
     
   
   
   
   - 多个插件以","分隔，多个插件按配置顺序执行。
     ```
     devspore:
       horizon:
         processors: bean1,bean2
     ```
     
   
   
   
   
 
 #### 出口插件
1. 实现Exit插件。 
   devspore-horizon提供了接口Observer，用户需要实现这个接口的**observe(DataEvent dataEvent)**方法，把变更通知、更新缓存、统一审计、统一工作流的处理逻辑写到此方法体内即可。
   Observer代码如下：
   ```
   public interface Observer {
       // receive the BO changes
       void observe(DataEvent dataEvent) throws PluginException;
   }
   ```
   
   
2. 填写配置信息。 
   - 完成接口实现之后，还需要填写配置信息。有关horizon的出口拦截配置信息如下：
     ```
     devspore.horizon.observers
     ```
     devspore.horizon.observers配置项也是个数组。horizon会读取数组中每个bean id，执行已实现的消息发送、审计等逻辑。
     
   
   
   
   - 多个插件以","分隔，多个插件按配置顺序执行。
     ```
     devspore:
       horizon:
         observers: bean1,bean2
     ```
     
   
   
   
   
 
 #### 插件参数DataEvent
DataEvent提供了插件的参数上下文，其主要包括以下信息：参数取值示例见[操作示例](https://support.huaweicloud.com/devg-astropro/astropro_06_0018.html#astropro_06_0018__section271319174210)
表1DataEvent参数说明 
| 参数名称         | 数据类型                  | 描述                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|
| metaDocument | MetaDocument          | 服务的元数据对象。                                                                                                                                                                                                                                                                                                                                                                              |
| operation    | Operation             | 资源操作类型，包含增删改查、批量增删改查，自定义等操作。 [@Extension](https://support.huaweicloud.com/devg-astropro/astropro_06_0018.html)注解operation参数值。                                                                                                                                                                                                                       |
| customMethod | String                | 扩展API中定义的method对象，仅在operation为CUSTOM时候有意义。 [@Extension](https://support.huaweicloud.com/devg-astropro/astropro_06_0018.html)注解customMethod参数值。                                                                                                                                                                                                       |
| sourceName   | String                | 操作的资源名称。[@Extension](https://support.huaweicloud.com/devg-astropro/astropro_06_0018.html)注解name参数值。                                                                                                                                                                                                                                                                                    |
| argsMap      | Map                   | 操作方法参数与对应实际入参的集合。                                                                                                                                                                                                                                                                                                                                                                      |
| id           | Object                | 操作的资源id。 - add：创建资源对象中的资源id。  - update：修改的资源id。  - delete：删除的资源id。                    |
| originDo     | Object                | api被调用前do对象（一般从数据库取出）。 - add：为null。  - update：修改前数据库中的原始对象。  - delete：删除前数据库中的原始对象。     |
| targetDo     | Object                | api想要设置的do对象的克隆对象（对其进行修改不会持久化）。 - add：需要创建的对象。  - update：需要修改到的对象。  - delete：为null。   |
| methodName   | String                | [@Extension](https://support.huaweicloud.com/devg-astropro/astropro_06_0018.html)注解所在原方法名。                                                                                                                                                                                                                                                                                             |
| className    | String                | [@Extension](https://support.huaweicloud.com/devg-astropro/astropro_06_0018.html)注解所在的类名。                                                                                                                                                                                                                                                                                              |
| contextMap   | Map\<String, Object\> | 缓存上下文对象，由请求插件设置，并由响应插件读取，通常key是插件名称。                                                                                                                                                                                                                                                                                                                                                   |
   
#### 内置插件
开启horizon后，会自动生成两个内置插件，用户在插件中实现统一的操作前认证、鉴权，操作后消息发送、缓存更新、审计等逻辑即可：
- Entry插件
  ```
  /**
   * default request plugin
   */
  @Component
  @javax.annotation.Generated(value = "com.huaweicloud.devspore.codegen, xxx-RELEASE")
  public class DefaultRequestPlugin extends Processor {
      @Override
      public boolean doProcess(DataEvent dataEvent) throws PluginException {
          // do your code
          return true;
      }
  }
  ```
  

- Exit插件
  ```
  /**
   * default response plugin
   */
  @Component
  @javax.annotation.Generated(value = "com.huaweicloud.devspore.codegen, xxx-RELEASE")
  public class DefaultResponsePlugin implements Observer {
      @Override
      public void observe(DataEvent dataEvent) throws PluginException {
          // do your code
      }
  }
  ```
  

- 配置文件
  ```
  devspore:
    horizon:
      processors: defaultRequestPlugin
      observers: defaultResponsePlugin
  ```
  
