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);
}
}