@Override
 public MonitorEngine register(MonitorEngine engine) throws ResourceException {
   // 先执行自动批准动作
   performApproval(engine);
   // 如果是从监控服务器下载下来的引擎,关联了相应的engine id,则直接更新
   if (StringUtils.isNotBlank(engine.getEngineId())) {
     MonitorEngine legacy = findByEngineId(engine.getEngineId());
     // id/name/label 保留数据库中的值
     engine.setId(legacy.getId());
     engine.setName(legacy.getName());
     engine.setLabel(legacy.getLabel());
     // properties 合并
     if (legacy.getProperties() != null) {
       if (engine.getProperties() == null) {
         engine.setProperties(legacy.getProperties());
       } else {
         engine.getProperties().putAll(legacy.getProperties());
       }
     }
     return update(legacy, engine);
   } else if (isDefault(engine)) { // 还有一种常见情况,就是缺省引擎(与监控服务器安装在同一个地址),而后没有配置engineId
     MonitorEngine defaultEngine = getRepository().findDefaultEngine();
     engine.setEngineId(defaultEngine.getEngineId());
     return update(defaultEngine, engine);
   } else {
     // 否则创建一个新的实例
     return create(engine);
   }
 }
 // 当引擎被批准时,其路径也应该随着用户设定的新路径发生了变化,修改之
 // Topo节点也会自动随之而修改
 void autoUpdateNodesForEngine(String legacyPath, String path) {
   if (StringUtils.isNotBlank(path) && !StringUtils.equals(legacyPath, path)) {
     try {
       nodeService.updateNodesPath(legacyPath, path);
     } catch (NodeException e) {
       logger.warn(e.getMessage(), e);
     }
   }
 }