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

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


The following commit(s) were added to refs/heads/master by this push:
     new 9a29e10fe0 [type:refactor] fix upload bug (#5342)
9a29e10fe0 is described below

commit 9a29e10fe02733a30d3d92a5768e7041e2faa95c
Author: Misaya295 <[email protected]>
AuthorDate: Fri Dec 8 09:40:05 2023 +0800

    [type:refactor] fix upload bug (#5342)
    
    * fix upload bug
    
    * fix upload bug
    
    * fix upload bug
    
    ---------
    
    Co-authored-by: chenwk <[email protected]>
---
 .../apache/shenyu/admin/model/dto/PluginDTO.java   |  7 +++--
 .../apache/shenyu/admin/model/entity/PluginDO.java | 10 ++------
 .../org/apache/shenyu/admin/model/vo/PluginVO.java | 30 ++++++++++++++++++++--
 .../admin/service/impl/PluginServiceImpl.java      | 23 +++++++++++------
 .../shenyu/admin/transfer/PluginTransfer.java      |  1 +
 .../src/main/resources/mappers/plugin-sqlmap.xml   |  3 +++
 .../admin/controller/PluginControllerTest.java     | 11 ++++----
 .../shenyu/admin/service/SyncDataServiceTest.java  |  3 ++-
 .../shenyu/common/utils/JarDependencyUtils.java    |  3 ++-
 9 files changed, 62 insertions(+), 29 deletions(-)

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 86f425f1b1..62376a7ce7 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
@@ -20,7 +20,6 @@ package org.apache.shenyu.admin.model.dto;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.mapper.PluginMapper;
 import org.apache.shenyu.admin.validation.annotation.Existed;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotBlank;
@@ -74,14 +73,14 @@ public class PluginDTO implements Serializable {
     /**
      * plugin jar.
      */
-    private MultipartFile file;
+    private String file;
 
     /**
      * Gets the value of file.
      *
      * @return the value of file
      */
-    public MultipartFile getFile() {
+    public String getFile() {
         return file;
     }
 
@@ -90,7 +89,7 @@ public class PluginDTO implements Serializable {
      *
      * @param file file
      */
-    public void setFile(final MultipartFile file) {
+    public void setFile(final String file) {
         this.file = file;
     }
 
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/entity/PluginDO.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/entity/PluginDO.java
index 87d519f5a6..aba8ba41ab 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/entity/PluginDO.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/entity/PluginDO.java
@@ -19,10 +19,9 @@ package org.apache.shenyu.admin.model.entity;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.model.dto.PluginDTO;
-import org.apache.shenyu.common.exception.ShenyuException;
 import org.apache.shenyu.common.utils.UUIDUtils;
+import org.opengauss.util.Base64;
 
-import java.io.IOException;
 import java.sql.Timestamp;
 import java.util.Arrays;
 import java.util.Objects;
@@ -217,12 +216,7 @@ public final class PluginDO extends BaseDO {
                 pluginDO.setId(item.getId());
             }
             if (Objects.nonNull(item.getFile())) {
-                try {
-                    pluginDO.setPluginJar(item.getFile().getBytes());
-                } catch (IOException e) {
-                    throw new ShenyuException(e);
-                }
-
+                pluginDO.setPluginJar(Base64.decode(item.getFile()));
             }
             return pluginDO;
         }).orElse(null);
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/PluginVO.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/PluginVO.java
index 6229b54fc7..8e080528b6 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/PluginVO.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/PluginVO.java
@@ -19,8 +19,10 @@ package org.apache.shenyu.admin.model.vo;
 
 import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.common.utils.DateUtils;
+import org.apache.shiro.codec.Base64;
 
 import java.io.Serializable;
+import java.util.Optional;
 
 /**
  * this is plugin view to web front.
@@ -69,6 +71,11 @@ public class PluginVO implements Serializable {
      */
     private String dateUpdated;
 
+    /**
+     * file.
+     */
+    private String file;
+
     public PluginVO() {
     }
 
@@ -79,7 +86,8 @@ public class PluginVO implements Serializable {
                     final Integer sort,
                     final Boolean enabled,
                     final String dateCreated,
-                    final String dateUpdated) {
+                    final String dateUpdated,
+                    final String file) {
         this.id = id;
         this.role = role;
         this.name = name;
@@ -88,6 +96,7 @@ public class PluginVO implements Serializable {
         this.enabled = enabled;
         this.dateCreated = dateCreated;
         this.dateUpdated = dateUpdated;
+        this.file = file;
     }
 
     /**
@@ -234,6 +243,22 @@ public class PluginVO implements Serializable {
         this.dateUpdated = dateUpdated;
     }
 
+    /**
+     * Gets the value of plugin jar.
+     * @return the value of plugin
+     */
+    public String getFile() {
+        return file;
+    }
+
+    /**
+     * set plugin jar.
+     * @param file jar
+     */
+    public void setFile(final String file) {
+        this.file = file;
+    }
+
     /**
      * build pluginVO.
      *
@@ -244,6 +269,7 @@ public class PluginVO implements Serializable {
         return new PluginVO(pluginDO.getId(), pluginDO.getRole(), 
pluginDO.getName(),
                 pluginDO.getConfig(), pluginDO.getSort(), 
pluginDO.getEnabled(),
                 
DateUtils.localDateTimeToString(pluginDO.getDateCreated().toLocalDateTime()),
-                
DateUtils.localDateTimeToString(pluginDO.getDateUpdated().toLocalDateTime()));
+                
DateUtils.localDateTimeToString(pluginDO.getDateUpdated().toLocalDateTime()),
+                
Optional.ofNullable(pluginDO.getPluginJar()).map(Base64::encodeToString).orElse(""));
     }
 }
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 07c4507d3e..30b69f23c4 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
@@ -43,11 +43,11 @@ import org.apache.shenyu.common.dto.PluginData;
 import org.apache.shenyu.common.exception.ShenyuException;
 import org.apache.shenyu.common.utils.JarDependencyUtils;
 import org.apache.shenyu.common.utils.LogUtils;
+import org.opengauss.util.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collections;
 import java.util.List;
@@ -131,7 +131,7 @@ public class PluginServiceImpl implements PluginService {
      * plugin enabled.
      *
      * @param ids     the ids
-     * @param enabled the enable
+     * @param enabled enable
      * @return String
      */
     @Override
@@ -207,7 +207,12 @@ public class PluginServiceImpl implements PluginService {
     public PluginDO findByName(final String name) {
         return pluginMapper.selectByName(name);
     }
-    
+
+    /**
+     *  activate plugin snapshot.
+     *
+     * @return List of plugins snapshot
+     */
     @Override
     public List<PluginSnapshotVO> activePluginSnapshot() {
         return pluginMapper.activePluginSnapshot(SessionUtil.isAdmin() ? null 
: SessionUtil.visitor().getUserId());
@@ -225,7 +230,7 @@ public class PluginServiceImpl implements PluginService {
     private String create(final PluginDTO pluginDTO) {
         Assert.isNull(pluginMapper.nameExisted(pluginDTO.getName()), 
AdminConstants.PLUGIN_NAME_IS_EXIST);
         if (!Objects.isNull(pluginDTO.getFile())) {
-            Assert.isTrue(checkFile(pluginDTO.getFile()), 
AdminConstants.THE_PLUGIN_JAR_FILE_IS_NOT_CORRECT_OR_EXCEEDS_16_MB);
+            Assert.isTrue(checkFile(Base64.decode(pluginDTO.getFile())), 
AdminConstants.THE_PLUGIN_JAR_FILE_IS_NOT_CORRECT_OR_EXCEEDS_16_MB);
         }
         PluginDO pluginDO = PluginDO.buildPluginDO(pluginDTO);
         if (pluginMapper.insertSelective(pluginDO) > 0) {
@@ -245,7 +250,7 @@ public class PluginServiceImpl implements PluginService {
     private String update(final PluginDTO pluginDTO) {
         Assert.isNull(pluginMapper.nameExistedExclude(pluginDTO.getName(), 
Collections.singletonList(pluginDTO.getId())), 
AdminConstants.PLUGIN_NAME_IS_EXIST);
         if (!Objects.isNull(pluginDTO.getFile())) {
-            Assert.isTrue(checkFile(pluginDTO.getFile()), 
AdminConstants.THE_PLUGIN_JAR_FILE_IS_NOT_CORRECT_OR_EXCEEDS_16_MB);
+            Assert.isTrue(checkFile(Base64.decode(pluginDTO.getFile())), 
AdminConstants.THE_PLUGIN_JAR_FILE_IS_NOT_CORRECT_OR_EXCEEDS_16_MB);
         }
         final PluginDO before = pluginMapper.selectById(pluginDTO.getId());
         PluginDO pluginDO = PluginDO.buildPluginDO(pluginDTO);
@@ -262,12 +267,14 @@ public class PluginServiceImpl implements PluginService {
      * @param file jar file
      * @return true is right
      */
-    private boolean checkFile(final MultipartFile file) {
+    private boolean checkFile(final byte[] file) {
         try {
-            if (file.getSize() > 16 * Constants.BYTES_PER_MB) {
+            // Check if the file size is greater than 16 megabytes
+            if (file.length > 16 * Constants.BYTES_PER_MB) {
+                LogUtils.warn(LOG, "File size is {}MB larger than 16MB", 
file.length / Constants.BYTES_PER_MB);
                 return false;
             }
-            Set<String> dependencyTree = 
JarDependencyUtils.getDependencyTree(file.getBytes());
+            Set<String> dependencyTree = 
JarDependencyUtils.getDependencyTree(file);
             return 
dependencyTree.contains(AdminConstants.PLUGIN_ABSTRACR_PATH) || 
dependencyTree.contains(AdminConstants.PLUGIN_INTERFACE_PATH);
         } catch (Exception e) {
             LogUtils.error(LOG, "check plugin jar error:{}", e.getMessage());
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/PluginTransfer.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/PluginTransfer.java
index ccc833125f..5be88ffc3d 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/PluginTransfer.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/PluginTransfer.java
@@ -69,6 +69,7 @@ public enum PluginTransfer {
                         .role(v.getRole())
                         .enabled(v.getEnabled())
                         .sort(v.getSort())
+                        .pluginJar(v.getFile())
                         .build())
                 .orElse(null);
     }
diff --git a/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
index 632502cd10..00af460957 100644
--- a/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
@@ -359,6 +359,9 @@
             <if test="enabled != null">
                 enabled = #{enabled, jdbcType=TINYINT},
             </if>
+            <if test="pluginJar != null">
+                plugin_jar = #{pluginJar, jdbcType=BLOB}
+            </if>
         </set>
         WHERE id = #{id, jdbcType=VARCHAR}
     </update>
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 39a8d90b78..ed74a832c6 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
@@ -52,6 +52,7 @@ import 
org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.Collections;
 import java.util.List;
 
@@ -91,7 +92,7 @@ public final class PluginControllerTest {
                 .setControllerAdvice(new ExceptionHandlers(null))
                 .build();
         this.pluginVO = new PluginVO("123", "1", "t_n", "1", 1, true,
-                DateUtils.localDateTimeToString(LocalDateTime.now()), 
DateUtils.localDateTimeToString(LocalDateTime.now()));
+                DateUtils.localDateTimeToString(LocalDateTime.now()), 
DateUtils.localDateTimeToString(LocalDateTime.now()), "");
         
SpringBeanUtils.getInstance().setApplicationContext(mock(ConfigurableApplicationContext.class));
 
     }
@@ -144,17 +145,17 @@ public final class PluginControllerTest {
         pluginDTO.setEnabled(true);
         pluginDTO.setRole("1");
         pluginDTO.setSort(100);
-        pluginDTO.setFile(file);
+        pluginDTO.setFile(Base64.getEncoder().encodeToString(file.getBytes()));
         
when(SpringBeanUtils.getInstance().getBean(PluginMapper.class)).thenReturn(pluginMapper);
         when(pluginMapper.existed(pluginDTO.getId())).thenReturn(false);
         
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(ShenyuResultMessage.CREATE_SUCCESS);
 
         this.mockMvc.perform(MockMvcRequestBuilders.multipart("/plugin")
-                        .file(file)
                         .param("name", pluginDTO.getName())
                         .param("enabled", 
String.valueOf(pluginDTO.getEnabled()))
                         .param("role", pluginDTO.getRole())
-                        .param("sort", String.valueOf(pluginDTO.getSort())))
+                        .param("sort", String.valueOf(pluginDTO.getSort()))
+                        .param("file", pluginDTO.getFile()))
                 .andExpect(status().isOk())
                 .andExpect(jsonPath("$.message", 
is(ShenyuResultMessage.CREATE_SUCCESS)))
                 .andReturn();
@@ -163,7 +164,7 @@ public final class PluginControllerTest {
         when(pluginMapper.existed(pluginDTO.getId())).thenReturn(true);
         
given(this.pluginService.createOrUpdate(pluginDTO)).willReturn(ShenyuResultMessage.UPDATE_SUCCESS);
         this.mockMvc.perform(MockMvcRequestBuilders.multipart("/plugin")
-                        .file(file)
+                        .param("file", pluginDTO.getFile())
                         .param("id", pluginDTO.getId())
                         .param("name", pluginDTO.getName())
                         .param("enabled", 
String.valueOf(pluginDTO.getEnabled()))
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
index 039f2a0e5d..53009a8bc0 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
@@ -194,7 +194,8 @@ public final class SyncDataServiceTest {
                 null,
                 true,
                 dateTime,
-                dateTime
+                dateTime,
+                ""
         );
     }
 }
diff --git 
a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/JarDependencyUtils.java
 
b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/JarDependencyUtils.java
index 3e3f0cea48..13171714e7 100644
--- 
a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/JarDependencyUtils.java
+++ 
b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/JarDependencyUtils.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.common.utils;
 
+import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.exception.ShenyuException;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.Opcodes;
@@ -79,7 +80,7 @@ public class JarDependencyUtils {
 
         } catch (Exception e) {
             LOG.error("get dependency tree error", e);
-            throw new ShenyuException(e);
+            throw new 
ShenyuException(AdminConstants.THE_PLUGIN_JAR_FILE_IS_NOT_CORRECT_OR_EXCEEDS_16_MB);
         }
     }
 

Reply via email to