This is an automated email from the ASF dual-hosted git repository.

xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 083fa1c  [ISSUE #3042] fix bug plugin metadata valid error (#3044)
083fa1c is described below

commit 083fa1caa8d506e2799912142562ef36fb9a1917
Author: likeguo <[email protected]>
AuthorDate: Wed Mar 16 10:01:23 2022 +0800

    [ISSUE #3042] fix bug plugin metadata valid error (#3044)
    
    * fix plugin edit bug : 
https://github.com/apache/incubator-shenyu/issues/3042
    
    * fix plugin edit bug : 
https://github.com/apache/incubator-shenyu/issues/3042
    
    * fix plugin edit bug : 
https://github.com/apache/incubator-shenyu/issues/3042
---
 .../admin/controller/MetaDataController.java       |   3 +-
 .../shenyu/admin/controller/PluginController.java  |  12 +--
 .../apache/shenyu/admin/mapper/MetaDataMapper.java |  23 ++++-
 .../apache/shenyu/admin/mapper/PluginMapper.java   |  10 ++
 .../apache/shenyu/admin/model/dto/MetaDataDTO.java |   5 +-
 .../apache/shenyu/admin/model/dto/PluginDTO.java   |   3 -
 .../shenyu/admin/service/MetaDataService.java      |  48 ++++++---
 .../apache/shenyu/admin/service/PluginService.java |  27 +++++-
 .../admin/service/impl/MetaDataServiceImpl.java    |  98 +++++++++++--------
 .../admin/service/impl/PluginServiceImpl.java      | 107 +++++++++++++--------
 .../java/org/apache/shenyu/admin/utils/Assert.java |  31 ++++--
 .../main/resources/mappers/meta-data-sqlmap.xml    |  16 +++
 .../src/main/resources/mappers/plugin-sqlmap.xml   |  12 +++
 .../admin/controller/MetaDataControllerTest.java   |  18 ++--
 .../admin/controller/PluginControllerTest.java     |  42 ++++----
 .../shenyu/admin/service/MetaDataServiceTest.java  |  11 ++-
 .../shenyu/admin/service/PluginServiceTest.java    |  69 ++++++-------
 17 files changed, 341 insertions(+), 194 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
index dc1e542..0e07183 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
@@ -111,8 +111,7 @@ public class MetaDataController {
      */
     @PostMapping("/createOrUpdate")
     public ShenyuAdminResult createOrUpdate(@Valid @RequestBody final 
MetaDataDTO metaDataDTO) {
-        metaDataService.createOrUpdate(metaDataDTO);
-        return ShenyuAdminResult.success(ShenyuResultMessage.CREATE_SUCCESS);
+        return 
ShenyuAdminResult.success(metaDataService.createOrUpdate(metaDataDTO));
     }
 
     /**
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/PluginController.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/PluginController.java
index 2955bf5..5fbce86 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/PluginController.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/PluginController.java
@@ -115,11 +115,7 @@ public class PluginController {
      */
     @PostMapping("")
     public ShenyuAdminResult createPlugin(@Valid @RequestBody final PluginDTO 
pluginDTO) {
-        String result = pluginService.createOrUpdate(pluginDTO);
-        if (StringUtils.isNoneBlank(result)) {
-            return ShenyuAdminResult.error(result);
-        }
-        return ShenyuAdminResult.success(ShenyuResultMessage.CREATE_SUCCESS);
+        return 
ShenyuAdminResult.success(pluginService.createOrUpdate(pluginDTO));
     }
     
     /**
@@ -135,11 +131,7 @@ public class PluginController {
                                                   provider = 
PluginMapper.class) final String id,
                                           @Valid @RequestBody final PluginDTO 
pluginDTO) {
         pluginDTO.setId(id);
-        final String result = pluginService.createOrUpdate(pluginDTO);
-        if (StringUtils.isNoneBlank(result)) {
-            return ShenyuAdminResult.error(result);
-        }
-        return ShenyuAdminResult.success(ShenyuResultMessage.UPDATE_SUCCESS);
+        return createPlugin(pluginDTO);
     }
     
     /**
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
index 68ad81f..b797400 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
@@ -21,6 +21,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.shenyu.admin.model.entity.MetaDataDO;
 import org.apache.shenyu.admin.model.query.MetaDataQuery;
+import org.apache.shenyu.admin.validation.ExistProvider;
 
 import java.io.Serializable;
 import java.util.List;
@@ -30,7 +31,16 @@ import java.util.Set;
  * The interface Meta data mapper.
  */
 @Mapper
-public interface MetaDataMapper {
+public interface MetaDataMapper extends ExistProvider {
+    
+    /**
+     * existed.
+     *
+     * @param id id
+     * @return existed
+     */
+    @Override
+    Boolean existed(@Param("id") Serializable id);
     
     /**
      * Select by id meta data do.
@@ -150,5 +160,14 @@ public interface MetaDataMapper {
      * @param path path
      * @return existed
      */
-    Boolean pathExisted(Serializable path);
+    Boolean pathExisted(@Param("path") Serializable path);
+    
+    /**
+     * the path is existed.
+     *
+     * @param path    path
+     * @param exclude exclude
+     * @return existed
+     */
+    Boolean pathExistedExclude(@Param("path") Serializable path, 
@Param("exclude") List<String> exclude);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/PluginMapper.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/PluginMapper.java
index aa5891c..a4ea6eb 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/PluginMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/PluginMapper.java
@@ -176,4 +176,14 @@ public interface PluginMapper extends ExistProvider {
      * @return existed
      */
     Boolean nameExisted(@Param("name") Serializable name);
+    
+    
+    /**
+     * plugin existed.
+     *
+     * @param name name
+     * @param exclude exclude
+     * @return existed
+     */
+    Boolean nameExistedExclude(@Param("name") Serializable name, 
@Param("exclude") List<String> exclude);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java
index ccfe01c..1c81005 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java
@@ -17,9 +17,8 @@
 
 package org.apache.shenyu.admin.model.dto;
 
-import org.apache.shenyu.admin.service.provider.MetaDataPathProvider;
+import org.apache.shenyu.admin.mapper.MetaDataMapper;
 import org.apache.shenyu.admin.validation.annotation.Existed;
-import org.apache.shenyu.common.constant.AdminConstants;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
@@ -30,6 +29,7 @@ public class MetaDataDTO implements Serializable {
     
     private static final long serialVersionUID = 7476312364813536366L;
     
+    @Existed(provider = MetaDataMapper.class, nullOfIgnore = true, message = 
"meta data is not existed")
     private String id;
     
     /**
@@ -49,7 +49,6 @@ public class MetaDataDTO implements Serializable {
      * the path is not null.
      */
     @NotBlank
-    @Existed(provider = MetaDataPathProvider.class, reverse = true, message = 
AdminConstants.DATA_PATH_IS_EXIST)
     private String path;
     
     /**
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/PluginDTO.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/PluginDTO.java
index 5820416..ef317c7 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/PluginDTO.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/PluginDTO.java
@@ -18,9 +18,7 @@
 package org.apache.shenyu.admin.model.dto;
 
 import org.apache.shenyu.admin.mapper.PluginMapper;
-import org.apache.shenyu.admin.service.provider.PluginNameProvider;
 import org.apache.shenyu.admin.validation.annotation.Existed;
-import org.apache.shenyu.common.constant.AdminConstants;
 
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
@@ -43,7 +41,6 @@ public class PluginDTO implements Serializable {
      * plugin name.
      */
     @NotNull
-    @Existed(provider = PluginNameProvider.class, reverse = true, message = 
AdminConstants.PLUGIN_NAME_IS_EXIST)
     private String name;
     
     /**
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/MetaDataService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/MetaDataService.java
index 84b1969..5f0d26d 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/MetaDataService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/MetaDataService.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.admin.service;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.model.dto.MetaDataDTO;
 import org.apache.shenyu.admin.model.entity.MetaDataDO;
 import org.apache.shenyu.admin.model.page.CommonPager;
@@ -32,23 +33,42 @@ import java.util.Map;
  * this is application authority service.
  */
 public interface MetaDataService {
-
+    
     /**
      * save or update mate data.
      * {@link 
org.apache.shenyu.admin.service.register.AbstractShenyuClientRegisterServiceImpl}
+     *
      * @param exist       has been exist meta data {@link MetaDataDO}
      * @param metaDataDTO meta data dto {@link MetaDataRegisterDTO}
      */
     void saveOrUpdateMetaData(MetaDataDO exist, MetaDataRegisterDTO 
metaDataDTO);
-
+    
     /**
      * Create or update int.
      *
      * @param metaDataDTO the meta data dto
      * @return the String
      */
-    String createOrUpdate(MetaDataDTO metaDataDTO);
-
+    default String createOrUpdate(MetaDataDTO metaDataDTO) {
+        return StringUtils.isBlank(metaDataDTO.getId()) ? create(metaDataDTO) 
: update(metaDataDTO);
+    }
+    
+    /**
+     * Create.
+     *
+     * @param metaDataDTO the meta data dto
+     * @return the String
+     */
+    String create(MetaDataDTO metaDataDTO);
+    
+    /**
+     * update.
+     *
+     * @param metaDataDTO the meta data dto
+     * @return the String
+     */
+    String update(MetaDataDTO metaDataDTO);
+    
     /**
      * delete application authorities.
      *
@@ -56,7 +76,7 @@ public interface MetaDataService {
      * @return rows int
      */
     int delete(List<String> ids);
-
+    
     /**
      * Find by id meta data vo.
      *
@@ -64,7 +84,7 @@ public interface MetaDataService {
      * @return the meta data vo
      */
     MetaDataVO findById(String id);
-
+    
     /**
      * List by page common pager.
      *
@@ -72,28 +92,28 @@ public interface MetaDataService {
      * @return the common pager
      */
     CommonPager<MetaDataVO> listByPage(MetaDataQuery metaDataQuery);
-
+    
     /**
      * Find all list.
      *
      * @return the list
      */
     List<MetaDataVO> findAll();
-
+    
     /**
      * Find all group map.
      *
      * @return the map
      */
     Map<String, List<MetaDataVO>> findAllGroup();
-
+    
     /**
      * List all list.
      *
      * @return the list
      */
     List<MetaData> listAll();
-
+    
     /**
      * Enabled string.
      *
@@ -102,12 +122,12 @@ public interface MetaDataService {
      * @return the string
      */
     String enabled(List<String> ids, Boolean enabled);
-
+    
     /**
      * Sync data.
      */
     void syncData();
-
+    
     /**
      * find meta data by path.
      *
@@ -115,7 +135,7 @@ public interface MetaDataService {
      * @return {@link MetaDataDO}
      */
     MetaDataDO findByPath(String path);
-
+    
     /**
      * find meta data by service's name and method's name.
      *
@@ -124,7 +144,7 @@ public interface MetaDataService {
      * @return {@link MetaDataDO}
      */
     MetaDataDO findByServiceNameAndMethodName(String serviceName, String 
methodName);
-
+    
     /**
      * insert MetaDataDO.
      *
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java
index 8d897ac..c8ded13 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.admin.service;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.model.dto.PluginDTO;
 import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.page.CommonPager;
@@ -37,7 +38,27 @@ public interface PluginService {
      * @param pluginDTO the plugin dto
      * @return the string
      */
-    String createOrUpdate(PluginDTO pluginDTO);
+    default String createOrUpdate(PluginDTO pluginDTO) {
+        return StringUtils.isBlank(pluginDTO.getId()) ? create(pluginDTO) : 
update(pluginDTO);
+    }
+    
+    /**
+     * create plugin.<br>
+     * insert plugin and insert plugin data.
+     *
+     * @param pluginDTO plugin info
+     * @return success is empty
+     */
+    String create(PluginDTO pluginDTO);
+    
+    /**
+     * create plugin.<br>
+     * insert plugin and insert plugin data.
+     *
+     * @param pluginDTO plugin
+     * @return success is empty
+     */
+    String update(PluginDTO pluginDTO);
     
     /**
      * Delete string.
@@ -69,7 +90,7 @@ public interface PluginService {
      * @return the list
      */
     List<PluginData> listAll();
-
+    
     /**
      * list all not in resource.
      *
@@ -80,7 +101,7 @@ public interface PluginService {
     /**
      * Enabled string.
      *
-     * @param ids the ids
+     * @param ids     the ids
      * @param enabled the enable
      * @return the string
      */
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
index 2fbe07a..b04ba32 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
@@ -30,6 +30,8 @@ import org.apache.shenyu.admin.model.query.MetaDataQuery;
 import org.apache.shenyu.admin.model.vo.MetaDataVO;
 import org.apache.shenyu.admin.service.MetaDataService;
 import org.apache.shenyu.admin.transfer.MetaDataTransfer;
+import org.apache.shenyu.admin.utils.Assert;
+import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.dto.MetaData;
 import org.apache.shenyu.common.enums.ConfigGroupEnum;
@@ -57,14 +59,14 @@ import java.util.stream.Collectors;
 public class MetaDataServiceImpl implements MetaDataService {
     
     private final MetaDataMapper metaDataMapper;
-
+    
     private final ApplicationEventPublisher eventPublisher;
-
+    
     public MetaDataServiceImpl(final MetaDataMapper metaDataMapper, final 
ApplicationEventPublisher eventPublisher) {
         this.metaDataMapper = metaDataMapper;
         this.eventPublisher = eventPublisher;
     }
-
+    
     @Override
     public void saveOrUpdateMetaData(final MetaDataDO exist, final 
MetaDataRegisterDTO metaDataDTO) {
         DataEventTypeEnum eventType;
@@ -85,37 +87,51 @@ public class MetaDataServiceImpl implements MetaDataService 
{
         eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, eventType,
                 
Collections.singletonList(MetaDataTransfer.INSTANCE.mapToData(metaDataDO))));
     }
-
+    
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public String createOrUpdate(final MetaDataDTO metaDataDTO) {
+        return MetaDataService.super.createOrUpdate(metaDataDTO);
+    }
+    
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String create(final MetaDataDTO metaDataDTO) {
+        Assert.isNull(metaDataMapper.pathExisted(metaDataDTO.getPath()), 
AdminConstants.DATA_PATH_IS_EXIST);
         MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
-        DataEventTypeEnum eventType;
-        String pathDesc = Objects.isNull(metaDataDO.getPathDesc()) ? "" : 
metaDataDO.getPathDesc();
-        if (StringUtils.isEmpty(metaDataDTO.getId())) {
-            Timestamp currentTime = new Timestamp(System.currentTimeMillis());
-            metaDataDO.setId(UUIDUtils.getInstance().generateShortUuid());
-            metaDataDO.setPathDesc(pathDesc);
-            metaDataDO.setDateCreated(currentTime);
-            metaDataDO.setDateUpdated(currentTime);
-            metaDataMapper.insert(metaDataDO);
-            eventType = DataEventTypeEnum.CREATE;
-        } else {
-            MetaDataDO m = metaDataMapper.selectById(metaDataDTO.getId());
-            Optional.ofNullable(m).ifPresent(e -> 
metaDataDTO.setEnabled(e.getEnabled()));
-            metaDataDO.setPathDesc(pathDesc);
-            metaDataMapper.update(metaDataDO);
-            eventType = DataEventTypeEnum.UPDATE;
-        }
-        // publish AppAuthData's event
-        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, eventType,
+        metaDataDO.setId(UUIDUtils.getInstance().generateShortUuid());
+        metaDataDO.setPathDesc(Objects.isNull(metaDataDO.getPathDesc()) ? "" : 
metaDataDO.getPathDesc());
+        Timestamp currentTime = new Timestamp(System.currentTimeMillis());
+        metaDataDO.setDateCreated(currentTime);
+        metaDataDO.setDateUpdated(currentTime);
+        metaDataMapper.insert(metaDataDO);
+        
+        // publish AppAuthData's creste event
+        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, DataEventTypeEnum.CREATE,
                 
Collections.singletonList(MetaDataTransfer.INSTANCE.mapToData(metaDataDTO))));
-        return StringUtils.EMPTY;
+        return ShenyuResultMessage.CREATE_SUCCESS;
     }
-
+    
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String update(final MetaDataDTO metaDataDTO) {
+        Assert.isNull(metaDataMapper.pathExistedExclude(metaDataDTO.getPath(), 
Collections.singletonList(metaDataDTO.getId())), 
AdminConstants.DATA_PATH_IS_EXIST);
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
+        Optional.ofNullable(metaDataMapper.selectById(metaDataDTO.getId()))
+                .ifPresent(e -> metaDataDTO.setEnabled(e.getEnabled()));
+        metaDataDO.setPathDesc(Objects.isNull(metaDataDO.getPathDesc()) ? "" : 
metaDataDO.getPathDesc());
+        metaDataMapper.update(metaDataDO);
+        
+        // publish AppAuthData's update event
+        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, DataEventTypeEnum.UPDATE,
+                
Collections.singletonList(MetaDataTransfer.INSTANCE.mapToData(metaDataDTO))));
+        return ShenyuResultMessage.UPDATE_SUCCESS;
+    }
+    
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int delete(final List<String> ids) {
-
+        
         int count = 0;
         Set<String> idSet = Optional.ofNullable(ids).orElseGet(ArrayList::new)
                 
.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toSet());
@@ -123,17 +139,17 @@ public class MetaDataServiceImpl implements 
MetaDataService {
             List<MetaDataDO> metaDataDoList = 
metaDataMapper.selectByIdSet(idSet);
             List<MetaData> metaDataList = 
Optional.ofNullable(metaDataDoList).orElseGet(ArrayList::new)
                     
.stream().map(MetaDataTransfer.INSTANCE::mapToData).collect(Collectors.toList());
-
+            
             count = metaDataMapper.deleteByIdSet(idSet);
             eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, DataEventTypeEnum.DELETE, 
metaDataList));
         }
-
+        
         return count;
     }
-
+    
     @Override
     public String enabled(final List<String> ids, final Boolean enabled) {
-
+        
         Set<String> idSet = Optional.ofNullable(ids).orElseGet(ArrayList::new)
                 
.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toSet());
         if (CollectionUtils.isEmpty(idSet)) {
@@ -147,13 +163,13 @@ public class MetaDataServiceImpl implements 
MetaDataService {
                 .map(MetaDataTransfer.INSTANCE::mapToData)
                 .collect(Collectors.toList());
         metaDataMapper.updateEnableBatch(idSet, enabled);
-
+        
         eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, DataEventTypeEnum.UPDATE,
                 metaDataList));
-
+        
         return StringUtils.EMPTY;
     }
