From 718bb4422e95aaba730f6741340f020a5a54fca1 Mon Sep 17 00:00:00 2001 From: midnight2104 Date: Wed, 10 Nov 2021 19:24:38 +0800 Subject: [PATCH 1/7] refactor shenyu-common: code polish --- .../apache/shenyu/common/utils/DateUtils.java | 9 +-- .../apache/shenyu/common/utils/GsonUtils.java | 27 ++++---- .../apache/shenyu/common/utils/IpUtils.java | 61 +++++++++---------- .../shenyu/common/utils/PathMatchUtils.java | 2 +- .../shenyu/common/utils/ReflectUtils.java | 3 +- .../apache/shenyu/common/utils/SignUtils.java | 2 +- .../common/utils/UpstreamCheckUtils.java | 8 +++ .../shenyu/common/utils/VersionUtils.java | 2 +- 8 files changed, 61 insertions(+), 53 deletions(-) diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/DateUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/DateUtils.java index 4a6411fce71c..1bff66e09af6 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/DateUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/DateUtils.java @@ -33,11 +33,11 @@ public class DateUtils { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT_DATETIME); /** - * parseLocalDateTime. - * out put format:yyyy-MM-dd HH:mm:ss + * parse LocalDateTime. + * out put format: yyyy-MM-dd HH:mm:ss * * @param dataTime date String - * @return yyyy -MM-dd HH:mm:ss + * @return LocalDateTime: yyyy-MM-dd HH:mm:ss * @see LocalDateTime */ public static LocalDateTime parseLocalDateTime(final String dataTime) { @@ -60,7 +60,8 @@ public static LocalDateTime parseLocalDateTime(final String dataTime, final Stri * * @param start this is start date. * @param end this is start date. - * @return The number of days between start and end, if end is after start, returns a positive number, otherwise returns a negative number + * @return The number of days between start and end, if end is after start, + * returns a positive number, otherwise returns a negative number. */ public static long acquireMinutesBetween(final LocalDateTime start, final LocalDateTime end) { return start.until(end, ChronoUnit.MINUTES); diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java index 65d42cc12516..58fe9b2dd11e 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java @@ -31,6 +31,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.shenyu.common.constant.Constants; @@ -95,7 +96,7 @@ public class GsonUtils { private static final String AND = "&"; /** - * Gets gson instance. + * Get gson instance. * * @return the instance */ @@ -104,7 +105,7 @@ public static Gson getGson() { } /** - * Gets instance. + * Get instance. * * @return the instance */ @@ -147,7 +148,7 @@ public T fromJson(final JsonElement jsonElement, final Class tClass) { } /** - * From list list. + * From list. * * @param the type parameter * @param json the json @@ -159,7 +160,7 @@ public List fromList(final String json, final Class clazz) { } /** - * From current list list. + * From current list. * * @param the type parameter * @param json the json @@ -171,7 +172,7 @@ public List fromCurrentList(final String json, final Class clazz) { } /** - * toGetParam. + * to Get Param. * * @param json json * @return java.lang.String string @@ -198,7 +199,7 @@ public String toGetParam(final String json) { } /** - * toMap. + * to Map. * * @param json json * @return hashMap map @@ -209,7 +210,7 @@ private Map toStringMap(final String json) { } /** - * toList Map. + * to List Map. * * @param json json * @return hashMap list @@ -220,7 +221,7 @@ public List> toListMap(final String json) { } /** - * To object map map. + * To object map. * * @param json the json * @return the map @@ -231,7 +232,7 @@ public Map toObjectMap(final String json) { } /** - * To object map map. + * To object map. * * @param the class * @param json the json @@ -255,7 +256,7 @@ public Map> toObjectMapList(final String json, final Class toLinkedMultiValueMap(final String js } /** - * Convert to map map. + * Convert to map. * * @param json the json * @return the map @@ -286,7 +287,7 @@ public Map convertToMap(final String json) { Map map = GSON_MAP.fromJson(json, new TypeToken>() { }.getType()); - if (map == null || map.isEmpty()) { + if(MapUtils.isEmpty(map)){ return map; } @@ -382,7 +383,7 @@ public Map deserialize(final JsonElement json, final Type type, final Json * Get JsonElement class type. * * @param element the element - * @return Class class + * @return Class the class */ public Class getType(final JsonElement element) { if (!element.isJsonPrimitive()) { diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/IpUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/IpUtils.java index 31b10af32583..ac6953990b17 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/IpUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/IpUtils.java @@ -23,6 +23,7 @@ import java.net.UnknownHostException; import java.net.SocketException; import java.net.NetworkInterface; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.ArrayList; @@ -46,6 +47,16 @@ public final class IpUtils { */ private static final Pattern NET_CARD_PATTERN = Pattern.compile("(\\d+)$"); + /** + * System env docker host ip. + */ + private static final String SYSTEM_ENV_DOCKER_HOST_IP = "docker_host_ip"; + + /** + * Localhost. + */ + private static final String LOCALHOST = "127.0.0.1"; + private IpUtils() { } @@ -76,7 +87,7 @@ public static String getHost(final String filterHost) { // if the progress works under docker environment // return the host ip about this docker located from environment value - String dockerHostIp = System.getenv("docker_host_ip"); + String dockerHostIp = System.getenv(SYSTEM_ENV_DOCKER_HOST_IP); if (dockerHostIp != null && !"".equals(dockerHostIp)) { return dockerHostIp; } @@ -113,33 +124,25 @@ public static String getHost(final String filterHost) { String priority = System.getProperty("networkInterface.priority", "enp preferList = new ArrayList<>(Arrays.asList(priority.split("<"))); // sort ip - Comparator byName = new Comparator() { - @Override - public int compare(final NetCard card1, final NetCard card2) { - int card1Score = -1; - int card2Score = -1; - for (String pre : preferList) { - if (card1.getName().contains(pre)) { - card1Score = preferList.indexOf(pre); - break; - } + Comparator byName = (card1, card2) -> { + int card1Score = -1; + int card2Score = -1; + for (String pre : preferList) { + if (card1.getName().contains(pre)) { + card1Score = preferList.indexOf(pre); + break; } - for (String pre : preferList) { - if (card2.getName().contains(pre)) { - card2Score = preferList.indexOf(pre); - break; - } + } + for (String pre : preferList) { + if (card2.getName().contains(pre)) { + card2Score = preferList.indexOf(pre); + break; } - return card2Score - card1Score; } + return card2Score - card1Score; }; Comparator byNamePostfix = Comparator.comparing(NetCard::getNamePostfix); - Comparator byIpv4Postfix = new Comparator() { - @Override - public int compare(final NetCard card1, final NetCard card2) { - return card2.getIpv4Postfix() - card1.getIpv4Postfix(); - } - }; + Comparator byIpv4Postfix = (card1, card2) -> card2.getIpv4Postfix() - card1.getIpv4Postfix(); ipv4Result.sort(byName.thenComparing(byNamePostfix).thenComparing(byIpv4Postfix)); ipv6Result.sort(byName.thenComparing(byNamePostfix)); // prefer ipv4 @@ -158,17 +161,17 @@ public int compare(final NetCard card1, final NetCard card2) { hostIp = ipv6Result.get(0).getIp(); } // If failed to find,fall back to localhost - if (hostIp == null) { + if (Objects.isNull(hostIp)) { hostIp = InetAddress.getLocalHost().getHostAddress(); } } catch (SocketException | UnknownHostException ignore) { - hostIp = "127.0.0.1"; + hostIp = LOCALHOST; } return hostIp; } /** - * Judge whether 'host'"' is complete. + * Judge whether host is complete. * * @param host host ip * @return boolean @@ -249,9 +252,6 @@ private static class NetCard implements Serializable { private Integer ipv4Postfix; - NetCard() { - } - NetCard(final String ip, final String name, final Integer namePostfix) { this.ip = ip; this.name = name; @@ -293,8 +293,5 @@ public void setNamePostfix(final Integer namePostfix) { this.namePostfix = namePostfix; } - public void setIpv4Postfix(final Integer ipv4Postfix) { - this.ipv4Postfix = ipv4Postfix; - } } } diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/PathMatchUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/PathMatchUtils.java index 42fc361a1599..9a3fdfe47083 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/PathMatchUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/PathMatchUtils.java @@ -30,7 +30,7 @@ public class PathMatchUtils { /** * Match boolean. * - * @param matchUrls the ignore urls + * @param matchUrls to ignore urls * @param path the path * @return the boolean */ diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/ReflectUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/ReflectUtils.java index e0ccdf2d6740..f7523ec3639d 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/ReflectUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/ReflectUtils.java @@ -38,7 +38,7 @@ public class ReflectUtils { private static final Logger LOG = LoggerFactory.getLogger(ReflectUtils.class); /** - * Gets field. + * Get field. * * @param beanClass the bean class * @param name the name @@ -166,6 +166,7 @@ private static Field getAccessibleField(final Object obj, final String fieldName } catch (NoSuchFieldException e) { // Field is not defined in the current class and continues to transition up // new add + LOG.error("field is not defined in the current class and continues to transition up", e); } } return null; diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/SignUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/SignUtils.java index 5b7d5e74f438..2aad3580888a 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/SignUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/SignUtils.java @@ -74,7 +74,7 @@ public static String generateSign(final String signKey, final Map params, final String signKey) { return Objects.equals(sign, generateSign(signKey, params)); diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/UpstreamCheckUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/UpstreamCheckUtils.java index 6fb6582e3ea2..5e33dd6f11b3 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/UpstreamCheckUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/UpstreamCheckUtils.java @@ -19,6 +19,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.shenyu.common.constant.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.InetSocketAddress; @@ -35,6 +37,11 @@ public class UpstreamCheckUtils { private static final int DEFAULT_TIMEOUT = 3000; + /** + * logger. + */ + private static final Logger LOG = LoggerFactory.getLogger(UpstreamCheckUtils.class); + /** * Check url boolean. * @@ -72,6 +79,7 @@ private static boolean isHostConnector(final String host, final int port, final try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress(host, port), timeout); } catch (IOException e) { + LOG.error("socket connect is error.", e); return false; } return true; diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/VersionUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/VersionUtils.java index d01e3a92ff3c..568054e35d45 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/VersionUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/VersionUtils.java @@ -73,7 +73,7 @@ public static String getVersion(final Class cls, final String defaultVersion) return defaultVersion; } String file = codeSource.getLocation().getFile(); - if (file != null && file.length() > 0 && file.endsWith(JAR)) { + if (file != null && file.endsWith(JAR)) { file = file.substring(0, file.length() - 4); int i = file.lastIndexOf('/'); if (i >= 0) { From 9f9ffa898add530776a1c243f210124ea0cf50ee Mon Sep 17 00:00:00 2001 From: midnight2104 Date: Wed, 10 Nov 2021 19:27:14 +0800 Subject: [PATCH 2/7] refactor shenyu-common: code polish --- .../apache/shenyu/common/utils/GsonUtils.java | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java index 58fe9b2dd11e..ee7aa9cf6878 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/utils/GsonUtils.java @@ -94,7 +94,7 @@ public class GsonUtils { private static final String EQUAL_SIGN = "="; private static final String AND = "&"; - + /** * Get gson instance. * @@ -103,7 +103,7 @@ public class GsonUtils { public static Gson getGson() { return GsonUtils.GSON; } - + /** * Get instance. * @@ -112,7 +112,7 @@ public static Gson getGson() { public static GsonUtils getInstance() { return INSTANCE; } - + /** * To json string. * @@ -122,55 +122,55 @@ public static GsonUtils getInstance() { public String toJson(final Object object) { return GSON.toJson(object); } - + /** * From json t. * - * @param the type parameter - * @param json the json + * @param the type parameter + * @param json the json * @param tClass the t class * @return the t */ public T fromJson(final String json, final Class tClass) { return GSON.fromJson(json, tClass); } - + /** * From json t. * - * @param the type parameter + * @param the type parameter * @param jsonElement the json element - * @param tClass the t class + * @param tClass the t class * @return the t */ public T fromJson(final JsonElement jsonElement, final Class tClass) { return GSON.fromJson(jsonElement, tClass); } - + /** * From list. * - * @param the type parameter - * @param json the json + * @param the type parameter + * @param json the json * @param clazz the clazz * @return the list */ public List fromList(final String json, final Class clazz) { return GSON.fromJson(json, TypeToken.getParameterized(List.class, clazz).getType()); } - + /** * From current list. * - * @param the type parameter - * @param json the json + * @param the type parameter + * @param json the json * @param clazz the clazz * @return the list */ public List fromCurrentList(final String json, final Class clazz) { return GSON.fromJson(json, TypeToken.getParameterized(CopyOnWriteArrayList.class, clazz).getType()); } - + /** * to Get Param. * @@ -208,7 +208,7 @@ private Map toStringMap(final String json) { return GSON.fromJson(json, new TypeToken>() { }.getType()); } - + /** * to List Map. * @@ -219,7 +219,7 @@ public List> toListMap(final String json) { return GSON.fromJson(json, new TypeToken>>() { }.getType()); } - + /** * To object map. * @@ -230,31 +230,31 @@ public Map toObjectMap(final String json) { return GSON_MAP.fromJson(json, new TypeToken>() { }.getType()); } - + /** * To object map. * - * @param the class - * @param json the json + * @param the class + * @param json the json * @param clazz the class * @return the map */ public Map toObjectMap(final String json, final Class clazz) { return GSON.fromJson(json, TypeToken.getParameterized(Map.class, String.class, clazz).getType()); } - + /** * To object map list. * - * @param the class - * @param json the json + * @param the class + * @param json the json * @param clazz the class * @return the map */ public Map> toObjectMapList(final String json, final Class clazz) { return GSON.fromJson(json, TypeToken.getParameterized(Map.class, String.class, TypeToken.getParameterized(List.class, clazz).getType()).getType()); } - + /** * To tree map. * @@ -265,7 +265,7 @@ public ConcurrentNavigableMap toTreeMap(final String json) { return GSON_MAP.fromJson(json, new TypeToken>() { }.getType()); } - + /** * To linked multiValue map. * @@ -276,7 +276,7 @@ public LinkedMultiValueMap toLinkedMultiValueMap(final String js return GSON.fromJson(json, new TypeToken>() { }.getType()); } - + /** * Convert to map. * @@ -287,7 +287,7 @@ public Map convertToMap(final String json) { Map map = GSON_MAP.fromJson(json, new TypeToken>() { }.getType()); - if(MapUtils.isEmpty(map)){ + if (MapUtils.isEmpty(map)) { return map; } @@ -378,7 +378,7 @@ public Map deserialize(final JsonElement json, final Type type, final Json return resultMap; } - + /** * Get JsonElement class type. * From c54eb99640996c08c88be1c2da47eafd9ef31797 Mon Sep 17 00:00:00 2001 From: midnight2104 Date: Thu, 11 Nov 2021 13:41:53 +0800 Subject: [PATCH 3/7] refactor shenyu-data-sync-center: code polish --- .../data/consul/ConsulSyncDataService.java | 25 ++++--- .../shenyu/sync/data/etcd/EtcdClient.java | 71 ++++++++----------- .../sync/data/etcd/EtcdSyncDataService.java | 34 ++++++--- .../sync/data/http/HttpSyncDataService.java | 21 ++++-- .../http/refresh/AbstractDataRefresh.java | 18 +++-- .../data/nacos/handler/NacosCacheHandler.java | 8 +-- .../websocket/WebsocketSyncDataService.java | 2 + .../zookeeper/ZookeeperSyncDataService.java | 14 +++- 8 files changed, 112 insertions(+), 81 deletions(-) diff --git a/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java b/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java index e11e0551f863..1458047e1fed 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java +++ b/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java @@ -35,6 +35,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -45,7 +46,7 @@ */ public class ConsulSyncDataService extends ConsulCacheHandler implements AutoCloseable, SyncDataService { /** - * logger. + * logger. */ private static final Logger LOG = LoggerFactory.getLogger(ConsulSyncDataService.class); @@ -57,9 +58,9 @@ public class ConsulSyncDataService extends ConsulCacheHandler implements AutoClo private ScheduledFuture watchFuture; - private ConsulConfig consulConfig; + private final ConsulConfig consulConfig; - private ConsulClient consulClient; + private final ConsulClient consulClient; private final AtomicBoolean running = new AtomicBoolean(false); @@ -70,12 +71,16 @@ public class ConsulSyncDataService extends ConsulCacheHandler implements AutoClo * @param metaDataSubscribers the meta data subscribers * @param authDataSubscribers the auth data subscribers */ - public ConsulSyncDataService(final ConsulClient consulClient, final ConsulConfig consulConfig, final PluginDataSubscriber pluginDataSubscriber, - final List metaDataSubscribers, final List authDataSubscribers) { + public ConsulSyncDataService(final ConsulClient consulClient, + final ConsulConfig consulConfig, + final PluginDataSubscriber pluginDataSubscriber, + final List metaDataSubscribers, + final List authDataSubscribers) { super(pluginDataSubscriber, metaDataSubscribers, authDataSubscribers); this.consulClient = consulClient; this.consulConfig = consulConfig; - this.executor = new ScheduledThreadPoolExecutor(1, ShenyuThreadFactory.create("consul-config-watch", true)); + this.executor = new ScheduledThreadPoolExecutor(1, + ShenyuThreadFactory.create("consul-config-watch", true)); consulIndexes.put(ConsulConstants.SYNC_PRE_FIX, 0L); initUpdateMap(); start(); @@ -97,19 +102,19 @@ private void watchConfigKeyValues() { for (String context : this.consulIndexes.keySet()) { try { Long currentIndex = this.consulIndexes.get(context); - if (currentIndex == null) { + if (Objects.isNull(currentIndex)) { currentIndex = ConsulConstants.INIT_CONFIG_VERSION_INDEX; } Response> response = this.consulClient.getKVValues(context, null, new QueryParams(consulConfig.getWaitTime(), currentIndex)); - if (response.getValue() == null || response.getValue().isEmpty()) { + if (Objects.isNull(response.getValue()) || response.getValue().isEmpty()) { if (LOG.isTraceEnabled()) { LOG.trace("No value for context " + context); } continue; } Long newIndex = response.getConsulIndex(); - if (newIndex == null || newIndex.equals(currentIndex)) { + if (Objects.isNull(newIndex) || Objects.equals(newIndex, currentIndex)) { if (LOG.isTraceEnabled()) { LOG.trace("Same index for context " + context); } @@ -152,7 +157,7 @@ public void start() { @Override public void close() { - if (this.running.compareAndSet(true, false) && this.watchFuture != null) { + if (this.running.compareAndSet(true, false) && Objects.nonNull(this.watchFuture)) { this.watchFuture.cancel(true); } } diff --git a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java index ab5f537cca6a..3480424d689c 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java +++ b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java @@ -25,6 +25,7 @@ import io.etcd.jetcd.options.GetOption; import io.etcd.jetcd.options.WatchOption; import io.etcd.jetcd.watch.WatchEvent; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,7 +75,12 @@ public String get(final String key) { } catch (InterruptedException | ExecutionException e) { LOG.error(e.getMessage(), e); } - return keyValues.isEmpty() ? null : keyValues.iterator().next().getValue().toString(StandardCharsets.UTF_8); + + if (CollectionUtils.isEmpty(keyValues)) { + return null; + } + + return keyValues.iterator().next().getValue().toString(StandardCharsets.UTF_8); } /** @@ -88,9 +94,21 @@ public String get(final String key) { */ public List getChildrenKeys(final String prefix, final String separator) throws ExecutionException, InterruptedException { ByteSequence prefixByteSequence = ByteSequence.from(prefix, StandardCharsets.UTF_8); - GetOption getOption = GetOption.newBuilder().withPrefix(prefixByteSequence).withSortField(GetOption.SortTarget.KEY).withSortOrder(GetOption.SortOrder.ASCEND).build(); - List keyValues = client.getKVClient().get(prefixByteSequence, getOption).get().getKvs(); - return keyValues.stream().map(e -> getSubNodeKeyName(prefix, e.getKey().toString(StandardCharsets.UTF_8), separator)).distinct().collect(Collectors.toList()); + GetOption getOption = GetOption.newBuilder() + .withPrefix(prefixByteSequence) + .withSortField(GetOption.SortTarget.KEY) + .withSortOrder(GetOption.SortOrder.ASCEND) + .build(); + + List keyValues = client.getKVClient() + .get(prefixByteSequence, getOption) + .get() + .getKvs(); + + return keyValues.stream() + .map(e -> getSubNodeKeyName(prefix, e.getKey().toString(StandardCharsets.UTF_8), separator)) + .distinct() + .collect(Collectors.toList()); } private String getSubNodeKeyName(final String prefix, final String fullPath, final String separator) { @@ -98,39 +116,6 @@ private String getSubNodeKeyName(final String prefix, final String fullPath, fin return pathWithoutPrefix.contains(separator) ? pathWithoutPrefix.substring(1) : pathWithoutPrefix; } - /** - * update value of node. - * - * @param key node name - * @param value node value - * @throws ExecutionException the exception - * @throws InterruptedException the exception - */ - public void put(final String key, final String value) throws ExecutionException, InterruptedException { - client.getKVClient().put(ByteSequence.from(key, StandardCharsets.UTF_8), ByteSequence.from(value, StandardCharsets.UTF_8)).get(); - } - - /** - * delete node. - * - * @param key node name - */ - public void delete(final String key) { - client.getKVClient().delete(ByteSequence.from(key, StandardCharsets.UTF_8)); - } - - /** - * delete node of recursive. - * - * @param key parent node name - */ - public void deleteRecursive(final String key) { - DeleteOption option = DeleteOption.newBuilder() - .withPrefix(ByteSequence.from(key, StandardCharsets.UTF_8)) - .build(); - client.getKVClient().delete(ByteSequence.from(key, StandardCharsets.UTF_8), option); - } - /** * subscribe data change. * @@ -138,7 +123,9 @@ public void deleteRecursive(final String key) { * @param updateHandler node value handler of update * @param deleteHandler node value handler of delete */ - public void watchDataChange(final String key, final BiConsumer updateHandler, final Consumer deleteHandler) { + public void watchDataChange(final String key, + final BiConsumer updateHandler, + final Consumer deleteHandler) { Watch.Listener listener = watch(updateHandler, deleteHandler); Watch.Watcher watch = client.getWatchClient().watch(ByteSequence.from(key, StandardCharsets.UTF_8), listener); watchCache.put(key, watch); @@ -151,7 +138,9 @@ public void watchDataChange(final String key, final BiConsumer u * @param updateHandler sub node handler of update * @param deleteHandler sub node delete of delete */ - public void watchChildChange(final String key, final BiConsumer updateHandler, final Consumer deleteHandler) { + public void watchChildChange(final String key, + final BiConsumer updateHandler, + final Consumer deleteHandler) { Watch.Listener listener = watch(updateHandler, deleteHandler); WatchOption option = WatchOption.newBuilder() .withPrefix(ByteSequence.from(key, StandardCharsets.UTF_8)) @@ -160,7 +149,8 @@ public void watchChildChange(final String key, final BiConsumer watchCache.put(key, watch); } - private Watch.Listener watch(final BiConsumer updateHandler, final Consumer deleteHandler) { + private Watch.Listener watch(final BiConsumer updateHandler, + final Consumer deleteHandler) { return Watch.listener(response -> { for (WatchEvent event : response.getEvents()) { String path = event.getKeyValue().getKey().toString(StandardCharsets.UTF_8); @@ -180,6 +170,7 @@ private Watch.Listener watch(final BiConsumer updateHandler, fin /** * cancel subscribe. + * * @param key node name */ public void watchClose(final String key) { diff --git a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java index 27e61f0430b5..1a556a8f3521 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java +++ b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java @@ -40,6 +40,7 @@ import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.concurrent.ExecutionException; @@ -69,8 +70,10 @@ public class EtcdSyncDataService implements SyncDataService, AutoCloseable { * @param metaDataSubscribers the meta data subscribers * @param authDataSubscribers the auth data subscribers */ - public EtcdSyncDataService(final EtcdClient etcdClient, final PluginDataSubscriber pluginDataSubscriber, - final List metaDataSubscribers, final List authDataSubscribers) { + public EtcdSyncDataService(final EtcdClient etcdClient, + final PluginDataSubscriber pluginDataSubscriber, + final List metaDataSubscribers, + final List authDataSubscribers) { this.etcdClient = etcdClient; this.pluginDataSubscriber = pluginDataSubscriber; this.metaDataSubscribers = metaDataSubscribers; @@ -206,22 +209,26 @@ private void deletePlugin(final String pluginName) { } private void subscribeSelectorDataChanges(final String path) { - etcdClient.watchDataChange(path, (updateNode, updateValue) -> cacheSelectorData(updateValue), + etcdClient.watchDataChange(path, + (updateNode, updateValue) -> cacheSelectorData(updateValue), this::unCacheSelectorData); } private void subscribeRuleDataChanges(final String path) { - etcdClient.watchDataChange(path, (updatePath, updateValue) -> cacheRuleData(updateValue), + etcdClient.watchDataChange(path, + (updatePath, updateValue) -> cacheRuleData(updateValue), this::unCacheRuleData); } private void subscribeAppAuthDataChanges(final String realPath) { - etcdClient.watchDataChange(realPath, (updatePath, updateValue) -> cacheAuthData(updateValue), + etcdClient.watchDataChange(realPath, + (updatePath, updateValue) -> cacheAuthData(updateValue), this::unCacheAuthData); } private void subscribeMetaDataChanges(final String realPath) { - etcdClient.watchDataChange(realPath, (updatePath, updateValue) -> cacheMetaData(updateValue), + etcdClient.watchDataChange(realPath, + (updatePath, updateValue) -> cacheMetaData(updateValue), this::deleteMetaData); } @@ -234,7 +241,7 @@ private void deleteMetaData(final String deletePath) { unCacheMetaData(metaData); etcdClient.watchClose(path); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + LOG.error("delete meta data error.", e); } } @@ -272,17 +279,20 @@ private void unCacheRuleData(final String dataPath) { final String str = dataPath.substring(DefaultPathConstants.RULE_PARENT.length()); final String pluginName = str.substring(1, str.length() - substring.length() - 1); final List list = Lists.newArrayList(Splitter.on(DefaultPathConstants.SELECTOR_JOIN_RULE).split(substring)); + RuleData ruleData = new RuleData(); ruleData.setPluginName(pluginName); ruleData.setSelectorId(list.get(0)); ruleData.setId(list.get(1)); + Optional.ofNullable(pluginDataSubscriber).ifPresent(e -> e.unRuleSubscribe(ruleData)); etcdClient.watchClose(dataPath); } private void cacheAuthData(final String dataString) { final AppAuthData appAuthData = GsonUtils.getInstance().fromJson(dataString, AppAuthData.class); - Optional.ofNullable(appAuthData).ifPresent(data -> authDataSubscribers.forEach(e -> e.onSubscribe(data))); + Optional.ofNullable(appAuthData) + .ifPresent(data -> authDataSubscribers.forEach(e -> e.onSubscribe(data))); } private void unCacheAuthData(final String dataPath) { @@ -295,11 +305,13 @@ private void unCacheAuthData(final String dataPath) { private void cacheMetaData(final String dataString) { final MetaData metaData = GsonUtils.getInstance().fromJson(dataString, MetaData.class); - Optional.ofNullable(metaData).ifPresent(data -> metaDataSubscribers.forEach(e -> e.onSubscribe(metaData))); + Optional.ofNullable(metaData) + .ifPresent(data -> metaDataSubscribers.forEach(e -> e.onSubscribe(metaData))); } private void unCacheMetaData(final MetaData metaData) { - Optional.ofNullable(metaData).ifPresent(data -> metaDataSubscribers.forEach(e -> e.unSubscribe(metaData))); + Optional.ofNullable(metaData) + .ifPresent(data -> metaDataSubscribers.forEach(e -> e.unSubscribe(metaData))); } private String buildRealPath(final String parent, final String children) { @@ -317,7 +329,7 @@ private List etcdClientGetChildren(final String parent) { @Override public void close() { - if (null != etcdClient) { + if (Objects.nonNull(etcdClient)) { etcdClient.close(); } } diff --git a/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java b/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java index 2f1668d657b4..0d4931d423c4 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java +++ b/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java @@ -50,6 +50,7 @@ import java.time.Duration; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -71,6 +72,16 @@ public class HttpSyncDataService implements SyncDataService, AutoCloseable { private static final Gson GSON = new Gson(); + /** + * shenyu admin path configs fetch + */ + private static final String SHENYU_ADMIN_PATH_CONFIGS_FETCH = "/configs/fetch"; + + /** + * shenyu admin path configs listener + */ + private static final String SHENYU_ADMIN_PATH_CONFIGS_LISTENER = "/configs/listener"; + /** * default: 10s. */ @@ -142,7 +153,7 @@ private void doFetchGroupConfig(final String server, final ConfigGroupEnum... gr for (ConfigGroupEnum groupKey : groups) { params.append("groupKeys").append("=").append(groupKey.name()).append("&"); } - String url = server + "/configs/fetch?" + StringUtils.removeEnd(params.toString(), "&"); + String url = server + SHENYU_ADMIN_PATH_CONFIGS_FETCH + "?" + StringUtils.removeEnd(params.toString(), "&"); LOG.info("request configs: [{}]", url); String json = null; try { @@ -189,8 +200,9 @@ private void doLongPolling(final String server) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity httpEntity = new HttpEntity(params, headers); - String listenerUrl = server + "/configs/listener"; + String listenerUrl = server + SHENYU_ADMIN_PATH_CONFIGS_LISTENER; LOG.debug("request listener configs: [{}]", listenerUrl); + JsonArray groupJson = null; try { String json = this.httpClient.postForEntity(listenerUrl, httpEntity, String.class).getBody(); @@ -200,7 +212,8 @@ private void doLongPolling(final String server) { String message = String.format("listener configs fail, server:[%s], %s", server, e.getMessage()); throw new ShenyuException(message, e); } - if (groupJson != null) { + + if (Objects.nonNull(groupJson)) { // fetch group configuration async. ConfigGroupEnum[] changedGroups = GSON.fromJson(groupJson, ConfigGroupEnum[].class); if (ArrayUtils.isNotEmpty(changedGroups)) { @@ -213,7 +226,7 @@ private void doLongPolling(final String server) { @Override public void close() throws Exception { RUNNING.set(false); - if (executor != null) { + if (Objects.nonNull(executor)) { executor.shutdownNow(); // help gc executor = null; diff --git a/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/refresh/AbstractDataRefresh.java b/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/refresh/AbstractDataRefresh.java index 26d325219090..6ba66dc7408d 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/refresh/AbstractDataRefresh.java +++ b/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/refresh/AbstractDataRefresh.java @@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory; import java.util.List; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -76,15 +77,18 @@ public abstract class AbstractDataRefresh implements DataRefresh { @Override public Boolean refresh(final JsonObject data) { - boolean updated = false; JsonObject jsonObject = convert(data); - if (null != jsonObject) { - ConfigData result = fromJson(jsonObject); - if (this.updateCacheIfNeed(result)) { - updated = true; - refresh(result.getData()); - } + if (Objects.isNull(jsonObject)) { + return false; + } + + boolean updated = false; + ConfigData result = fromJson(jsonObject); + if (this.updateCacheIfNeed(result)) { + updated = true; + refresh(result.getData()); } + return updated; } diff --git a/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java b/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java index b10864c45bda..f20990db799b 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java +++ b/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java @@ -35,11 +35,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.concurrent.Executor; import java.util.stream.Collectors; @@ -151,7 +147,7 @@ private String getConfigAndSignListener(final String dataId, final Listener list } catch (NacosException e) { LOG.error(e.getMessage(), e); } - if (config == null) { + if (Objects.isNull(config)) { config = "{}"; } return config; diff --git a/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/WebsocketSyncDataService.java b/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/WebsocketSyncDataService.java index 331adfec00e5..72a324b2e36b 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/WebsocketSyncDataService.java +++ b/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/WebsocketSyncDataService.java @@ -65,6 +65,7 @@ public WebsocketSyncDataService(final WebsocketConfig websocketConfig, final List authDataSubscribers) { String[] urls = StringUtils.split(websocketConfig.getUrls(), ","); executor = new ScheduledThreadPoolExecutor(urls.length, ShenyuThreadFactory.create("websocket-connect", true)); + for (String url : urls) { try { clients.add(new ShenyuWebsocketClient(new URI(url), Objects.requireNonNull(pluginDataSubscriber), metaDataSubscribers, authDataSubscribers)); @@ -72,6 +73,7 @@ public WebsocketSyncDataService(final WebsocketConfig websocketConfig, LOG.error("websocket url({}) is error", url, e); } } + try { for (WebSocketClient client : clients) { boolean success = client.connectBlocking(3000, TimeUnit.MILLISECONDS); diff --git a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/main/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataService.java b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/main/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataService.java index 9123b60d2043..f7a1b608e191 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/main/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataService.java +++ b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/main/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataService.java @@ -39,6 +39,7 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -322,7 +323,9 @@ public void handleDataDeleted(final String dataPath) throws UnsupportedEncodingE } private void cachePluginData(final PluginData pluginData) { - Optional.ofNullable(pluginData).flatMap(data -> Optional.ofNullable(pluginDataSubscriber)).ifPresent(e -> e.onSubscribe(pluginData)); + Optional.ofNullable(pluginData) + .flatMap(data -> Optional.ofNullable(pluginDataSubscriber)) + .ifPresent(e -> e.onSubscribe(pluginData)); } private void cacheSelectorData(final SelectorData selectorData) { @@ -338,6 +341,7 @@ private void unCacheSelectorData(final String dataPath) { final String pluginName = str.substring(1, str.length() - selectorId.length() - 1); selectorData.setPluginName(pluginName); selectorData.setId(selectorId); + Optional.ofNullable(pluginDataSubscriber) .ifPresent(e -> e.unSelectorSubscribe(selectorData)); } @@ -353,10 +357,12 @@ private void unCacheRuleData(final String dataPath) { final String str = dataPath.substring(DefaultPathConstants.RULE_PARENT.length()); final String pluginName = str.substring(1, str.length() - substring.length() - 1); final List list = Lists.newArrayList(Splitter.on(DefaultPathConstants.SELECTOR_JOIN_RULE).split(substring)); + RuleData ruleData = new RuleData(); ruleData.setPluginName(pluginName); ruleData.setSelectorId(list.get(0)); ruleData.setId(list.get(1)); + Optional.ofNullable(pluginDataSubscriber) .ifPresent(e -> e.unRuleSubscribe(ruleData)); } @@ -383,10 +389,12 @@ private void unCacheMetaData(final MetaData metaData) { .ifPresent(data -> metaDataSubscribers.forEach(e -> e.unSubscribe(metaData))); } - private List addSubscribePath(final List alreadyChildren, final List currentChildren) { + private List addSubscribePath(final List alreadyChildren, + final List currentChildren) { if (CollectionUtils.isEmpty(alreadyChildren)) { return currentChildren; } + return currentChildren.stream() .filter(current -> alreadyChildren.stream().noneMatch(current::equals)) .collect(Collectors.toList()); @@ -405,7 +413,7 @@ private List zkClientGetChildren(final String parent) { @Override public void close() { - if (null != zkClient) { + if (Objects.nonNull(zkClient)) { zkClient.close(); } } From c1ae1fe428dd88346422d4c25e5fa22031f68677 Mon Sep 17 00:00:00 2001 From: midnight2104 Date: Thu, 11 Nov 2021 13:52:35 +0800 Subject: [PATCH 4/7] refactor shenyu-data-sync-center: code polish --- .../org/apache/shenyu/sync/data/etcd/EtcdClient.java | 1 - .../shenyu/sync/data/etcd/EtcdSyncDataService.java | 12 ++++-------- .../shenyu/sync/data/http/HttpSyncDataService.java | 4 ++-- .../sync/data/nacos/handler/NacosCacheHandler.java | 7 ++++++- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java index 3480424d689c..7e3a7c95828a 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java +++ b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdClient.java @@ -21,7 +21,6 @@ import io.etcd.jetcd.KeyValue; import io.etcd.jetcd.Watch; import io.etcd.jetcd.ByteSequence; -import io.etcd.jetcd.options.DeleteOption; import io.etcd.jetcd.options.GetOption; import io.etcd.jetcd.options.WatchOption; import io.etcd.jetcd.watch.WatchEvent; diff --git a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java index 1a556a8f3521..4c2a8b1ef676 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java +++ b/shenyu-sync-data-center/shenyu-sync-data-etcd/src/main/java/org/apache/shenyu/sync/data/etcd/EtcdSyncDataService.java @@ -209,26 +209,22 @@ private void deletePlugin(final String pluginName) { } private void subscribeSelectorDataChanges(final String path) { - etcdClient.watchDataChange(path, - (updateNode, updateValue) -> cacheSelectorData(updateValue), + etcdClient.watchDataChange(path, (updateNode, updateValue) -> cacheSelectorData(updateValue), this::unCacheSelectorData); } private void subscribeRuleDataChanges(final String path) { - etcdClient.watchDataChange(path, - (updatePath, updateValue) -> cacheRuleData(updateValue), + etcdClient.watchDataChange(path, (updatePath, updateValue) -> cacheRuleData(updateValue), this::unCacheRuleData); } private void subscribeAppAuthDataChanges(final String realPath) { - etcdClient.watchDataChange(realPath, - (updatePath, updateValue) -> cacheAuthData(updateValue), + etcdClient.watchDataChange(realPath, (updatePath, updateValue) -> cacheAuthData(updateValue), this::unCacheAuthData); } private void subscribeMetaDataChanges(final String realPath) { - etcdClient.watchDataChange(realPath, - (updatePath, updateValue) -> cacheMetaData(updateValue), + etcdClient.watchDataChange(realPath, (updatePath, updateValue) -> cacheMetaData(updateValue), this::deleteMetaData); } diff --git a/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java b/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java index 0d4931d423c4..e6009b18ca19 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java +++ b/shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java @@ -73,12 +73,12 @@ public class HttpSyncDataService implements SyncDataService, AutoCloseable { private static final Gson GSON = new Gson(); /** - * shenyu admin path configs fetch + * shenyu admin path configs fetch. */ private static final String SHENYU_ADMIN_PATH_CONFIGS_FETCH = "/configs/fetch"; /** - * shenyu admin path configs listener + * shenyu admin path configs listener. */ private static final String SHENYU_ADMIN_PATH_CONFIGS_LISTENER = "/configs/listener"; diff --git a/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java b/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java index f20990db799b..eb9d12345b7e 100644 --- a/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java +++ b/shenyu-sync-data-center/shenyu-sync-data-nacos/src/main/java/org/apache/shenyu/sync/data/nacos/handler/NacosCacheHandler.java @@ -35,7 +35,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.Executor; import java.util.stream.Collectors; From 1cc89aa297c6bba44e636defb30a6ed32f75f295 Mon Sep 17 00:00:00 2001 From: midnight2104 Date: Fri, 12 Nov 2021 14:00:54 +0800 Subject: [PATCH 5/7] refactor shenyu-admin: code polish --- .../service/impl/AppAuthServiceImpl.java | 5 + .../impl/DashboardUserServiceImpl.java | 8 +- .../admin/service/impl/EnumServiceImpl.java | 3 + .../service/impl/MetaDataServiceImpl.java | 15 +-- .../service/impl/PermissionServiceImpl.java | 45 +++++---- .../admin/service/impl/PluginServiceImpl.java | 26 ++++-- .../service/impl/ResourceServiceImpl.java | 36 ++++---- .../admin/service/impl/RoleServiceImpl.java | 46 +++++++--- .../admin/service/impl/RuleServiceImpl.java | 17 ++-- .../service/impl/ShenyuDictServiceImpl.java | 3 +- .../service/impl/SyncDataServiceImpl.java | 27 ++++-- .../service/impl/UpstreamCheckService.java | 91 +++++++++++-------- .../admin/shiro/bean/StatelessAuthFilter.java | 7 +- .../shenyu/admin/shiro/config/ShiroRealm.java | 3 +- .../admin/utils/ShenyuResultMessage.java | 2 - 15 files changed, 208 insertions(+), 126 deletions(-) diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java index 8b9cfdc35de1..1aa859d3d038 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java @@ -169,6 +169,7 @@ public ShenyuAdminResult updateDetail(final AppAuthDTO appAuthDTO) { List authParamDTOList = appAuthDTO.getAuthParamDTOList(); if (CollectionUtils.isNotEmpty(authParamDTOList)) { authParamMapper.deleteByAuthId(appAuthDTO.getId()); + List authParamDOList = authParamDTOList.stream() .map(dto -> AuthParamDO.create(appAuthDTO.getId(), dto.getAppName(), dto.getAppParam())) .collect(Collectors.toList()); @@ -179,13 +180,16 @@ public ShenyuAdminResult updateDetail(final AppAuthDTO appAuthDTO) { List oldAuthPathDOList = authPathMapper.findByAuthId(appAuthDTO.getId()); String appName = oldAuthPathDOList.stream().findFirst() .map(AuthPathDO::getAppName).orElse(StringUtils.EMPTY); + authPathMapper.deleteByAuthId(appAuthDTO.getId()); + List authPathDOList = authPathDTOList.stream() .filter(Objects::nonNull) .map(dto -> AuthPathDO.create(dto.getPath(), appAuthDTO.getId(), appName)) .collect(Collectors.toList()); authPathMapper.batchSave(authPathDOList); } + AppAuthData appAuthData = buildByEntity(appAuthDO); eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.APP_AUTH, DataEventTypeEnum.UPDATE, @@ -202,6 +206,7 @@ public ShenyuAdminResult updateDetailPath(final AuthPathWarpDTO authPathWarpDTO) List authPathDTOList = authPathWarpDTO.getAuthPathDTOList(); if (CollectionUtils.isNotEmpty(authPathDTOList)) { authPathMapper.deleteByAuthId(authPathWarpDTO.getId()); + List collect = authPathDTOList.stream() .filter(Objects::nonNull) .map(authPathDTO -> AuthPathDO.create(authPathDTO.getPath(), appAuthDO.getId(), authPathDTO.getAppName())) 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 d47038bd7c7b..37f2eb882e60 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 @@ -116,12 +116,15 @@ public int createOrUpdate(final DashboardUserDTO dashboardUserDTO) { bindUserRole(dashboardUserDO.getId(), dashboardUserDTO.getRoles()); return dashboardUserMapper.insertSelective(dashboardUserDO); } + if (!AdminConstants.ADMIN_NAME.equals(dashboardUserDTO.getUserName())) { userRoleMapper.deleteByUserId(dashboardUserDTO.getId()); } + if (CollectionUtils.isNotEmpty(dashboardUserDTO.getRoles())) { bindUserRole(dashboardUserDTO.getId(), dashboardUserDTO.getRoles()); } + return dashboardUserMapper.updateSelective(dashboardUserDO); } @@ -213,9 +216,11 @@ public LoginDashboardUserVO login(final String userName, final String password) if (Objects.nonNull(ldapTemplate)) { dashboardUserVO = loginByLdap(userName, password); } + if (Objects.isNull(dashboardUserVO)) { dashboardUserVO = loginByDatabase(userName, password); } + return LoginDashboardUserVO.buildLoginDashboardUserVO(dashboardUserVO) .setToken(JwtUtils.generateToken(dashboardUserVO.getUserName(), dashboardUserVO.getPassword(), jwtProperties.getExpiredSeconds())); @@ -256,8 +261,7 @@ private DashboardUserVO loginByLdap(final String userName, final String password private DashboardUserVO loginByDatabase(final String userName, final String password) { String key = secretProperties.getKey(); String iv = secretProperties.getIv(); - DashboardUserVO dashboardUserVO = findByQuery(userName, AesUtils.aesEncryption(password, key, iv)); - return dashboardUserVO; + return findByQuery(userName, AesUtils.aesEncryption(password, key, iv)); } /** diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/EnumServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/EnumServiceImpl.java index 2189a61c61a6..e82ddc58211f 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/EnumServiceImpl.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/EnumServiceImpl.java @@ -100,9 +100,11 @@ public Map> list() { List redisModeEnums = Arrays.stream(RedisModeEnum.values()) .map(redisModeEnum -> new EnumVO(null, redisModeEnum.getName(), true)) .collect(Collectors.toList()); + List hystrixIsolationModeEnums = Arrays.stream(HystrixIsolationModeEnum.values()) .map(hystrixIsolationModeEnum -> new EnumVO(hystrixIsolationModeEnum.getCode(), hystrixIsolationModeEnum.getName(), true)) .collect(Collectors.toList()); + Map> enums = Maps.newHashMap(); enums.put("httpMethodEnums", httpMethodEnums); enums.put("loadBalanceEnums", loadBalanceEnums); @@ -117,6 +119,7 @@ public Map> list() { enums.put("wafEnums", wafEnums); enums.put("redisModeEnums", redisModeEnums); enums.put("hystrixIsolationModeEnums", hystrixIsolationModeEnums); + return enums; } } 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 a6221bec7017..cf48d3f8b052 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 @@ -97,7 +97,7 @@ public String createOrUpdate(final MetaDataDTO metaDataDTO) { } MetaDataDO metaDataDO = MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO); DataEventTypeEnum eventType; - String pathDesc = metaDataDO.getPathDesc() == null ? "" : metaDataDO.getPathDesc(); + String pathDesc = Objects.isNull(metaDataDO.getPathDesc()) ? "" : metaDataDO.getPathDesc(); if (StringUtils.isEmpty(metaDataDTO.getId())) { Timestamp currentTime = new Timestamp(System.currentTimeMillis()); metaDataDO.setId(UUIDUtils.getInstance().generateShortUuid()); @@ -168,11 +168,10 @@ public MetaDataVO findById(final String id) { @Override @Pageable public CommonPager listByPage(final MetaDataQuery metaDataQuery) { - return PageResultUtils.result(metaDataQuery.getPageParameter(), - () -> metaDataMapper.selectByQuery(metaDataQuery) - .stream() - .map(MetaDataTransfer.INSTANCE::mapToVO) - .collect(Collectors.toList())); + return PageResultUtils.result(metaDataQuery.getPageParameter(), () -> metaDataMapper.selectByQuery(metaDataQuery) + .stream() + .map(MetaDataTransfer.INSTANCE::mapToVO) + .collect(Collectors.toList())); } @Override @@ -216,10 +215,12 @@ private String checkData(final MetaDataDTO metaDataDTO) { LOG.error("metaData create param is error, {}", metaDataDTO); return AdminConstants.PARAMS_ERROR; } + final MetaDataDO exist = metaDataMapper.findByPath(metaDataDTO.getPath()); - if (exist != null && !exist.getId().equals(metaDataDTO.getId())) { + if (Objects.nonNull(exist) && !exist.getId().equals(metaDataDTO.getId())) { return AdminConstants.DATA_PATH_IS_EXIST; } + return StringUtils.EMPTY; } diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java index 74e681404de8..30e45c935674 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java @@ -80,21 +80,24 @@ public PermissionServiceImpl(final DashboardUserMapper dashboardUserMapper, @Override public PermissionMenuVO getPermissionMenu(final String token) { UserInfo userInfo = JwtUtils.getUserInfo(); - if (Objects.nonNull(userInfo)) { - List resourceVOList = getResourceListByUserName(userInfo.getUserName()); - if (CollectionUtils.isNotEmpty(resourceVOList)) { - List menuInfoList = new ArrayList<>(); - resourceService.getMenuInfo(menuInfoList, resourceVOList, null); - return new PermissionMenuVO(menuInfoList, getAuthPerm(resourceVOList), getAllAuthPerms()); - } + if (Objects.isNull(userInfo)) { + return null; } - return null; + + List resourceVOList = getResourceListByUserName(userInfo.getUserName()); + if (CollectionUtils.isEmpty(resourceVOList)) { + return null; + } + + List menuInfoList = new ArrayList<>(); + resourceService.getMenuInfo(menuInfoList, resourceVOList, null); + return new PermissionMenuVO(menuInfoList, getAuthPerm(resourceVOList), getAllAuthPerms()); } /** - * get Auth perm by user name for shiro. + * get Auth perm by username for shiro. * - * @param userName user name. + * @param userName username. * @return {@linkplain Set} */ @Override @@ -109,7 +112,7 @@ public Set getAuthPermByUserName(final String userName) { /** * get resource by username. * - * @param userName user name + * @param userName username * @return {@linkplain List} */ private List getResourceListByUserName(final String userName) { @@ -117,17 +120,20 @@ private List getResourceListByUserName(final String userName) { List roleIds = userRoleDOList.stream().filter(Objects::nonNull) .map(UserRoleDO::getRoleId) .collect(Collectors.toList()); + Set resourceIds = permissionMapper.findByObjectIds(roleIds).stream() .map(PermissionDO::getResourceId) .filter(StringUtils::isNoneBlank) .collect(Collectors.toSet()); - if (CollectionUtils.isNotEmpty(resourceIds)) { - return new ArrayList<>(resourceIds).stream() - .map(resource -> ResourceVO.buildResourceVO(resourceMapper.selectById(resource))) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(resourceIds)) { + return Collections.emptyList(); } - return Collections.emptyList(); + + return new ArrayList<>(resourceIds).stream() + .map(resource -> ResourceVO.buildResourceVO(resourceMapper.selectById(resource))) + .filter(Objects::nonNull) + .collect(Collectors.toList()); } /** @@ -150,7 +156,8 @@ private List getAuthPerm(final List resourceVOList) { */ private List getAllAuthPerms() { return resourceMapper.selectAll().stream() - .filter(item -> item.getResourceType().equals(ResourceTypeConstants.MENU_TYPE_2)) - .map(item -> AuthPerm.buildAuthPerm(ResourceVO.buildResourceVO(item))).collect(Collectors.toList()); + .filter(item -> item.getResourceType().equals(ResourceTypeConstants.MENU_TYPE_2)) + .map(item -> AuthPerm.buildAuthPerm(ResourceVO.buildResourceVO(item))) + .collect(Collectors.toList()); } } 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 71306157cf1d..2c04d2f063ca 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 @@ -112,6 +112,7 @@ public String createOrUpdate(final PluginDTO pluginDTO) { if (StringUtils.isNoneBlank(msg)) { return msg; } + PluginDO pluginDO = PluginDO.buildPluginDO(pluginDTO); DataEventTypeEnum eventType = DataEventTypeEnum.CREATE; if (StringUtils.isBlank(pluginDTO.getId())) { @@ -137,6 +138,7 @@ public String createOrUpdate(final PluginDTO pluginDTO) { @Override @Transactional(rollbackFor = Exception.class) public String delete(final List ids) { + // 1. select plugin id. List plugins = Optional.ofNullable(this.pluginMapper.selectByIds(ids)) .orElse(Collections.emptyList()); final List pluginIds = plugins.stream() @@ -144,11 +146,13 @@ public String delete(final List ids) { if (CollectionUtils.isEmpty(pluginIds)) { return AdminConstants.SYS_PLUGIN_ID_NOT_EXIST; } - // delete plugins + + // 2. delete plugins. this.pluginMapper.deleteByIds(pluginIds); - // delete plugin handle + // 3. delete plugin handle. this.pluginHandleMapper.deleteByPluginIds(pluginIds); - // all selectors + + // 4. all selectors. final List selectorIds = Optional.ofNullable(this.selectorMapper.findByPluginIds(pluginIds)) .orElse(Collections.emptyList()) .stream().map(SelectorDO::getId).collect(Collectors.toList()); @@ -159,20 +163,25 @@ public String delete(final List ids) { this.selectorConditionMapper.deleteBySelectorIds(selectorIds); // delete all rules final List ruleIds = Optional.ofNullable(this.ruleMapper.findBySelectorIds(selectorIds)) - .orElse(Collections.emptyList()).stream().map(RuleDO::getId).collect(Collectors.toList()); + .orElse(Collections.emptyList()) + .stream() + .map(RuleDO::getId) + .collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(ruleIds)) { this.ruleMapper.deleteByIds(ruleIds); // delete all rule conditions this.ruleConditionMapper.deleteByRuleIds(ruleIds); } } - // delete resource & permission + + // 5. delete resource & permission. final List 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())); } - // publish change event. + + // 6. publish change event. eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.PLUGIN, DataEventTypeEnum.DELETE, plugins.stream().map(PluginTransfer.INSTANCE::mapToData).collect(Collectors.toList()))); return StringUtils.EMPTY; @@ -198,6 +207,7 @@ public String enabled(final List ids, final Boolean enabled) { pluginMapper.updateEnable(pluginDO); plugins.add(pluginDO); } + // publish change event. if (CollectionUtils.isNotEmpty(plugins)) { eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.PLUGIN, DataEventTypeEnum.UPDATE, @@ -248,7 +258,7 @@ public String selectIdByName(final String name) { Objects.requireNonNull(pluginDO); return pluginDO.getId(); } - + /** * Find by name plugin do. * @@ -259,7 +269,7 @@ public String selectIdByName(final String name) { public PluginDO findByName(final String name) { return pluginMapper.selectByName(name); } - + /** * check plugin Data integrity. * diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ResourceServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ResourceServiceImpl.java index c7f240b9b7f0..93e4727a8b20 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ResourceServiceImpl.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ResourceServiceImpl.java @@ -56,7 +56,8 @@ public class ResourceServiceImpl implements ResourceService { private final PermissionMapper permissionMapper; - public ResourceServiceImpl(final ResourceMapper resourceMapper, final PermissionMapper permissionMapper) { + public ResourceServiceImpl(final ResourceMapper resourceMapper, + final PermissionMapper permissionMapper) { this.resourceMapper = resourceMapper; this.permissionMapper = permissionMapper; } @@ -72,7 +73,7 @@ public void createResource(final ResourceDO resourceDO) { } /** - * create or update resource. + * create or update resource. * * @param resourceDTO {@linkplain ResourceDTO} * @return rows int @@ -152,11 +153,10 @@ public List listByTitles(final List titles) { @Override @Pageable public CommonPager listByPage(final ResourceQuery resourceQuery) { - return PageResultUtils.result(resourceQuery.getPageParameter(), - () -> resourceMapper.selectByQuery(resourceQuery) - .stream() - .map(ResourceVO::buildResourceVO) - .collect(Collectors.toList())); + return PageResultUtils.result(resourceQuery.getPageParameter(), () -> resourceMapper.selectByQuery(resourceQuery) + .stream() + .map(ResourceVO::buildResourceVO) + .collect(Collectors.toList())); } /** @@ -167,12 +167,13 @@ public CommonPager listByPage(final ResourceQuery resourceQuery) { @Override public List getMenuTree() { List resourceVOList = resourceMapper.selectAll().stream().map(ResourceVO::buildResourceVO).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(resourceVOList)) { - List menuInfoList = new ArrayList<>(); - getMenuInfo(menuInfoList, resourceVOList, null); - return menuInfoList; + if (CollectionUtils.isEmpty(resourceVOList)) { + return null; } - return null; + + List menuInfoList = new ArrayList<>(); + getMenuInfo(menuInfoList, resourceVOList, null); + return menuInfoList; } /** @@ -192,17 +193,20 @@ public List findByParentId(final String id) { * get Menu Info. * * @param menuInfoList {@linkplain List} menu info. - * @param metaList {@linkplain List} resource list - * @param menuInfo {@linkplain MenuInfo} + * @param metaList {@linkplain List} resource list + * @param menuInfo {@linkplain MenuInfo} */ @Override - public void getMenuInfo(final List menuInfoList, final List metaList, final MenuInfo menuInfo) { + public void getMenuInfo(final List menuInfoList, + final List metaList, + final MenuInfo menuInfo) { for (ResourceVO resourceVO : metaList) { String parentId = resourceVO.getParentId(); MenuInfo tempMenuInfo = MenuInfo.buildMenuInfo(resourceVO); if (ObjectUtils.isEmpty(tempMenuInfo)) { continue; } + if (ObjectUtils.isEmpty(menuInfo) && reactor.util.StringUtils.isEmpty(parentId)) { menuInfoList.add(tempMenuInfo); if (Objects.equals(resourceVO.getIsLeaf(), Boolean.FALSE)) { @@ -221,7 +225,7 @@ public void getMenuInfo(final List menuInfoList, final List deleteResourceIds, final List resourceIds, final List metaList) { diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RoleServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RoleServiceImpl.java index 8bc328a93ae4..4158a3d67818 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RoleServiceImpl.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RoleServiceImpl.java @@ -60,7 +60,9 @@ public class RoleServiceImpl implements RoleService { private final ResourceMapper resourceMapper; - public RoleServiceImpl(final RoleMapper roleMapper, final PermissionMapper permissionMapper, final ResourceMapper resourceMapper) { + public RoleServiceImpl(final RoleMapper roleMapper, + final PermissionMapper permissionMapper, + final ResourceMapper resourceMapper) { this.roleMapper = roleMapper; this.permissionMapper = permissionMapper; this.resourceMapper = resourceMapper; @@ -105,8 +107,9 @@ public int delete(final List ids) { @Override public RoleEditVO findById(final String id) { RoleVO sysRole = RoleVO.buildRoleVO(roleMapper.selectById(id)); - return Optional.ofNullable(sysRole).map(item -> new RoleEditVO(getPermissionIdsByRoleId(item.getId()), item, - getAllPermissions())).orElse(null); + return Optional.ofNullable(sysRole) + .map(item -> new RoleEditVO(getPermissionIdsByRoleId(item.getId()), item, getAllPermissions())) + .orElse(null); } /** @@ -129,8 +132,10 @@ public RoleVO findByQuery(final String roleName) { @Override @Pageable public CommonPager listByPage(final RoleQuery roleQuery) { - return PageResultUtils.result(roleQuery.getPageParameter(), - () -> roleMapper.selectByQuery(roleQuery).stream().map(RoleVO::buildRoleVO).collect(Collectors.toList())); + return PageResultUtils.result(roleQuery.getPageParameter(), () -> roleMapper.selectByQuery(roleQuery) + .stream() + .map(RoleVO::buildRoleVO) + .collect(Collectors.toList())); } /** @@ -140,7 +145,10 @@ public CommonPager listByPage(final RoleQuery roleQuery) { */ @Override public List selectAll() { - return roleMapper.selectAll().stream().map(RoleVO::buildRoleVO).collect(Collectors.toList()); + return roleMapper.selectAll() + .stream() + .map(RoleVO::buildRoleVO) + .collect(Collectors.toList()); } /** @@ -149,8 +157,12 @@ public List selectAll() { * @return {@linkplain PermissionInfo} */ private PermissionInfo getAllPermissions() { - List resourceVOList = resourceMapper.selectAll().stream().map(ResourceVO::buildResourceVO).collect(Collectors.toList()); + List resourceVOList = resourceMapper.selectAll() + .stream() + .map(ResourceVO::buildResourceVO) + .collect(Collectors.toList()); List permissionIds = resourceVOList.stream().map(ResourceVO::getId).collect(Collectors.toList()); + List treeList = new ArrayList<>(); getTreeModelList(treeList, resourceVOList, null); return PermissionInfo.builder().treeList(treeList).permissionIds(permissionIds).build(); @@ -163,17 +175,22 @@ private PermissionInfo getAllPermissions() { * @return {@linkplain List} */ private List getPermissionIdsByRoleId(final String roleId) { - return permissionMapper.findByObjectId(roleId).stream().map(PermissionDO::getResourceId).collect(Collectors.toList()); + return permissionMapper.findByObjectId(roleId) + .stream() + .map(PermissionDO::getResourceId) + .collect(Collectors.toList()); } /** * get menu list. * - * @param treeList {@linkplain ResourceInfo} - * @param metaList {@linkplain ResourceDTO} + * @param treeList {@linkplain ResourceInfo} + * @param metaList {@linkplain ResourceDTO} * @param resourceInfo {@linkplain ResourceInfo} */ - private void getTreeModelList(final List treeList, final List metaList, final ResourceInfo resourceInfo) { + private void getTreeModelList(final List treeList, + final List metaList, + final ResourceInfo resourceInfo) { for (ResourceVO resourceVO : metaList) { String parentId = resourceVO.getParentId(); ResourceInfo resourceInfoItem = ResourceInfo.buildResourceInfo(resourceVO); @@ -195,7 +212,7 @@ private void getTreeModelList(final List treeList, final List getListDiff(final List preList, final List if (CollectionUtils.isEmpty(lastList)) { return null; } + if (CollectionUtils.isEmpty(preList)) { return lastList; } + Map map = preList.stream().distinct() .collect(Collectors.toMap(source -> source, source -> 1)); return lastList.stream().filter(item -> !map.containsKey(item)).collect(Collectors.toList()); @@ -232,7 +251,7 @@ private void deleteByObjectIdAndResourceId(final PermissionQuery permissionQuery /** * manger role permission. * - * @param roleId role id. + * @param roleId role id. * @param currentPermissionList {@linkplain List} current role permission ids */ private void manageRolePermission(final String roleId, final List currentPermissionList) { @@ -241,6 +260,7 @@ private void manageRolePermission(final String roleId, final List curren if (CollectionUtils.isNotEmpty(addPermission)) { batchSavePermission(addPermission.stream().map(node -> PermissionDO.buildPermissionDO(PermissionDTO.builder().objectId(roleId).resourceId(node).build())).collect(Collectors.toList())); } + List deletePermission = getListDiff(currentPermissionList, lastPermissionList); if (CollectionUtils.isNotEmpty(deletePermission)) { deletePermission.forEach(node -> deleteByObjectIdAndResourceId(new PermissionQuery(roleId, node))); 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 b174cbdb551c..6220b21cb1e1 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 @@ -95,6 +95,7 @@ public String registerDefault(final RuleDTO ruleDTO) { if (Objects.nonNull(exist)) { return ""; } + RuleDO ruleDO = RuleDO.buildRuleDO(ruleDTO); List ruleConditions = ruleDTO.getRuleConditions(); if (StringUtils.isEmpty(ruleDTO.getId())) { @@ -236,21 +237,23 @@ private void publishEvent(final RuleDO ruleDO, final List rule } private RuleData buildRuleData(final RuleDO ruleDO) { - // query for conditions - List conditions = ruleConditionMapper.selectByQuery( - new RuleConditionQuery(ruleDO.getId())) - .stream() - .filter(Objects::nonNull) - .map(ConditionTransfer.INSTANCE::mapToRuleDO) - .collect(Collectors.toList()); SelectorDO selectorDO = selectorMapper.selectById(ruleDO.getSelectorId()); if (Objects.isNull(selectorDO)) { return null; } + PluginDO pluginDO = pluginMapper.selectById(selectorDO.getPluginId()); if (Objects.isNull(pluginDO)) { return null; } + + // query for conditions + List conditions = ruleConditionMapper.selectByQuery( + new RuleConditionQuery(ruleDO.getId())) + .stream() + .filter(Objects::nonNull) + .map(ConditionTransfer.INSTANCE::mapToRuleDO) + .collect(Collectors.toList()); return RuleDO.transFrom(ruleDO, pluginDO.getName(), conditions); } } diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ShenyuDictServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ShenyuDictServiceImpl.java index fdb38974a296..2f9b33bd946b 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ShenyuDictServiceImpl.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ShenyuDictServiceImpl.java @@ -17,6 +17,7 @@ package org.apache.shenyu.admin.service.impl; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shenyu.admin.aspect.annotation.Pageable; import org.apache.shenyu.admin.mapper.ShenyuDictMapper; @@ -79,7 +80,7 @@ public Integer deleteShenyuDicts(final List ids) { @Override public Integer enabled(final List ids, final Boolean enabled) { - if (ids == null || ids.isEmpty()) { + if (CollectionUtils.isEmpty(ids)) { return 0; } return shenyuDictMapper.enabled(ids, enabled); 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 23227371ddd9..0ac88602c1e7 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 @@ -83,13 +83,18 @@ public SyncDataServiceImpl(final AppAuthService appAuthService, @Override public boolean syncAll(final DataEventTypeEnum type) { appAuthService.syncData(); + List pluginDataList = pluginService.listAll(); eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.PLUGIN, type, pluginDataList)); + List selectorDataList = selectorService.listAll(); eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, type, selectorDataList)); + List ruleDataList = ruleService.listAll(); eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, type, ruleDataList)); + metaDataService.syncData(); + return true; } @@ -98,16 +103,22 @@ public boolean syncPluginData(final String pluginId) { PluginVO pluginVO = pluginService.findById(pluginId); eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.PLUGIN, DataEventTypeEnum.UPDATE, Collections.singletonList(PluginTransfer.INSTANCE.mapDataTOVO(pluginVO)))); + List selectorDataList = selectorService.findByPluginId(pluginId); - if (CollectionUtils.isNotEmpty(selectorDataList)) { - eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.REFRESH, selectorDataList)); - List allRuleDataList = new ArrayList<>(); - for (SelectorData selectData : selectorDataList) { - List ruleDataList = ruleService.findBySelectorId(selectData.getId()); - allRuleDataList.addAll(ruleDataList); - } - eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, DataEventTypeEnum.REFRESH, allRuleDataList)); + if (CollectionUtils.isEmpty(selectorDataList)) { + return true; } + + eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.REFRESH, selectorDataList)); + + List allRuleDataList = new ArrayList<>(); + for (SelectorData selectData : selectorDataList) { + List ruleDataList = ruleService.findBySelectorId(selectData.getId()); + allRuleDataList.addAll(ruleDataList); + } + + eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, DataEventTypeEnum.REFRESH, allRuleDataList)); + return true; } } diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java index 980fe67abca7..197470c28f70 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java @@ -73,6 +73,8 @@ public class UpstreamCheckService { private static final Set ZOMBIE_SET = Sets.newConcurrentHashSet(); + private static final String REGISTER_TYPE_HTTP = "http"; + private final int zombieCheckTimes; private final int scheduledTime; @@ -88,25 +90,27 @@ public class UpstreamCheckService { private final PluginMapper pluginMapper; private final SelectorConditionMapper selectorConditionMapper; - + private final SelectorHandleConverterFactor converterFactor; private ScheduledThreadPoolExecutor executor; private ScheduledFuture scheduledFuture; - + /** * Instantiates a new Upstream check service. * - * @param selectorMapper the selector mapper - * @param eventPublisher the event publisher - * @param pluginMapper the plugin mapper - * @param selectorConditionMapper the selectorCondition mapper + * @param selectorMapper the selector mapper + * @param eventPublisher the event publisher + * @param pluginMapper the plugin mapper + * @param selectorConditionMapper the selectorCondition mapper * @param shenyuRegisterCenterConfig the shenyu register center config - * @param converterFactor the converter factor + * @param converterFactor the converter factor */ - public UpstreamCheckService(final SelectorMapper selectorMapper, final ApplicationEventPublisher eventPublisher, - final PluginMapper pluginMapper, final SelectorConditionMapper selectorConditionMapper, + public UpstreamCheckService(final SelectorMapper selectorMapper, + final ApplicationEventPublisher eventPublisher, + final PluginMapper pluginMapper, + final SelectorConditionMapper selectorConditionMapper, final ShenyuRegisterCenterConfig shenyuRegisterCenterConfig, final SelectorHandleConverterFactor converterFactor) { this.selectorMapper = selectorMapper; @@ -123,7 +127,7 @@ public UpstreamCheckService(final SelectorMapper selectorMapper, final Applicati setup(); } } - + /** * Set up. */ @@ -134,24 +138,27 @@ public void setup() { scheduledFuture = executor.scheduleWithFixedDelay(this::scheduled, 10, scheduledTime, TimeUnit.SECONDS); } } - + /** * Close relative resource on container destroy. */ @PreDestroy public void close() { - if (Objects.nonNull(scheduledFuture)) { - scheduledFuture.cancel(false); - executor.shutdownNow(); - try { - executor.awaitTermination(5, TimeUnit.SECONDS); - } catch (InterruptedException ex) { - LOG.error("shutdown executor error", ex); - Thread.currentThread().interrupt(); - } + if (Objects.isNull(scheduledFuture)) { + return; } + + scheduledFuture.cancel(false); + executor.shutdownNow(); + try { + executor.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + LOG.error("shutdown executor error", ex); + Thread.currentThread().interrupt(); + } + } - + /** * Remove by key. * @@ -160,17 +167,18 @@ public void close() { public static void removeByKey(final String selectorName) { UPSTREAM_MAP.remove(selectorName); } - + /** * Submit. * - * @param selectorId the selector id + * @param selectorId the selector id * @param commonUpstream the common upstream */ public void submit(final String selectorId, final CommonUpstream commonUpstream) { if (!Constants.DEFAULT_REGISTER_TYPE.equalsIgnoreCase(registerType)) { return; } + if (UPSTREAM_MAP.containsKey(selectorId)) { List upstreams = UPSTREAM_MAP.getOrDefault(selectorId, Collections.emptyList()); Optional exists = upstreams.stream().filter(item -> StringUtils.isNotBlank(item.getUpstreamUrl()) @@ -184,15 +192,15 @@ public void submit(final String selectorId, final CommonUpstream commonUpstream) UPSTREAM_MAP.put(selectorId, Lists.newArrayList(commonUpstream)); } } - + /** * Replace. * - * @param selectorId the selector name + * @param selectorId the selector name * @param commonUpstreams the common upstream list */ public void replace(final String selectorId, final List commonUpstreams) { - if (!"http".equalsIgnoreCase(registerType)) { + if (!REGISTER_TYPE_HTTP.equalsIgnoreCase(registerType)) { return; } UPSTREAM_MAP.put(selectorId, commonUpstreams); @@ -268,20 +276,25 @@ private void updateHandler(final String selectorId, final List u private void updateSelectorHandler(final String selectorId, final List aliveList) { SelectorDO selectorDO = selectorMapper.selectById(selectorId); - if (Objects.nonNull(selectorDO)) { - PluginDO pluginDO = pluginMapper.selectById(selectorDO.getPluginId()); - String handler = converterFactor.newInstance(pluginDO.getName()).handler(selectorDO.getHandle(), aliveList); - selectorDO.setHandle(handler); - selectorMapper.updateSelective(selectorDO); - List conditionDataList = ConditionTransfer.INSTANCE.mapToSelectorDOS( - selectorConditionMapper.selectByQuery(new SelectorConditionQuery(selectorDO.getId()))); - SelectorData selectorData = SelectorDO.transFrom(selectorDO, pluginDO.getName(), conditionDataList); - selectorData.setHandle(handler); - // publish change event. - eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.UPDATE, Collections.singletonList(selectorData))); + if (Objects.isNull(selectorDO)) { + return; } + + PluginDO pluginDO = pluginMapper.selectById(selectorDO.getPluginId()); + String handler = converterFactor.newInstance(pluginDO.getName()).handler(selectorDO.getHandle(), aliveList); + selectorDO.setHandle(handler); + selectorMapper.updateSelective(selectorDO); + + List conditionDataList = ConditionTransfer.INSTANCE.mapToSelectorDOS( + selectorConditionMapper.selectByQuery(new SelectorConditionQuery(selectorDO.getId()))); + SelectorData selectorData = SelectorDO.transFrom(selectorDO, pluginDO.getName(), conditionDataList); + selectorData.setHandle(handler); + + // publish change event. + eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.UPDATE, Collections.singletonList(selectorData))); + } - + /** * fetch upstream data from db. */ @@ -292,7 +305,7 @@ public void fetchUpstreamData() { } pluginDOList.stream().filter(Objects::nonNull).forEach(pluginDO -> { final List selectorDOList = selectorMapper.findByPluginId(pluginDO.getId()); - for (SelectorDO selectorDO : selectorDOList) { + for (SelectorDO selectorDO : selectorDOList) { if (Objects.isNull(selectorDO) || StringUtils.isBlank(selectorDO.getHandle())) { continue; } diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/bean/StatelessAuthFilter.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/bean/StatelessAuthFilter.java index 17cabb31f6c4..fac905c2228d 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/bean/StatelessAuthFilter.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/bean/StatelessAuthFilter.java @@ -44,14 +44,15 @@ public class StatelessAuthFilter extends AccessControlFilter { private static final String HEAD_TOKEN = "X-Access-Token"; @Override - protected boolean isAccessAllowed(final ServletRequest servletRequest, final ServletResponse servletResponse, + protected boolean isAccessAllowed(final ServletRequest servletRequest, + final ServletResponse servletResponse, final Object o) { return false; } @Override - protected boolean onAccessDenied(final ServletRequest servletRequest, final ServletResponse servletResponse) - throws Exception { + protected boolean onAccessDenied(final ServletRequest servletRequest, + final ServletResponse servletResponse) throws Exception { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; if (StringUtils.equals(HttpMethod.OPTIONS.name(), httpServletRequest.getMethod())) { return true; diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroRealm.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroRealm.java index 26ecacf74281..ef98d30a7cd0 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroRealm.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroRealm.java @@ -35,6 +35,7 @@ import org.apache.shiro.subject.PrincipalCollection; import org.springframework.stereotype.Service; +import java.util.Objects; import java.util.Set; /** @@ -83,7 +84,7 @@ protected AuthenticationInfo doGetAuthenticationInfo(final AuthenticationToken a } DashboardUserVO dashboardUserVO = dashboardUserService.findByUserName(userName); - if (dashboardUserVO == null) { + if (Objects.isNull(dashboardUserVO)) { throw new AuthenticationException(String.format("userName(%s) can not be found.", userName)); } diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/ShenyuResultMessage.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/ShenyuResultMessage.java index 8d7688c53693..95dda8bfb7d0 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/ShenyuResultMessage.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/ShenyuResultMessage.java @@ -26,8 +26,6 @@ public final class ShenyuResultMessage { public static final String CREATE_SUCCESS = "create success"; - public static final String CREATE_FAILED = "create failed"; - public static final String DELETE_SUCCESS = "delete success"; public static final String UPDATE_SUCCESS = "update success"; From c07f247efe54ac2139a6e196f844d12dd6caa8c2 Mon Sep 17 00:00:00 2001 From: midnight2104 Date: Sat, 13 Nov 2021 22:00:17 +0800 Subject: [PATCH 6/7] refactor shenyu-admin: add user permissions. --- .../controller/DashboardUserController.java | 18 +++++++++++++----- .../admin/shiro/config/ShiroConfiguration.java | 13 +++++++++++++ .../DashboardUserControllerTest.java | 2 +- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java index 049854b8534c..35a9037ccf3e 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java @@ -29,6 +29,7 @@ import org.apache.shenyu.admin.service.DashboardUserService; import org.apache.shenyu.admin.utils.AesUtils; import org.apache.shenyu.admin.utils.ShenyuResultMessage; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -70,14 +71,17 @@ public DashboardUserController(final SecretProperties secretProperties, final Da * @param pageSize page size * @return {@linkplain ShenyuAdminResult} */ + @RequiresPermissions("system:manager:list") @GetMapping("") - public ShenyuAdminResult queryDashboardUsers(final String userName, final Integer currentPage, final Integer pageSize) { - String key = secretProperties.getKey(); - String iv = secretProperties.getIv(); - CommonPager commonPager = dashboardUserService.listByPage(new DashboardUserQuery(userName, new PageParameter(currentPage, pageSize))); + public ShenyuAdminResult queryDashboardUsers(final String userName, + final Integer currentPage, + final Integer pageSize) { + CommonPager commonPager = dashboardUserService.listByPage(new DashboardUserQuery(userName, + new PageParameter(currentPage, pageSize))); + if (CollectionUtils.isNotEmpty(commonPager.getDataList())) { commonPager.getDataList() - .forEach(item -> item.setPassword(AesUtils.aesDecryption(item.getPassword(), key, iv))); + .forEach(item -> item.setPassword("")); return ShenyuAdminResult.success(ShenyuResultMessage.QUERY_SUCCESS, commonPager); } else { return ShenyuAdminResult.error(ShenyuResultMessage.DASHBOARD_QUERY_ERROR); @@ -90,6 +94,7 @@ public ShenyuAdminResult queryDashboardUsers(final String userName, final Intege * @param id dashboard user id. * @return {@linkplain ShenyuAdminResult} */ + @RequiresPermissions("system:manager:list") @GetMapping("/{id}") public ShenyuAdminResult detailDashboardUser(@PathVariable("id") final String id) { DashboardUserEditVO dashboardUserEditVO = dashboardUserService.findById(id); @@ -105,6 +110,7 @@ public ShenyuAdminResult detailDashboardUser(@PathVariable("id") final String id * @param dashboardUserDTO dashboard user. * @return {@linkplain ShenyuAdminResult} */ + @RequiresPermissions("system:manager:add") @PostMapping("") public ShenyuAdminResult createDashboardUser(@Valid @RequestBody final DashboardUserDTO dashboardUserDTO) { String key = secretProperties.getKey(); @@ -123,6 +129,7 @@ public ShenyuAdminResult createDashboardUser(@Valid @RequestBody final Dashboard * @param dashboardUserDTO dashboard user. * @return {@linkplain ShenyuAdminResult} */ + @RequiresPermissions("system:manager:edit") @PutMapping("/{id}") public ShenyuAdminResult updateDashboardUser(@PathVariable("id") final String id, @Valid @RequestBody final DashboardUserDTO dashboardUserDTO) { String key = secretProperties.getKey(); @@ -139,6 +146,7 @@ public ShenyuAdminResult updateDashboardUser(@PathVariable("id") final String id * @param ids primary key. * @return {@linkplain ShenyuAdminResult} */ + @RequiresPermissions("system:manager:delete") @DeleteMapping("/batch") public ShenyuAdminResult deleteDashboardUser(@RequestBody @NotEmpty final List<@NotBlank String> ids) { Integer deleteCount = dashboardUserService.delete(ids); diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroConfiguration.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroConfiguration.java index 0484d06d1493..0e2efe3e874e 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroConfiguration.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/shiro/config/ShiroConfiguration.java @@ -24,6 +24,7 @@ import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -94,6 +95,18 @@ public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor( return authorizationAttributeSourceAdvisor; } + /** + * Support shiro annotation. + * + * @return DefaultAdvisorAutoProxyCreator. + */ + @Bean + public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() { + DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); + defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); + return defaultAdvisorAutoProxyCreator; + } + /** * shiro's lifecycle in spring. * diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java index ed616f9ee546..e1f81c8d18da 100644 --- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java +++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java @@ -98,7 +98,7 @@ public void queryDashboardUsers() throws Exception { mockMvc.perform(get(url)) .andExpect(status().isOk()) .andExpect(jsonPath("$.message", is(ShenyuResultMessage.QUERY_SUCCESS))) - .andExpect(jsonPath("$.data.dataList[0].password", is("123456"))) + .andExpect(jsonPath("$.data.dataList[0].password", is(""))) .andReturn(); final CommonPager commonPagerError = new CommonPager<>(new PageParameter(), From e6339915ca1138bd7d712429d831704c54e343f3 Mon Sep 17 00:00:00 2001 From: midnight2104 Date: Mon, 15 Nov 2021 13:10:55 +0800 Subject: [PATCH 7/7] refactor shenyu-admin: ignore password in api. --- .../shenyu/admin/controller/DashboardUserController.java | 9 +++------ .../apache/shenyu/admin/model/vo/DashboardUserVO.java | 2 ++ .../admin/controller/DashboardUserControllerTest.java | 4 +--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java index 35a9037ccf3e..be658d113aee 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/DashboardUserController.java @@ -80,8 +80,6 @@ public ShenyuAdminResult queryDashboardUsers(final String userName, new PageParameter(currentPage, pageSize))); if (CollectionUtils.isNotEmpty(commonPager.getDataList())) { - commonPager.getDataList() - .forEach(item -> item.setPassword("")); return ShenyuAdminResult.success(ShenyuResultMessage.QUERY_SUCCESS, commonPager); } else { return ShenyuAdminResult.error(ShenyuResultMessage.DASHBOARD_QUERY_ERROR); @@ -98,10 +96,9 @@ public ShenyuAdminResult queryDashboardUsers(final String userName, @GetMapping("/{id}") public ShenyuAdminResult detailDashboardUser(@PathVariable("id") final String id) { DashboardUserEditVO dashboardUserEditVO = dashboardUserService.findById(id); - return Optional.ofNullable(dashboardUserEditVO).map(item -> { - item.setPassword(""); - return ShenyuAdminResult.success(ShenyuResultMessage.DETAIL_SUCCESS, item); - }).orElseGet(() -> ShenyuAdminResult.error(ShenyuResultMessage.DASHBOARD_QUERY_ERROR)); + return Optional.ofNullable(dashboardUserEditVO) + .map(item -> ShenyuAdminResult.success(ShenyuResultMessage.DETAIL_SUCCESS, item)) + .orElseGet(() -> ShenyuAdminResult.error(ShenyuResultMessage.DASHBOARD_QUERY_ERROR)); } /** diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/DashboardUserVO.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/DashboardUserVO.java index f6ce5c68dcdb..3bbd1182afca 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/DashboardUserVO.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/DashboardUserVO.java @@ -17,6 +17,7 @@ package org.apache.shenyu.admin.model.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; import org.apache.shenyu.admin.model.entity.DashboardUserDO; import org.apache.shenyu.common.utils.DateUtils; @@ -44,6 +45,7 @@ public class DashboardUserVO implements Serializable { /** * user password. */ + @JsonIgnore private String password; /** diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java index e1f81c8d18da..4220ef055a03 100644 --- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java +++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/DashboardUserControllerTest.java @@ -98,7 +98,6 @@ public void queryDashboardUsers() throws Exception { mockMvc.perform(get(url)) .andExpect(status().isOk()) .andExpect(jsonPath("$.message", is(ShenyuResultMessage.QUERY_SUCCESS))) - .andExpect(jsonPath("$.data.dataList[0].password", is(""))) .andReturn(); final CommonPager commonPagerError = new CommonPager<>(new PageParameter(), @@ -121,8 +120,7 @@ public void detailDashboardUser() throws Exception { final String url = "/dashboardUser/1"; mockMvc.perform(get(url)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.message", is(ShenyuResultMessage.DETAIL_SUCCESS))) - .andExpect(jsonPath("$.data.password", is(""))); + .andExpect(jsonPath("$.message", is(ShenyuResultMessage.DETAIL_SUCCESS))); given(dashboardUserService.findById(any())).willReturn(null); mockMvc.perform(get(url))