You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by xi...@apache.org on 2022/03/01 10:00:28 UTC

[incubator-shenyu] branch master updated: [Type:Refactor] optimize some code in admin (#2946)

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 909a539  [Type:Refactor] optimize some code in admin (#2946)
909a539 is described below

commit 909a53938156808c2a43edbb259d2ed0072112ab
Author: likeguo <33...@users.noreply.github.com>
AuthorDate: Tue Mar 1 18:00:20 2022 +0800

    [Type:Refactor] optimize some code in admin (#2946)
    
    * clean code:user has permission
    
    * clean code:used method reference
    
    * clean code:switch case  merge
    
    * clean code:switch case  merge
    
    * clean code:switch case  merge
---
 .../listener/AbstractDataChangedListener.java      | 65 ++++++++++------------
 .../shenyu/admin/mapper/DataPermissionMapper.java  |  8 +++
 .../service/impl/DashboardUserServiceImpl.java     | 30 ++++++----
 .../admin/service/impl/MetaDataServiceImpl.java    | 22 ++++----
 .../admin/service/impl/PluginServiceImpl.java      |  2 +-
 .../shenyu/admin/service/impl/RuleServiceImpl.java |  4 +-
 .../admin/service/impl/SelectorServiceImpl.java    |  2 +-
 .../admin/service/impl/SyncDataServiceImpl.java    |  2 +-
 .../resources/mappers/data-permission-sqlmap.xml   |  6 +-
 9 files changed, 77 insertions(+), 64 deletions(-)

diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
index 2247a7a..dd426ce 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
@@ -17,7 +17,6 @@
 
 package org.apache.shenyu.admin.listener;
 
-import com.google.gson.reflect.TypeToken;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.shenyu.admin.service.AppAuthService;
 import org.apache.shenyu.admin.service.MetaDataService;
@@ -52,7 +51,6 @@ import java.util.concurrent.ConcurrentMap;
  *
  * @since 2.0.0
  */
-@SuppressWarnings("all")
 public abstract class AbstractDataChangedListener implements DataChangedListener, InitializingBean {
 
     /**
@@ -96,30 +94,20 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         ConfigDataCache config = CACHE.get(groupKey.name());
         switch (groupKey) {
             case APP_AUTH:
-                List<AppAuthData> appAuthList = GsonUtils.getGson().fromJson(config.getJson(), new TypeToken<List<AppAuthData>>() {
-                }.getType());
-                return new ConfigData<>(config.getMd5(), config.getLastModifyTime(), appAuthList);
+                return buildConfigData(config, AppAuthData.class);
             case PLUGIN:
-                List<PluginData> pluginList = GsonUtils.getGson().fromJson(config.getJson(), new TypeToken<List<PluginData>>() {
-                }.getType());
-                return new ConfigData<>(config.getMd5(), config.getLastModifyTime(), pluginList);
+                return buildConfigData(config, PluginData.class);
             case RULE:
-                List<RuleData> ruleList = GsonUtils.getGson().fromJson(config.getJson(), new TypeToken<List<RuleData>>() {
-                }.getType());
-                return new ConfigData<>(config.getMd5(), config.getLastModifyTime(), ruleList);
+                return buildConfigData(config, RuleData.class);
             case SELECTOR:
-                List<SelectorData> selectorList = GsonUtils.getGson().fromJson(config.getJson(), new TypeToken<List<SelectorData>>() {
-                }.getType());
-                return new ConfigData<>(config.getMd5(), config.getLastModifyTime(), selectorList);
+                return buildConfigData(config, SelectorData.class);
             case META_DATA:
-                List<MetaData> metaList = GsonUtils.getGson().fromJson(config.getJson(), new TypeToken<List<MetaData>>() {
-                }.getType());
-                return new ConfigData<>(config.getMd5(), config.getLastModifyTime(), metaList);
+                return buildConfigData(config, MetaData.class);
             default:
                 throw new IllegalStateException("Unexpected groupKey: " + groupKey);
         }
     }
-
+    
     @Override
     public void onAppAuthChanged(final List<AppAuthData> changed, final DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -128,7 +116,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         this.updateAppAuthCache();
         this.afterAppAuthChanged(changed, eventType);
     }
-
+    
     /**
      * After app auth changed.
      *
@@ -137,7 +125,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
      */
     protected void afterAppAuthChanged(final List<AppAuthData> changed, final DataEventTypeEnum eventType) {
     }
-
+    
     @Override
     public void onMetaDataChanged(final List<MetaData> changed, final DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -146,7 +134,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         this.updateMetaDataCache();
         this.afterMetaDataChanged(changed, eventType);
     }
-
+    
     /**
      * After meta data changed.
      *
@@ -155,7 +143,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
      */
     protected void afterMetaDataChanged(final List<MetaData> changed, final DataEventTypeEnum eventType) {
     }
-
+    
     @Override
     public void onPluginChanged(final List<PluginData> changed, final DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -164,7 +152,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         this.updatePluginCache();
         this.afterPluginChanged(changed, eventType);
     }
-
+    
     /**
      * After plugin changed.
      *
@@ -173,7 +161,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
      */
     protected void afterPluginChanged(final List<PluginData> changed, final DataEventTypeEnum eventType) {
     }
-
+    
     @Override
     public void onRuleChanged(final List<RuleData> changed, final DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -182,7 +170,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         this.updateRuleCache();
         this.afterRuleChanged(changed, eventType);
     }
-
+    
     /**
      * After rule changed.
      *
@@ -191,7 +179,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
      */
     protected void afterRuleChanged(final List<RuleData> changed, final DataEventTypeEnum eventType) {
     }
-
+    
     @Override
     public void onSelectorChanged(final List<SelectorData> changed, final DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -200,7 +188,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         this.updateSelectorCache();
         this.afterSelectorChanged(changed, eventType);
     }
-
+    
     /**
      * After selector changed.
      *
@@ -209,15 +197,15 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
      */
     protected void afterSelectorChanged(final List<SelectorData> changed, final DataEventTypeEnum eventType) {
     }
-
+    
     @Override
     public final void afterPropertiesSet() {
         this.refreshLocalCache();
         this.afterInitialize();
     }
-
+    
     protected abstract void afterInitialize();
-
+    
     /**
      * if md5 is not the same as the original, then update lcoal cache.
      * @param group ConfigGroupEnum
@@ -230,7 +218,7 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         ConfigDataCache oldVal = CACHE.put(newVal.getGroup(), newVal);
         LOG.info("update config cache[{}], old: {}, updated: {}", group, oldVal, newVal);
     }
-
+    
     /**
      * refresh local cache.
      */
@@ -241,40 +229,43 @@ public abstract class AbstractDataChangedListener implements DataChangedListener
         this.updateSelectorCache();
         this.updateMetaDataCache();
     }
-
+    
     /**
      * Update selector cache.
      */
     protected void updateSelectorCache() {
         this.updateCache(ConfigGroupEnum.SELECTOR, selectorService.listAll());
     }
-
+    
     /**
      * Update rule cache.
      */
     protected void updateRuleCache() {
         this.updateCache(ConfigGroupEnum.RULE, ruleService.listAll());
     }
-
+    
     /**
      * Update plugin cache.
      */
     protected void updatePluginCache() {
         this.updateCache(ConfigGroupEnum.PLUGIN, pluginService.listAll());
     }
-
+    
     /**
      * Update app auth cache.
      */
     protected void updateAppAuthCache() {
         this.updateCache(ConfigGroupEnum.APP_AUTH, appAuthService.listAll());
     }
-
+    
     /**
      * Update meta data cache.
      */
     protected void updateMetaDataCache() {
         this.updateCache(ConfigGroupEnum.META_DATA, metaDataService.listAll());
     }
-
+    
+    private <T> ConfigData<T> buildConfigData(final ConfigDataCache config, final Class<T> dataType) {
+        return new ConfigData<>(config.getMd5(), config.getLastModifyTime(), GsonUtils.getInstance().fromList(config.getJson(), dataType));
+    }
 }
diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DataPermissionMapper.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DataPermissionMapper.java
index 26c3680..0beb2d8 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DataPermissionMapper.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DataPermissionMapper.java
@@ -30,6 +30,14 @@ import java.util.Set;
  */
 @Mapper
 public interface DataPermissionMapper {
+    
+    /**
+     * user has permission.
+     *
+     * @param userId userId
+     * @return has permission,if not has permission the return null.
+     */
+    Boolean existed(String userId);
 
     /**
      * get list of {@link DataPermissionDO} by user id and data type.
diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DashboardUserServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DashboardUserServiceImpl.java
index 5e3c071..88c78a8 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DashboardUserServiceImpl.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DashboardUserServiceImpl.java
@@ -147,7 +147,7 @@ public class DashboardUserServiceImpl implements DashboardUserService {
             if (Objects.nonNull(dashboardUserDO)) {
                 idSet.remove(dashboardUserDO.getId());
             }
-            if (idSet.size() > 0) {
+            if (CollectionUtils.isNotEmpty(ids)) {
                 ret = dashboardUserMapper.deleteByIdSet(idSet);
                 userRoleMapper.deleteByUserIdSet(idSet);
                 dataPermissionMapper.deleteByUserIdSet(idSet);
@@ -168,15 +168,25 @@ public class DashboardUserServiceImpl implements DashboardUserService {
 
         DashboardUserVO dashboardUserVO = DashboardUserVO.buildDashboardUserVO(dashboardUserMapper.selectById(id));
 
-        Set<String> roleIdSet = Optional.ofNullable(userRoleMapper.findByUserId(id)).orElseGet(() -> new ArrayList<>())
-                .stream().map(userRoleDO -> userRoleDO.getRoleId()).collect(Collectors.toSet());
-
-        List<RoleDO> allRoleDOList = Optional.ofNullable(roleMapper.selectAll()).orElseGet(() -> new ArrayList<>());
-        List<RoleVO> allRoles = allRoleDOList.stream().map(RoleVO::buildRoleVO).collect(Collectors.toList());
-
-        List<RoleDO> roleDOList = allRoleDOList.stream().filter(roleDO -> roleIdSet.contains(roleDO.getId())).collect(Collectors.toList());
-        List<RoleVO> roles = Optional.ofNullable(roleDOList).orElseGet(() -> new ArrayList<>()).stream()
-                .map(roleDO -> RoleVO.buildRoleVO(roleDO)).filter(Objects::nonNull).collect(Collectors.toList());
+        Set<String> roleIdSet = Optional.ofNullable(userRoleMapper.findByUserId(id))
+                .orElseGet(ArrayList::new)
+                .stream()
+                .map(UserRoleDO::getRoleId)
+                .collect(Collectors.toSet());
+
+        List<RoleDO> allRoleDOList = Optional.ofNullable(roleMapper.selectAll())
+                .orElseGet(ArrayList::new);
+        List<RoleVO> allRoles = allRoleDOList.stream()
+                .map(RoleVO::buildRoleVO).collect(Collectors.toList());
+
+        List<RoleDO> roleDOList = allRoleDOList.stream()
+                .filter(roleDO -> roleIdSet.contains(roleDO.getId()))
+                .collect(Collectors.toList());
+        List<RoleVO> roles = Optional.of(roleDOList)
+                .orElseGet(ArrayList::new).stream()
+                .map(RoleVO::buildRoleVO)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
 
         return DashboardUserEditVO.buildDashboardUserEditVO(dashboardUserVO, roles, allRoles);
     }
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 d9f10da..57bbf3e 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
@@ -125,12 +125,12 @@ public class MetaDataServiceImpl implements MetaDataService {
     public int delete(final List<String> ids) {
 
         int count = 0;
-        Set<String> idSet = Optional.ofNullable(ids).orElseGet(() -> new ArrayList<>())
-                .stream().filter(id -> StringUtils.isNotEmpty(id)).collect(Collectors.toSet());
+        Set<String> idSet = Optional.ofNullable(ids).orElseGet(ArrayList::new)
+                .stream().filter(StringUtils::isNotEmpty).collect(Collectors.toSet());
         if (CollectionUtils.isNotEmpty(idSet)) {
             List<MetaDataDO> metaDataDoList = metaDataMapper.selectByIdSet(idSet);
-            List<MetaData> metaDataList = Optional.ofNullable(metaDataDoList).orElseGet(() -> new ArrayList<>())
-                    .stream().map(metaDataDO -> MetaDataTransfer.INSTANCE.mapToData(metaDataDO)).collect(Collectors.toList());
+            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));
@@ -142,16 +142,17 @@ public class MetaDataServiceImpl implements MetaDataService {
     @Override
     public String enabled(final List<String> ids, final Boolean enabled) {
 
-        Set<String> idSet = Optional.ofNullable(ids).orElseGet(() -> new ArrayList<>())
-                .stream().filter(id -> StringUtils.isNotEmpty(id)).collect(Collectors.toSet());
+        Set<String> idSet = Optional.ofNullable(ids).orElseGet(ArrayList::new)
+                .stream().filter(StringUtils::isNotEmpty).collect(Collectors.toSet());
         if (CollectionUtils.isEmpty(idSet)) {
             return AdminConstants.ID_NOT_EXIST;
         }
-        List<MetaDataDO> metaDataDoList = Optional.ofNullable(metaDataMapper.selectByIdSet(idSet)).orElseGet(() -> new ArrayList<>());
+        List<MetaDataDO> metaDataDoList = Optional.ofNullable(metaDataMapper.selectByIdSet(idSet)).orElseGet(ArrayList::new);
         if (idSet.size() != metaDataDoList.size()) {
             return AdminConstants.ID_NOT_EXIST;
         }
-        List<MetaData> metaDataList = metaDataDoList.stream().map(metaDataDO -> MetaDataTransfer.INSTANCE.mapToData(metaDataDO))
+        List<MetaData> metaDataList = metaDataDoList.stream()
+                .map(MetaDataTransfer.INSTANCE::mapToData)
                 .collect(Collectors.toList());
         metaDataMapper.updateEnableBatch(idSet, enabled);
 
@@ -219,8 +220,7 @@ public class MetaDataServiceImpl implements MetaDataService {
     }
 
     private String checkData(final MetaDataDTO metaDataDTO) {
-        Boolean success = checkParam(metaDataDTO);
-        if (!success) {
+        if (!checkParam(metaDataDTO)) {
             LOG.error("metaData create param is error, {}", metaDataDTO);
             return AdminConstants.PARAMS_ERROR;
         }
@@ -233,7 +233,7 @@ public class MetaDataServiceImpl implements MetaDataService {
         return StringUtils.EMPTY;
     }
 
-    private Boolean checkParam(final MetaDataDTO metaDataDTO) {
+    private boolean checkParam(final MetaDataDTO metaDataDTO) {
         return !StringUtils.isEmpty(metaDataDTO.getAppName())
                 && !StringUtils.isEmpty(metaDataDTO.getPath())
                 && !StringUtils.isEmpty(metaDataDTO.getRpcType())
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 868c474..6a7cff1 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
@@ -202,7 +202,7 @@ public class PluginServiceImpl implements PluginService {
             return AdminConstants.SYS_PLUGIN_ID_NOT_EXIST;
         }
         List<PluginDO> plugins = Optional.ofNullable(pluginMapper.selectByIds(ids)).orElseGet(ArrayList::new);
-        Set<String> idSet = new HashSet<>(Optional.ofNullable(ids).orElseGet(ArrayList::new));
+        Set<String> idSet = new HashSet<>(Optional.of(ids).orElseGet(ArrayList::new));
         if (idSet.size() > plugins.size()) {
             return AdminConstants.SYS_PLUGIN_ID_NOT_EXIST;
         }
diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
index 8b0e9e6..ca48a83 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
@@ -129,7 +129,7 @@ public class RuleServiceImpl implements RuleService {
         List<RuleConditionDTO> ruleConditions = ruleDTO.getRuleConditions();
         if (StringUtils.isEmpty(ruleDTO.getId())) {
             ruleCount = ruleMapper.insertSelective(ruleDO);
-            if (dataPermissionMapper.listByUserId(JwtUtils.getUserInfo().getUserId()).size() > 0) {
+            if (Boolean.TRUE.equals(dataPermissionMapper.existed(JwtUtils.getUserInfo().getUserId()))) {
                 DataPermissionDTO dataPermissionDTO = new DataPermissionDTO();
                 dataPermissionDTO.setUserId(JwtUtils.getUserInfo().getUserId());
                 dataPermissionDTO.setDataId(ruleDO.getId());
@@ -274,7 +274,7 @@ public class RuleServiceImpl implements RuleService {
                         return list1;
                     }));
 
-        return Optional.ofNullable(ruleDOList).orElseGet(ArrayList::new)
+        return Optional.of(ruleDOList).orElseGet(ArrayList::new)
                 .stream().filter(Objects::nonNull).map(ruleDO -> {
                     String ruleId = ruleDO.getId();
                     List<ConditionData> conditions = conditionMap.get(ruleId);
diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java
index 5fc41b8..afee8b1 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java
@@ -163,7 +163,7 @@ public class SelectorServiceImpl implements SelectorService {
                 selectorConditionMapper.insertSelective(SelectorConditionDO.buildSelectorConditionDO(selectorConditionDTO));
             });
             // check selector add
-            if (dataPermissionMapper.listByUserId(JwtUtils.getUserInfo().getUserId()).size() > 0) {
+            if (Boolean.TRUE.equals(dataPermissionMapper.existed(JwtUtils.getUserInfo().getUserId()))) {
                 DataPermissionDTO dataPermissionDTO = new DataPermissionDTO();
                 dataPermissionDTO.setUserId(JwtUtils.getUserInfo().getUserId());
                 dataPermissionDTO.setDataId(selectorDO.getId());
diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java
index 57150ec..c1c5cd2 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java
@@ -111,7 +111,7 @@ public class SyncDataServiceImpl implements SyncDataService {
 
         eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.REFRESH, selectorDataList));
 
-        List<String> selectorIdList = selectorDataList.stream().map(selectorData -> selectorData.getId())
+        List<String> selectorIdList = selectorDataList.stream().map(SelectorData::getId)
                 .collect(Collectors.toList());
         List<RuleData> allRuleDataList = ruleService.findBySelectorIdList(selectorIdList);
 
diff --git a/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml b/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml
index 2df75cc..96c360b 100644
--- a/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml
@@ -89,6 +89,10 @@
         and user_id = #{userId,jdbcType=VARCHAR} and data_type = #{dataType,jdbcType=INTEGER}
     </select>
 
+    <select id="existed" resultType="java.lang.Boolean">
+        select true from data_permission where user_id = #{userId,jdbcType=VARCHAR} limit 1
+    </select>
+
     <insert id="insertSelective" parameterType="org.apache.shenyu.admin.model.entity.DataPermissionDO">
         insert into data_permission
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -142,4 +146,4 @@
         </foreach>
     </insert>
 
-</mapper>
\ No newline at end of file
+</mapper>