-
+    
     @Override
     public void syncData() {
         List<MetaDataDO> all = metaDataMapper.findAll();
@@ -161,12 +177,12 @@ public class MetaDataServiceImpl implements 
MetaDataService {
             eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, DataEventTypeEnum.REFRESH, 
MetaDataTransfer.INSTANCE.mapToDataAll(all)));
         }
     }
-
+    
     @Override
     public MetaDataVO findById(final String id) {
         return 
Optional.ofNullable(MetaDataTransfer.INSTANCE.mapToVO(metaDataMapper.selectById(id))).orElseGet(MetaDataVO::new);
     }
-
+    
     @Override
     @Pageable
     public CommonPager<MetaDataVO> listByPage(final MetaDataQuery 
metaDataQuery) {
@@ -175,19 +191,19 @@ public class MetaDataServiceImpl implements 
MetaDataService {
                 .map(MetaDataTransfer.INSTANCE::mapToVO)
                 .collect(Collectors.toList()));
     }
-
+    
     @Override
     public List<MetaDataVO> findAll() {
         return 
MetaDataTransfer.INSTANCE.mapToVOList(metaDataMapper.selectAll());
     }
-
+    
     @Override
     public Map<String, List<MetaDataVO>> findAllGroup() {
         return 
MetaDataTransfer.INSTANCE.mapToVOList(metaDataMapper.selectAll())
                 .stream()
                 .collect(Collectors.groupingBy(MetaDataVO::getAppName));
     }
-
+    
     @Override
     public List<MetaData> listAll() {
         return metaDataMapper.selectAll()
@@ -196,17 +212,17 @@ public class MetaDataServiceImpl implements 
MetaDataService {
                 .map(MetaDataTransfer.INSTANCE::mapToData)
                 .collect(Collectors.toList());
     }
-
+    
     @Override
     public MetaDataDO findByPath(final String path) {
         return metaDataMapper.findByPath(path);
     }
-
+    
     @Override
     public MetaDataDO findByServiceNameAndMethodName(final String serviceName, 
final String methodName) {
         return metaDataMapper.findByServiceNameAndMethod(serviceName, 
methodName);
     }
-
+    
     @Override
     public int insert(final MetaDataDO metaDataDO) {
         return metaDataMapper.insert(metaDataDO);
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
index 8f56c1c..1964b30 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
@@ -41,6 +41,8 @@ import org.apache.shenyu.admin.model.vo.ResourceVO;
 import org.apache.shenyu.admin.service.PluginService;
 import org.apache.shenyu.admin.service.ResourceService;
 import org.apache.shenyu.admin.transfer.PluginTransfer;
+import org.apache.shenyu.admin.utils.Assert;
+import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.dto.PluginData;
 import org.apache.shenyu.common.enums.AdminPluginOperateEnum;
@@ -65,23 +67,23 @@ import java.util.stream.Collectors;
  */
 @Service
 public class PluginServiceImpl implements PluginService {
-
+    
     private final PluginMapper pluginMapper;
-
+    
     private final PluginHandleMapper pluginHandleMapper;
-
+    
     private final SelectorMapper selectorMapper;
-
+    
     private final SelectorConditionMapper selectorConditionMapper;
-
+    
     private final RuleMapper ruleMapper;
-
+    
     private final RuleConditionMapper ruleConditionMapper;
-
+    
     private final ApplicationEventPublisher eventPublisher;
-
+    
     private final ResourceService resourceService;
-
+    
     public PluginServiceImpl(final PluginMapper pluginMapper,
                              final PluginHandleMapper pluginHandleMapper,
                              final SelectorMapper selectorMapper,
@@ -99,7 +101,7 @@ public class PluginServiceImpl implements PluginService {
         this.eventPublisher = eventPublisher;
         this.resourceService = resourceService;
     }
-
+    
     /**
      * create or update plugin.
      *
@@ -109,22 +111,49 @@ public class PluginServiceImpl implements PluginService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String createOrUpdate(final PluginDTO pluginDTO) {
+        return PluginService.super.createOrUpdate(pluginDTO);
+    }
+    
+    /**
+     * create plugin.<br>
+     * insert plugin and insert plugin data.
+     *
+     * @param pluginDTO plugin info
+     * @return success is empty
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String create(final PluginDTO pluginDTO) {
+        Assert.isNull(pluginMapper.nameExisted(pluginDTO.getName()), 
AdminConstants.PLUGIN_NAME_IS_EXIST);
         PluginDO pluginDO = PluginDO.buildPluginDO(pluginDTO);
-        DataEventTypeEnum eventType = DataEventTypeEnum.CREATE;
-        if (StringUtils.isBlank(pluginDTO.getId())) {
-            insertPluginDataToResource(pluginDTO);
-            pluginMapper.insertSelective(pluginDO);
-        } else {
-            eventType = DataEventTypeEnum.UPDATE;
-            pluginMapper.updateSelective(pluginDO);
-        }
-
-        // publish change event.
-        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.PLUGIN, eventType,
+        insertPluginDataToResource(pluginDTO);
+        pluginMapper.insertSelective(pluginDO);
+        
+        // publish create event.
+        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.PLUGIN, DataEventTypeEnum.CREATE,
                 
Collections.singletonList(PluginTransfer.INSTANCE.mapToData(pluginDO))));
-        return StringUtils.EMPTY;
+        return ShenyuResultMessage.CREATE_SUCCESS;
     }
-
+    
+    /**
+     * update plugin.<br>
+     *
+     * @param pluginDTO plugin
+     * @return success is empty
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String update(final PluginDTO pluginDTO) {
+        Assert.isNull(pluginMapper.nameExistedExclude(pluginDTO.getName(), 
Collections.singletonList(pluginDTO.getId())), 
AdminConstants.PLUGIN_NAME_IS_EXIST);
+        PluginDO pluginDO = PluginDO.buildPluginDO(pluginDTO);
+        pluginMapper.updateSelective(pluginDO);
+        
+        // publish update event.
+        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.PLUGIN, DataEventTypeEnum.UPDATE,
+                
Collections.singletonList(PluginTransfer.INSTANCE.mapToData(pluginDO))));
+        return ShenyuResultMessage.UPDATE_SUCCESS;
+    }
+    
     /**
      * delete plugins.
      *
@@ -142,12 +171,12 @@ public class PluginServiceImpl implements PluginService {
         if (CollectionUtils.isEmpty(pluginIds)) {
             return AdminConstants.SYS_PLUGIN_ID_NOT_EXIST;
         }
-
+        
         // 2. delete plugins.
         this.pluginMapper.deleteByIds(pluginIds);
         // 3. delete plugin handle.
         this.pluginHandleMapper.deleteByPluginIds(pluginIds);
-
+        
         // 4. all selectors.
         final List<String> selectorIds = 
Optional.ofNullable(this.selectorMapper.findByPluginIds(pluginIds))
                 .orElse(Collections.emptyList())
@@ -169,20 +198,20 @@ public class PluginServiceImpl implements PluginService {
                 this.ruleConditionMapper.deleteByRuleIds(ruleIds);
             }
         }
-
+        
         // 5. delete resource & permission.
         final List<ResourceVO> resources = 
this.resourceService.listByTitles(plugins.stream()
                 .map(PluginDO::getName).collect(Collectors.toList()));
         if (CollectionUtils.isNotEmpty(resources)) {
             
this.resourceService.delete(resources.stream().map(ResourceVO::getId).collect(Collectors.toList()));
         }
-
+        
         // 6. publish change event.
         eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.PLUGIN, DataEventTypeEnum.DELETE,
                 
plugins.stream().map(PluginTransfer.INSTANCE::mapToData).collect(Collectors.toList())));
         return StringUtils.EMPTY;
     }
-
+    
     /**
      * plugin enabled.
      *
@@ -192,7 +221,7 @@ public class PluginServiceImpl implements PluginService {
      */
     @Override
     public String enabled(final List<String> ids, final Boolean enabled) {
-
+        
         if (CollectionUtils.isEmpty(ids)) {
             return AdminConstants.SYS_PLUGIN_ID_NOT_EXIST;
         }
@@ -210,7 +239,7 @@ public class PluginServiceImpl implements PluginService {
         }
         return StringUtils.EMPTY;
     }
-
+    
     /**
      * find plugin by id.
      *
@@ -221,7 +250,7 @@ public class PluginServiceImpl implements PluginService {
     public PluginVO findById(final String id) {
         return PluginVO.buildPluginVO(pluginMapper.selectById(id));
     }
-
+    
     /**
      * find page of plugin by query.
      *
@@ -234,7 +263,7 @@ public class PluginServiceImpl implements PluginService {
         return PageResultUtils.result(pluginQuery.getPageParameter(), () -> 
pluginMapper.selectByQuery(pluginQuery)
                 
.stream().map(PluginVO::buildPluginVO).collect(Collectors.toList()));
     }
-
+    
     /**
      * query all plugin.
      *
@@ -246,21 +275,21 @@ public class PluginServiceImpl implements PluginService {
                 .map(PluginTransfer.INSTANCE::mapToData)
                 .collect(Collectors.toList());
     }
-
+    
     @Override
     public List<PluginData> listAllNotInResource() {
         return pluginMapper.listAllNotInResource().stream()
                 .map(PluginTransfer.INSTANCE::mapToData)
                 .collect(Collectors.toList());
     }
-
+    
     @Override
     public String selectIdByName(final String name) {
         PluginDO pluginDO = pluginMapper.selectByName(name);
         Objects.requireNonNull(pluginDO);
         return pluginDO.getId();
     }
-
+    
     /**
      * Find by name plugin do.
      *
@@ -271,7 +300,7 @@ public class PluginServiceImpl implements PluginService {
     public PluginDO findByName(final String name) {
         return pluginMapper.selectByName(name);
     }
-
+    
     /**
      * add plugin and add plugin resource.
      *
@@ -299,7 +328,7 @@ public class PluginServiceImpl implements PluginService {
         insertPluginButtonResource(resourceDO.getId(), pluginDTO.getName(), 
ConfigGroupEnum.RULE, AdminPluginOperateEnum.QUERY);
         insertPluginButtonResource(resourceDO.getId(), pluginDTO.getName(), 
ConfigGroupEnum.PLUGIN, AdminPluginOperateEnum.SYNCHRONIZE);
     }
-
+    
     /**
      * insert Resource Data.
      *
@@ -308,7 +337,7 @@ public class PluginServiceImpl implements PluginService {
     private void insertPluginMenuResource(final ResourceDO resourceDO) {
         resourceService.createResource(resourceDO);
     }
-
+    
     /**
      * insert Plugin Selector Button Resource.
      *
@@ -340,7 +369,7 @@ public class PluginServiceImpl implements PluginService {
             default:
                 break;
         }
-
+        
         insertPluginMenuResource(resourceDO);
     }
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/Assert.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/Assert.java
index b0af6e2..e5fdbce 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/Assert.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/Assert.java
@@ -39,9 +39,17 @@ public final class Assert {
      * @param message error message
      */
     public static void notNull(final Object obj, final String message) {
-        if (Objects.isNull(obj)) {
-            throw new ValidFailException(message);
-        }
+        isTrue(Objects.nonNull(obj), message);
+    }
+    
+    /**
+     * assert obj is null.
+     *
+     * @param obj     obj
+     * @param message error message
+     */
+    public static void isNull(final Object obj, final String message) {
+        isTrue(Objects.isNull(obj), message);
     }
     
     /**
@@ -51,9 +59,7 @@ public final class Assert {
      * @param message error message
      */
     public static void notBlack(final String str, final String message) {
-        if (StringUtils.isBlank(str)) {
-            throw new ValidFailException(message);
-        }
+        isTrue(StringUtils.isNoneBlank(str), message);
     }
     
     /**
@@ -63,7 +69,18 @@ public final class Assert {
      * @param message    error message
      */
     public static void notEmpty(final Collection<?> collection, final String 
message) {
-        if (CollectionUtils.isEmpty(collection)) {
+        isTrue(!CollectionUtils.isEmpty(collection), message);
+    }
+    
+    
+    /**
+     * assert test is true.
+     *
+     * @param test    string
+     * @param message error message
+     */
+    public static void isTrue(final Boolean test, final String message) {
+        if (!Boolean.TRUE.equals(test)) {
             throw new ValidFailException(message);
         }
     }
diff --git a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
index 3398b5a..e43a7da 100644
--- a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
@@ -107,6 +107,22 @@
         select true from meta_data where path = #{path} limit 1
     </select>
 
+    <select id="pathExistedExclude" resultType="java.lang.Boolean">
+        select true
+        from meta_data
+        where path = #{path}
+        and id not in
+        <foreach collection="exclude" item="id" index="index"
+                 open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        limit 1
+    </select>
+
+    <select id="existed" resultType="java.lang.Boolean">
+        select true from meta_data where id = #{id} limit 1
+    </select>
+
     <insert id="insert" 
parameterType="org.apache.shenyu.admin.model.entity.MetaDataDO">
         insert into meta_data (id, date_created, date_updated, app_name, 
path,path_desc,rpc_type, 
service_name,method_name,parameter_types,rpc_ext,enabled )
         values (#{id,jdbcType=VARCHAR}, #{dateCreated,jdbcType=TIMESTAMP}, 
#{dateUpdated,jdbcType=TIMESTAMP},
diff --git a/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
index a51388b..7fea9a4 100644
--- a/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
@@ -121,6 +121,18 @@
         select true from plugin where name = #{name} limit 1
     </select>
 
+    <select id="nameExistedExclude" resultType="java.lang.Boolean">
+        select true
+        from plugin
+        where name = #{name}
+        and id not in
+        <foreach collection="exclude" item="id" index="index"
+                 open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        limit 1
+    </select>
+
     <insert id="insert" 
parameterType="org.apache.shenyu.admin.model.entity.PluginDO">
         insert into plugin (id, date_created, date_updated,
         name,config,role, sort, enabled)
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
index d0d443b..e6df159 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
@@ -19,6 +19,7 @@ package org.apache.shenyu.admin.controller;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.exception.ExceptionHandlers;
+import org.apache.shenyu.admin.mapper.MetaDataMapper;
 import org.apache.shenyu.admin.model.dto.BatchCommonDTO;
 import org.apache.shenyu.admin.model.dto.MetaDataDTO;
 import org.apache.shenyu.admin.model.page.CommonPager;
@@ -26,7 +27,6 @@ import org.apache.shenyu.admin.model.page.PageParameter;
 import org.apache.shenyu.admin.model.query.MetaDataQuery;
 import org.apache.shenyu.admin.model.vo.MetaDataVO;
 import org.apache.shenyu.admin.service.MetaDataService;
-import org.apache.shenyu.admin.service.provider.MetaDataPathProvider;
 import org.apache.shenyu.admin.spring.SpringBeanUtils;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
@@ -73,7 +73,7 @@ public final class MetaDataControllerTest {
     private MetaDataService metaDataService;
     
     @Mock
-    private MetaDataPathProvider pathProvider;
+    private MetaDataMapper metaDataMapper;
 
     private final MetaDataVO metaDataVO = new MetaDataVO("appName", "appPath", 
"desc", "rpcType", "serviceName", "methodName", "types", "rpcExt",
             "1", DateUtils.localDateTimeToString(LocalDateTime.now()), 
DateUtils.localDateTimeToString(LocalDateTime.now()),
@@ -156,14 +156,14 @@ public final class MetaDataControllerTest {
         metaDataDTO.setRuleName("ruleName");
         metaDataDTO.setEnabled(false);
         
SpringBeanUtils.getInstance().setApplicationContext(mock(ConfigurableApplicationContext.class));
-        
when(SpringBeanUtils.getInstance().getBean(MetaDataPathProvider.class)).thenReturn(pathProvider);
-        when(pathProvider.existed(metaDataDTO.getPath())).thenReturn(null);
-        
given(this.metaDataService.createOrUpdate(metaDataDTO)).willReturn(StringUtils.EMPTY);
+        
when(SpringBeanUtils.getInstance().getBean(MetaDataMapper.class)).thenReturn(metaDataMapper);
+        when(metaDataMapper.existed(metaDataDTO.getId())).thenReturn(true);
+        
given(this.metaDataService.createOrUpdate(metaDataDTO)).willReturn(ShenyuResultMessage.UPDATE_SUCCESS);
         
this.mockMvc.perform(MockMvcRequestBuilders.post("/meta-data/createOrUpdate")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(metaDataDTO)))
                 .andExpect(status().isOk())
-                .andExpect(jsonPath("$.message", 
is(ShenyuResultMessage.CREATE_SUCCESS)))
+                .andExpect(jsonPath("$.message", 
is(ShenyuResultMessage.UPDATE_SUCCESS)))
                 .andReturn();
     }
 
@@ -180,14 +180,14 @@ public final class MetaDataControllerTest {
         metaDataDTO.setRuleName("ruleName");
         metaDataDTO.setEnabled(false);
         
SpringBeanUtils.getInstance().setApplicationContext(mock(ConfigurableApplicationContext.class));
-        
when(SpringBeanUtils.getInstance().getBean(MetaDataPathProvider.class)).thenReturn(pathProvider);
-        when(pathProvider.existed(metaDataDTO.getPath())).thenReturn(true);
+        
when(SpringBeanUtils.getInstance().getBean(MetaDataMapper.class)).thenReturn(metaDataMapper);
+        when(metaDataMapper.existed(metaDataDTO.getId())).thenReturn(null);
         
this.mockMvc.perform(MockMvcRequestBuilders.post("/meta-data/createOrUpdate")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(metaDataDTO)))
                 .andExpect(status().isOk())
                 .andExpect(jsonPath("$.code", is(500)))
-                .andExpect(jsonPath("$.message", is("Request error! invalid 
argument [path: The path already exists and can't be added repeatedly!]")))
+                .andExpect(jsonPath("$.message", is("Request error! invalid 
argument [id: meta data is not existed]")))
                 .andReturn();
     }
 
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/PluginControllerTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/PluginControllerTest.java
index 4dc35e6..274c86a 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/PluginControllerTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/PluginControllerTest.java
@@ -28,7 +28,6 @@ import org.apache.shenyu.admin.model.query.PluginQuery;
 import org.apache.shenyu.admin.model.vo.PluginVO;
 import org.apache.shenyu.admin.service.PluginService;
 import org.apache.shenyu.admin.service.SyncDataService;
-import org.apache.shenyu.admin.service.provider.PluginNameProvider;
 import org.apache.shenyu.admin.spring.SpringBeanUtils;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
@@ -77,9 +76,6 @@ public final class PluginControllerTest {
     private SyncDataService syncDataService;
     
     @Mock
-    private PluginNameProvider nameProvider;
-    
-    @Mock
     private PluginMapper pluginMapper;
     
     private PluginVO pluginVO;
@@ -138,31 +134,30 @@ public final class PluginControllerTest {
     @Test
     public void testCreatePlugin() throws Exception {
         PluginDTO pluginDTO = new PluginDTO();
-        pluginDTO.setId("123");
         pluginDTO.setName("test");
         pluginDTO.setEnabled(true);
         pluginDTO.setRole("1");
         pluginDTO.setSort(100);
-        
when(SpringBeanUtils.getInstance().getBean(PluginNameProvider.class)).thenReturn(nameProvider);
         
when(SpringBeanUtils.getInstance().getBean(PluginMapper.class)).thenReturn(pluginMapper);
-
-        when(nameProvider.existed(pluginDTO.getName())).thenReturn(null);
-        when(pluginMapper.existed(pluginDTO.getId())).thenReturn(true);
-        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(StringUtils.EMPTY);
+        
+        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(ShenyuResultMessage.CREATE_SUCCESS);
         this.mockMvc.perform(MockMvcRequestBuilders.post("/plugin/")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(pluginDTO)))
                 .andExpect(status().isOk())
                 .andExpect(jsonPath("$.message", 
is(ShenyuResultMessage.CREATE_SUCCESS)))
                 .andReturn();
-        when(nameProvider.existed(pluginDTO.getName())).thenReturn(true);
+        // update success
+        pluginDTO.setId("123");
+        when(pluginMapper.existed(pluginDTO.getId())).thenReturn(true);
+        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(ShenyuResultMessage.UPDATE_SUCCESS);
         this.mockMvc.perform(MockMvcRequestBuilders.post("/plugin/")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(pluginDTO)))
                 .andExpect(status().isOk())
-                .andExpect(jsonPath("$.message", is("Request error! invalid 
argument [name: The plugin name already exists and can't be added 
repeatedly!]")))
+                .andExpect(jsonPath("$.message", 
is(ShenyuResultMessage.UPDATE_SUCCESS)))
                 .andReturn();
-        when(nameProvider.existed(pluginDTO.getName())).thenReturn(false);
+        // update fail
         when(pluginMapper.existed(pluginDTO.getId())).thenReturn(false);
         this.mockMvc.perform(MockMvcRequestBuilders.post("/plugin/")
                 .contentType(MediaType.APPLICATION_JSON)
@@ -181,32 +176,29 @@ public final class PluginControllerTest {
         pluginDTO.setEnabled(true);
         pluginDTO.setRole("1");
         pluginDTO.setSort(100);
-        
when(SpringBeanUtils.getInstance().getBean(PluginNameProvider.class)).thenReturn(nameProvider);
         
when(SpringBeanUtils.getInstance().getBean(PluginMapper.class)).thenReturn(pluginMapper);
-        when(nameProvider.existed(pluginDTO.getName())).thenReturn(false);
         when(pluginMapper.existed(pluginDTO.getId())).thenReturn(true);
-        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(StringUtils.EMPTY);
-        this.mockMvc.perform(MockMvcRequestBuilders.put("/plugin/{id}", "123")
+        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(ShenyuResultMessage.UPDATE_SUCCESS);
+        this.mockMvc.perform(MockMvcRequestBuilders.put("/plugin/{id}", 
pluginDTO.getId())
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(pluginDTO)))
                 .andExpect(status().isOk())
                 .andExpect(jsonPath("$.message", 
is(ShenyuResultMessage.UPDATE_SUCCESS)))
                 .andReturn();
-        
-        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(AdminConstants.PLUGIN_NAME_IS_EXIST);
-        this.mockMvc.perform(MockMvcRequestBuilders.put("/plugin/{id}", "123")
+        when(pluginMapper.existed(pluginDTO.getId())).thenReturn(null);
+        this.mockMvc.perform(MockMvcRequestBuilders.put("/plugin/{id}", 
pluginDTO.getId())
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(pluginDTO)))
                 .andExpect(status().isOk())
-                .andExpect(jsonPath("$.message", 
is(AdminConstants.PLUGIN_NAME_IS_EXIST)))
+                .andExpect(jsonPath("$.message", is("Request error! invalid 
argument [id: the plugin is not exited]")))
                 .andReturn();
-        
-        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(AdminConstants.PLUGIN_NAME_NOT_EXIST);
-        this.mockMvc.perform(MockMvcRequestBuilders.put("/plugin/{id}", "123")
+        when(pluginMapper.existed(pluginDTO.getId())).thenReturn(true);
+        
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(ShenyuResultMessage.CREATE_SUCCESS);
+        this.mockMvc.perform(MockMvcRequestBuilders.put("/plugin/{id}", 
pluginDTO.getId())
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(pluginDTO)))
                 .andExpect(status().isOk())
-                .andExpect(jsonPath("$.message", 
is(AdminConstants.PLUGIN_NAME_NOT_EXIST)))
+                .andExpect(jsonPath("$.message", 
is(ShenyuResultMessage.CREATE_SUCCESS)))
                 .andReturn();
     }
     
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
index b451098..0346596 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
@@ -27,6 +27,7 @@ import org.apache.shenyu.admin.model.page.PageParameter;
 import org.apache.shenyu.admin.model.query.MetaDataQuery;
 import org.apache.shenyu.admin.model.vo.MetaDataVO;
 import org.apache.shenyu.admin.service.impl.MetaDataServiceImpl;
+import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.dto.MetaData;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
@@ -45,6 +46,7 @@ import org.springframework.context.ApplicationEventPublisher;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -243,8 +245,9 @@ public final class MetaDataServiceTest {
     private void testCreateOrUpdateForInsert() {
         when(metaDataDTO.getId()).thenReturn(null);
         when(metaDataMapper.insert(any())).thenReturn(1);
+        when(metaDataMapper.pathExisted(any())).thenReturn(null);
         String msg = metaDataService.createOrUpdate(metaDataDTO);
-        assertEquals(StringUtils.EMPTY, msg);
+        assertEquals(ShenyuResultMessage.CREATE_SUCCESS, msg);
     }
 
     /**
@@ -254,10 +257,12 @@ public final class MetaDataServiceTest {
     private void testCreateOrUpdateForUpdate() {
         MetaDataDO metaDataDO = MetaDataDO.builder().build();
         when(metaDataDTO.getId()).thenReturn("id");
-        
when(metaDataMapper.selectById("id")).thenReturn(null).thenReturn(metaDataDO);
+        when(metaDataDTO.getPath()).thenReturn("path");
+        when(metaDataMapper.pathExistedExclude("path", 
Collections.singletonList("id"))).thenReturn(null);
+        when(metaDataMapper.selectById("id")).thenReturn(metaDataDO);
         when(metaDataMapper.update(any())).thenReturn(1);
         String msg = metaDataService.createOrUpdate(metaDataDTO);
-        assertEquals(StringUtils.EMPTY, msg);
+        assertEquals(ShenyuResultMessage.UPDATE_SUCCESS, msg);
     }
 
     private void assertEquals(final String expected, final String actual) {
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
index 95020a5..2b527e0 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
@@ -33,6 +33,7 @@ import org.apache.shenyu.admin.model.page.PageParameter;
 import org.apache.shenyu.admin.model.query.PluginQuery;
 import org.apache.shenyu.admin.model.vo.PluginVO;
 import org.apache.shenyu.admin.service.impl.PluginServiceImpl;
+import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.dto.PluginData;
 import org.assertj.core.util.Lists;
@@ -67,71 +68,71 @@ import static org.mockito.Mockito.when;
 @ExtendWith(MockitoExtension.class)
 @MockitoSettings(strictness = Strictness.LENIENT)
 public final class PluginServiceTest {
-
+    
     @InjectMocks
     private PluginServiceImpl pluginService;
-
+    
     @Mock
     private PluginMapper pluginMapper;
-
+    
     @Mock
     private PluginHandleMapper pluginHandleMapper;
-
+    
     @Mock
     private SelectorMapper selectorMapper;
-
+    
     @Mock
     private RuleMapper ruleMapper;
-
+    
     @Mock
     private RuleConditionMapper ruleConditionMapper;
-
+    
     @Mock
     private SelectorConditionMapper selectorConditionMapper;
-
+    
     @Mock
     private ApplicationEventPublisher eventPublisher;
-
+    
     @Mock
     private ResourceService resourceService;
-
+    
     @BeforeEach
     public void setUp() {
         pluginService = new PluginServiceImpl(pluginMapper, 
pluginHandleMapper, selectorMapper, selectorConditionMapper,
                 ruleMapper, ruleConditionMapper, eventPublisher, 
resourceService);
     }
-
+    
     @Test
     public void testCreateOrUpdate() {
         publishEvent();
         testCreate();
         testUpdate();
     }
-
+    
     @Test
     public void testDelete() {
         List<PluginDO> plugins = 
Collections.singletonList(buildPluginDO("123"));
         
when(pluginMapper.selectByIds(Collections.singletonList("123"))).thenReturn(plugins);
         
when(pluginMapper.deleteByIds(Collections.singletonList("123"))).thenReturn(1);
-
+        
         final List<SelectorDO> selectorDOList = new ArrayList<>();
         selectorDOList.add(SelectorDO.builder().id("101").build());
         
when(selectorMapper.findByPluginIds(Collections.singletonList("101"))).thenReturn(selectorDOList);
         assertEquals(StringUtils.EMPTY, 
pluginService.delete(Collections.singletonList("123")));
     }
-
+    
     @Test
     public void testDeleteShouldSysPluginIdNotExist() {
         when(pluginMapper.selectById(any())).thenReturn(null);
-
+        
         PluginDO pluginDO = buildPluginDO("123");
         final List<String> ids = Collections.singletonList(pluginDO.getId());
         assertEquals(AdminConstants.SYS_PLUGIN_ID_NOT_EXIST, 
pluginService.delete(ids));
     }
-
+    
     @Test
     public void testEnable() {
-
+        
         List<String> idList = Lists.list("123", "1234");
         publishEvent();
         BatchCommonDTO batchCommonDTO = new BatchCommonDTO();
@@ -140,20 +141,20 @@ public final class PluginServiceTest {
         
given(this.pluginMapper.selectByIds(idList)).willReturn(Lists.list(buildPluginDO(),
 buildPluginDO()));
         assertThat(this.pluginService.enabled(batchCommonDTO.getIds(), 
batchCommonDTO.getEnabled()), equalTo(StringUtils.EMPTY));
     }
-
+    
     @Test
     public void testEnableShouldSysPluginIdNotExist() {
         when(pluginMapper.selectById(any())).thenReturn(null);
-
+        
         BatchCommonDTO batchCommonDTO = new BatchCommonDTO();
         batchCommonDTO.setEnabled(false);
         batchCommonDTO.setIds(Collections.singletonList("123"));
-
+        
         given(this.pluginMapper.updateEnable(any())).willReturn(1);
-
+        
         assertThat(this.pluginService.enabled(batchCommonDTO.getIds(), 
batchCommonDTO.getEnabled()), equalTo(AdminConstants.SYS_PLUGIN_ID_NOT_EXIST));
     }
-
+    
     @Test
     public void testFindById() {
         PluginDO pluginDO = buildPluginDO();
@@ -162,7 +163,7 @@ public final class PluginServiceTest {
         assertNotNull(pluginVO);
         assertEquals(pluginDO.getId(), pluginVO.getId());
     }
-
+    
     @Test
     public void testListByPage() {
         PageParameter pageParameter = new PageParameter();
@@ -179,7 +180,7 @@ public final class PluginServiceTest {
         final CommonPager<PluginVO> pluginDOCommonPager = 
this.pluginService.listByPage(pluginQuery);
         assertEquals(pluginDOCommonPager.getDataList().size(), 
pluginDOList.size());
     }
-
+    
     @Test
     public void testListAll() {
         PluginDO pluginDO = buildPluginDO("123");
@@ -189,33 +190,35 @@ public final class PluginServiceTest {
         assertNotNull(dataList);
         assertEquals(pluginDOList.size(), dataList.size());
     }
-
+    
     private void publishEvent() {
         PluginDO pluginDO = buildPluginDO();
         given(this.pluginMapper.selectById("123")).willReturn(pluginDO);
     }
-
+    
     private void testCreate() {
         PluginDTO pluginDTO = buildPluginDTO("");
+        when(pluginMapper.nameExisted(pluginDTO.getName())).thenReturn(null);
         when(pluginMapper.insert(any())).thenReturn(1);
-        assertEquals(StringUtils.EMPTY, 
this.pluginService.createOrUpdate(pluginDTO));
+        assertEquals(ShenyuResultMessage.CREATE_SUCCESS, 
this.pluginService.createOrUpdate(pluginDTO));
     }
-
+    
     private void testUpdate() {
         PluginDO pluginDO = buildPluginDO();
         when(pluginMapper.selectByName(any())).thenReturn(pluginDO);
-
+        
         PluginDTO pluginDTO = new PluginDTO();
         pluginDTO.setId("123");
         pluginDTO.setName("test");
+        when(pluginMapper.nameExistedExclude(pluginDTO.getName(), 
Collections.singletonList(pluginDO.getId()))).thenReturn(null);
         when(pluginMapper.update(any())).thenReturn(1);
-        assertEquals(StringUtils.EMPTY, 
this.pluginService.createOrUpdate(pluginDTO));
+        assertEquals(ShenyuResultMessage.UPDATE_SUCCESS, 
this.pluginService.createOrUpdate(pluginDTO));
     }
     
     private PluginDTO buildPluginDTO() {
         return buildPluginDTO("123");
     }
-
+    
     private PluginDTO buildPluginDTO(final String id) {
         PluginDTO pluginDTO = new PluginDTO();
         if (StringUtils.isNotBlank(id)) {
@@ -227,7 +230,7 @@ public final class PluginServiceTest {
         pluginDTO.setEnabled(true);
         return pluginDTO;
     }
-
+    
     private PluginDO buildPluginDO() {
         PluginDO pluginDO = PluginDO.buildPluginDO(buildPluginDTO());
         Timestamp now = Timestamp.valueOf(LocalDateTime.now());
@@ -235,7 +238,7 @@ public final class PluginServiceTest {
         pluginDO.setDateUpdated(now);
         return pluginDO;
     }
-
+    
     private PluginDO buildPluginDO(final String id) {
         PluginDTO pluginDTO = new PluginDTO();
         if (StringUtils.isNotBlank(id)) {

Reply via email to