From 5dbfe61536413ae19668de2c3de5584c7151d6de Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 15 Sep 2022 16:44:00 +0800 Subject: [PATCH 01/37] Optimize DateTimeUtils.java --- .../src/main/java/we/util/DateTimeUtils.java | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/fizz-common/src/main/java/we/util/DateTimeUtils.java b/fizz-common/src/main/java/we/util/DateTimeUtils.java index 2a9589f..f74158f 100644 --- a/fizz-common/src/main/java/we/util/DateTimeUtils.java +++ b/fizz-common/src/main/java/we/util/DateTimeUtils.java @@ -37,20 +37,21 @@ import java.util.stream.Stream; public abstract class DateTimeUtils { - private static Map dateTimeFormatters = new HashMap<>(); + private static Map dateTimeFormatterMap = new HashMap<>(); - private static ZoneId defaultZone = ZoneId.systemDefault(); + private static ZoneId defaultZone = ZoneId.systemDefault(); - private static final String zeroTimeSuffix = " 00:00:00.000"; + @Deprecated + private static final String zeroTimeSuffix = " 00:00:00.000"; private DateTimeUtils() { } public static DateTimeFormatter getDateTimeFormatter(String pattern) { - DateTimeFormatter f = dateTimeFormatters.get(pattern); + DateTimeFormatter f = dateTimeFormatterMap.get(pattern); if (f == null) { f = DateTimeFormatter.ofPattern(pattern); - dateTimeFormatters.put(pattern, f); + dateTimeFormatterMap.put(pattern, f); } return f; } @@ -59,6 +60,7 @@ public abstract class DateTimeUtils { return ldt.atZone(defaultZone).toInstant().toEpochMilli(); } + @Deprecated public static long toMillis(String dateTime, String... pattern) { if (dateTime.length() == 10) { dateTime += zeroTimeSuffix; @@ -72,6 +74,12 @@ public abstract class DateTimeUtils { return toMillis(ldt); } + public static long toMillis(String dateTime, String pattern) { + DateTimeFormatter f = getDateTimeFormatter(pattern); + LocalDateTime ldt = LocalDateTime.parse(dateTime, f); + return toMillis(ldt); + } + public static LocalDate transform(Date date) { return date.toInstant().atZone(defaultZone).toLocalDate(); } @@ -96,6 +104,7 @@ public abstract class DateTimeUtils { return Date.from(localDateTime.atZone(defaultZone).toInstant()); } + @Deprecated public static String convert(long mills, String... pattern) { String p = DP.DP10; if (pattern.length != 0) { @@ -106,6 +115,13 @@ public abstract class DateTimeUtils { return ldt.format(f); } + public static String convert(long mills, String pattern) { + LocalDateTime ldt = LocalDateTime.ofInstant(Instant.ofEpochMilli(mills), defaultZone); + DateTimeFormatter f = getDateTimeFormatter(pattern); + return ldt.format(f); + } + + @Deprecated public static String convert(LocalDate date, String... pattern) { String p = DP.DP10; if (pattern.length != 0) { @@ -115,6 +131,12 @@ public abstract class DateTimeUtils { return date.format(f); } + public static String convert(LocalDate date, String pattern) { + DateTimeFormatter f = getDateTimeFormatter(pattern); + return date.format(f); + } + + @Deprecated public static String convert(LocalDateTime localDateTime, String... pattern) { String p = DP.DP23; if (pattern.length != 0) { @@ -124,6 +146,11 @@ public abstract class DateTimeUtils { return localDateTime.format(f); } + public static String convert(LocalDateTime localDateTime, String pattern) { + DateTimeFormatter f = getDateTimeFormatter(pattern); + return localDateTime.format(f); + } + public static List datesBetween(String start, String end) { LocalDate sd = LocalDate.parse(start); LocalDate ed = LocalDate.parse(end); @@ -146,7 +173,7 @@ public abstract class DateTimeUtils { long numOfDaysBetween = ChronoUnit.DAYS.between(sd, ed); return IntStream.iterate(0, i -> i + 1) .limit(numOfDaysBetween) - .mapToObj(i -> sd.plusDays(i)) + .mapToObj(sd::plusDays) .collect(Collectors.toList()); } @@ -155,9 +182,10 @@ public abstract class DateTimeUtils { } public static LocalDateTime beforeNowNoTime(long offsetDays) { - return LocalDate.now().minusDays(offsetDays).atTime(0, 0, 0, 0); + return LocalDate.now().minusDays(offsetDays).atStartOfDay(); } + @Deprecated public static LocalDateTime time2zero(LocalDateTime ldt) { return ldt.withHour(0).withMinute(0).withSecond(0).with(ChronoField.MILLI_OF_SECOND, 0); } From 8633e0f1e8083bbdcbd6e0da09cd857cb44b803f Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Fri, 16 Sep 2022 09:48:18 +0800 Subject: [PATCH 02/37] Optimize JacksonUtils.java --- .../src/main/java/we/util/DateTimeUtils.java | 5 + .../src/main/java/we/util/JacksonUtils.java | 184 +++++++++--------- .../we/util/LocalDate2millsSerializer.java | 16 ++ .../util/LocalDateTime2millsSerializer.java | 16 ++ .../we/util/Mills2localDateDeserializer.java | 21 ++ .../util/Mills2localDateTimeDeserializer.java | 19 ++ 6 files changed, 171 insertions(+), 90 deletions(-) create mode 100644 fizz-common/src/main/java/we/util/LocalDate2millsSerializer.java create mode 100644 fizz-common/src/main/java/we/util/LocalDateTime2millsSerializer.java create mode 100644 fizz-common/src/main/java/we/util/Mills2localDateDeserializer.java create mode 100644 fizz-common/src/main/java/we/util/Mills2localDateTimeDeserializer.java diff --git a/fizz-common/src/main/java/we/util/DateTimeUtils.java b/fizz-common/src/main/java/we/util/DateTimeUtils.java index f74158f..b914b34 100644 --- a/fizz-common/src/main/java/we/util/DateTimeUtils.java +++ b/fizz-common/src/main/java/we/util/DateTimeUtils.java @@ -56,6 +56,11 @@ public abstract class DateTimeUtils { return f; } + public static long toMillis(LocalDate ld) { + LocalDateTime ldt = ld.atStartOfDay(); + return toMillis(ldt); + } + public static long toMillis(LocalDateTime ldt) { return ldt.atZone(defaultZone).toInstant().toEpochMilli(); } diff --git a/fizz-common/src/main/java/we/util/JacksonUtils.java b/fizz-common/src/main/java/we/util/JacksonUtils.java index aabd53f..9abb4b2 100644 --- a/fizz-common/src/main/java/we/util/JacksonUtils.java +++ b/fizz-common/src/main/java/we/util/JacksonUtils.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import we.util.Consts.DP; import java.io.IOException; @@ -58,21 +59,24 @@ public abstract class JacksonUtils { m.configure( DeserializationFeature. FAIL_ON_UNKNOWN_PROPERTIES, false); m.configure( JsonParser.Feature. ALLOW_UNQUOTED_CONTROL_CHARS, true); - SimpleModule m0 = new SimpleModule(); - m0.addDeserializer(Date.class, new DateDeseralizer()); - m.registerModule(m0); + JavaTimeModule javaTimeModule = new JavaTimeModule(); + m.registerModule(javaTimeModule); - SimpleModule m1 = new SimpleModule(); - m1.addDeserializer(LocalDate.class, new LocalDateDeseralizer()); - m.registerModule(m1); - - SimpleModule m2 = new SimpleModule(); - m2.addDeserializer(LocalDateTime.class, new LocalDateTimeDeseralizer()); - m.registerModule(m2); - - SimpleModule m3 = new SimpleModule(); - m3.addSerializer(LocalDateTime.class, new LocalDateTimeSeralizer()); - m.registerModule(m3); +// SimpleModule m0 = new SimpleModule(); +// m0.addDeserializer(Date.class, new DateDeseralizer()); +// m.registerModule(m0); +// +// SimpleModule m1 = new SimpleModule(); +// m1.addDeserializer(LocalDate.class, new LocalDateDeseralizer()); +// m.registerModule(m1); +// +// SimpleModule m2 = new SimpleModule(); +// m2.addDeserializer(LocalDateTime.class, new LocalDateTimeDeseralizer()); +// m.registerModule(m2); +// +// SimpleModule m3 = new SimpleModule(); +// m3.addSerializer(LocalDateTime.class, new LocalDateTimeSeralizer()); +// m.registerModule(m3); } private JacksonUtils() { @@ -157,79 +161,79 @@ public abstract class JacksonUtils { } } -class DateDeseralizer extends JsonDeserializer { - - public Date deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { - - String s = jp.getText(); - int sl = s.length(); - if (sl == DP.MILLS_LEN) { - return new Date(Long.parseLong(s)); - } else { - String dtp = DP.DP10; - DateTimeFormatter dtf = null; - if (sl == DP.DP10.length()) { - } else if (sl == DP.DP14.length()) { - dtp = DP.DP14; - } else if (sl == DP.DP19.length()) { - dtp = DP.DP19; - } else if (sl == DP.DP23.length()) { - dtp = DP.DP23; - } else { - throw new IOException("invalid datetime pattern: " + s); - } - dtf = DateTimeUtils.getDateTimeFormatter(dtp); - LocalDateTime ldt = LocalDateTime.parse(s, dtf); - return DateTimeUtils.from(ldt); - } - } -} - -class LocalDateDeseralizer extends JsonDeserializer { - - public LocalDate deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { - - String s = jp.getText(); - if (s.length() == DP.DP10.length()) { - DateTimeFormatter dtf = DateTimeUtils.getDateTimeFormatter(DP.DP10); - return LocalDate.parse(s, dtf); - } else { - throw new IOException("invalid datetime pattern: " + s); - } - } -} - -class LocalDateTimeDeseralizer extends JsonDeserializer { - - public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { - - String s = jp.getText(); - int sl = s.length(); - if (sl == DP.MILLS_LEN) { - return DateTimeUtils.transform(Long.parseLong(s)); - } else { - String dtp = DP.DP10; - DateTimeFormatter dtf = null; - if (sl == DP.DP10.length()) { - } else if (sl == DP.DP14.length()) { - dtp = DP.DP14; - } else if (sl == DP.DP19.length()) { - dtp = DP.DP19; - } else if (sl == DP.DP23.length()) { - dtp = DP.DP23; - } else { - throw new IOException("invalid datetime pattern: " + s); - } - dtf = DateTimeUtils.getDateTimeFormatter(dtp); - return LocalDateTime.parse(s, dtf); - } - } -} - -class LocalDateTimeSeralizer extends JsonSerializer { - - @Override - public void serialize(LocalDateTime ldt, JsonGenerator jg, SerializerProvider sp) throws IOException { - jg.writeNumber(DateTimeUtils.toMillis(ldt)); - } -} +//class DateDeseralizer extends JsonDeserializer { +// +// public Date deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { +// +// String s = jp.getText(); +// int sl = s.length(); +// if (sl == DP.MILLS_LEN) { +// return new Date(Long.parseLong(s)); +// } else { +// String dtp = DP.DP10; +// DateTimeFormatter dtf = null; +// if (sl == DP.DP10.length()) { +// } else if (sl == DP.DP14.length()) { +// dtp = DP.DP14; +// } else if (sl == DP.DP19.length()) { +// dtp = DP.DP19; +// } else if (sl == DP.DP23.length()) { +// dtp = DP.DP23; +// } else { +// throw new IOException("invalid datetime pattern: " + s); +// } +// dtf = DateTimeUtils.getDateTimeFormatter(dtp); +// LocalDateTime ldt = LocalDateTime.parse(s, dtf); +// return DateTimeUtils.from(ldt); +// } +// } +//} +// +//class LocalDateDeseralizer extends JsonDeserializer { +// +// public LocalDate deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { +// +// String s = jp.getText(); +// if (s.length() == DP.DP10.length()) { +// DateTimeFormatter dtf = DateTimeUtils.getDateTimeFormatter(DP.DP10); +// return LocalDate.parse(s, dtf); +// } else { +// throw new IOException("invalid datetime pattern: " + s); +// } +// } +//} +// +//class LocalDateTimeDeseralizer extends JsonDeserializer { +// +// public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { +// +// String s = jp.getText(); +// int sl = s.length(); +// if (sl == DP.MILLS_LEN) { +// return DateTimeUtils.transform(Long.parseLong(s)); +// } else { +// String dtp = DP.DP10; +// DateTimeFormatter dtf = null; +// if (sl == DP.DP10.length()) { +// } else if (sl == DP.DP14.length()) { +// dtp = DP.DP14; +// } else if (sl == DP.DP19.length()) { +// dtp = DP.DP19; +// } else if (sl == DP.DP23.length()) { +// dtp = DP.DP23; +// } else { +// throw new IOException("invalid datetime pattern: " + s); +// } +// dtf = DateTimeUtils.getDateTimeFormatter(dtp); +// return LocalDateTime.parse(s, dtf); +// } +// } +//} +// +//class LocalDateTimeSeralizer extends JsonSerializer { +// +// @Override +// public void serialize(LocalDateTime ldt, JsonGenerator jg, SerializerProvider sp) throws IOException { +// jg.writeNumber(DateTimeUtils.toMillis(ldt)); +// } +//} diff --git a/fizz-common/src/main/java/we/util/LocalDate2millsSerializer.java b/fizz-common/src/main/java/we/util/LocalDate2millsSerializer.java new file mode 100644 index 0000000..db0479d --- /dev/null +++ b/fizz-common/src/main/java/we/util/LocalDate2millsSerializer.java @@ -0,0 +1,16 @@ +package we.util; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDate; + +public class LocalDate2millsSerializer extends JsonSerializer { + + @Override + public void serialize(LocalDate ld, JsonGenerator jg, SerializerProvider sp) throws IOException { + jg.writeNumber(DateTimeUtils.toMillis(ld)); + } +} \ No newline at end of file diff --git a/fizz-common/src/main/java/we/util/LocalDateTime2millsSerializer.java b/fizz-common/src/main/java/we/util/LocalDateTime2millsSerializer.java new file mode 100644 index 0000000..9446539 --- /dev/null +++ b/fizz-common/src/main/java/we/util/LocalDateTime2millsSerializer.java @@ -0,0 +1,16 @@ +package we.util; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDateTime; + +public class LocalDateTime2millsSerializer extends JsonSerializer { + + @Override + public void serialize(LocalDateTime ldt, JsonGenerator jg, SerializerProvider sp) throws IOException { + jg.writeNumber(DateTimeUtils.toMillis(ldt)); + } +} \ No newline at end of file diff --git a/fizz-common/src/main/java/we/util/Mills2localDateDeserializer.java b/fizz-common/src/main/java/we/util/Mills2localDateDeserializer.java new file mode 100644 index 0000000..78bfd42 --- /dev/null +++ b/fizz-common/src/main/java/we/util/Mills2localDateDeserializer.java @@ -0,0 +1,21 @@ +package we.util; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; + +public class Mills2localDateDeserializer extends JsonDeserializer { + + public LocalDate deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + String text = jp.getText(); + if (StringUtils.isBlank(text)) { + return null; + } + LocalDateTime ldt = DateTimeUtils.transform(Long.parseLong(text)); + return ldt.toLocalDate(); + } +} \ No newline at end of file diff --git a/fizz-common/src/main/java/we/util/Mills2localDateTimeDeserializer.java b/fizz-common/src/main/java/we/util/Mills2localDateTimeDeserializer.java new file mode 100644 index 0000000..483b82b --- /dev/null +++ b/fizz-common/src/main/java/we/util/Mills2localDateTimeDeserializer.java @@ -0,0 +1,19 @@ +package we.util; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.LocalDateTime; + +public class Mills2localDateTimeDeserializer extends JsonDeserializer { + + public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + String text = jp.getText(); + if (StringUtils.isBlank(text)) { + return null; + } + return DateTimeUtils.transform(Long.parseLong(text)); + } +} \ No newline at end of file From 778c57dffaa2f17af0a3d3b3f6bb6c4e7a791ada Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Tue, 20 Sep 2022 17:44:28 +0800 Subject: [PATCH 03/37] Upgrade snakeyaml and ognl --- fizz-bootstrap/pom.xml | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index 761cb3a..ace3118 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -34,7 +34,7 @@ 2.8.9 2.0.54.Final 2.2.9.RELEASE - 1.31 + 1.32 Moore-SR13--> diff --git a/pom.xml b/pom.xml index 96c15bb..2c03fe0 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 2.11.1 2.0.54.Final 2.2.9.RELEASE - 1.31 + 1.32 Moore-SR13 @@ -79,7 +79,7 @@ ognl ognl - 3.3.3 + 3.3.4 From 9eabd0c76c2dbbc3628eb1a0c22cd2e7686f67fa Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Tue, 20 Sep 2022 18:24:57 +0800 Subject: [PATCH 04/37] Remove DateTimeUtils.isSameDay --- fizz-common/src/main/java/we/util/DateTimeUtils.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/fizz-common/src/main/java/we/util/DateTimeUtils.java b/fizz-common/src/main/java/we/util/DateTimeUtils.java index b914b34..12e9174 100644 --- a/fizz-common/src/main/java/we/util/DateTimeUtils.java +++ b/fizz-common/src/main/java/we/util/DateTimeUtils.java @@ -195,12 +195,6 @@ public abstract class DateTimeUtils { return ldt.withHour(0).withMinute(0).withSecond(0).with(ChronoField.MILLI_OF_SECOND, 0); } - public static boolean isSameDay(Date date1, Date date2) { - LocalDate localDate1 = date1.toInstant().atZone(defaultZone).toLocalDate(); - LocalDate localDate2 = date2.toInstant().atZone(defaultZone).toLocalDate(); - return localDate1.isEqual(localDate2); - } - public static long get10sTimeWinStart(int n) { LocalDateTime now = LocalDateTime.now().with(ChronoField.MILLI_OF_SECOND, 0); int sec = now.getSecond(); From fea6ae89ee89a544deabdbb95198e390f5281702 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 29 Sep 2022 09:37:43 +0800 Subject: [PATCH 05/37] Upgrade snakeyaml --- fizz-bootstrap/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index ace3118..ff61016 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -34,7 +34,7 @@ 2.8.9 2.0.54.Final 2.2.9.RELEASE - 1.32 + 1.33 Moore-SR13--> diff --git a/pom.xml b/pom.xml index 2c03fe0..d4d378b 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 2.11.1 2.0.54.Final 2.2.9.RELEASE - 1.32 + 1.33 Moore-SR13 From 92b06137b83c3758087a3865037080997e8d8935 Mon Sep 17 00:00:00 2001 From: linwaiwai Date: Thu, 22 Sep 2022 11:07:17 +0800 Subject: [PATCH 06/37] Update README.md update readme features (cherry picked from commit bd9cfb60229b4899d61164fc4b05c6304a574c89) --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 357acbd..63d8744 100644 --- a/README.md +++ b/README.md @@ -40,16 +40,20 @@ API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path] ## 产品特性 - +- 应用管理:支持对接入的应用进行管理; +- API管理:支持API定义后端服务的配置; +- 分组管理:支持通过分组管理实现同一分组的API使用相关的配置; +- 服务鉴权:通过插件可对服务进行应用访问权限、检验等链式的拦截策略; - 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。 - 安全授权:支持内置的key-auth, JWT, basic-auth授权方式,并且可以方便控制。 - 服务编排:支持HTTP、Dubbo、gRPC、Soap协议热服务编排能力,支持前后端编码,支持JSON/XML输出,随时随地更新API。 - 负载均衡:支持round-robin负载均衡。 +- 策略熔断:根据服务或者具体地址进行多种恢复策略熔断配置。 - 多注册中心:支持从Eureka或Nacos注册中心进行服务发现。 - 配置中心:支持接入apollo配置中心。 - HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。 - 访问策略:支持不同策略访问不同的API、配置不同的鉴权等。 -- IP黑白名单:支持配置IP黑白名单。 +- 黑白名单:支持配置通过绑定黑、白名单限制访问。 - 自定义插件:强大的插件机制支持自由扩展。 - 可扩展:简单易用的插件机制方便扩展功能。 - 高性能:性能在众多网关之中表现优异。 @@ -59,7 +63,7 @@ API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path] - 多级限流:细颗粒度的限流方式包含服务限流,接口限流,APP_ID限流,IP限流。 - 微服务文档:企业级管理开放微服务文档管理,系统集成更方便。 - 公网专线:建立公网中受到完全保护的私有连接通道。 -- 策略熔断:根据服务或者具体地址进行多种恢复策略熔断配置。 + ## 基准测试 From 043cf2d0b12a59141be25439dba78408e8f21df4 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Wed, 12 Oct 2022 09:55:57 +0800 Subject: [PATCH 07/37] Upgrade netty to 4.1.83.Final --- fizz-bootstrap/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index ff61016..c9cc3e5 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -18,7 +18,7 @@ Dragonfruit-SR3 Dysprosium-SR25 5.3.7.RELEASE - 4.1.82.Final + 4.1.83.Final 4.4.15 2.17.2 1.7.36 diff --git a/pom.xml b/pom.xml index d4d378b..5327f9d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Dysprosium-SR25 5.3.7.RELEASE 2.2.7.RELEASE - 4.1.82.Final + 4.1.83.Final 4.4.15 2.17.2 1.7.36 From 6b3b6a450817423f6c841c09c2ab7134e65ad50e Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 13 Oct 2022 18:22:58 +0800 Subject: [PATCH 08/37] Upgrade netty to 4.1.84.Final --- fizz-bootstrap/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index c9cc3e5..05ae83d 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -18,7 +18,7 @@ Dragonfruit-SR3 Dysprosium-SR25 5.3.7.RELEASE - 4.1.83.Final + 4.1.84.Final 4.4.15 2.17.2 1.7.36 diff --git a/pom.xml b/pom.xml index 5327f9d..8ae41c9 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Dysprosium-SR25 5.3.7.RELEASE 2.2.7.RELEASE - 4.1.83.Final + 4.1.84.Final 4.4.15 2.17.2 1.7.36 From 255ea578771edb8981ee82fcc27fb5cef80c8c42 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 31 Oct 2022 14:56:42 +0800 Subject: [PATCH 09/37] Fix blank gateway context problem #458 --- fizz-core/src/main/java/we/util/WebUtils.java | 31 +++++++++--- .../src/test/java/we/util/WebUtilsTests.java | 50 +++++++++++++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/fizz-core/src/main/java/we/util/WebUtils.java b/fizz-core/src/main/java/we/util/WebUtils.java index 72a6631..0674251 100644 --- a/fizz-core/src/main/java/we/util/WebUtils.java +++ b/fizz-core/src/main/java/we/util/WebUtils.java @@ -216,10 +216,15 @@ public abstract class WebUtils { if (svc == null) { String p = exchange.getRequest().getPath().value(); int secFS = p.indexOf(Consts.S.FORWARD_SLASH, 1); + String prefix = p.substring(0, secFS); if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { - svc = p.substring(1, secFS); + if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); + svc = p.substring(secFS + 1, trdFS); + } else { + svc = p.substring(1, secFS); + } } else { - String prefix = p.substring(0, secFS); if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); svc = p.substring(secFS + 1, trdFS); @@ -340,10 +345,16 @@ public abstract class WebUtils { // p = exchange.getRequest().getPath().value(); p = exchange.getRequest().getURI().getPath(); int secFS = p.indexOf(Consts.S.FORWARD_SLASH, 1); + String prefix = p.substring(0, secFS); if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { - p = p.substring(secFS); + if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); + p = p.substring(trdFS); + } else { + p = p.substring(secFS); + } } else { - String prefix = p.substring(0, secFS); + if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); p = p.substring(trdFS); @@ -367,12 +378,16 @@ public abstract class WebUtils { public static String getClientReqPathPrefix(ServerWebExchange exchange) { String prefix = exchange.getAttribute(clientRequestPathPrefix); if (prefix == null) { + String path = exchange.getRequest().getPath().value(); + int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); + prefix = path.substring(0, secFS); if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { - prefix = Consts.S.FORWARD_SLASH_STR; + if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + prefix = prefix + Consts.S.FORWARD_SLASH; + } else { + prefix = Consts.S.FORWARD_SLASH_STR; + } } else { - String path = exchange.getRequest().getPath().value(); - int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); - prefix = path.substring(0, secFS); if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { prefix = prefix + Consts.S.FORWARD_SLASH; } else { diff --git a/fizz-core/src/test/java/we/util/WebUtilsTests.java b/fizz-core/src/test/java/we/util/WebUtilsTests.java index edbe0c7..9e2dc47 100644 --- a/fizz-core/src/test/java/we/util/WebUtilsTests.java +++ b/fizz-core/src/test/java/we/util/WebUtilsTests.java @@ -31,6 +31,15 @@ public class WebUtilsTests { assertEquals("/ybiz", clientReqPath); String clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); assertEquals("/_proxytest/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/_proxytestx/test/ybiz").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("test", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/ybiz", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/_proxytestx/", clientReqPathPrefix); WebUtils.setGatewayPrefix("/prox"); mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/prox/test/ybiz").build(); @@ -39,6 +48,17 @@ public class WebUtilsTests { assertEquals("test", clientService); clientReqPath = WebUtils.getClientReqPath(mockExchange); assertEquals("/ybiz", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/prox/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/_proxytest/xservice/ybiz?a=b").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("xservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/ybiz", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/_proxytest/", clientReqPathPrefix); WebUtils.setGatewayPrefix(""); mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/aservice/ybiz1").build(); @@ -47,6 +67,36 @@ public class WebUtilsTests { assertEquals("aservice", clientService); clientReqPath = WebUtils.getClientReqPath(mockExchange); assertEquals("/ybiz1", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/_proxytest/xservice/ybiz?a=b").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("xservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/ybiz", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/_proxytest/", clientReqPathPrefix); + + WebUtils.setGatewayPrefix("/"); + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/aservice/ybiz1").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("aservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/ybiz1", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/_proxytest/xservice/ybiz?a=b").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("xservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/ybiz", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/_proxytest/", clientReqPathPrefix); } @Test From 4769992918157aad0b9570454f0534242565d8c1 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 27 Oct 2022 09:55:02 +0800 Subject: [PATCH 10/37] Fix ip validation problem in app --- fizz-core/src/main/java/we/plugin/auth/App.java | 10 ++++------ fizz-core/src/main/java/we/plugin/auth/AppService.java | 10 ++++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fizz-core/src/main/java/we/plugin/auth/App.java b/fizz-core/src/main/java/we/plugin/auth/App.java index 38795db..df5e2c3 100644 --- a/fizz-core/src/main/java/we/plugin/auth/App.java +++ b/fizz-core/src/main/java/we/plugin/auth/App.java @@ -84,16 +84,14 @@ public class App { String subnet = ip.substring(0, i).trim(); String addrSeg = ip.substring(i + 1).trim(); if ("*".equals(addrSeg)) { - this.ips.put(subnet, Collections.singletonList(new String[]{"1", "255"})); + // this.ips.put(subnet, Collections.singletonList(new String[]{"1", "255"})); + List segs = this.ips.computeIfAbsent(subnet, k -> new ArrayList<>()); + segs.add(new String[]{"1", "255"}); } else if (addrSeg.indexOf('-') > 0) { String[] a = StringUtils.split(addrSeg, '-'); String beg = a[0].trim(); String end = a[1].trim(); - List lst = this.ips.get(subnet); - if (lst == null) { - lst = new ArrayList<>(); - this.ips.put(subnet, lst); - } + List lst = this.ips.computeIfAbsent(subnet, k -> new ArrayList<>()); lst.add(new String[]{beg, end}); } else { this.ips.put(ip, null); diff --git a/fizz-core/src/main/java/we/plugin/auth/AppService.java b/fizz-core/src/main/java/we/plugin/auth/AppService.java index 00026de..0913999 100644 --- a/fizz-core/src/main/java/we/plugin/auth/AppService.java +++ b/fizz-core/src/main/java/we/plugin/auth/AppService.java @@ -90,9 +90,10 @@ public class AppService { updateAppMap(app, appMapTmp); return Flux.just(e); } catch (Throwable t) { - throwable[0] = t; - log.info(json, t); - return Flux.error(t); + // throwable[0] = t; + log.warn(json, t); + // return Flux.error(t); + return Flux.just(e); } }).blockLast())).flatMap( e -> { @@ -107,7 +108,8 @@ public class AppService { } ).block(); if (error != ReactorUtils.EMPTY_THROWABLE) { - throw error; + // throw error; + log.error(Consts.S.EMPTY, error); } appMap = appMapTmp; From 41085e177d1db32fba599514f5b0cacf216aa378 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Sat, 12 Nov 2022 11:56:43 +0800 Subject: [PATCH 11/37] Upgrade netty to 4.1.85.Final --- fizz-bootstrap/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index 05ae83d..27ffcdf 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -18,7 +18,7 @@ Dragonfruit-SR3 Dysprosium-SR25 5.3.7.RELEASE - 4.1.84.Final + 4.1.85.Final 4.4.15 2.17.2 1.7.36 diff --git a/pom.xml b/pom.xml index 8ae41c9..fec252a 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Dysprosium-SR25 5.3.7.RELEASE 2.2.7.RELEASE - 4.1.84.Final + 4.1.85.Final 4.4.15 2.17.2 1.7.36 From 19403fa6c2d371a2f27f8277edd5898ffda3a4ca Mon Sep 17 00:00:00 2001 From: dxfeng10 Date: Tue, 22 Nov 2022 10:16:56 +0800 Subject: [PATCH 12/37] Support logic functions (#461) * skip tests * Support logic functions #460 * Support logic functions #460 --- .../java/we/fizz/function/CommonFunc.java | 42 +++ .../we/fizz/function/CommonFuncTests.java | 279 ++++++++++++++++++ fizz-gateway-community.release | 2 +- 3 files changed, 322 insertions(+), 1 deletion(-) diff --git a/fizz-core/src/main/java/we/fizz/function/CommonFunc.java b/fizz-core/src/main/java/we/fizz/function/CommonFunc.java index 6c36314..6ce5e21 100644 --- a/fizz-core/src/main/java/we/fizz/function/CommonFunc.java +++ b/fizz-core/src/main/java/we/fizz/function/CommonFunc.java @@ -62,6 +62,9 @@ public class CommonFunc implements IFunc { FuncExecutor.register(NAME_SPACE_PREFIX + "common.isNotBlank", this); FuncExecutor.register(NAME_SPACE_PREFIX + "common.isEmpty", this); FuncExecutor.register(NAME_SPACE_PREFIX + "common.isNotEmpty", this); + FuncExecutor.register(NAME_SPACE_PREFIX + "common.and", this); + FuncExecutor.register(NAME_SPACE_PREFIX + "common.or", this); + FuncExecutor.register(NAME_SPACE_PREFIX + "common.not", this); } /** @@ -132,4 +135,43 @@ public class CommonFunc implements IFunc { return !isEmpty(obj); } + /** + * Return true if all args are true
+ * + * @param objs + * @return + */ + public boolean and(Boolean... objs) { + if (objs != null && objs.length > 0) { + for (int i = 0; i < objs.length; i++) { + if (objs[i] == null || !objs[i]) { + return false; + } + } + return true; + } + return false; + } + + /** + * Return true if any arg is true
+ * + * @param objs + * @return + */ + public boolean or(Boolean... objs) { + if (objs != null && objs.length > 0) { + for (int i = 0; i < objs.length; i++) { + if (objs[i] != null && objs[i]) { + return true; + } + } + } + return false; + } + + public boolean not(Boolean obj) { + return !(obj == null ? false : obj); + } + } diff --git a/fizz-core/src/test/java/we/fizz/function/CommonFuncTests.java b/fizz-core/src/test/java/we/fizz/function/CommonFuncTests.java index 0c1a423..93c8040 100644 --- a/fizz-core/src/test/java/we/fizz/function/CommonFuncTests.java +++ b/fizz-core/src/test/java/we/fizz/function/CommonFuncTests.java @@ -52,6 +52,18 @@ class CommonFuncTests { m.put("a", "1"); m.put("b", "1"); m.put("d", ""); + m.put("true", true); + m.put("false", false); + m.put("blank", ""); + m.put("null", null); + m.put("stringtrue", "true"); + m.put("stringfalse", "false"); + m.put("string1", "1"); + m.put("string0", "0"); + m.put("stringabc", "abc"); + m.put("int1", "1"); + m.put("int0", "0"); + m.put("int2", "2"); List list = new ArrayList<>(); list.add(createRecord("a", "a1")); @@ -238,4 +250,271 @@ class CommonFuncTests { assertEquals(false, result); } + @Test + void testAnd() { + ONode ctx = getCtxNode(); + String funcExpression = "fn.common.and(true, true)"; + Boolean result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.and(true, true, true)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.and(true)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.and({data.m.true}, {data.m.true}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.and({data.m.true}, {data.m.true}, {data.m.true}, {data.m.notexist})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.true}, {data.m.true}, {data.m.true}, {data.m.null})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.true}, {data.m.true}, {data.m.true}, {data.m.blank})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.true}, {data.m.false}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.false}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.false})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.true}, {data.m.notexist})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.notexist})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and()"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.blank})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.null})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.int1})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.and({data.m.int0})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.string1})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.and({data.m.string0})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.stringabc})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.stringtrue})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.and({data.m.stringfalse})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.and({data.m.int2})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + } + + @Test + void testOr() { + ONode ctx = getCtxNode(); + String funcExpression = "fn.common.or(true, true)"; + Boolean result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or(true, true, true)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or(false, true)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or(true)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or(false)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or(true, false, true)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.true}, {data.m.true}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.true}, {data.m.true}, {data.m.false})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.false}, {data.m.true}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.false}, {data.m.notexist}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.false}, {data.m.null}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.false}, {data.m.blank}, {data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.false}, {data.m.false}, {data.m.false})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.false}, {data.m.false})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.false})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.null})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.blank})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.notexist})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or()"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.true})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.int1})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.int0})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.string1})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.string0})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.stringabc})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.stringtrue})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.or({data.m.stringfalse})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.or({data.m.int2})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + } + + @Test + void testNot() { + ONode ctx = getCtxNode(); + String funcExpression = "fn.common.not(true)"; + Boolean result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.not(false)"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.blank})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.null})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.notexist})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.string1})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.not({data.m.string0})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.stringabc})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.stringtrue})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.not({data.m.stringfalse})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.int1})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(false, result); + + funcExpression = "fn.common.not({data.m.int0})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + + funcExpression = "fn.common.not({data.m.int2})"; + result = (Boolean)FuncExecutor.getInstance().exec(ctx, funcExpression); + assertEquals(true, result); + } } \ No newline at end of file diff --git a/fizz-gateway-community.release b/fizz-gateway-community.release index 970a224..c6b5708 100644 --- a/fizz-gateway-community.release +++ b/fizz-gateway-community.release @@ -9,7 +9,7 @@ baseline.jdk=jdk-1.8 # 构建打包所用的maven版本 build.tools.maven=maven3.2.5 -build.command=mvn -B clean package install --file pom.xml && mvn -B clean package install --file fizz-bootstrap/pom.xml +build.command=mvn -B clean package install -Dmaven.test.skip=true --file pom.xml && mvn -B clean package install -Dmaven.test.skip=true --file fizz-bootstrap/pom.xml # 构建打包使用的打包文件 build.output=fizz-bootstrap/target/* From 2d45c5d61ed488dc19638ee131371debc0bd2f81 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Tue, 22 Nov 2022 11:07:38 +0800 Subject: [PATCH 13/37] Rename --- fizz-core/src/main/java/we/fizz/Pipeline.java | 4 ++-- fizz-core/src/main/java/we/fizz/Step.java | 6 +++--- .../{ComponentHelper.java => ComponentExecutor.java} | 4 ++-- .../src/main/java/we/fizz/component/circle/Circle.java | 6 +++--- fizz-core/src/main/java/we/fizz/input/InputFactory.java | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) rename fizz-core/src/main/java/we/fizz/component/{ComponentHelper.java => ComponentExecutor.java} (95%) diff --git a/fizz-core/src/main/java/we/fizz/Pipeline.java b/fizz-core/src/main/java/we/fizz/Pipeline.java index 9a504ee..fbe1399 100644 --- a/fizz-core/src/main/java/we/fizz/Pipeline.java +++ b/fizz-core/src/main/java/we/fizz/Pipeline.java @@ -34,7 +34,7 @@ import we.constants.CommonConstants; import we.exception.ExecuteScriptException; import we.exception.RedirectException; import we.exception.StopAndResponseException; -import we.fizz.component.ComponentHelper; +import we.fizz.component.ComponentExecutor; import we.fizz.component.ComponentResult; import we.fizz.component.IComponent; import we.fizz.component.StepContextPosition; @@ -164,7 +164,7 @@ public class Pipeline { List components = step.getComponents(); if (components != null && components.size() > 0) { StepContextPosition stepCtxPos = new StepContextPosition(step.getName()); - return ComponentHelper.run(components, stepContext, stepCtxPos, (ctx, pos) -> { + return ComponentExecutor.exec(components, stepContext, stepCtxPos, (ctx, pos) -> { step.beforeRun(stepContext, null); return createStep(step); }).flatMap(sr -> { diff --git a/fizz-core/src/main/java/we/fizz/Step.java b/fizz-core/src/main/java/we/fizz/Step.java index 1cb8305..a3daadd 100644 --- a/fizz-core/src/main/java/we/fizz/Step.java +++ b/fizz-core/src/main/java/we/fizz/Step.java @@ -27,7 +27,7 @@ import org.apache.commons.collections.CollectionUtils; import org.springframework.context.ConfigurableApplicationContext; import reactor.core.publisher.Mono; -import we.fizz.component.ComponentHelper; +import we.fizz.component.ComponentExecutor; import we.fizz.component.ComponentResult; import we.fizz.component.IComponent; import we.fizz.component.StepContextPosition; @@ -88,7 +88,7 @@ public class Step { step.addRequestConfig((String) requestConfig.get("name"), inputConfig); } } - step.setComponents(ComponentHelper.buildComponents((List>) config.get("components"))); + step.setComponents(ComponentExecutor.buildComponents((List>) config.get("components"))); return step; } } @@ -128,7 +128,7 @@ public class Step { List components = input.getConfig().getComponents(); if (components != null && components.size() > 0) { StepContextPosition stepCtxPos = new StepContextPosition(name, requestName); - Mono result = ComponentHelper.run(components, stepContext, stepCtxPos, (ctx, pos) -> { + Mono result = ComponentExecutor.exec(components, stepContext, stepCtxPos, (ctx, pos) -> { if (input.needRun(ctx)) { return input.run(); } diff --git a/fizz-core/src/main/java/we/fizz/component/ComponentHelper.java b/fizz-core/src/main/java/we/fizz/component/ComponentExecutor.java similarity index 95% rename from fizz-core/src/main/java/we/fizz/component/ComponentHelper.java rename to fizz-core/src/main/java/we/fizz/component/ComponentExecutor.java index 360647d..80e2389 100644 --- a/fizz-core/src/main/java/we/fizz/component/ComponentHelper.java +++ b/fizz-core/src/main/java/we/fizz/component/ComponentExecutor.java @@ -36,7 +36,7 @@ import we.fizz.component.condition.Condition; * @author Francis Dong * */ -public class ComponentHelper { +public class ComponentExecutor { /** * Converts step context to ONode @@ -80,7 +80,7 @@ public class ComponentHelper { * @param stepContext * @param f */ - public static Mono run(List components, StepContext stepContext, + public static Mono exec(List components, StepContext stepContext, StepContextPosition stepCtxPos, BiFunction f) { if (components != null && components.size() > 0) { // conditions before circle component diff --git a/fizz-core/src/main/java/we/fizz/component/circle/Circle.java b/fizz-core/src/main/java/we/fizz/component/circle/Circle.java index c99027c..308ee74 100644 --- a/fizz-core/src/main/java/we/fizz/component/circle/Circle.java +++ b/fizz-core/src/main/java/we/fizz/component/circle/Circle.java @@ -28,7 +28,7 @@ import lombok.Data; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import we.fizz.StepContext; -import we.fizz.component.ComponentHelper; +import we.fizz.component.ComponentExecutor; import we.fizz.component.ComponentResult; import we.fizz.component.ComponentTypeEnum; import we.fizz.component.IComponent; @@ -264,7 +264,7 @@ public class Circle implements IComponent { @SuppressWarnings({ "unchecked", "rawtypes" }) public Mono exec(StepContext stepContext, StepContextPosition stepCtxPos, BiFunction f) { - ONode ctxNode1 = ComponentHelper.toONode(stepContext); + ONode ctxNode1 = ComponentExecutor.toONode(stepContext); CircleItem nextItem = this.next(ctxNode1); if (nextItem != null) { return Mono.just(new CircleItemResult(ctxNode1, nextItem, null)).expand(circleItemResult -> { @@ -293,7 +293,7 @@ public class Circle implements IComponent { } else { stepContext.addStepCircleResult(stepCtxPos.getStepName()); } - ONode ctxNode2 = ComponentHelper.toONode(stepContext); + ONode ctxNode2 = ComponentExecutor.toONode(stepContext); if (this.breakCircle(cItem.getIndex(), ctxNode2, stepContext, stepCtxPos)) { return Mono.empty(); } diff --git a/fizz-core/src/main/java/we/fizz/input/InputFactory.java b/fizz-core/src/main/java/we/fizz/input/InputFactory.java index fa657c7..798379f 100644 --- a/fizz-core/src/main/java/we/fizz/input/InputFactory.java +++ b/fizz-core/src/main/java/we/fizz/input/InputFactory.java @@ -17,7 +17,7 @@ package we.fizz.input; -import we.fizz.component.ComponentHelper; +import we.fizz.component.ComponentExecutor; import org.reflections.Reflections; import we.fizz.exception.FizzRuntimeException; import we.fizz.input.extension.request.RequestInput; @@ -67,7 +67,7 @@ public class InputFactory { } inputConfig.setType(typeEnum); inputConfig.setDataMapping((Map) config.get("dataMapping")); - inputConfig.setComponents(ComponentHelper.buildComponents((List>) config.get("components"))); + inputConfig.setComponents(ComponentExecutor.buildComponents((List>) config.get("components"))); inputConfig.parse(); return inputConfig; } else { From 011e25a280f3bc20169fc4c35db6bf53023697a0 Mon Sep 17 00:00:00 2001 From: "lancer.hong" Date: Fri, 25 Nov 2022 22:10:31 +0800 Subject: [PATCH 14/37] FizzWebClient support x-forwarded-for header --- fizz-bootstrap/src/main/resources/application.yml | 3 +++ fizz-core/src/main/java/we/config/SystemConfig.java | 7 +++++++ fizz-core/src/main/java/we/proxy/FizzWebClient.java | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/fizz-bootstrap/src/main/resources/application.yml b/fizz-bootstrap/src/main/resources/application.yml index 586ac8c..7dd11e5 100644 --- a/fizz-bootstrap/src/main/resources/application.yml +++ b/fizz-bootstrap/src/main/resources/application.yml @@ -125,6 +125,9 @@ fizz: fast-fail-when-registry-center-down: false + web-client: + x-forwarded-for: false + # dedicated-line: # server: # enable: true diff --git a/fizz-core/src/main/java/we/config/SystemConfig.java b/fizz-core/src/main/java/we/config/SystemConfig.java index 83ee4c5..447099f 100644 --- a/fizz-core/src/main/java/we/config/SystemConfig.java +++ b/fizz-core/src/main/java/we/config/SystemConfig.java @@ -132,6 +132,13 @@ public class SystemConfig { @Value("${fizz.fast-fail-when-registry-center-down:false}") private boolean fastFailWhenRegistryCenterDown; + @Value("${fizz.web-client.x-forwarded-for:false}") + private boolean fizzWebClientXForwardedFor; + + public boolean isFizzWebClientXForwardedFor() { + return fizzWebClientXForwardedFor; + } + public boolean isFastFailWhenRegistryCenterDown() { return fastFailWhenRegistryCenterDown; } diff --git a/fizz-core/src/main/java/we/proxy/FizzWebClient.java b/fizz-core/src/main/java/we/proxy/FizzWebClient.java index e9183ac..d7f1f62 100644 --- a/fizz-core/src/main/java/we/proxy/FizzWebClient.java +++ b/fizz-core/src/main/java/we/proxy/FizzWebClient.java @@ -39,6 +39,7 @@ import we.exception.ExternalService4xxException; import we.fizz.exception.FizzRuntimeException; import we.service_registry.RegistryCenterService; import we.util.Consts; +import we.util.NetworkUtils; import we.util.ThreadContext; import we.util.WebUtils; @@ -236,6 +237,9 @@ public class FizzWebClient { ); } setHostHeader(uri, hdrs); + if (systemConfig.isFizzWebClientXForwardedFor()) { + hdrs.add(com.google.common.net.HttpHeaders.X_FORWARDED_FOR, NetworkUtils.getServerIp()); + } } ); From 115f8184efc514edec8ba9794d2f7346b405ecdd Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Tue, 13 Dec 2022 10:03:15 +0800 Subject: [PATCH 15/37] Upgrade netty to 4.1.86.Final --- fizz-bootstrap/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index 27ffcdf..1e35cc9 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -18,7 +18,7 @@ Dragonfruit-SR3 Dysprosium-SR25 5.3.7.RELEASE - 4.1.85.Final + 4.1.86.Final 4.4.15 2.17.2 1.7.36 diff --git a/pom.xml b/pom.xml index fec252a..9efa541 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Dysprosium-SR25 5.3.7.RELEASE 2.2.7.RELEASE - 4.1.85.Final + 4.1.86.Final 4.4.15 2.17.2 1.7.36 From d43a9ba798d2836e695b9a651bb70b11abfa4af1 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 12 Jan 2023 11:28:19 +0800 Subject: [PATCH 16/37] Upgrade netty-tcnative to 2.0.55.Final --- fizz-bootstrap/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index 1e35cc9..8d314a1 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -32,7 +32,7 @@ 1.15 2.11.1 2.8.9 - 2.0.54.Final + 2.0.55.Final 2.2.9.RELEASE 1.33 Moore-SR13--> diff --git a/pom.xml b/pom.xml index 9efa541..0d65ba2 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ 0.8.2 0.9.11 2.11.1 - 2.0.54.Final + 2.0.55.Final 2.2.9.RELEASE 1.33 Moore-SR13 From 9ff6869b5882c59b3e684b8b85a920de0a500ee4 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Fri, 13 Jan 2023 11:06:04 +0800 Subject: [PATCH 17/37] Upgrade netty-tcnative to 2.0.56.Final and netty to 4.1.87.Final --- fizz-bootstrap/pom.xml | 4 ++-- pom.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index 8d314a1..2258424 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -18,7 +18,7 @@ Dragonfruit-SR3 Dysprosium-SR25 5.3.7.RELEASE - 4.1.86.Final + 4.1.87.Final 4.4.15 2.17.2 1.7.36 @@ -32,7 +32,7 @@ 1.15 2.11.1 2.8.9 - 2.0.55.Final + 2.0.56.Final 2.2.9.RELEASE 1.33 Moore-SR13--> diff --git a/pom.xml b/pom.xml index 0d65ba2..81af7eb 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Dysprosium-SR25 5.3.7.RELEASE 2.2.7.RELEASE - 4.1.86.Final + 4.1.87.Final 4.4.15 2.17.2 1.7.36 @@ -22,7 +22,7 @@ 0.8.2 0.9.11 2.11.1 - 2.0.55.Final + 2.0.56.Final 2.2.9.RELEASE 1.33 Moore-SR13 From 6946773194b316c4581d2340b0e18bad4b6a1610 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Thu, 2 Feb 2023 11:46:04 +0800 Subject: [PATCH 18/37] rename organization --- README.en-us.md | 10 +++++----- README.md | 12 ++++++------ install.sh | 4 ++-- pom.xml | 8 ++++---- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/README.en-us.md b/README.en-us.md index 7d1306b..b1ab9b0 100644 --- a/README.en-us.md +++ b/README.en-us.md @@ -1,7 +1,7 @@ English | [简体中文](./README.md)

- +

Version @@ -11,8 +11,8 @@ English | [简体中文](./README.md) License: GPL--3.0 - - Java CI with Maven + + Java CI with Maven

@@ -39,7 +39,7 @@ API access:http://demo.fizzgate.com/proxy/[Service Name]/[API Path] ## Fizz's typical scene - + ## Product Features @@ -169,7 +169,7 @@ installation method 1: binary package: Installation method 2: docker: -Download SQL script from page: https://github.com/wehotel/fizz-gateway-community/releases/tag/{version} (replace {version} with corresponding version number) +Download SQL script from page: https://github.com/fizzgate/fizz-gateway-community/releases/tag/{version} (replace {version} with corresponding version number) For the first installation, execute the `fizz-manager-professional-{version}-mysql.sql` database script, upgrade from a low version to a high version, and choose to execute the corresponding upgrade script in the update directory diff --git a/README.md b/README.md index c923580..75305b0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [English](./README.en-us.md) | 简体中文

- +

Version @@ -10,8 +10,8 @@ License: GPL--3.0 - - Java CI with Maven + + Java CI with Maven

@@ -37,7 +37,7 @@ API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path] ## Fizz典型应用场景 - + ## 产品特性 - 应用管理:支持对接入的应用进行管理; @@ -171,7 +171,7 @@ API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path] 安装方式二(v2.0.0或以上版本):docker: -SQL脚本下载页:https://github.com/wehotel/fizz-gateway-community/releases/tag/{version} (把{version}替换为对应版本号) +SQL脚本下载页:https://github.com/fizzgate/fizz-gateway-community/releases/tag/{version} (把{version}替换为对应版本号) 首次安装执行`fizz-manager-professional-{version}-mysql.sql`数据库脚本,从低版本升级至高版本选择执行update目录下对应升级脚本(如有脚本则执行) @@ -299,7 +299,7 @@ Fizz官方微信群(请加入群之后再询问群主) 1. 网关核心项目fizz-gateway-community社区版本以GNU v3的方式进行的开放,在遵循GNU协议的个人非商业化项目中可以免费使用。 -2. 管理后台项目(fizz-manager-professional)作为商业版本仅开放二进制包 [免费下载](https://wj.qq.com/s2/8682608/8fe2/),而商业项目请注明公司名称联系我们(sale@fizzgate.com)进行授权,了解商业授权规则请点击[商业授权规则](https://github.com/wehotel/fizz-gateway-community/wiki/%E5%95%86%E4%B8%9A%E6%8E%88%E6%9D%83) +2. 管理后台项目(fizz-manager-professional)作为商业版本仅开放二进制包 [免费下载](https://wj.qq.com/s2/8682608/8fe2/),而商业项目请注明公司名称联系我们(sale@fizzgate.com)进行授权,了解商业授权规则请点击[商业授权规则](https://github.com/fizzgate/fizz-gateway-community/wiki/%E5%95%86%E4%B8%9A%E6%8E%88%E6%9D%83) 3. 在选择Fizz Gateway之前,我们强烈建议您先试用一下我们的DEMO站点,试用我们的产品,并且思考与自身的业务结合,并且考虑产品推行落地方式,在查阅我们的官网价格(https://www.fizzgate.com) 之后再进一步与我们联系。 diff --git a/install.sh b/install.sh index db4e146..ad48152 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ #!/bin/bash # ---------------------------------------------------------------------- -# use : wget https://github.com/wehotel/fizz-gateway-community/raw/master/install.sh && bash install.sh +# use : wget https://github.com/fizzgate/fizz-gateway-community/raw/master/install.sh && bash install.sh # ---------------------------------------------------------------------- # abort on errors @@ -53,7 +53,7 @@ if [ -x "$(command -v docker)" -a -x "$(command -v docker-compose)" ]; then # 安装Fizz if [ ! -f "docker-compose.yml" ];then - wget https://github.com/wehotel/fizz-gateway-community/raw/master/docker-compose.yml + wget https://github.com/fizzgate/fizz-gateway-community/raw/master/docker-compose.yml fi if [ ! -f "/etc/docker/daemon.json" ];then diff --git a/pom.xml b/pom.xml index 81af7eb..bc2451d 100644 --- a/pom.xml +++ b/pom.xml @@ -440,12 +440,12 @@ - https://github.com/wehotel/fizz-gateway-community + https://github.com/fizzgate/fizz-gateway-community - https://github.com/wehotel/fizz-gateway-community - scm:git:https://github.com/wehotel/fizz-gateway-community.git - scm:git:https://github.com/wehotel/fizz-gateway-community.git + https://github.com/fizzgate/fizz-gateway-community + scm:git:https://github.com/fizzgate/fizz-gateway-community.git + scm:git:https://github.com/fizzgate/fizz-gateway-community.git HEAD From 4f76a2c5d2dd26e4cf76ba3190b9c40c618ad99f Mon Sep 17 00:00:00 2001 From: dxfeng10 Date: Thu, 2 Feb 2023 14:38:26 +0800 Subject: [PATCH 19/37] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 75305b0..95794a2 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path] ## Fizz典型应用场景 - + ## 产品特性 - 应用管理:支持对接入的应用进行管理; From 8368aa6c822e5daa432dbc8a8a6da3705d0b9e6c Mon Sep 17 00:00:00 2001 From: dxfeng10 Date: Thu, 2 Feb 2023 14:39:23 +0800 Subject: [PATCH 20/37] Update README.en-us.md --- README.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.en-us.md b/README.en-us.md index b1ab9b0..777e257 100644 --- a/README.en-us.md +++ b/README.en-us.md @@ -39,7 +39,7 @@ API access:http://demo.fizzgate.com/proxy/[Service Name]/[API Path] ## Fizz's typical scene - + ## Product Features From f5136230307d50ba6c463fdc46f244778c62a78e Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 2 Feb 2023 17:57:28 +0800 Subject: [PATCH 21/37] Support client request with / path --- fizz-core/src/main/java/we/util/WebUtils.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fizz-core/src/main/java/we/util/WebUtils.java b/fizz-core/src/main/java/we/util/WebUtils.java index 0674251..cf2bdef 100644 --- a/fizz-core/src/main/java/we/util/WebUtils.java +++ b/fizz-core/src/main/java/we/util/WebUtils.java @@ -227,6 +227,9 @@ public abstract class WebUtils { } else { if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); + if (trdFS == -1) { + trdFS = p.length(); + } svc = p.substring(secFS + 1, trdFS); } else { throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); @@ -357,7 +360,11 @@ public abstract class WebUtils { if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); - p = p.substring(trdFS); + if (trdFS == -1) { + p = Consts.S.FORWARD_SLASH_STR; + } else { + p = p.substring(trdFS); + } } else { throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); } From 470e31ccc8ce9ae3387a796945462d7547506d2a Mon Sep 17 00:00:00 2001 From: dxfeng10 Date: Fri, 3 Feb 2023 16:01:38 +0800 Subject: [PATCH 22/37] rename package (#465) --- fizz-bootstrap/pom.xml | 2 +- .../fizzgate}/FizzBootstrapApplication.java | 11 +- .../src/main/resources/log4j2-spring.xml | 2 +- fizz-common/pom.xml | 4 +- .../fizzgate}/config/RedisReactiveConfig.java | 2 +- .../config/RedisReactiveProperties.java | 9 +- .../fizzgate}/config/SchedConfig.java | 2 +- .../config/WebClientBuilderConfig.java | 2 +- .../fizzgate}/config/WebClientConfig.java | 2 +- .../fizzgate}/constants/CommonConstants.java | 2 +- .../clients/log4j2appender/LogService.java | 7 +- .../clients/log4j2appender/ThreadContext.java | 2 + .../ext/FizzServerHttpRequestDecorator.java | 6 +- .../ext/FizzServerHttpResponseDecorator.java | 6 +- .../ext/FizzServerWebExchangeDecorator.java | 12 +- .../{we => com/fizzgate}/util/Constants.java | 4 +- .../{we => com/fizzgate}/util/Consts.java | 2 +- .../fizzgate}/util/DateTimeUtils.java | 6 +- .../fizzgate}/util/DigestUtils.java | 2 +- .../{we => com/fizzgate}/util/FileUtils.java | 2 +- .../fizzgate}/util/JacksonUtils.java | 4 +- .../fizzgate}/util/JsonSchemaUtils.java | 2 +- .../util/LocalDate2millsSerializer.java | 2 +- .../util/LocalDateTime2millsSerializer.java | 2 +- .../{we => com/fizzgate}/util/MapUtil.java | 2 +- .../util/Mills2localDateDeserializer.java | 2 +- .../util/Mills2localDateTimeDeserializer.java | 2 +- .../fizzgate}/util/NettyDataBufferUtils.java | 2 +- .../fizzgate}/util/NetworkUtils.java | 2 +- .../{we => com/fizzgate}/util/PemUtils.java | 2 +- .../fizzgate}/util/PropertiesUtils.java | 2 +- .../fizzgate}/util/ReactiveRedisHelper.java | 7 +- .../fizzgate}/util/ReactorUtils.java | 2 +- .../fizzgate}/util/ReflectionUtils.java | 2 +- .../{we => com/fizzgate}/util/Result.java | 2 +- .../{we => com/fizzgate}/util/Script.java | 2 +- .../fizzgate}/util/ScriptUtils.java | 2 +- .../fizzgate}/util/StringUtils.java | 2 +- .../fizzgate}/util/SymmetricCryptoUtils.java | 2 +- .../fizzgate}/util/SymmetricDecryptor.java | 2 +- .../fizzgate}/util/SymmetricEncryptor.java | 2 +- .../fizzgate}/util/ThreadContext.java | 2 +- .../{we => com/fizzgate}/util/TypeUtils.java | 2 +- .../{we => com/fizzgate}/util/UUIDUtil.java | 2 +- .../fizzgate}/util/UrlTransformUtils.java | 2 +- .../java/{we => com/fizzgate}/util/Utils.java | 2 +- .../{we => com/fizzgate}/util/YmlUtils.java | 2 +- .../{we => com/fizzgate}/xml/FileReader.java | 2 +- .../{we => com/fizzgate}/xml/JsonToXml.java | 2 +- .../java/{we => com/fizzgate}/xml/Node.java | 2 +- .../java/{we => com/fizzgate}/xml/Tag.java | 2 +- .../{we => com/fizzgate}/xml/XmlToJson.java | 2 +- .../clients/log4j2appender/ThreadContext.java | 90 --------------- .../java/{we => com/fizzgate}/OgnlTests.java | 2 +- .../fizzgate}/util/JsonSchemaUtilsTest.java | 5 +- .../fizzgate}/util/MapUtilTests.java | 4 +- .../fizzgate}/util/SymmetricCryptoTests.java | 5 +- .../{we => com/fizzgate}/xml/XmlTests.java | 5 +- fizz-core/pom.xml | 2 +- .../main/java/{we => com/fizzgate}/Fizz.java | 2 +- .../{we => com/fizzgate}/FizzAppContext.java | 4 +- .../ApolloLog4j2ConfigurationFactory.java | 2 +- .../config/FizzBeanFactoryPostProcessor.java | 13 ++- .../factory/config/FizzBeanPostProcessor.java | 2 +- .../config/AggregateRedisConfig.java | 9 +- .../AggregateRedisConfigProperties.java | 5 +- .../fizzgate}/config/ApolloConfig.java | 2 +- .../fizzgate}/config/AppConfigProperties.java | 2 +- .../config/FizzConfigConfiguration.java | 9 +- .../FizzGatewayNodeStatSchedConfig.java | 16 +-- .../fizzgate}/config/FizzMangerConfig.java | 8 +- .../fizzgate}/config/FlowControlConfig.java | 7 +- .../fizzgate}/config/FlowStatSchedConfig.java | 16 +-- .../config/FlowStatSchedConfigProperties.java | 2 +- .../java/com/fizzgate/config/LogConfig.java | 2 + .../fizzgate}/config/ManualApiConfig.java | 5 +- .../config/ProxyWebClientConfig.java | 4 +- .../config/RefreshLocalCacheConfig.java | 23 ++-- .../RefreshLocalCacheConfigProperties.java | 2 +- .../fizzgate}/config/SystemConfig.java | 11 +- .../fizzgate}/config/WebServerConfig.java | 2 +- .../config/WebServerConfigProperties.java | 2 +- .../config/annotation/FizzRefreshScope.java | 5 +- .../event/FizzApplicationListener.java | 2 +- .../context/event/FizzRefreshEvent.java | 5 +- .../event/FizzRefreshEventListener.java | 9 +- .../scope/refresh/FizzRefreshScope.java | 5 +- .../FizzRefreshScopeRefreshedEvent.java | 2 +- .../controller/CacheCheckController.java | 30 ++--- .../controller/CallbackController.java | 16 +-- .../controller/ConfigController.java | 8 +- .../controller/FlowControlController.java | 20 ++-- .../controller/HealthCheckController.java | 8 +- .../controller/ManagerConfigController.java | 36 +++--- .../controller/req/BaseManagerConfigReq.java | 2 +- .../controller/req/GetApiConfigDetailReq.java | 2 +- .../controller/req/GetApiConfigReq.java | 2 +- .../controller/req/GetConfigReq.java | 2 +- .../controller/req/GetConfigStrReq.java | 2 +- .../controller/resp/ApiConfigInfo.java | 2 +- .../fizzgate}/controller/resp/ConfigResp.java | 4 +- .../controller/resp/ConfigStrResp.java | 2 +- .../resp/GetApiConfigDetailResp.java | 2 +- .../controller/resp/GetApiConfigResp.java | 2 +- .../fizzgate}/dedicated_line/ApiDoc.java | 6 +- .../dedicated_line/DedicatedLine.java | 5 +- .../DedicatedLineController.java | 12 +- .../DedicatedLineHttpHandler.java | 10 +- .../dedicated_line/DedicatedLineInfo.java | 5 +- .../DedicatedLineInfoService.java | 12 +- .../dedicated_line/DedicatedLineService.java | 16 +-- .../DedicatedLineServiceRegistration.java | 11 +- .../dedicated_line/DedicatedLineUtils.java | 6 +- .../DedicatedLineWebServer.java | 5 +- ...edicatedLineWebServerInitializedEvent.java | 2 +- .../dedicated_line/MethodAndPath.java | 7 +- .../exception/ExecuteScriptException.java | 4 +- .../ExternalService4xxException.java | 2 +- .../exception/RedirectException.java | 2 +- .../exception/StopAndResponseException.java | 2 +- .../fizzgate}/filter/AggregateFilter.java | 27 ++--- .../filter/AggregateFilterProperties.java | 5 +- .../fizzgate}/filter/CallbackFilter.java | 29 ++--- .../filter/CallbackFilterProperties.java | 2 +- .../fizzgate}/filter/CorsFilterConfig.java | 4 +- .../filter/FilterExceptionHandlerConfig.java | 26 +++-- .../fizzgate}/filter/FilterResult.java | 2 +- .../fizzgate}/filter/FizzLogFilter.java | 12 +- .../fizzgate}/filter/FizzWebFilter.java | 6 +- .../fizzgate}/filter/FlowControlFilter.java | 32 +++--- .../filter/FlowControlFilterProperties.java | 2 +- .../fizzgate}/filter/PreprocessFilter.java | 30 ++--- .../fizzgate}/filter/RouteFilter.java | 20 ++-- .../fizzgate}/fizz/AggregateResource.java | 4 +- .../fizzgate}/fizz/AggregateResult.java | 2 +- .../fizzgate}/fizz/AggregateService.java | 15 +-- .../fizzgate}/fizz/ConfigLoader.java | 23 ++-- .../fizz/ConfigLoaderProperties.java | 2 +- .../{we => com/fizzgate}/fizz/Pipeline.java | 45 ++++---- .../java/{we => com/fizzgate}/fizz/Step.java | 21 ++-- .../fizzgate}/fizz/StepContext.java | 5 +- .../fizzgate}/fizz/StepResponse.java | 2 +- .../fizz/component/ComponentExecutor.java | 8 +- .../fizz/component/ComponentResult.java | 2 +- .../fizz/component/ComponentTypeEnum.java | 2 +- .../fizzgate}/fizz/component/IComponent.java | 2 +- .../fizz/component/OperatorEnum.java | 2 +- .../fizz/component/StepContextPosition.java | 2 +- .../fizz/component/circle/Circle.java | 23 ++-- .../fizz/component/circle/CircleItem.java | 2 +- .../fizz/component/condition/Condition.java | 18 +-- .../component/condition/ConditionValue.java | 9 +- .../fizz/exception/FizzException.java | 2 +- .../fizz/exception/FizzRuntimeException.java | 4 +- .../fizzgate}/fizz/field/FieldConfig.java | 2 +- .../fizz/field/FixedDataTypeEnum.java | 2 +- .../fizzgate}/fizz/field/RefDataTypeEnum.java | 2 +- .../fizzgate}/fizz/field/ValueTypeEnum.java | 2 +- .../fizzgate}/fizz/function/CodecFunc.java | 4 +- .../fizzgate}/fizz/function/CommonFunc.java | 2 +- .../fizzgate}/fizz/function/DateFunc.java | 4 +- .../fizzgate}/fizz/function/FuncExecutor.java | 11 +- .../fizzgate}/fizz/function/IFunc.java | 2 +- .../fizzgate}/fizz/function/ListFunc.java | 4 +- .../fizzgate}/fizz/function/MathFunc.java | 2 +- .../fizzgate}/fizz/function/StringFunc.java | 4 +- .../fizz/input/ClientInputConfig.java | 2 +- .../fizzgate}/fizz/input/IInput.java | 10 +- .../fizzgate}/fizz/input/Input.java | 10 +- .../fizzgate}/fizz/input/InputConfig.java | 4 +- .../fizzgate}/fizz/input/InputContext.java | 6 +- .../fizzgate}/fizz/input/InputFactory.java | 11 +- .../fizzgate}/fizz/input/InputType.java | 2 +- .../fizzgate}/fizz/input/PathMapping.java | 16 +-- .../fizzgate}/fizz/input/RPCInput.java | 12 +- .../fizzgate}/fizz/input/RPCResponse.java | 2 +- .../fizzgate}/fizz/input/ScriptHelper.java | 20 ++-- .../input/extension/dubbo/DubboInput.java | 26 +++-- .../extension/dubbo/DubboInputConfig.java | 6 +- .../extension/dubbo/DubboRPCResponse.java | 4 +- .../input/extension/grpc/GRPCResponse.java | 5 +- .../fizz/input/extension/grpc/GrpcInput.java | 27 ++--- .../input/extension/grpc/GrpcInputConfig.java | 8 +- .../input/extension/request/RequestInput.java | 35 +++--- .../extension/request/RequestInputConfig.java | 4 +- .../extension/request/RequestRPCResponse.java | 5 +- .../global_resource/GlobalResource.java | 4 +- .../GlobalResourceService.java | 12 +- .../fizzgate}/legacy/RespEntity.java | 6 +- .../listener/AggregateChannelListener.java | 6 +- .../fizzgate}/log/LogProperties.java | 2 +- .../{we => com/fizzgate}/log/LogSend.java | 2 +- .../fizzgate}/log/LogSendAppender.java | 2 +- .../log/LogSendAppenderWithLog4j2.java | 13 ++- .../log/LogSendAppenderWithLogback.java | 2 + .../fizzgate}/log/LogSendService.java | 2 +- .../log/RedisLogSendServiceImpl.java | 7 +- .../fizzgate}/monitor/FizzMonitorService.java | 15 +-- .../fizzgate}/plugin/FixedPluginFilter.java | 6 +- .../fizzgate}/plugin/FizzPluginFilter.java | 2 +- .../plugin/FizzPluginFilterChain.java | 14 ++- .../fizzgate}/plugin/PluginConfig.java | 5 +- .../fizzgate}/plugin/PluginFilter.java | 12 +- .../plugin/auth/AbstractCustomAuth.java | 8 +- .../fizzgate}/plugin/auth/ApiConfig.java | 13 ++- .../fizzgate}/plugin/auth/ApiConfig2apps.java | 6 +- .../plugin/auth/ApiConfig2appsService.java | 14 ++- .../plugin/auth/ApiConfigService.java | 12 +- .../auth/ApiConfigServiceProperties.java | 2 +- .../{we => com/fizzgate}/plugin/auth/App.java | 7 +- .../fizzgate}/plugin/auth/AppService.java | 12 +- .../plugin/auth/AuthPluginFilter.java | 10 +- .../fizzgate}/plugin/auth/CallbackConfig.java | 6 +- .../fizzgate}/plugin/auth/CustomAuth.java | 2 +- .../fizzgate}/plugin/auth/GatewayGroup.java | 7 +- .../plugin/auth/GatewayGroup2apiConfig.java | 5 +- .../plugin/auth/GatewayGroupService.java | 14 ++- .../fizzgate}/plugin/auth/Receiver.java | 7 +- .../fizzgate}/plugin/auth/ServiceConfig.java | 7 +- .../plugin/requestbody/RequestBodyPlugin.java | 18 +-- .../fizzgate}/plugin/stat/AccessStat.java | 4 +- .../plugin/stat/AccessStatSchedConfig.java | 13 ++- .../plugin/stat/StatPluginFilter.java | 14 ++- .../stat/StatPluginFilterProperties.java | 5 +- .../AbstractDiscoveryClientUriSelector.java | 6 +- .../fizzgate}/proxy/CallBackendConfig.java | 2 +- .../fizzgate}/proxy/CallbackReplayReq.java | 7 +- .../fizzgate}/proxy/CallbackService.java | 24 ++-- .../proxy/DisableDiscoveryUriSelector.java | 2 +- .../proxy/DiscoveryClientUriSelector.java | 2 +- .../fizzgate}/proxy/EurekaUriSelector.java | 2 +- .../fizzgate}/proxy/FailAggregateResult.java | 4 +- .../proxy/FizzFailClientResponse.java | 2 +- .../fizzgate}/proxy/FizzWebClient.java | 22 ++-- .../fizzgate}/proxy/NacosUriSelector.java | 2 +- .../{we => com/fizzgate}/proxy/Route.java | 9 +- .../fizzgate}/proxy/RpcInstanceService.java | 2 +- .../proxy/RpcInstanceServiceImpl.java | 12 +- .../fizzgate}/proxy/ServiceInstance.java | 4 +- .../fizzgate}/proxy/ServiceTypePath.java | 7 +- .../dubbo/ApacheDubboGenericService.java | 5 +- .../ApacheDubboGenericServiceProperties.java | 5 +- .../dubbo/DubboInterfaceDeclaration.java | 2 +- .../fizzgate}/proxy/dubbo/DubboUtils.java | 2 +- .../proxy/grpc/GrpcGenericService.java | 17 ++- .../proxy/grpc/GrpcInstanceService.java | 2 +- .../proxy/grpc/GrpcInstanceServiceImpl.java | 5 +- .../proxy/grpc/GrpcInterfaceDeclaration.java | 2 +- .../proxy/grpc/ListenableFutureAdapter.java | 2 +- .../proxy/grpc/client/CallParams.java | 2 +- .../proxy/grpc/client/CallResults.java | 2 +- .../proxy/grpc/client/GrpcClient.java | 12 +- .../proxy/grpc/client/GrpcProxyClient.java | 10 +- .../client/core/CompositeStreamObserver.java | 2 +- .../proxy/grpc/client/core/DoneObserver.java | 2 +- .../client/core/DynamicMessageMarshaller.java | 2 +- .../client/core/GrpcMethodDefinition.java | 2 +- .../client/core/ServerReflectionClient.java | 2 +- .../grpc/client/core/ServiceResolver.java | 2 +- .../grpc/client/utils/ChannelFactory.java | 2 +- .../client/utils/GrpcReflectionUtils.java | 6 +- .../grpc/client/utils/MessageWriter.java | 4 +- .../proxy/http/HttpInstanceService.java | 2 +- .../proxy/http/HttpInstanceServiceImpl.java | 5 +- .../fizzgate}/proxy/package-info.java | 4 +- .../FizzServiceRegistration.java | 11 +- .../service_registry/RegistryCenter.java | 5 +- .../RegistryCenterService.java | 10 +- .../eureka/FizzEurekaHelper.java | 6 +- .../eureka/FizzEurekaServiceRegistration.java | 8 +- .../nacos/FizzNacosHelper.java | 11 +- .../nacos/FizzNacosProperties.java | 2 +- .../nacos/FizzNacosServiceRegistration.java | 11 +- .../{we => com/fizzgate}/stats/BlockType.java | 2 +- .../{we => com/fizzgate}/stats/FlowStat.java | 11 +- .../fizzgate}/stats/IncrRequestResult.java | 2 +- .../fizzgate}/stats/ResourceConfig.java | 2 +- .../fizzgate}/stats/ResourceStat.java | 5 +- .../stats/ResourceTimeWindowStat.java | 2 +- .../{we => com/fizzgate}/stats/TimeSlot.java | 6 +- .../fizzgate}/stats/TimeWindowStat.java | 2 +- .../circuitbreaker/CircuitBreakManager.java | 10 +- .../stats/circuitbreaker/CircuitBreaker.java | 15 +-- .../fizzgate}/stats/degrade/DegradeRule.java | 12 +- .../stats/degrade/DegradeRuleService.java | 12 +- .../ratelimit/ResourceRateLimitConfig.java | 13 ++- .../ResourceRateLimitConfigService.java | 12 +- .../fizzgate}/util/ResourceIdUtils.java | 7 +- .../{we => com/fizzgate}/util/WebUtils.java | 20 +++- .../src/main/java/we/config/LogConfig.java | 104 ------------------ .../we/log/LogSendAppenderWithLogback.java | 94 ---------------- .../{we => com/fizzgate}/LogKafkaTests.java | 2 +- .../fizzgate}/RedisClusterTests.java | 7 +- .../DedicatedLineServiceTests.java | 14 ++- .../filter/FlowControlFilterTests.java | 24 ++-- .../fizzgate}/fizz/InputValidateTests.java | 11 +- .../fizzgate}/fizz/component/CircleTests.java | 27 ++--- .../fizz/component/ConditionTests.java | 15 +-- .../fizz/function/CodecFuncTests.java | 7 +- .../fizz/function/CommonFuncTests.java | 5 +- .../fizz/function/DateFuncTests.java | 4 +- .../fizz/function/FuncExecutorTests.java | 5 +- .../fizz/function/ListFuncTests.java | 6 +- .../fizz/function/MathFuncTests.java | 4 +- .../fizz/function/StringFuncTests.java | 5 +- .../com/fizzgate/fizz/group/DevTestGroup.java | 4 + .../fizzgate/fizz/group/FastTestGroup.java | 4 + .../fizzgate/fizz/group/SlowTestGroup.java | 4 + .../fizz/input/DubboInputMockTests.java | 20 ++-- .../fizzgate}/fizz/input/DubboInputTests.java | 11 +- .../fizz/input/GrpcInputMockTests.java | 24 ++-- .../fizz/input/PathMappingTests.java | 6 +- .../fizz/input/RequestInputTests.java | 5 +- .../ApacheDubboGenericServiceMockTests.java | 9 +- .../dubbo/ApacheDubboGenericServiceTests.java | 7 +- .../global_resource/GlobalResourceTests.java | 19 ++-- .../fizzgate}/plugin/PluginTests.java | 29 +++-- .../auth/ApiConfig2appsServiceTests.java | 12 +- .../plugin/auth/ApiConfigServiceTests.java | 15 ++- .../fizzgate}/plugin/auth/AppTests.java | 4 +- .../fizzgate}/proxy/CallbackServiceTests.java | 18 +-- .../fizzgate}/proxy/FizzWebClientTests.java | 4 +- .../fizzgate}/redis/RedisProperties.java | 2 +- .../redis/RedisServerConfiguration.java | 2 +- .../redis/RedisTemplateConfiguration.java | 2 +- .../RegistryCenterServiceTests.java | 22 ++-- .../fizzgate}/stats/FlowStatTests.java | 12 +- .../CircuitBreakManagerTests.java | 25 +++-- .../stats/ratelimit/RateLimitTests.java | 12 +- .../ResourceRateLimitConfigServiceTests.java | 13 ++- .../ResourceRateLimitConfigTests.java | 8 +- .../fizzgate}/util/MapUtilTests.java | 4 +- .../fizzgate}/util/WebUtilsTests.java | 4 +- .../fizzgate}/util/YmlUtilsTest.java | 5 +- .../test/java/we/fizz/group/DevTestGroup.java | 4 - .../java/we/fizz/group/FastTestGroup.java | 4 - .../java/we/fizz/group/SlowTestGroup.java | 4 - fizz-core/src/test/resources/log4j2-test.xml | 2 +- fizz-plugin/plugin-core.md | 18 +-- .../basicAuth/BasicAuthPluginFilter.java | 16 +-- .../plugin/basicAuth/GlobalConfig.java | 2 +- .../config/WeFizzPluginAutoConfiguration.java | 9 +- .../core/filter/AbstractFizzPlugin.java | 22 ++-- .../core/filter/config/ConfigUtils.java | 2 +- .../core/filter/config/ContentParser.java | 2 +- .../plugin/core/filter/config/FizzConfig.java | 6 +- .../core/filter/config/parser/JsonParser.java | 4 +- .../core/spring/FizzPluginAliasProcessor.java | 5 +- .../DedicatedLineApiAuthPluginFilter.java | 16 +-- .../codec/DedicatedLineCodecPluginFilter.java | 22 ++-- .../DedicatedLinePairingPluginFilter.java | 20 ++-- .../plugin/grayrelease/GrayReleasePlugin.java | 15 +-- .../fizzgate}/plugin/jwt/GlobalConfig.java | 2 +- .../plugin/jwt/JwtAuthPluginFilter.java | 11 +- .../fizzgate}/plugin/myplugin/MyPlugin.java | 8 +- .../plugin/myplugin/MyPluginPlus.java | 12 +- .../main/resources/META-INF/spring.factories | 2 +- .../basicAuth/BasicAuthPluginFilterTests.java | 5 +- .../filter/config/parser/JsonParserTest.java | 5 +- .../grayrelease/GrayReleasePluginTests.java | 24 ++-- .../jwtAuth/JwtAuthPluginFilterTests.java | 5 +- .../main/resources/META-INF/spring.factories | 100 ++++++++--------- ...schema-validator-i18n-support-1.0.39_5.jar | Bin 188874 -> 0 bytes ...schema-validator-i18n-support-1.0.39_6.jar | Bin 0 -> 195706 bytes ...chema-validator-i18n-support-1.0.39_6.pom} | 2 +- .../maven-metadata-local.xml | 4 +- 366 files changed, 1520 insertions(+), 1524 deletions(-) rename fizz-bootstrap/src/main/java/{we => com/fizzgate}/FizzBootstrapApplication.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/config/RedisReactiveConfig.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/config/RedisReactiveProperties.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/config/SchedConfig.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/config/WebClientBuilderConfig.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/config/WebClientConfig.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/constants/CommonConstants.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/flume/clients/log4j2appender/LogService.java (92%) create mode 100644 fizz-common/src/main/java/com/fizzgate/flume/clients/log4j2appender/ThreadContext.java rename fizz-common/src/main/java/{we => com/fizzgate}/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/spring/http/server/reactive/ext/FizzServerHttpResponseDecorator.java (96%) rename fizz-common/src/main/java/{we => com/fizzgate}/spring/web/server/ext/FizzServerWebExchangeDecorator.java (96%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/Constants.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/Consts.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/DateTimeUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/DigestUtils.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/FileUtils.java (97%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/JacksonUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/JsonSchemaUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/LocalDate2millsSerializer.java (94%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/LocalDateTime2millsSerializer.java (94%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/MapUtil.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/Mills2localDateDeserializer.java (96%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/Mills2localDateTimeDeserializer.java (95%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/NettyDataBufferUtils.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/NetworkUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/PemUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/PropertiesUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/ReactiveRedisHelper.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/ReactorUtils.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/ReflectionUtils.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/Result.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/Script.java (97%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/ScriptUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/StringUtils.java (97%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/SymmetricCryptoUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/SymmetricDecryptor.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/SymmetricEncryptor.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/ThreadContext.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/TypeUtils.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/UUIDUtil.java (97%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/UrlTransformUtils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/Utils.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/util/YmlUtils.java (97%) rename fizz-common/src/main/java/{we => com/fizzgate}/xml/FileReader.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/xml/JsonToXml.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/xml/Node.java (98%) rename fizz-common/src/main/java/{we => com/fizzgate}/xml/Tag.java (99%) rename fizz-common/src/main/java/{we => com/fizzgate}/xml/XmlToJson.java (99%) delete mode 100644 fizz-common/src/main/java/we/flume/clients/log4j2appender/ThreadContext.java rename fizz-common/src/test/java/{we => com/fizzgate}/OgnlTests.java (97%) rename fizz-common/src/test/java/{we => com/fizzgate}/util/JsonSchemaUtilsTest.java (95%) rename fizz-common/src/test/java/{we => com/fizzgate}/util/MapUtilTests.java (98%) rename fizz-common/src/test/java/{we => com/fizzgate}/util/SymmetricCryptoTests.java (88%) rename fizz-common/src/test/java/{we => com/fizzgate}/xml/XmlTests.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/Fizz.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/FizzAppContext.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/apollo/ApolloLog4j2ConfigurationFactory.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/beans/factory/config/FizzBeanFactoryPostProcessor.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/beans/factory/config/FizzBeanPostProcessor.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/AggregateRedisConfig.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/AggregateRedisConfigProperties.java (90%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/ApolloConfig.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/AppConfigProperties.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/FizzConfigConfiguration.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/FizzGatewayNodeStatSchedConfig.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/FizzMangerConfig.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/FlowControlConfig.java (90%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/FlowStatSchedConfig.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/FlowStatSchedConfigProperties.java (94%) create mode 100644 fizz-core/src/main/java/com/fizzgate/config/LogConfig.java rename fizz-core/src/main/java/{we => com/fizzgate}/config/ManualApiConfig.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/ProxyWebClientConfig.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/RefreshLocalCacheConfig.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/RefreshLocalCacheConfigProperties.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/SystemConfig.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/WebServerConfig.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/config/WebServerConfigProperties.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/context/config/annotation/FizzRefreshScope.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/context/event/FizzApplicationListener.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/context/event/FizzRefreshEvent.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/context/event/FizzRefreshEventListener.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/context/scope/refresh/FizzRefreshScope.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/context/scope/refresh/FizzRefreshScopeRefreshedEvent.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/CacheCheckController.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/CallbackController.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/ConfigController.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/FlowControlController.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/HealthCheckController.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/ManagerConfigController.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/req/BaseManagerConfigReq.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/req/GetApiConfigDetailReq.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/req/GetApiConfigReq.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/req/GetConfigReq.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/req/GetConfigStrReq.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/resp/ApiConfigInfo.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/resp/ConfigResp.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/resp/ConfigStrResp.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/resp/GetApiConfigDetailResp.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/controller/resp/GetApiConfigResp.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/ApiDoc.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLine.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineController.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineHttpHandler.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineInfo.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineInfoService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineServiceRegistration.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineUtils.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineWebServer.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/DedicatedLineWebServerInitializedEvent.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/dedicated_line/MethodAndPath.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/exception/ExecuteScriptException.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/exception/ExternalService4xxException.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/exception/RedirectException.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/exception/StopAndResponseException.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/AggregateFilter.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/AggregateFilterProperties.java (90%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/CallbackFilter.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/CallbackFilterProperties.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/CorsFilterConfig.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/FilterExceptionHandlerConfig.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/FilterResult.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/FizzLogFilter.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/FizzWebFilter.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/FlowControlFilter.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/FlowControlFilterProperties.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/PreprocessFilter.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/filter/RouteFilter.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/AggregateResource.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/AggregateResult.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/AggregateService.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/ConfigLoader.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/ConfigLoaderProperties.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/Pipeline.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/Step.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/StepContext.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/StepResponse.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/ComponentExecutor.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/ComponentResult.java (64%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/ComponentTypeEnum.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/IComponent.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/OperatorEnum.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/StepContextPosition.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/circle/Circle.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/circle/CircleItem.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/condition/Condition.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/component/condition/ConditionValue.java (88%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/exception/FizzException.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/exception/FizzRuntimeException.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/field/FieldConfig.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/field/FixedDataTypeEnum.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/field/RefDataTypeEnum.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/field/ValueTypeEnum.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/CodecFunc.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/CommonFunc.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/DateFunc.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/FuncExecutor.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/IFunc.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/ListFunc.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/MathFunc.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/function/StringFunc.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/ClientInputConfig.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/IInput.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/Input.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/InputConfig.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/InputContext.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/InputFactory.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/InputType.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/PathMapping.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/RPCInput.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/RPCResponse.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/ScriptHelper.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/dubbo/DubboInput.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/dubbo/DubboInputConfig.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/dubbo/DubboRPCResponse.java (89%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/grpc/GRPCResponse.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/grpc/GrpcInput.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/grpc/GrpcInputConfig.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/request/RequestInput.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/request/RequestInputConfig.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/fizz/input/extension/request/RequestRPCResponse.java (91%) rename fizz-core/src/main/java/{we => com/fizzgate}/global_resource/GlobalResource.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/global_resource/GlobalResourceService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/legacy/RespEntity.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/listener/AggregateChannelListener.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/log/LogProperties.java (76%) rename fizz-core/src/main/java/{we => com/fizzgate}/log/LogSend.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/log/LogSendAppender.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/log/LogSendAppenderWithLog4j2.java (96%) create mode 100644 fizz-core/src/main/java/com/fizzgate/log/LogSendAppenderWithLogback.java rename fizz-core/src/main/java/{we => com/fizzgate}/log/LogSendService.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/log/RedisLogSendServiceImpl.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/monitor/FizzMonitorService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/FixedPluginFilter.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/FizzPluginFilter.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/FizzPluginFilterChain.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/PluginConfig.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/PluginFilter.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/AbstractCustomAuth.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/ApiConfig.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/ApiConfig2apps.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/ApiConfig2appsService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/ApiConfigService.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/ApiConfigServiceProperties.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/App.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/AppService.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/AuthPluginFilter.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/CallbackConfig.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/CustomAuth.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/GatewayGroup.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/GatewayGroup2apiConfig.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/GatewayGroupService.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/Receiver.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/auth/ServiceConfig.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/requestbody/RequestBodyPlugin.java (90%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/stat/AccessStat.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/stat/AccessStatSchedConfig.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/stat/StatPluginFilter.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/plugin/stat/StatPluginFilterProperties.java (89%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/AbstractDiscoveryClientUriSelector.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/CallBackendConfig.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/CallbackReplayReq.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/CallbackService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/DisableDiscoveryUriSelector.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/DiscoveryClientUriSelector.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/EurekaUriSelector.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/FailAggregateResult.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/FizzFailClientResponse.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/FizzWebClient.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/NacosUriSelector.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/Route.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/RpcInstanceService.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/RpcInstanceServiceImpl.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/ServiceInstance.java (94%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/ServiceTypePath.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/dubbo/ApacheDubboGenericService.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/dubbo/ApacheDubboGenericServiceProperties.java (89%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/dubbo/DubboInterfaceDeclaration.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/dubbo/DubboUtils.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/GrpcGenericService.java (88%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/GrpcInstanceService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/GrpcInstanceServiceImpl.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/GrpcInterfaceDeclaration.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/ListenableFutureAdapter.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/CallParams.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/CallResults.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/GrpcClient.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/GrpcProxyClient.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/core/CompositeStreamObserver.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/core/DoneObserver.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/core/DynamicMessageMarshaller.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/core/GrpcMethodDefinition.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/core/ServerReflectionClient.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/core/ServiceResolver.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/utils/ChannelFactory.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/utils/GrpcReflectionUtils.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/grpc/client/utils/MessageWriter.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/http/HttpInstanceService.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/http/HttpInstanceServiceImpl.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/proxy/package-info.java (95%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/FizzServiceRegistration.java (93%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/RegistryCenter.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/RegistryCenterService.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/eureka/FizzEurekaHelper.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/eureka/FizzEurekaServiceRegistration.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/nacos/FizzNacosHelper.java (96%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/nacos/FizzNacosProperties.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/service_registry/nacos/FizzNacosServiceRegistration.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/BlockType.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/FlowStat.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/IncrRequestResult.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/ResourceConfig.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/ResourceStat.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/ResourceTimeWindowStat.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/TimeSlot.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/TimeWindowStat.java (99%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/circuitbreaker/CircuitBreakManager.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/circuitbreaker/CircuitBreaker.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/degrade/DegradeRule.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/degrade/DegradeRuleService.java (97%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/ratelimit/ResourceRateLimitConfig.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/stats/ratelimit/ResourceRateLimitConfigService.java (98%) rename fizz-core/src/main/java/{we => com/fizzgate}/util/ResourceIdUtils.java (92%) rename fizz-core/src/main/java/{we => com/fizzgate}/util/WebUtils.java (98%) delete mode 100644 fizz-core/src/main/java/we/config/LogConfig.java delete mode 100644 fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java rename fizz-core/src/test/java/{we => com/fizzgate}/LogKafkaTests.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/RedisClusterTests.java (95%) rename fizz-core/src/test/java/{we => com/fizzgate}/dedicated_line/DedicatedLineServiceTests.java (80%) rename fizz-core/src/test/java/{we => com/fizzgate}/filter/FlowControlFilterTests.java (90%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/InputValidateTests.java (93%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/component/CircleTests.java (88%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/component/ConditionTests.java (97%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/function/CodecFuncTests.java (96%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/function/CommonFuncTests.java (99%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/function/DateFuncTests.java (97%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/function/FuncExecutorTests.java (94%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/function/ListFuncTests.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/function/MathFuncTests.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/function/StringFuncTests.java (98%) create mode 100644 fizz-core/src/test/java/com/fizzgate/fizz/group/DevTestGroup.java create mode 100644 fizz-core/src/test/java/com/fizzgate/fizz/group/FastTestGroup.java create mode 100644 fizz-core/src/test/java/com/fizzgate/fizz/group/SlowTestGroup.java rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/input/DubboInputMockTests.java (86%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/input/DubboInputTests.java (86%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/input/GrpcInputMockTests.java (86%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/input/PathMappingTests.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/input/RequestInputTests.java (96%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/input/proxy/dubbo/ApacheDubboGenericServiceMockTests.java (91%) rename fizz-core/src/test/java/{we => com/fizzgate}/fizz/input/proxy/dubbo/ApacheDubboGenericServiceTests.java (93%) rename fizz-core/src/test/java/{we => com/fizzgate}/global_resource/GlobalResourceTests.java (84%) rename fizz-core/src/test/java/{we => com/fizzgate}/plugin/PluginTests.java (93%) rename fizz-core/src/test/java/{we => com/fizzgate}/plugin/auth/ApiConfig2appsServiceTests.java (88%) rename fizz-core/src/test/java/{we => com/fizzgate}/plugin/auth/ApiConfigServiceTests.java (86%) rename fizz-core/src/test/java/{we => com/fizzgate}/plugin/auth/AppTests.java (96%) rename fizz-core/src/test/java/{we => com/fizzgate}/proxy/CallbackServiceTests.java (90%) rename fizz-core/src/test/java/{we => com/fizzgate}/proxy/FizzWebClientTests.java (94%) rename fizz-core/src/test/java/{we => com/fizzgate}/redis/RedisProperties.java (97%) rename fizz-core/src/test/java/{we => com/fizzgate}/redis/RedisServerConfiguration.java (96%) rename fizz-core/src/test/java/{we => com/fizzgate}/redis/RedisTemplateConfiguration.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/service_registry/RegistryCenterServiceTests.java (87%) rename fizz-core/src/test/java/{we => com/fizzgate}/stats/FlowStatTests.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/stats/circuitbreaker/CircuitBreakManagerTests.java (89%) rename fizz-core/src/test/java/{we => com/fizzgate}/stats/ratelimit/RateLimitTests.java (96%) rename fizz-core/src/test/java/{we => com/fizzgate}/stats/ratelimit/ResourceRateLimitConfigServiceTests.java (88%) rename fizz-core/src/test/java/{we => com/fizzgate}/stats/ratelimit/ResourceRateLimitConfigTests.java (92%) rename fizz-core/src/test/java/{we => com/fizzgate}/util/MapUtilTests.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/util/WebUtilsTests.java (98%) rename fizz-core/src/test/java/{we => com/fizzgate}/util/YmlUtilsTest.java (91%) delete mode 100644 fizz-core/src/test/java/we/fizz/group/DevTestGroup.java delete mode 100644 fizz-core/src/test/java/we/fizz/group/FastTestGroup.java delete mode 100644 fizz-core/src/test/java/we/fizz/group/SlowTestGroup.java rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/basicAuth/BasicAuthPluginFilter.java (94%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/basicAuth/GlobalConfig.java (96%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/core/config/WeFizzPluginAutoConfiguration.java (61%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/core/filter/AbstractFizzPlugin.java (92%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/core/filter/config/ConfigUtils.java (96%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/core/filter/config/ContentParser.java (87%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/core/filter/config/FizzConfig.java (75%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/core/filter/config/parser/JsonParser.java (96%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/core/spring/FizzPluginAliasProcessor.java (95%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/dedicatedline/auth/DedicatedLineApiAuthPluginFilter.java (92%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/dedicatedline/codec/DedicatedLineCodecPluginFilter.java (91%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/dedicatedline/pairing/DedicatedLinePairingPluginFilter.java (92%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/grayrelease/GrayReleasePlugin.java (98%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/jwt/GlobalConfig.java (97%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/jwt/JwtAuthPluginFilter.java (97%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/myplugin/MyPlugin.java (81%) rename fizz-plugin/src/main/java/{we => com/fizzgate}/plugin/myplugin/MyPluginPlus.java (89%) rename fizz-plugin/src/test/java/{we => com/fizzgate}/plugin/basicAuth/BasicAuthPluginFilterTests.java (95%) rename fizz-plugin/src/test/java/{we => com/fizzgate}/plugin/core/filter/config/parser/JsonParserTest.java (93%) rename fizz-plugin/src/test/java/{we => com/fizzgate}/plugin/grayrelease/GrayReleasePluginTests.java (95%) rename fizz-plugin/src/test/java/{we => com/fizzgate}/plugin/jwtAuth/JwtAuthPluginFilterTests.java (97%) delete mode 100644 repo/com/networknt/json-schema-validator-i18n-support/1.0.39_5/json-schema-validator-i18n-support-1.0.39_5.jar create mode 100644 repo/com/networknt/json-schema-validator-i18n-support/1.0.39_6/json-schema-validator-i18n-support-1.0.39_6.jar rename repo/com/networknt/json-schema-validator-i18n-support/{1.0.39_5/json-schema-validator-i18n-support-1.0.39_5.pom => 1.0.39_6/json-schema-validator-i18n-support-1.0.39_6.pom} (98%) diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index 2258424..9fc02de 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -60,7 +60,7 @@ com.networknt json-schema-validator-i18n-support - 1.0.39_5 + 1.0.39_6 diff --git a/fizz-bootstrap/src/main/java/we/FizzBootstrapApplication.java b/fizz-bootstrap/src/main/java/com/fizzgate/FizzBootstrapApplication.java similarity index 98% rename from fizz-bootstrap/src/main/java/we/FizzBootstrapApplication.java rename to fizz-bootstrap/src/main/java/com/fizzgate/FizzBootstrapApplication.java index 74ed6e7..3eb0b3e 100644 --- a/fizz-bootstrap/src/main/java/we/FizzBootstrapApplication.java +++ b/fizz-bootstrap/src/main/java/com/fizzgate/FizzBootstrapApplication.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we; +package com.fizzgate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,9 +83,12 @@ import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfigurati import org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration; import org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import we.config.AggregateRedisConfig; -import we.log.LogSendAppender; -import we.util.FileUtils; + +import com.fizzgate.Fizz; +import com.fizzgate.FizzAppContext; +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.log.LogSendAppender; +import com.fizzgate.util.FileUtils; /** * fizz gateway application boot entrance diff --git a/fizz-bootstrap/src/main/resources/log4j2-spring.xml b/fizz-bootstrap/src/main/resources/log4j2-spring.xml index a6a93bf..b6ea1fd 100644 --- a/fizz-bootstrap/src/main/resources/log4j2-spring.xml +++ b/fizz-bootstrap/src/main/resources/log4j2-spring.xml @@ -29,7 +29,7 @@ - + diff --git a/fizz-common/pom.xml b/fizz-common/pom.xml index 27ff035..11e383f 100644 --- a/fizz-common/pom.xml +++ b/fizz-common/pom.xml @@ -44,7 +44,7 @@ com.networknt json-schema-validator-i18n-support - 1.0.39_5 + 1.0.39_6 @@ -163,7 +163,7 @@ com.networknt - we.repackaged.com.networknt + com.fizzgate.repackaged.com.networknt diff --git a/fizz-common/src/main/java/we/config/RedisReactiveConfig.java b/fizz-common/src/main/java/com/fizzgate/config/RedisReactiveConfig.java similarity index 99% rename from fizz-common/src/main/java/we/config/RedisReactiveConfig.java rename to fizz-common/src/main/java/com/fizzgate/config/RedisReactiveConfig.java index 854a559..cdfd84b 100644 --- a/fizz-common/src/main/java/we/config/RedisReactiveConfig.java +++ b/fizz-common/src/main/java/com/fizzgate/config/RedisReactiveConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import io.lettuce.core.ClientOptions; import io.lettuce.core.ReadFrom; diff --git a/fizz-common/src/main/java/we/config/RedisReactiveProperties.java b/fizz-common/src/main/java/com/fizzgate/config/RedisReactiveProperties.java similarity index 98% rename from fizz-common/src/main/java/we/config/RedisReactiveProperties.java rename to fizz-common/src/main/java/com/fizzgate/config/RedisReactiveProperties.java index a227aa2..c6aee0f 100644 --- a/fizz-common/src/main/java/we/config/RedisReactiveProperties.java +++ b/fizz-common/src/main/java/com/fizzgate/config/RedisReactiveProperties.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import io.lettuce.core.ReadFrom; import org.springframework.data.redis.connection.RedisNode; -import we.util.Consts; -import we.util.StringUtils; -import we.util.Utils; + +import com.fizzgate.util.Consts; +import com.fizzgate.util.StringUtils; +import com.fizzgate.util.Utils; import java.time.Duration; import java.util.ArrayList; diff --git a/fizz-common/src/main/java/we/config/SchedConfig.java b/fizz-common/src/main/java/com/fizzgate/config/SchedConfig.java similarity index 98% rename from fizz-common/src/main/java/we/config/SchedConfig.java rename to fizz-common/src/main/java/com/fizzgate/config/SchedConfig.java index 8616d93..58114bf 100644 --- a/fizz-common/src/main/java/we/config/SchedConfig.java +++ b/fizz-common/src/main/java/com/fizzgate/config/SchedConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import java.util.Date; import java.util.concurrent.Executor; diff --git a/fizz-common/src/main/java/we/config/WebClientBuilderConfig.java b/fizz-common/src/main/java/com/fizzgate/config/WebClientBuilderConfig.java similarity index 98% rename from fizz-common/src/main/java/we/config/WebClientBuilderConfig.java rename to fizz-common/src/main/java/com/fizzgate/config/WebClientBuilderConfig.java index 516725f..3b937fb 100644 --- a/fizz-common/src/main/java/we/config/WebClientBuilderConfig.java +++ b/fizz-common/src/main/java/com/fizzgate/config/WebClientBuilderConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; diff --git a/fizz-common/src/main/java/we/config/WebClientConfig.java b/fizz-common/src/main/java/com/fizzgate/config/WebClientConfig.java similarity index 99% rename from fizz-common/src/main/java/we/config/WebClientConfig.java rename to fizz-common/src/main/java/com/fizzgate/config/WebClientConfig.java index 98efd99..ad82d70 100644 --- a/fizz-common/src/main/java/we/config/WebClientConfig.java +++ b/fizz-common/src/main/java/com/fizzgate/config/WebClientConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import io.netty.channel.ChannelOption; import io.netty.handler.ssl.SslContext; diff --git a/fizz-common/src/main/java/we/constants/CommonConstants.java b/fizz-common/src/main/java/com/fizzgate/constants/CommonConstants.java similarity index 98% rename from fizz-common/src/main/java/we/constants/CommonConstants.java rename to fizz-common/src/main/java/com/fizzgate/constants/CommonConstants.java index e389199..df37c94 100644 --- a/fizz-common/src/main/java/we/constants/CommonConstants.java +++ b/fizz-common/src/main/java/com/fizzgate/constants/CommonConstants.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.constants; +package com.fizzgate.constants; /** * @author unknown diff --git a/fizz-common/src/main/java/we/flume/clients/log4j2appender/LogService.java b/fizz-common/src/main/java/com/fizzgate/flume/clients/log4j2appender/LogService.java similarity index 92% rename from fizz-common/src/main/java/we/flume/clients/log4j2appender/LogService.java rename to fizz-common/src/main/java/com/fizzgate/flume/clients/log4j2appender/LogService.java index 11179b6..26c8bcb 100644 --- a/fizz-common/src/main/java/we/flume/clients/log4j2appender/LogService.java +++ b/fizz-common/src/main/java/com/fizzgate/flume/clients/log4j2appender/LogService.java @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package we.flume.clients.log4j2appender; +package com.fizzgate.flume.clients.log4j2appender; import org.apache.logging.log4j.ThreadContext; -import we.constants.CommonConstants; -import we.util.Consts; + +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.util.Consts; public enum LogService { diff --git a/fizz-common/src/main/java/com/fizzgate/flume/clients/log4j2appender/ThreadContext.java b/fizz-common/src/main/java/com/fizzgate/flume/clients/log4j2appender/ThreadContext.java new file mode 100644 index 0000000..76aaf5a --- /dev/null +++ b/fizz-common/src/main/java/com/fizzgate/flume/clients/log4j2appender/ThreadContext.java @@ -0,0 +1,2 @@ +package com.fizzgate.flume.clients.log4j2appender; + diff --git a/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java b/fizz-common/src/main/java/com/fizzgate/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java similarity index 98% rename from fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java rename to fizz-common/src/main/java/com/fizzgate/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java index 083fb13..914d15d 100644 --- a/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java +++ b/fizz-common/src/main/java/com/fizzgate/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.spring.http.server.reactive.ext; +package com.fizzgate.spring.http.server.reactive.ext; import io.netty.handler.codec.http.cookie.Cookie; import org.springframework.core.io.buffer.DataBuffer; @@ -30,9 +30,11 @@ import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; + +import com.fizzgate.util.NettyDataBufferUtils; + import reactor.core.publisher.Flux; import reactor.netty.http.server.HttpServerRequest; -import we.util.NettyDataBufferUtils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; diff --git a/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpResponseDecorator.java b/fizz-common/src/main/java/com/fizzgate/spring/http/server/reactive/ext/FizzServerHttpResponseDecorator.java similarity index 96% rename from fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpResponseDecorator.java rename to fizz-common/src/main/java/com/fizzgate/spring/http/server/reactive/ext/FizzServerHttpResponseDecorator.java index f0f1cdd..0641784 100644 --- a/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpResponseDecorator.java +++ b/fizz-common/src/main/java/com/fizzgate/spring/http/server/reactive/ext/FizzServerHttpResponseDecorator.java @@ -15,15 +15,17 @@ * along with this program. If not, see . */ -package we.spring.http.server.reactive.ext; +package com.fizzgate.spring.http.server.reactive.ext; import org.reactivestreams.Publisher; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.PooledDataBuffer; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.http.server.reactive.ServerHttpResponseDecorator; + +import com.fizzgate.util.NettyDataBufferUtils; + import reactor.core.publisher.Mono; -import we.util.NettyDataBufferUtils; /** * @author hongqiaowei diff --git a/fizz-common/src/main/java/we/spring/web/server/ext/FizzServerWebExchangeDecorator.java b/fizz-common/src/main/java/com/fizzgate/spring/web/server/ext/FizzServerWebExchangeDecorator.java similarity index 96% rename from fizz-common/src/main/java/we/spring/web/server/ext/FizzServerWebExchangeDecorator.java rename to fizz-common/src/main/java/com/fizzgate/spring/web/server/ext/FizzServerWebExchangeDecorator.java index 2467161..7013db8 100644 --- a/fizz-common/src/main/java/we/spring/web/server/ext/FizzServerWebExchangeDecorator.java +++ b/fizz-common/src/main/java/com/fizzgate/spring/web/server/ext/FizzServerWebExchangeDecorator.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.spring.web.server.ext; +package com.fizzgate.spring.web.server.ext; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -26,11 +26,13 @@ import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchangeDecorator; + +import com.fizzgate.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator; +import com.fizzgate.util.Consts; +import com.fizzgate.util.NettyDataBufferUtils; +import com.fizzgate.util.ThreadContext; + import reactor.core.publisher.Mono; -import we.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator; -import we.util.Consts; -import we.util.NettyDataBufferUtils; -import we.util.ThreadContext; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; diff --git a/fizz-common/src/main/java/we/util/Constants.java b/fizz-common/src/main/java/com/fizzgate/util/Constants.java similarity index 98% rename from fizz-common/src/main/java/we/util/Constants.java rename to fizz-common/src/main/java/com/fizzgate/util/Constants.java index b9da0ad..1c080c2 100644 --- a/fizz-common/src/main/java/we/util/Constants.java +++ b/fizz-common/src/main/java/com/fizzgate/util/Constants.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import org.apache.commons.lang3.SystemUtils; /** * @author hongqiaowei - * @deprecated and use {@link we.util.Consts} instead + * @deprecated and use {@link com.fizzgate.util.Consts} instead */ @Deprecated diff --git a/fizz-common/src/main/java/we/util/Consts.java b/fizz-common/src/main/java/com/fizzgate/util/Consts.java similarity index 99% rename from fizz-common/src/main/java/we/util/Consts.java rename to fizz-common/src/main/java/com/fizzgate/util/Consts.java index 7a3dcec..4925ea3 100644 --- a/fizz-common/src/main/java/we/util/Consts.java +++ b/fizz-common/src/main/java/com/fizzgate/util/Consts.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; /** * @author hongqiaowei diff --git a/fizz-common/src/main/java/we/util/DateTimeUtils.java b/fizz-common/src/main/java/com/fizzgate/util/DateTimeUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/DateTimeUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/DateTimeUtils.java index 12e9174..23fde6c 100644 --- a/fizz-common/src/main/java/we/util/DateTimeUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/DateTimeUtils.java @@ -15,9 +15,7 @@ * along with this program. If not, see . */ -package we.util; - -import we.util.Consts.DP; +package com.fizzgate.util; import java.time.Instant; import java.time.LocalDate; @@ -31,6 +29,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; +import com.fizzgate.util.Consts.DP; + /** * @author hongqiaowei */ diff --git a/fizz-common/src/main/java/we/util/DigestUtils.java b/fizz-common/src/main/java/com/fizzgate/util/DigestUtils.java similarity index 98% rename from fizz-common/src/main/java/we/util/DigestUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/DigestUtils.java index b474962..f70217f 100644 --- a/fizz-common/src/main/java/we/util/DigestUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/DigestUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import org.apache.commons.codec.binary.Hex; diff --git a/fizz-common/src/main/java/we/util/FileUtils.java b/fizz-common/src/main/java/com/fizzgate/util/FileUtils.java similarity index 97% rename from fizz-common/src/main/java/we/util/FileUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/FileUtils.java index 9a31fa1..701fc92 100644 --- a/fizz-common/src/main/java/we/util/FileUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/FileUtils.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import java.io.File; import java.util.Objects; diff --git a/fizz-common/src/main/java/we/util/JacksonUtils.java b/fizz-common/src/main/java/com/fizzgate/util/JacksonUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/JacksonUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/JacksonUtils.java index 9abb4b2..f81fd19 100644 --- a/fizz-common/src/main/java/we/util/JacksonUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/JacksonUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonFactory; @@ -27,7 +27,7 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import we.util.Consts.DP; +import com.fizzgate.util.Consts.DP; import java.io.IOException; import java.time.LocalDate; diff --git a/fizz-common/src/main/java/we/util/JsonSchemaUtils.java b/fizz-common/src/main/java/com/fizzgate/util/JsonSchemaUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/JsonSchemaUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/JsonSchemaUtils.java index 92852ce..1625391 100644 --- a/fizz-common/src/main/java/we/util/JsonSchemaUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/JsonSchemaUtils.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/fizz-common/src/main/java/we/util/LocalDate2millsSerializer.java b/fizz-common/src/main/java/com/fizzgate/util/LocalDate2millsSerializer.java similarity index 94% rename from fizz-common/src/main/java/we/util/LocalDate2millsSerializer.java rename to fizz-common/src/main/java/com/fizzgate/util/LocalDate2millsSerializer.java index db0479d..95665e9 100644 --- a/fizz-common/src/main/java/we/util/LocalDate2millsSerializer.java +++ b/fizz-common/src/main/java/com/fizzgate/util/LocalDate2millsSerializer.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; diff --git a/fizz-common/src/main/java/we/util/LocalDateTime2millsSerializer.java b/fizz-common/src/main/java/com/fizzgate/util/LocalDateTime2millsSerializer.java similarity index 94% rename from fizz-common/src/main/java/we/util/LocalDateTime2millsSerializer.java rename to fizz-common/src/main/java/com/fizzgate/util/LocalDateTime2millsSerializer.java index 9446539..f6a7b09 100644 --- a/fizz-common/src/main/java/we/util/LocalDateTime2millsSerializer.java +++ b/fizz-common/src/main/java/com/fizzgate/util/LocalDateTime2millsSerializer.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; diff --git a/fizz-common/src/main/java/we/util/MapUtil.java b/fizz-common/src/main/java/com/fizzgate/util/MapUtil.java similarity index 99% rename from fizz-common/src/main/java/we/util/MapUtil.java rename to fizz-common/src/main/java/com/fizzgate/util/MapUtil.java index 0347697..50ce684 100644 --- a/fizz-common/src/main/java/we/util/MapUtil.java +++ b/fizz-common/src/main/java/com/fizzgate/util/MapUtil.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import java.util.ArrayList; import java.util.Collection; diff --git a/fizz-common/src/main/java/we/util/Mills2localDateDeserializer.java b/fizz-common/src/main/java/com/fizzgate/util/Mills2localDateDeserializer.java similarity index 96% rename from fizz-common/src/main/java/we/util/Mills2localDateDeserializer.java rename to fizz-common/src/main/java/com/fizzgate/util/Mills2localDateDeserializer.java index 78bfd42..41045a0 100644 --- a/fizz-common/src/main/java/we/util/Mills2localDateDeserializer.java +++ b/fizz-common/src/main/java/com/fizzgate/util/Mills2localDateDeserializer.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; diff --git a/fizz-common/src/main/java/we/util/Mills2localDateTimeDeserializer.java b/fizz-common/src/main/java/com/fizzgate/util/Mills2localDateTimeDeserializer.java similarity index 95% rename from fizz-common/src/main/java/we/util/Mills2localDateTimeDeserializer.java rename to fizz-common/src/main/java/com/fizzgate/util/Mills2localDateTimeDeserializer.java index 483b82b..50ba739 100644 --- a/fizz-common/src/main/java/we/util/Mills2localDateTimeDeserializer.java +++ b/fizz-common/src/main/java/com/fizzgate/util/Mills2localDateTimeDeserializer.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; diff --git a/fizz-common/src/main/java/we/util/NettyDataBufferUtils.java b/fizz-common/src/main/java/com/fizzgate/util/NettyDataBufferUtils.java similarity index 98% rename from fizz-common/src/main/java/we/util/NettyDataBufferUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/NettyDataBufferUtils.java index 9b5a4b6..09bbeb4 100644 --- a/fizz-common/src/main/java/we/util/NettyDataBufferUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/NettyDataBufferUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import io.netty.buffer.ByteBufAllocator; import org.springframework.core.io.buffer.DataBuffer; diff --git a/fizz-common/src/main/java/we/util/NetworkUtils.java b/fizz-common/src/main/java/com/fizzgate/util/NetworkUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/NetworkUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/NetworkUtils.java index 9e9d96b..7a0acb1 100644 --- a/fizz-common/src/main/java/we/util/NetworkUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/NetworkUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/fizz-common/src/main/java/we/util/PemUtils.java b/fizz-common/src/main/java/com/fizzgate/util/PemUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/PemUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/PemUtils.java index 7141533..ab694dc 100644 --- a/fizz-common/src/main/java/we/util/PemUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/PemUtils.java @@ -3,7 +3,7 @@ //The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -package we.util; +package com.fizzgate.util; import org.bouncycastle.util.io.pem.PemObject; import org.bouncycastle.util.io.pem.PemReader; diff --git a/fizz-common/src/main/java/we/util/PropertiesUtils.java b/fizz-common/src/main/java/com/fizzgate/util/PropertiesUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/PropertiesUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/PropertiesUtils.java index 4260b77..6aa322a 100644 --- a/fizz-common/src/main/java/we/util/PropertiesUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/PropertiesUtils.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.PropertyAccessor; diff --git a/fizz-common/src/main/java/we/util/ReactiveRedisHelper.java b/fizz-common/src/main/java/com/fizzgate/util/ReactiveRedisHelper.java similarity index 98% rename from fizz-common/src/main/java/we/util/ReactiveRedisHelper.java rename to fizz-common/src/main/java/com/fizzgate/util/ReactiveRedisHelper.java index 85cd310..954112f 100644 --- a/fizz-common/src/main/java/we/util/ReactiveRedisHelper.java +++ b/fizz-common/src/main/java/com/fizzgate/util/ReactiveRedisHelper.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import io.lettuce.core.ClientOptions; import io.lettuce.core.TimeoutOptions; @@ -29,8 +29,9 @@ import org.springframework.data.redis.connection.lettuce.LettuceClientConfigurat import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; -import we.config.RedisReactiveConfig; -import we.config.RedisReactiveProperties; + +import com.fizzgate.config.RedisReactiveConfig; +import com.fizzgate.config.RedisReactiveProperties; import java.time.Duration; diff --git a/fizz-common/src/main/java/we/util/ReactorUtils.java b/fizz-common/src/main/java/com/fizzgate/util/ReactorUtils.java similarity index 98% rename from fizz-common/src/main/java/we/util/ReactorUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/ReactorUtils.java index b9c3e2b..78016da 100644 --- a/fizz-common/src/main/java/we/util/ReactorUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/ReactorUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/fizz-common/src/main/java/we/util/ReflectionUtils.java b/fizz-common/src/main/java/com/fizzgate/util/ReflectionUtils.java similarity index 98% rename from fizz-common/src/main/java/we/util/ReflectionUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/ReflectionUtils.java index a3047d7..a44b777 100644 --- a/fizz-common/src/main/java/we/util/ReflectionUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/ReflectionUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import java.lang.reflect.Field; import java.lang.reflect.Method; diff --git a/fizz-common/src/main/java/we/util/Result.java b/fizz-common/src/main/java/com/fizzgate/util/Result.java similarity index 99% rename from fizz-common/src/main/java/we/util/Result.java rename to fizz-common/src/main/java/com/fizzgate/util/Result.java index dc9e25d..2f1047e 100644 --- a/fizz-common/src/main/java/we/util/Result.java +++ b/fizz-common/src/main/java/com/fizzgate/util/Result.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import java.util.Collections; import java.util.Map; diff --git a/fizz-common/src/main/java/we/util/Script.java b/fizz-common/src/main/java/com/fizzgate/util/Script.java similarity index 97% rename from fizz-common/src/main/java/we/util/Script.java rename to fizz-common/src/main/java/com/fizzgate/util/Script.java index fd1e791..2da358e 100644 --- a/fizz-common/src/main/java/we/util/Script.java +++ b/fizz-common/src/main/java/com/fizzgate/util/Script.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; /** * @author hongqiaowei diff --git a/fizz-common/src/main/java/we/util/ScriptUtils.java b/fizz-common/src/main/java/com/fizzgate/util/ScriptUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/ScriptUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/ScriptUtils.java index 3167b0f..45e7d7c 100644 --- a/fizz-common/src/main/java/we/util/ScriptUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/ScriptUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.ClassPathResource; diff --git a/fizz-common/src/main/java/we/util/StringUtils.java b/fizz-common/src/main/java/com/fizzgate/util/StringUtils.java similarity index 97% rename from fizz-common/src/main/java/we/util/StringUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/StringUtils.java index 776ad56..d684ba8 100644 --- a/fizz-common/src/main/java/we/util/StringUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/StringUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import java.util.Objects; diff --git a/fizz-common/src/main/java/we/util/SymmetricCryptoUtils.java b/fizz-common/src/main/java/com/fizzgate/util/SymmetricCryptoUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/SymmetricCryptoUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/SymmetricCryptoUtils.java index 9a7fd30..7d8f2d5 100644 --- a/fizz-common/src/main/java/we/util/SymmetricCryptoUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/SymmetricCryptoUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; diff --git a/fizz-common/src/main/java/we/util/SymmetricDecryptor.java b/fizz-common/src/main/java/com/fizzgate/util/SymmetricDecryptor.java similarity index 98% rename from fizz-common/src/main/java/we/util/SymmetricDecryptor.java rename to fizz-common/src/main/java/com/fizzgate/util/SymmetricDecryptor.java index 8fb06ec..b8ff904 100644 --- a/fizz-common/src/main/java/we/util/SymmetricDecryptor.java +++ b/fizz-common/src/main/java/com/fizzgate/util/SymmetricDecryptor.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; diff --git a/fizz-common/src/main/java/we/util/SymmetricEncryptor.java b/fizz-common/src/main/java/com/fizzgate/util/SymmetricEncryptor.java similarity index 98% rename from fizz-common/src/main/java/we/util/SymmetricEncryptor.java rename to fizz-common/src/main/java/com/fizzgate/util/SymmetricEncryptor.java index c81c13d..f03cee8 100644 --- a/fizz-common/src/main/java/we/util/SymmetricEncryptor.java +++ b/fizz-common/src/main/java/com/fizzgate/util/SymmetricEncryptor.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.CharsetUtil; diff --git a/fizz-common/src/main/java/we/util/ThreadContext.java b/fizz-common/src/main/java/com/fizzgate/util/ThreadContext.java similarity index 99% rename from fizz-common/src/main/java/we/util/ThreadContext.java rename to fizz-common/src/main/java/com/fizzgate/util/ThreadContext.java index aa9b368..8da6bc7 100644 --- a/fizz-common/src/main/java/we/util/ThreadContext.java +++ b/fizz-common/src/main/java/com/fizzgate/util/ThreadContext.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import java.text.SimpleDateFormat; import java.util.ArrayList; diff --git a/fizz-common/src/main/java/we/util/TypeUtils.java b/fizz-common/src/main/java/com/fizzgate/util/TypeUtils.java similarity index 98% rename from fizz-common/src/main/java/we/util/TypeUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/TypeUtils.java index 104e4d7..ab54cf0 100644 --- a/fizz-common/src/main/java/we/util/TypeUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/TypeUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import java.math.BigDecimal; diff --git a/fizz-common/src/main/java/we/util/UUIDUtil.java b/fizz-common/src/main/java/com/fizzgate/util/UUIDUtil.java similarity index 97% rename from fizz-common/src/main/java/we/util/UUIDUtil.java rename to fizz-common/src/main/java/com/fizzgate/util/UUIDUtil.java index 7a5cec3..329ba7d 100644 --- a/fizz-common/src/main/java/we/util/UUIDUtil.java +++ b/fizz-common/src/main/java/com/fizzgate/util/UUIDUtil.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import java.util.UUID; diff --git a/fizz-common/src/main/java/we/util/UrlTransformUtils.java b/fizz-common/src/main/java/com/fizzgate/util/UrlTransformUtils.java similarity index 99% rename from fizz-common/src/main/java/we/util/UrlTransformUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/UrlTransformUtils.java index e10f17c..396d1d3 100644 --- a/fizz-common/src/main/java/we/util/UrlTransformUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/UrlTransformUtils.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/fizz-common/src/main/java/we/util/Utils.java b/fizz-common/src/main/java/com/fizzgate/util/Utils.java similarity index 99% rename from fizz-common/src/main/java/we/util/Utils.java rename to fizz-common/src/main/java/com/fizzgate/util/Utils.java index 341ba5d..fcc55ed 100644 --- a/fizz-common/src/main/java/we/util/Utils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/Utils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import org.apache.commons.lang3.StringUtils; diff --git a/fizz-common/src/main/java/we/util/YmlUtils.java b/fizz-common/src/main/java/com/fizzgate/util/YmlUtils.java similarity index 97% rename from fizz-common/src/main/java/we/util/YmlUtils.java rename to fizz-common/src/main/java/com/fizzgate/util/YmlUtils.java index 91112f8..8c76def 100644 --- a/fizz-common/src/main/java/we/util/YmlUtils.java +++ b/fizz-common/src/main/java/com/fizzgate/util/YmlUtils.java @@ -1,4 +1,4 @@ -package we.util; +package com.fizzgate.util; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.core.io.ByteArrayResource; diff --git a/fizz-common/src/main/java/we/xml/FileReader.java b/fizz-common/src/main/java/com/fizzgate/xml/FileReader.java similarity index 98% rename from fizz-common/src/main/java/we/xml/FileReader.java rename to fizz-common/src/main/java/com/fizzgate/xml/FileReader.java index fe23fc3..a9a7b2e 100644 --- a/fizz-common/src/main/java/we/xml/FileReader.java +++ b/fizz-common/src/main/java/com/fizzgate/xml/FileReader.java @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package we.xml; +package com.fizzgate.xml; import java.io.BufferedReader; import java.io.FileInputStream; diff --git a/fizz-common/src/main/java/we/xml/JsonToXml.java b/fizz-common/src/main/java/com/fizzgate/xml/JsonToXml.java similarity index 99% rename from fizz-common/src/main/java/we/xml/JsonToXml.java rename to fizz-common/src/main/java/com/fizzgate/xml/JsonToXml.java index 2fe76cb..652e999 100644 --- a/fizz-common/src/main/java/we/xml/JsonToXml.java +++ b/fizz-common/src/main/java/com/fizzgate/xml/JsonToXml.java @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package we.xml; +package com.fizzgate.xml; //import android.util.Xml; diff --git a/fizz-common/src/main/java/we/xml/Node.java b/fizz-common/src/main/java/com/fizzgate/xml/Node.java similarity index 98% rename from fizz-common/src/main/java/we/xml/Node.java rename to fizz-common/src/main/java/com/fizzgate/xml/Node.java index 7bdb2c9..bc536d3 100644 --- a/fizz-common/src/main/java/we/xml/Node.java +++ b/fizz-common/src/main/java/com/fizzgate/xml/Node.java @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package we.xml; +package com.fizzgate.xml; import java.util.ArrayList; diff --git a/fizz-common/src/main/java/we/xml/Tag.java b/fizz-common/src/main/java/com/fizzgate/xml/Tag.java similarity index 99% rename from fizz-common/src/main/java/we/xml/Tag.java rename to fizz-common/src/main/java/com/fizzgate/xml/Tag.java index 4a5db33..435282e 100644 --- a/fizz-common/src/main/java/we/xml/Tag.java +++ b/fizz-common/src/main/java/com/fizzgate/xml/Tag.java @@ -1,4 +1,4 @@ -package we.xml; +package com.fizzgate.xml; /* Copyright 2016 Arnaud Guyon diff --git a/fizz-common/src/main/java/we/xml/XmlToJson.java b/fizz-common/src/main/java/com/fizzgate/xml/XmlToJson.java similarity index 99% rename from fizz-common/src/main/java/we/xml/XmlToJson.java rename to fizz-common/src/main/java/com/fizzgate/xml/XmlToJson.java index b7e777d..88db7e8 100644 --- a/fizz-common/src/main/java/we/xml/XmlToJson.java +++ b/fizz-common/src/main/java/com/fizzgate/xml/XmlToJson.java @@ -1,4 +1,4 @@ -package we.xml; +package com.fizzgate.xml; /* Copyright 2016 Arnaud Guyon diff --git a/fizz-common/src/main/java/we/flume/clients/log4j2appender/ThreadContext.java b/fizz-common/src/main/java/we/flume/clients/log4j2appender/ThreadContext.java deleted file mode 100644 index fbceff1..0000000 --- a/fizz-common/src/main/java/we/flume/clients/log4j2appender/ThreadContext.java +++ /dev/null @@ -1,90 +0,0 @@ -///* -// * Copyright (C) 2020 the original author or authors. -// * -// * This program is free software: you can redistribute it and/or modify -// * it under the terms of the GNU General Public License as published by -// * the Free Software Foundation, either version 3 of the License, or -// * any later version. -// * -// * This program is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have received a copy of the GNU General Public License -// * along with this program. If not, see . -// */ -// -//package we.flume.clients.log4j2appender; -// -//import java.text.SimpleDateFormat; -//import java.util.HashMap; -//import java.util.Map; -// -///** for internal use */ -//public abstract class ThreadContext { -// -// private static ThreadLocal> tl = new ThreadLocal<>(); -// private static final int mapCap = 32; -// -// private static final String sb = "sb"; -// private static final int sbCap = 256; -// -// public static StringBuilder getStringBuilder() { -// return getStringBuilder(true); -// } -// -// public static StringBuilder getStringBuilder(boolean clean) { -// Map m = getMap(); -// StringBuilder b = (StringBuilder) m.get(sb); -// if (b == null) { -// b = new StringBuilder(sbCap); -// m.put(sb, b); -// } else { -// if (clean) { -// b.delete(0, b.length()); -// } -// } -// return b; -// } -// -// public static SimpleDateFormat getSimpleDateFormat(String pattern) { -// Map m = getMap(); -// SimpleDateFormat sdf = (SimpleDateFormat) m.get(pattern); -// if (sdf == null) { -// sdf = new SimpleDateFormat(pattern); -// m.put(pattern, sdf); -// } -// return sdf; -// } -// -// public static Object get(String key, Class clz) { -// Object obj = get(key); -// if (obj == null) { -// try { -// obj = clz.newInstance(); -// set(key, obj); -// } catch (InstantiationException | IllegalAccessException e) { -// throw new RuntimeException(e); -// } -// } -// return obj; -// } -// -// private static Map getMap() { -// Map m = tl.get(); -// if (m == null) { -// m = new HashMap<>(mapCap); -// tl.set(m); -// } -// return m; -// } -// -// public static Object get(String key) { -// return getMap().get(key); -// } -// -// public static void set(String key, Object obj) { -// getMap().put(key, obj); -// } -//} diff --git a/fizz-common/src/test/java/we/OgnlTests.java b/fizz-common/src/test/java/com/fizzgate/OgnlTests.java similarity index 97% rename from fizz-common/src/test/java/we/OgnlTests.java rename to fizz-common/src/test/java/com/fizzgate/OgnlTests.java index c371400..526f0a5 100644 --- a/fizz-common/src/test/java/we/OgnlTests.java +++ b/fizz-common/src/test/java/com/fizzgate/OgnlTests.java @@ -1,4 +1,4 @@ -package we; +package com.fizzgate; import ognl.Ognl; import org.junit.jupiter.api.Test; diff --git a/fizz-common/src/test/java/we/util/JsonSchemaUtilsTest.java b/fizz-common/src/test/java/com/fizzgate/util/JsonSchemaUtilsTest.java similarity index 95% rename from fizz-common/src/test/java/we/util/JsonSchemaUtilsTest.java rename to fizz-common/src/test/java/com/fizzgate/util/JsonSchemaUtilsTest.java index a003ef0..5a6b705 100644 --- a/fizz-common/src/test/java/we/util/JsonSchemaUtilsTest.java +++ b/fizz-common/src/test/java/com/fizzgate/util/JsonSchemaUtilsTest.java @@ -15,11 +15,10 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import org.junit.jupiter.api.Test; -import we.schema.util.I18nUtils; - +import com.fizzgate.schema.util.I18nUtils; import java.util.List; import java.util.Locale; diff --git a/fizz-common/src/test/java/we/util/MapUtilTests.java b/fizz-common/src/test/java/com/fizzgate/util/MapUtilTests.java similarity index 98% rename from fizz-common/src/test/java/we/util/MapUtilTests.java rename to fizz-common/src/test/java/com/fizzgate/util/MapUtilTests.java index c0d3ce0..2ce28e7 100644 --- a/fizz-common/src/test/java/we/util/MapUtilTests.java +++ b/fizz-common/src/test/java/com/fizzgate/util/MapUtilTests.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -26,6 +26,8 @@ import java.util.Map; import org.junit.jupiter.api.Test; +import com.fizzgate.util.MapUtil; + /** * * @author Francis Dong diff --git a/fizz-common/src/test/java/we/util/SymmetricCryptoTests.java b/fizz-common/src/test/java/com/fizzgate/util/SymmetricCryptoTests.java similarity index 88% rename from fizz-common/src/test/java/we/util/SymmetricCryptoTests.java rename to fizz-common/src/test/java/com/fizzgate/util/SymmetricCryptoTests.java index 14ad470..d8d5ac4 100644 --- a/fizz-common/src/test/java/we/util/SymmetricCryptoTests.java +++ b/fizz-common/src/test/java/com/fizzgate/util/SymmetricCryptoTests.java @@ -1,9 +1,12 @@ -package we.util; +package com.fizzgate.util; import cn.hutool.crypto.symmetric.SymmetricAlgorithm; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import com.fizzgate.util.SymmetricDecryptor; +import com.fizzgate.util.SymmetricEncryptor; + public class SymmetricCryptoTests { @Test diff --git a/fizz-common/src/test/java/we/xml/XmlTests.java b/fizz-common/src/test/java/com/fizzgate/xml/XmlTests.java similarity index 98% rename from fizz-common/src/test/java/we/xml/XmlTests.java rename to fizz-common/src/test/java/com/fizzgate/xml/XmlTests.java index 85b1f64..c875005 100644 --- a/fizz-common/src/test/java/we/xml/XmlTests.java +++ b/fizz-common/src/test/java/com/fizzgate/xml/XmlTests.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.xml; +package com.fizzgate.xml; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -23,6 +23,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.json.JSONObject; import org.junit.jupiter.api.Test; +import com.fizzgate.xml.JsonToXml; +import com.fizzgate.xml.XmlToJson; + public class XmlTests { private String xmlStr = "\n" + "\n" diff --git a/fizz-core/pom.xml b/fizz-core/pom.xml index 3aa5b62..aa01aed 100644 --- a/fizz-core/pom.xml +++ b/fizz-core/pom.xml @@ -24,7 +24,7 @@ com.networknt json-schema-validator-i18n-support - 1.0.39_5 + 1.0.39_6 provided diff --git a/fizz-core/src/main/java/we/Fizz.java b/fizz-core/src/main/java/com/fizzgate/Fizz.java similarity index 97% rename from fizz-core/src/main/java/we/Fizz.java rename to fizz-core/src/main/java/com/fizzgate/Fizz.java index 733adf2..3fef92c 100644 --- a/fizz-core/src/main/java/we/Fizz.java +++ b/fizz-core/src/main/java/com/fizzgate/Fizz.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we; +package com.fizzgate; import org.springframework.context.ConfigurableApplicationContext; diff --git a/fizz-core/src/main/java/we/FizzAppContext.java b/fizz-core/src/main/java/com/fizzgate/FizzAppContext.java similarity index 91% rename from fizz-core/src/main/java/we/FizzAppContext.java rename to fizz-core/src/main/java/com/fizzgate/FizzAppContext.java index e011348..0b74fd7 100644 --- a/fizz-core/src/main/java/we/FizzAppContext.java +++ b/fizz-core/src/main/java/com/fizzgate/FizzAppContext.java @@ -15,12 +15,12 @@ * along with this program. If not, see . */ -package we; +package com.fizzgate; import org.springframework.context.ConfigurableApplicationContext; /** - * @deprecated and use {@link we.Fizz} instead + * @deprecated and use {@link com.fizzgate.Fizz} instead */ @Deprecated diff --git a/fizz-core/src/main/java/we/apollo/ApolloLog4j2ConfigurationFactory.java b/fizz-core/src/main/java/com/fizzgate/apollo/ApolloLog4j2ConfigurationFactory.java similarity index 99% rename from fizz-core/src/main/java/we/apollo/ApolloLog4j2ConfigurationFactory.java rename to fizz-core/src/main/java/com/fizzgate/apollo/ApolloLog4j2ConfigurationFactory.java index 19288d9..7030dff 100644 --- a/fizz-core/src/main/java/we/apollo/ApolloLog4j2ConfigurationFactory.java +++ b/fizz-core/src/main/java/com/fizzgate/apollo/ApolloLog4j2ConfigurationFactory.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.apollo; +package com.fizzgate.apollo; import com.ctrip.framework.apollo.Config; import com.ctrip.framework.apollo.ConfigChangeListener; diff --git a/fizz-core/src/main/java/we/beans/factory/config/FizzBeanFactoryPostProcessor.java b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java similarity index 97% rename from fizz-core/src/main/java/we/beans/factory/config/FizzBeanFactoryPostProcessor.java rename to fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java index 19ac54c..44a06e1 100644 --- a/fizz-core/src/main/java/we/beans/factory/config/FizzBeanFactoryPostProcessor.java +++ b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java @@ -15,9 +15,15 @@ * along with this program. If not, see . */ -package we.beans.factory.config; +package com.fizzgate.beans.factory.config; import com.fasterxml.jackson.core.type.TypeReference; +import com.fizzgate.config.FizzConfigConfiguration; +import com.fizzgate.config.RedisReactiveProperties; +import com.fizzgate.context.config.annotation.FizzRefreshScope; +import com.fizzgate.context.event.FizzRefreshEvent; +import com.fizzgate.util.*; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -37,11 +43,6 @@ import org.springframework.core.env.MutablePropertySources; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.FizzConfigConfiguration; -import we.config.RedisReactiveProperties; -import we.context.config.annotation.FizzRefreshScope; -import we.context.event.FizzRefreshEvent; -import we.util.*; import java.util.*; diff --git a/fizz-core/src/main/java/we/beans/factory/config/FizzBeanPostProcessor.java b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanPostProcessor.java similarity index 97% rename from fizz-core/src/main/java/we/beans/factory/config/FizzBeanPostProcessor.java rename to fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanPostProcessor.java index 52b3b3f..fb2d1f6 100644 --- a/fizz-core/src/main/java/we/beans/factory/config/FizzBeanPostProcessor.java +++ b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanPostProcessor.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.beans.factory.config; +package com.fizzgate.beans.factory.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/fizz-core/src/main/java/we/config/AggregateRedisConfig.java b/fizz-core/src/main/java/com/fizzgate/config/AggregateRedisConfig.java similarity index 97% rename from fizz-core/src/main/java/we/config/AggregateRedisConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/AggregateRedisConfig.java index d459e90..3be6a8f 100644 --- a/fizz-core/src/main/java/we/config/AggregateRedisConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/AggregateRedisConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -32,8 +32,11 @@ import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSeriali import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory; -import we.log.LogSendAppender; -import we.log.RedisLogSendServiceImpl; + +import com.fizzgate.config.RedisReactiveConfig; +import com.fizzgate.config.RedisReactiveProperties; +import com.fizzgate.log.LogSendAppender; +import com.fizzgate.log.RedisLogSendServiceImpl; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/config/AggregateRedisConfigProperties.java b/fizz-core/src/main/java/com/fizzgate/config/AggregateRedisConfigProperties.java similarity index 90% rename from fizz-core/src/main/java/we/config/AggregateRedisConfigProperties.java rename to fizz-core/src/main/java/com/fizzgate/config/AggregateRedisConfigProperties.java index 6d50624..851c668 100644 --- a/fizz-core/src/main/java/we/config/AggregateRedisConfigProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/config/AggregateRedisConfigProperties.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; -import we.context.config.annotation.FizzRefreshScope; + +import com.fizzgate.context.config.annotation.FizzRefreshScope; /** * {@link AggregateRedisConfig} properties diff --git a/fizz-core/src/main/java/we/config/ApolloConfig.java b/fizz-core/src/main/java/com/fizzgate/config/ApolloConfig.java similarity index 97% rename from fizz-core/src/main/java/we/config/ApolloConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/ApolloConfig.java index 8491704..359d745 100644 --- a/fizz-core/src/main/java/we/config/ApolloConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/ApolloConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/fizz-core/src/main/java/we/config/AppConfigProperties.java b/fizz-core/src/main/java/com/fizzgate/config/AppConfigProperties.java similarity index 97% rename from fizz-core/src/main/java/we/config/AppConfigProperties.java rename to fizz-core/src/main/java/com/fizzgate/config/AppConfigProperties.java index 774cc2e..6e4fa5a 100644 --- a/fizz-core/src/main/java/we/config/AppConfigProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/config/AppConfigProperties.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/we/config/FizzConfigConfiguration.java b/fizz-core/src/main/java/com/fizzgate/config/FizzConfigConfiguration.java similarity index 95% rename from fizz-core/src/main/java/we/config/FizzConfigConfiguration.java rename to fizz-core/src/main/java/com/fizzgate/config/FizzConfigConfiguration.java index 631b9d9..3ed2085 100644 --- a/fizz-core/src/main/java/we/config/FizzConfigConfiguration.java +++ b/fizz-core/src/main/java/com/fizzgate/config/FizzConfigConfiguration.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import we.beans.factory.config.FizzBeanFactoryPostProcessor; -import we.context.event.FizzRefreshEventListener; -import we.context.scope.refresh.FizzRefreshScope; + +import com.fizzgate.beans.factory.config.FizzBeanFactoryPostProcessor; +import com.fizzgate.context.event.FizzRefreshEventListener; +import com.fizzgate.context.scope.refresh.FizzRefreshScope; import java.util.HashMap; import java.util.Map; diff --git a/fizz-core/src/main/java/we/config/FizzGatewayNodeStatSchedConfig.java b/fizz-core/src/main/java/com/fizzgate/config/FizzGatewayNodeStatSchedConfig.java similarity index 93% rename from fizz-core/src/main/java/we/config/FizzGatewayNodeStatSchedConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/FizzGatewayNodeStatSchedConfig.java index 9a4f199..197eb25 100644 --- a/fizz-core/src/main/java/we/config/FizzGatewayNodeStatSchedConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/FizzGatewayNodeStatSchedConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,12 +27,14 @@ import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.util.CollectionUtils; -import we.stats.FlowStat; -import we.stats.ResourceTimeWindowStat; -import we.stats.TimeWindowStat; -import we.util.JacksonUtils; -import we.util.NetworkUtils; -import we.util.ResourceIdUtils; + +import com.fizzgate.config.SchedConfig; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceTimeWindowStat; +import com.fizzgate.stats.TimeWindowStat; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.NetworkUtils; +import com.fizzgate.util.ResourceIdUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/config/FizzMangerConfig.java b/fizz-core/src/main/java/com/fizzgate/config/FizzMangerConfig.java similarity index 96% rename from fizz-core/src/main/java/we/config/FizzMangerConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/FizzMangerConfig.java index 3df38a6..7aa7eaf 100644 --- a/fizz-core/src/main/java/we/config/FizzMangerConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/FizzMangerConfig.java @@ -15,15 +15,17 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; + +import com.fizzgate.util.Consts; +import com.fizzgate.util.Result; + import reactor.core.publisher.Mono; -import we.util.Consts; -import we.util.Result; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/config/FlowControlConfig.java b/fizz-core/src/main/java/com/fizzgate/config/FlowControlConfig.java similarity index 90% rename from fizz-core/src/main/java/we/config/FlowControlConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/FlowControlConfig.java index 84fd2b0..d30bf1f 100644 --- a/fizz-core/src/main/java/we/config/FlowControlConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/FlowControlConfig.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import we.stats.FlowStat; -import we.stats.circuitbreaker.CircuitBreakManager; + +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.circuitbreaker.CircuitBreakManager; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/config/FlowStatSchedConfig.java b/fizz-core/src/main/java/com/fizzgate/config/FlowStatSchedConfig.java similarity index 97% rename from fizz-core/src/main/java/we/config/FlowStatSchedConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/FlowStatSchedConfig.java index ebe3bca..c2e8106 100644 --- a/fizz-core/src/main/java/we/config/FlowStatSchedConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/FlowStatSchedConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,12 +23,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.scheduling.annotation.Scheduled; -import we.stats.FlowStat; -import we.stats.ResourceTimeWindowStat; -import we.stats.TimeWindowStat; -import we.stats.ratelimit.ResourceRateLimitConfig; -import we.stats.ratelimit.ResourceRateLimitConfigService; -import we.util.*; + +import com.fizzgate.config.SchedConfig; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceTimeWindowStat; +import com.fizzgate.stats.TimeWindowStat; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfig; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfigService; +import com.fizzgate.util.*; import javax.annotation.Resource; import java.math.BigDecimal; diff --git a/fizz-core/src/main/java/we/config/FlowStatSchedConfigProperties.java b/fizz-core/src/main/java/com/fizzgate/config/FlowStatSchedConfigProperties.java similarity index 94% rename from fizz-core/src/main/java/we/config/FlowStatSchedConfigProperties.java rename to fizz-core/src/main/java/com/fizzgate/config/FlowStatSchedConfigProperties.java index d4f2fcb..be5e5a3 100644 --- a/fizz-core/src/main/java/we/config/FlowStatSchedConfigProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/config/FlowStatSchedConfigProperties.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/com/fizzgate/config/LogConfig.java b/fizz-core/src/main/java/com/fizzgate/config/LogConfig.java new file mode 100644 index 0000000..bc8dc2e --- /dev/null +++ b/fizz-core/src/main/java/com/fizzgate/config/LogConfig.java @@ -0,0 +1,2 @@ +package com.fizzgate.config; + diff --git a/fizz-core/src/main/java/we/config/ManualApiConfig.java b/fizz-core/src/main/java/com/fizzgate/config/ManualApiConfig.java similarity index 96% rename from fizz-core/src/main/java/we/config/ManualApiConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/ManualApiConfig.java index 7f456ee..282409e 100644 --- a/fizz-core/src/main/java/we/config/ManualApiConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/ManualApiConfig.java @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.plugin.auth.*; + +import com.fizzgate.plugin.auth.*; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/config/ProxyWebClientConfig.java b/fizz-core/src/main/java/com/fizzgate/config/ProxyWebClientConfig.java similarity index 95% rename from fizz-core/src/main/java/we/config/ProxyWebClientConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/ProxyWebClientConfig.java index e9a24ad..6dbe3f3 100644 --- a/fizz-core/src/main/java/we/config/ProxyWebClientConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/ProxyWebClientConfig.java @@ -15,13 +15,15 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; +import com.fizzgate.config.WebClientConfig; + /** * @author hongqiaowei */ diff --git a/fizz-core/src/main/java/we/config/RefreshLocalCacheConfig.java b/fizz-core/src/main/java/com/fizzgate/config/RefreshLocalCacheConfig.java similarity index 92% rename from fizz-core/src/main/java/we/config/RefreshLocalCacheConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/RefreshLocalCacheConfig.java index ba78c4a..3148837 100644 --- a/fizz-core/src/main/java/we/config/RefreshLocalCacheConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/RefreshLocalCacheConfig.java @@ -14,22 +14,23 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Scheduled; -import we.fizz.ConfigLoader; -import we.plugin.auth.ApiConfig2appsService; -import we.plugin.auth.ApiConfigService; -import we.plugin.auth.AppService; -import we.plugin.auth.GatewayGroupService; -import we.proxy.RpcInstanceService; -import we.service_registry.RegistryCenterService; -import we.stats.degrade.DegradeRuleService; -import we.stats.ratelimit.ResourceRateLimitConfigService; -import we.util.Result; + +import com.fizzgate.fizz.ConfigLoader; +import com.fizzgate.plugin.auth.ApiConfig2appsService; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.auth.AppService; +import com.fizzgate.plugin.auth.GatewayGroupService; +import com.fizzgate.proxy.RpcInstanceService; +import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.stats.degrade.DegradeRuleService; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfigService; +import com.fizzgate.util.Result; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/config/RefreshLocalCacheConfigProperties.java b/fizz-core/src/main/java/com/fizzgate/config/RefreshLocalCacheConfigProperties.java similarity index 96% rename from fizz-core/src/main/java/we/config/RefreshLocalCacheConfigProperties.java rename to fizz-core/src/main/java/com/fizzgate/config/RefreshLocalCacheConfigProperties.java index e28ddae..f3cda2f 100644 --- a/fizz-core/src/main/java/we/config/RefreshLocalCacheConfigProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/config/RefreshLocalCacheConfigProperties.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/we/config/SystemConfig.java b/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java similarity index 98% rename from fizz-core/src/main/java/we/config/SystemConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java index 447099f..d3f992c 100644 --- a/fizz-core/src/main/java/we/config/SystemConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -24,10 +24,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; -import we.context.config.annotation.FizzRefreshScope; -import we.util.Consts; -import we.util.UUIDUtil; -import we.util.WebUtils; + +import com.fizzgate.context.config.annotation.FizzRefreshScope; +import com.fizzgate.util.Consts; +import com.fizzgate.util.UUIDUtil; +import com.fizzgate.util.WebUtils; import javax.annotation.PostConstruct; import java.util.*; diff --git a/fizz-core/src/main/java/we/config/WebServerConfig.java b/fizz-core/src/main/java/com/fizzgate/config/WebServerConfig.java similarity index 99% rename from fizz-core/src/main/java/we/config/WebServerConfig.java rename to fizz-core/src/main/java/com/fizzgate/config/WebServerConfig.java index 7cb9750..98a5856 100644 --- a/fizz-core/src/main/java/we/config/WebServerConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/WebServerConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/fizz-core/src/main/java/we/config/WebServerConfigProperties.java b/fizz-core/src/main/java/com/fizzgate/config/WebServerConfigProperties.java similarity index 98% rename from fizz-core/src/main/java/we/config/WebServerConfigProperties.java rename to fizz-core/src/main/java/com/fizzgate/config/WebServerConfigProperties.java index 3286434..824c6b5 100644 --- a/fizz-core/src/main/java/we/config/WebServerConfigProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/config/WebServerConfigProperties.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.config; +package com.fizzgate.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/we/context/config/annotation/FizzRefreshScope.java b/fizz-core/src/main/java/com/fizzgate/context/config/annotation/FizzRefreshScope.java similarity index 91% rename from fizz-core/src/main/java/we/context/config/annotation/FizzRefreshScope.java rename to fizz-core/src/main/java/com/fizzgate/context/config/annotation/FizzRefreshScope.java index 9d924c2..e4344ab 100644 --- a/fizz-core/src/main/java/we/context/config/annotation/FizzRefreshScope.java +++ b/fizz-core/src/main/java/com/fizzgate/context/config/annotation/FizzRefreshScope.java @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package we.context.config.annotation; +package com.fizzgate.context.config.annotation; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; -import we.config.FizzConfigConfiguration; + +import com.fizzgate.config.FizzConfigConfiguration; import java.lang.annotation.*; diff --git a/fizz-core/src/main/java/we/context/event/FizzApplicationListener.java b/fizz-core/src/main/java/com/fizzgate/context/event/FizzApplicationListener.java similarity index 97% rename from fizz-core/src/main/java/we/context/event/FizzApplicationListener.java rename to fizz-core/src/main/java/com/fizzgate/context/event/FizzApplicationListener.java index aa7fec9..9a03a9e 100644 --- a/fizz-core/src/main/java/we/context/event/FizzApplicationListener.java +++ b/fizz-core/src/main/java/com/fizzgate/context/event/FizzApplicationListener.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.context.event; +package com.fizzgate.context.event; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; diff --git a/fizz-core/src/main/java/we/context/event/FizzRefreshEvent.java b/fizz-core/src/main/java/com/fizzgate/context/event/FizzRefreshEvent.java similarity index 94% rename from fizz-core/src/main/java/we/context/event/FizzRefreshEvent.java rename to fizz-core/src/main/java/com/fizzgate/context/event/FizzRefreshEvent.java index 12c7995..b37443a 100644 --- a/fizz-core/src/main/java/we/context/event/FizzRefreshEvent.java +++ b/fizz-core/src/main/java/com/fizzgate/context/event/FizzRefreshEvent.java @@ -15,10 +15,11 @@ * along with this program. If not, see . */ -package we.context.event; +package com.fizzgate.context.event; import org.springframework.context.ApplicationEvent; -import we.util.JacksonUtils; + +import com.fizzgate.util.JacksonUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/context/event/FizzRefreshEventListener.java b/fizz-core/src/main/java/com/fizzgate/context/event/FizzRefreshEventListener.java similarity index 94% rename from fizz-core/src/main/java/we/context/event/FizzRefreshEventListener.java rename to fizz-core/src/main/java/com/fizzgate/context/event/FizzRefreshEventListener.java index fdd82af..faf199e 100644 --- a/fizz-core/src/main/java/we/context/event/FizzRefreshEventListener.java +++ b/fizz-core/src/main/java/com/fizzgate/context/event/FizzRefreshEventListener.java @@ -15,16 +15,17 @@ * along with this program. If not, see . */ -package we.context.event; +package com.fizzgate.context.event; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; -import we.beans.factory.config.FizzBeanFactoryPostProcessor; -import we.context.scope.refresh.FizzRefreshScope; -import we.util.JacksonUtils; + +import com.fizzgate.beans.factory.config.FizzBeanFactoryPostProcessor; +import com.fizzgate.context.scope.refresh.FizzRefreshScope; +import com.fizzgate.util.JacksonUtils; import java.util.HashMap; import java.util.Map; diff --git a/fizz-core/src/main/java/we/context/scope/refresh/FizzRefreshScope.java b/fizz-core/src/main/java/com/fizzgate/context/scope/refresh/FizzRefreshScope.java similarity index 97% rename from fizz-core/src/main/java/we/context/scope/refresh/FizzRefreshScope.java rename to fizz-core/src/main/java/com/fizzgate/context/scope/refresh/FizzRefreshScope.java index 323dfd5..974396a 100644 --- a/fizz-core/src/main/java/we/context/scope/refresh/FizzRefreshScope.java +++ b/fizz-core/src/main/java/com/fizzgate/context/scope/refresh/FizzRefreshScope.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.context.scope.refresh; +package com.fizzgate.context.scope.refresh; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; @@ -28,7 +28,8 @@ import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.core.Ordered; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedResource; -import we.config.FizzConfigConfiguration; + +import com.fizzgate.config.FizzConfigConfiguration; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/context/scope/refresh/FizzRefreshScopeRefreshedEvent.java b/fizz-core/src/main/java/com/fizzgate/context/scope/refresh/FizzRefreshScopeRefreshedEvent.java similarity index 96% rename from fizz-core/src/main/java/we/context/scope/refresh/FizzRefreshScopeRefreshedEvent.java rename to fizz-core/src/main/java/com/fizzgate/context/scope/refresh/FizzRefreshScopeRefreshedEvent.java index 47b0d23..2e70fb3 100644 --- a/fizz-core/src/main/java/we/context/scope/refresh/FizzRefreshScopeRefreshedEvent.java +++ b/fizz-core/src/main/java/com/fizzgate/context/scope/refresh/FizzRefreshScopeRefreshedEvent.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.context.scope.refresh; +package com.fizzgate.context.scope.refresh; import org.springframework.context.ApplicationEvent; diff --git a/fizz-core/src/main/java/we/controller/CacheCheckController.java b/fizz-core/src/main/java/com/fizzgate/controller/CacheCheckController.java similarity index 91% rename from fizz-core/src/main/java/we/controller/CacheCheckController.java rename to fizz-core/src/main/java/com/fizzgate/controller/CacheCheckController.java index 7d62fa6..1f90547 100644 --- a/fizz-core/src/main/java/we/controller/CacheCheckController.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/CacheCheckController.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.controller; +package com.fizzgate.controller; import org.openjdk.jol.info.GraphLayout; import org.springframework.beans.factory.annotation.Autowired; @@ -23,20 +23,22 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.global_resource.GlobalResourceService; +import com.fizzgate.plugin.auth.ApiConfig2appsService; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.auth.AppService; +import com.fizzgate.plugin.auth.GatewayGroupService; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceStat; +import com.fizzgate.stats.circuitbreaker.CircuitBreakManager; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfig; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfigService; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ResourceIdUtils; + import reactor.core.publisher.Mono; -import we.global_resource.GlobalResourceService; -import we.plugin.auth.ApiConfig2appsService; -import we.plugin.auth.ApiConfigService; -import we.plugin.auth.AppService; -import we.plugin.auth.GatewayGroupService; -import we.stats.FlowStat; -import we.stats.ResourceStat; -import we.stats.circuitbreaker.CircuitBreakManager; -import we.stats.ratelimit.ResourceRateLimitConfig; -import we.stats.ratelimit.ResourceRateLimitConfigService; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.ResourceIdUtils; import javax.annotation.Resource; import java.math.BigDecimal; diff --git a/fizz-core/src/main/java/we/controller/CallbackController.java b/fizz-core/src/main/java/com/fizzgate/controller/CallbackController.java similarity index 93% rename from fizz-core/src/main/java/we/controller/CallbackController.java rename to fizz-core/src/main/java/com/fizzgate/controller/CallbackController.java index 12c1f05..24566ab 100644 --- a/fizz-core/src/main/java/we/controller/CallbackController.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/CallbackController.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.controller; +package com.fizzgate.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,13 +26,15 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.proxy.CallbackReplayReq; +import com.fizzgate.proxy.CallbackService; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.Result; +import com.fizzgate.util.ThreadContext; + import reactor.core.publisher.Mono; -import we.proxy.CallbackReplayReq; -import we.proxy.CallbackService; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.Result; -import we.util.ThreadContext; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/controller/ConfigController.java b/fizz-core/src/main/java/com/fizzgate/controller/ConfigController.java similarity index 94% rename from fizz-core/src/main/java/we/controller/ConfigController.java rename to fizz-core/src/main/java/com/fizzgate/controller/ConfigController.java index 953d82c..807e2e1 100644 --- a/fizz-core/src/main/java/we/controller/ConfigController.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/ConfigController.java @@ -15,15 +15,17 @@ * along with this program. If not, see . */ -package we.controller; +package com.fizzgate.controller; import org.apache.commons.io.FileUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.fizz.ConfigLoader; +import com.fizzgate.util.ScriptUtils; + import reactor.core.publisher.Mono; -import we.fizz.ConfigLoader; -import we.util.ScriptUtils; import javax.annotation.Resource; import java.io.File; diff --git a/fizz-core/src/main/java/we/controller/FlowControlController.java b/fizz-core/src/main/java/com/fizzgate/controller/FlowControlController.java similarity index 91% rename from fizz-core/src/main/java/we/controller/FlowControlController.java rename to fizz-core/src/main/java/com/fizzgate/controller/FlowControlController.java index 18f7877..e4bafef 100644 --- a/fizz-core/src/main/java/we/controller/FlowControlController.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/FlowControlController.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.controller; +package com.fizzgate.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,15 +27,17 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceTimeWindowStat; +import com.fizzgate.stats.TimeWindowStat; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.DateTimeUtils; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ResourceIdUtils; + import reactor.core.publisher.Mono; -import we.stats.FlowStat; -import we.stats.ResourceTimeWindowStat; -import we.stats.TimeWindowStat; -import we.stats.ratelimit.ResourceRateLimitConfig; -import we.util.Consts; -import we.util.DateTimeUtils; -import we.util.JacksonUtils; -import we.util.ResourceIdUtils; import java.math.BigDecimal; import java.util.HashMap; diff --git a/fizz-core/src/main/java/we/controller/HealthCheckController.java b/fizz-core/src/main/java/com/fizzgate/controller/HealthCheckController.java similarity index 92% rename from fizz-core/src/main/java/we/controller/HealthCheckController.java rename to fizz-core/src/main/java/com/fizzgate/controller/HealthCheckController.java index 3682d91..f66529d 100644 --- a/fizz-core/src/main/java/we/controller/HealthCheckController.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/HealthCheckController.java @@ -15,15 +15,17 @@ * along with this program. If not, see . */ -package we.controller; +package com.fizzgate.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.util.Consts; +import com.fizzgate.util.DateTimeUtils; + import reactor.core.publisher.Mono; -import we.util.Consts; -import we.util.DateTimeUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/controller/ManagerConfigController.java b/fizz-core/src/main/java/com/fizzgate/controller/ManagerConfigController.java similarity index 93% rename from fizz-core/src/main/java/we/controller/ManagerConfigController.java rename to fizz-core/src/main/java/com/fizzgate/controller/ManagerConfigController.java index 13b9d44..263dbff 100644 --- a/fizz-core/src/main/java/we/controller/ManagerConfigController.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/ManagerConfigController.java @@ -15,8 +15,25 @@ * along with this program. If not, see . */ -package we.controller; +package com.fizzgate.controller; +import com.fizzgate.controller.req.BaseManagerConfigReq; +import com.fizzgate.controller.req.GetApiConfigDetailReq; +import com.fizzgate.controller.req.GetApiConfigReq; +import com.fizzgate.controller.req.GetConfigReq; +import com.fizzgate.controller.req.GetConfigStrReq; +import com.fizzgate.controller.resp.ApiConfigInfo; +import com.fizzgate.controller.resp.ConfigResp; +import com.fizzgate.controller.resp.ConfigStrResp; +import com.fizzgate.controller.resp.GetApiConfigDetailResp; +import com.fizzgate.controller.resp.GetApiConfigResp; +import com.fizzgate.fizz.ConfigLoader; +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.auth.ApiConfig2appsService; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.auth.GatewayGroup; +import com.fizzgate.plugin.auth.GatewayGroupService; import com.google.common.collect.Sets; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -28,23 +45,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; -import we.controller.req.BaseManagerConfigReq; -import we.controller.req.GetApiConfigDetailReq; -import we.controller.req.GetApiConfigReq; -import we.controller.req.GetConfigReq; -import we.controller.req.GetConfigStrReq; -import we.controller.resp.ApiConfigInfo; -import we.controller.resp.ConfigResp; -import we.controller.resp.ConfigStrResp; -import we.controller.resp.GetApiConfigDetailResp; -import we.controller.resp.GetApiConfigResp; -import we.fizz.ConfigLoader; -import we.plugin.PluginConfig; -import we.plugin.auth.ApiConfig; -import we.plugin.auth.ApiConfig2appsService; -import we.plugin.auth.ApiConfigService; -import we.plugin.auth.GatewayGroup; -import we.plugin.auth.GatewayGroupService; import javax.annotation.Resource; import javax.validation.Valid; diff --git a/fizz-core/src/main/java/we/controller/req/BaseManagerConfigReq.java b/fizz-core/src/main/java/com/fizzgate/controller/req/BaseManagerConfigReq.java similarity index 98% rename from fizz-core/src/main/java/we/controller/req/BaseManagerConfigReq.java rename to fizz-core/src/main/java/com/fizzgate/controller/req/BaseManagerConfigReq.java index e491ab5..dd9ed0d 100644 --- a/fizz-core/src/main/java/we/controller/req/BaseManagerConfigReq.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/req/BaseManagerConfigReq.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.controller.req; +package com.fizzgate.controller.req; import javax.validation.constraints.NotNull; import java.io.Serializable; diff --git a/fizz-core/src/main/java/we/controller/req/GetApiConfigDetailReq.java b/fizz-core/src/main/java/com/fizzgate/controller/req/GetApiConfigDetailReq.java similarity index 94% rename from fizz-core/src/main/java/we/controller/req/GetApiConfigDetailReq.java rename to fizz-core/src/main/java/com/fizzgate/controller/req/GetApiConfigDetailReq.java index b78df71..ff54630 100644 --- a/fizz-core/src/main/java/we/controller/req/GetApiConfigDetailReq.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/req/GetApiConfigDetailReq.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.controller.req; +package com.fizzgate.controller.req; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/fizz-core/src/main/java/we/controller/req/GetApiConfigReq.java b/fizz-core/src/main/java/com/fizzgate/controller/req/GetApiConfigReq.java similarity index 94% rename from fizz-core/src/main/java/we/controller/req/GetApiConfigReq.java rename to fizz-core/src/main/java/com/fizzgate/controller/req/GetApiConfigReq.java index 0609433..fafcf39 100644 --- a/fizz-core/src/main/java/we/controller/req/GetApiConfigReq.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/req/GetApiConfigReq.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.controller.req; +package com.fizzgate.controller.req; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/fizz-core/src/main/java/we/controller/req/GetConfigReq.java b/fizz-core/src/main/java/com/fizzgate/controller/req/GetConfigReq.java similarity index 98% rename from fizz-core/src/main/java/we/controller/req/GetConfigReq.java rename to fizz-core/src/main/java/com/fizzgate/controller/req/GetConfigReq.java index cc364c6..71cc2d6 100644 --- a/fizz-core/src/main/java/we/controller/req/GetConfigReq.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/req/GetConfigReq.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.controller.req; +package com.fizzgate.controller.req; import org.springframework.util.DigestUtils; diff --git a/fizz-core/src/main/java/we/controller/req/GetConfigStrReq.java b/fizz-core/src/main/java/com/fizzgate/controller/req/GetConfigStrReq.java similarity index 98% rename from fizz-core/src/main/java/we/controller/req/GetConfigStrReq.java rename to fizz-core/src/main/java/com/fizzgate/controller/req/GetConfigStrReq.java index a25d795..64f2624 100644 --- a/fizz-core/src/main/java/we/controller/req/GetConfigStrReq.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/req/GetConfigStrReq.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.controller.req; +package com.fizzgate.controller.req; import org.springframework.util.DigestUtils; diff --git a/fizz-core/src/main/java/we/controller/resp/ApiConfigInfo.java b/fizz-core/src/main/java/com/fizzgate/controller/resp/ApiConfigInfo.java similarity index 93% rename from fizz-core/src/main/java/we/controller/resp/ApiConfigInfo.java rename to fizz-core/src/main/java/com/fizzgate/controller/resp/ApiConfigInfo.java index 294de37..8012862 100644 --- a/fizz-core/src/main/java/we/controller/resp/ApiConfigInfo.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/resp/ApiConfigInfo.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.controller.resp; +package com.fizzgate.controller.resp; import lombok.Data; diff --git a/fizz-core/src/main/java/we/controller/resp/ConfigResp.java b/fizz-core/src/main/java/com/fizzgate/controller/resp/ConfigResp.java similarity index 95% rename from fizz-core/src/main/java/we/controller/resp/ConfigResp.java rename to fizz-core/src/main/java/com/fizzgate/controller/resp/ConfigResp.java index d494175..c69ed7d 100644 --- a/fizz-core/src/main/java/we/controller/resp/ConfigResp.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/resp/ConfigResp.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package we.controller.resp; +package com.fizzgate.controller.resp; import java.io.Serializable; import java.util.List; import java.util.Objects; -import we.fizz.ConfigLoader; +import com.fizzgate.fizz.ConfigLoader; /** * 聚合配置响应实体类 diff --git a/fizz-core/src/main/java/we/controller/resp/ConfigStrResp.java b/fizz-core/src/main/java/com/fizzgate/controller/resp/ConfigStrResp.java similarity index 97% rename from fizz-core/src/main/java/we/controller/resp/ConfigStrResp.java rename to fizz-core/src/main/java/com/fizzgate/controller/resp/ConfigStrResp.java index f06e6fa..d4c54c3 100644 --- a/fizz-core/src/main/java/we/controller/resp/ConfigStrResp.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/resp/ConfigStrResp.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.controller.resp; +package com.fizzgate.controller.resp; import java.io.Serializable; import java.util.Objects; diff --git a/fizz-core/src/main/java/we/controller/resp/GetApiConfigDetailResp.java b/fizz-core/src/main/java/com/fizzgate/controller/resp/GetApiConfigDetailResp.java similarity index 94% rename from fizz-core/src/main/java/we/controller/resp/GetApiConfigDetailResp.java rename to fizz-core/src/main/java/com/fizzgate/controller/resp/GetApiConfigDetailResp.java index 4067430..e8e3de7 100644 --- a/fizz-core/src/main/java/we/controller/resp/GetApiConfigDetailResp.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/resp/GetApiConfigDetailResp.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.controller.resp; +package com.fizzgate.controller.resp; import lombok.Data; diff --git a/fizz-core/src/main/java/we/controller/resp/GetApiConfigResp.java b/fizz-core/src/main/java/com/fizzgate/controller/resp/GetApiConfigResp.java similarity index 93% rename from fizz-core/src/main/java/we/controller/resp/GetApiConfigResp.java rename to fizz-core/src/main/java/com/fizzgate/controller/resp/GetApiConfigResp.java index 534d85a..e109c13 100644 --- a/fizz-core/src/main/java/we/controller/resp/GetApiConfigResp.java +++ b/fizz-core/src/main/java/com/fizzgate/controller/resp/GetApiConfigResp.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.controller.resp; +package com.fizzgate.controller.resp; import lombok.Data; diff --git a/fizz-core/src/main/java/we/dedicated_line/ApiDoc.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/ApiDoc.java similarity index 93% rename from fizz-core/src/main/java/we/dedicated_line/ApiDoc.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/ApiDoc.java index 9630bc5..368a083 100644 --- a/fizz-core/src/main/java/we/dedicated_line/ApiDoc.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/ApiDoc.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package we.dedicated_line; - -import we.util.JacksonUtils; +package com.fizzgate.dedicated_line; import java.util.Collections; import java.util.List; +import com.fizzgate.util.JacksonUtils; + /** * @author hongqiaowei */ diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLine.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLine.java similarity index 97% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLine.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLine.java index e2ee57e..7cef3f9 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLine.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLine.java @@ -15,12 +15,13 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import cn.hutool.core.codec.Base64; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fizzgate.util.JacksonUtils; + import org.springframework.util.CollectionUtils; -import we.util.JacksonUtils; import java.util.*; diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineController.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineController.java similarity index 97% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineController.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineController.java index 77fff23..8313658 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineController.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineController.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,11 +30,13 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.reactive.function.BodyExtractors; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.FizzMangerConfig; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.proxy.FizzWebClient; +import com.fizzgate.util.*; + import reactor.core.publisher.Mono; -import we.config.FizzMangerConfig; -import we.config.SystemConfig; -import we.proxy.FizzWebClient; -import we.util.*; import javax.annotation.Resource; import java.time.LocalDateTime; diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineHttpHandler.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineHttpHandler.java similarity index 99% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineHttpHandler.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineHttpHandler.java index 8c27b49..bdde287 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineHttpHandler.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineHttpHandler.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import cn.hutool.crypto.symmetric.SymmetricAlgorithm; import org.slf4j.Logger; @@ -39,11 +39,13 @@ import org.springframework.web.server.adapter.DefaultServerWebExchange; import org.springframework.web.server.adapter.ForwardedHeaderTransformer; import org.springframework.web.server.i18n.LocaleContextResolver; import org.springframework.web.server.session.WebSessionManager; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.proxy.FizzWebClient; +import com.fizzgate.util.*; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.proxy.FizzWebClient; -import we.util.*; import java.net.URI; import java.util.Arrays; diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineInfo.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineInfo.java similarity index 95% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineInfo.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineInfo.java index e86af31..14d5906 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineInfo.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineInfo.java @@ -15,14 +15,15 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import cn.hutool.core.codec.Base64; -import we.util.JacksonUtils; import java.util.Collections; import java.util.List; +import com.fizzgate.util.JacksonUtils; + /** * @author hongqiaowei */ diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineInfoService.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineInfoService.java similarity index 96% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineInfoService.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineInfoService.java index b3822d1..67bc47c 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineInfoService.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineInfoService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,12 +23,14 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.Result; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.config.SystemConfig; -import we.util.JacksonUtils; -import we.util.Result; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineService.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineService.java similarity index 96% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineService.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineService.java index a88728b..21df63c 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineService.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,14 +24,16 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.Result; +import com.fizzgate.util.UrlTransformUtils; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.config.SystemConfig; -import we.plugin.auth.ApiConfig; -import we.util.JacksonUtils; -import we.util.Result; -import we.util.UrlTransformUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineServiceRegistration.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineServiceRegistration.java similarity index 96% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineServiceRegistration.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineServiceRegistration.java index 19e4283..453c32a 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineServiceRegistration.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineServiceRegistration.java @@ -15,9 +15,14 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.service_registry.FizzServiceRegistration; +import com.fizzgate.service_registry.eureka.FizzEurekaHelper; +import com.fizzgate.service_registry.nacos.FizzNacosHelper; + import lombok.SneakyThrows; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,10 +38,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; -import we.config.SystemConfig; -import we.service_registry.FizzServiceRegistration; -import we.service_registry.eureka.FizzEurekaHelper; -import we.service_registry.nacos.FizzNacosHelper; import javax.annotation.PreDestroy; import java.util.Properties; diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineUtils.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineUtils.java similarity index 94% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineUtils.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineUtils.java index 0af579d..aec78ae 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineUtils.java @@ -15,10 +15,10 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; -import we.util.Consts; -import we.util.ThreadContext; +import com.fizzgate.util.Consts; +import com.fizzgate.util.ThreadContext; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineWebServer.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineWebServer.java similarity index 97% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineWebServer.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineWebServer.java index 6698a53..f6f8d47 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineWebServer.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineWebServer.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +30,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.web.server.adapter.HttpWebHandlerAdapter; import org.springframework.web.server.session.DefaultWebSessionManager; -import we.config.SystemConfig; + +import com.fizzgate.config.SystemConfig; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; diff --git a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineWebServerInitializedEvent.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineWebServerInitializedEvent.java similarity index 97% rename from fizz-core/src/main/java/we/dedicated_line/DedicatedLineWebServerInitializedEvent.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineWebServerInitializedEvent.java index 8cb00fd..9590595 100644 --- a/fizz-core/src/main/java/we/dedicated_line/DedicatedLineWebServerInitializedEvent.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/DedicatedLineWebServerInitializedEvent.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext; import org.springframework.boot.web.server.WebServer; diff --git a/fizz-core/src/main/java/we/dedicated_line/MethodAndPath.java b/fizz-core/src/main/java/com/fizzgate/dedicated_line/MethodAndPath.java similarity index 91% rename from fizz-core/src/main/java/we/dedicated_line/MethodAndPath.java rename to fizz-core/src/main/java/com/fizzgate/dedicated_line/MethodAndPath.java index a236bd0..269d239 100644 --- a/fizz-core/src/main/java/we/dedicated_line/MethodAndPath.java +++ b/fizz-core/src/main/java/com/fizzgate/dedicated_line/MethodAndPath.java @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import org.springframework.http.HttpMethod; -import we.plugin.auth.ApiConfig; -import we.util.JacksonUtils; + +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.util.JacksonUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/exception/ExecuteScriptException.java b/fizz-core/src/main/java/com/fizzgate/exception/ExecuteScriptException.java similarity index 96% rename from fizz-core/src/main/java/we/exception/ExecuteScriptException.java rename to fizz-core/src/main/java/com/fizzgate/exception/ExecuteScriptException.java index 98bffd9..ffd88f8 100644 --- a/fizz-core/src/main/java/we/exception/ExecuteScriptException.java +++ b/fizz-core/src/main/java/com/fizzgate/exception/ExecuteScriptException.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package we.exception; +package com.fizzgate.exception; -import we.fizz.StepContext; +import com.fizzgate.fizz.StepContext; /** * @author Francis diff --git a/fizz-core/src/main/java/we/exception/ExternalService4xxException.java b/fizz-core/src/main/java/com/fizzgate/exception/ExternalService4xxException.java similarity index 97% rename from fizz-core/src/main/java/we/exception/ExternalService4xxException.java rename to fizz-core/src/main/java/com/fizzgate/exception/ExternalService4xxException.java index fa6400e..b73803f 100644 --- a/fizz-core/src/main/java/we/exception/ExternalService4xxException.java +++ b/fizz-core/src/main/java/com/fizzgate/exception/ExternalService4xxException.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.exception; +package com.fizzgate.exception; /** * diff --git a/fizz-core/src/main/java/we/exception/RedirectException.java b/fizz-core/src/main/java/com/fizzgate/exception/RedirectException.java similarity index 97% rename from fizz-core/src/main/java/we/exception/RedirectException.java rename to fizz-core/src/main/java/com/fizzgate/exception/RedirectException.java index cd52dab..27a2f65 100644 --- a/fizz-core/src/main/java/we/exception/RedirectException.java +++ b/fizz-core/src/main/java/com/fizzgate/exception/RedirectException.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.exception; +package com.fizzgate.exception; /** * @author Francis diff --git a/fizz-core/src/main/java/we/exception/StopAndResponseException.java b/fizz-core/src/main/java/com/fizzgate/exception/StopAndResponseException.java similarity index 97% rename from fizz-core/src/main/java/we/exception/StopAndResponseException.java rename to fizz-core/src/main/java/com/fizzgate/exception/StopAndResponseException.java index 16cf94d..2ff078f 100644 --- a/fizz-core/src/main/java/we/exception/StopAndResponseException.java +++ b/fizz-core/src/main/java/com/fizzgate/exception/StopAndResponseException.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.exception; +package com.fizzgate.exception; /** * @author Francis diff --git a/fizz-core/src/main/java/we/filter/AggregateFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java similarity index 94% rename from fizz-core/src/main/java/we/filter/AggregateFilter.java rename to fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java index 804ce5a..aa6d782 100644 --- a/fizz-core/src/main/java/we/filter/AggregateFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java @@ -15,10 +15,23 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.fizz.AggregateResource; +import com.fizzgate.fizz.AggregateResult; +import com.fizzgate.fizz.ConfigLoader; +import com.fizzgate.fizz.Pipeline; +import com.fizzgate.fizz.input.Input; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.MapUtil; +import com.fizzgate.util.NettyDataBufferUtils; +import com.fizzgate.util.WebUtils; + import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; @@ -38,18 +51,6 @@ import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import we.config.SystemConfig; -import we.constants.CommonConstants; -import we.fizz.AggregateResource; -import we.fizz.AggregateResult; -import we.fizz.ConfigLoader; -import we.fizz.Pipeline; -import we.fizz.input.Input; -import we.plugin.auth.ApiConfig; -import we.util.Consts; -import we.util.MapUtil; -import we.util.NettyDataBufferUtils; -import we.util.WebUtils; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; diff --git a/fizz-core/src/main/java/we/filter/AggregateFilterProperties.java b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilterProperties.java similarity index 90% rename from fizz-core/src/main/java/we/filter/AggregateFilterProperties.java rename to fizz-core/src/main/java/com/fizzgate/filter/AggregateFilterProperties.java index 6a5d45a..1063af5 100644 --- a/fizz-core/src/main/java/we/filter/AggregateFilterProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilterProperties.java @@ -14,13 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; -import we.context.config.annotation.FizzRefreshScope; + +import com.fizzgate.context.config.annotation.FizzRefreshScope; /** * {@link AggregateFilter} properties diff --git a/fizz-core/src/main/java/we/filter/CallbackFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilter.java similarity index 94% rename from fizz-core/src/main/java/we/filter/CallbackFilter.java rename to fizz-core/src/main/java/com/fizzgate/filter/CallbackFilter.java index d6adebb..212f9ed 100644 --- a/fizz-core/src/main/java/we/filter/CallbackFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilter.java @@ -15,9 +15,23 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import com.alibaba.fastjson.JSON; +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.auth.CallbackConfig; +import com.fizzgate.plugin.auth.GatewayGroupService; +import com.fizzgate.plugin.auth.Receiver; +import com.fizzgate.proxy.CallbackService; +import com.fizzgate.proxy.DiscoveryClientUriSelector; +import com.fizzgate.proxy.ServiceInstance; +import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.util.Consts; +import com.fizzgate.util.NettyDataBufferUtils; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.WebUtils; + import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,19 +48,6 @@ import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.plugin.auth.ApiConfig; -import we.plugin.auth.CallbackConfig; -import we.plugin.auth.GatewayGroupService; -import we.plugin.auth.Receiver; -import we.proxy.CallbackService; -import we.proxy.DiscoveryClientUriSelector; -import we.proxy.ServiceInstance; -import we.service_registry.RegistryCenterService; -import we.util.Consts; -import we.util.NettyDataBufferUtils; -import we.util.ThreadContext; -import we.util.WebUtils; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; diff --git a/fizz-core/src/main/java/we/filter/CallbackFilterProperties.java b/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilterProperties.java similarity index 94% rename from fizz-core/src/main/java/we/filter/CallbackFilterProperties.java rename to fizz-core/src/main/java/com/fizzgate/filter/CallbackFilterProperties.java index 7ead8ec..9c6516b 100644 --- a/fizz-core/src/main/java/we/filter/CallbackFilterProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/CallbackFilterProperties.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/we/filter/CorsFilterConfig.java b/fizz-core/src/main/java/com/fizzgate/filter/CorsFilterConfig.java similarity index 97% rename from fizz-core/src/main/java/we/filter/CorsFilterConfig.java rename to fizz-core/src/main/java/com/fizzgate/filter/CorsFilterConfig.java index da49763..2485313 100644 --- a/fizz-core/src/main/java/we/filter/CorsFilterConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/CorsFilterConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; @@ -27,7 +27,7 @@ import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; -import we.config.SystemConfig; +import com.fizzgate.config.SystemConfig; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/filter/FilterExceptionHandlerConfig.java b/fizz-core/src/main/java/com/fizzgate/filter/FilterExceptionHandlerConfig.java similarity index 93% rename from fizz-core/src/main/java/we/filter/FilterExceptionHandlerConfig.java rename to fizz-core/src/main/java/com/fizzgate/filter/FilterExceptionHandlerConfig.java index 98e25c1..c71bf75 100644 --- a/fizz-core/src/main/java/we/filter/FilterExceptionHandlerConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FilterExceptionHandlerConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -30,18 +30,20 @@ import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebExceptionHandler; + +import com.fizzgate.Fizz; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.exception.ExecuteScriptException; +import com.fizzgate.exception.RedirectException; +import com.fizzgate.exception.StopAndResponseException; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.legacy.RespEntity; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.Fizz; -import we.config.SystemConfig; -import we.exception.ExecuteScriptException; -import we.exception.RedirectException; -import we.exception.StopAndResponseException; -import we.fizz.exception.FizzRuntimeException; -import we.legacy.RespEntity; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.ThreadContext; -import we.util.WebUtils; import java.net.URI; diff --git a/fizz-core/src/main/java/we/filter/FilterResult.java b/fizz-core/src/main/java/com/fizzgate/filter/FilterResult.java similarity index 98% rename from fizz-core/src/main/java/we/filter/FilterResult.java rename to fizz-core/src/main/java/com/fizzgate/filter/FilterResult.java index 98f6df4..83e4d12 100644 --- a/fizz-core/src/main/java/we/filter/FilterResult.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FilterResult.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import java.util.Map; diff --git a/fizz-core/src/main/java/we/filter/FizzLogFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/FizzLogFilter.java similarity index 92% rename from fizz-core/src/main/java/we/filter/FizzLogFilter.java rename to fizz-core/src/main/java/com/fizzgate/filter/FizzLogFilter.java index c128da9..9878ce4 100644 --- a/fizz-core/src/main/java/we/filter/FizzLogFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FizzLogFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,10 +24,12 @@ import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; -import reactor.core.publisher.Mono; -import we.util.Consts; -import we.util.ThreadContext; -import we.util.WebUtils; + +import com.fizzgate.util.Consts; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.WebUtils; + +import reactor.core.publisher.Mono; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/filter/FizzWebFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/FizzWebFilter.java similarity index 95% rename from fizz-core/src/main/java/we/filter/FizzWebFilter.java rename to fizz-core/src/main/java/com/fizzgate/filter/FizzWebFilter.java index 2f3b21a..5114b04 100644 --- a/fizz-core/src/main/java/we/filter/FizzWebFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FizzWebFilter.java @@ -15,13 +15,15 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; + +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.util.WebUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/filter/FlowControlFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java similarity index 96% rename from fizz-core/src/main/java/we/filter/FlowControlFilter.java rename to fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java index e66a6d4..760563d 100644 --- a/fizz-core/src/main/java/we/filter/FlowControlFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -29,22 +29,24 @@ import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.monitor.FizzMonitorService; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.auth.AppService; +import com.fizzgate.stats.BlockType; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.IncrRequestResult; +import com.fizzgate.stats.ResourceConfig; +import com.fizzgate.stats.circuitbreaker.CircuitBreakManager; +import com.fizzgate.stats.circuitbreaker.CircuitBreaker; +import com.fizzgate.stats.degrade.DegradeRule; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfig; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfigService; +import com.fizzgate.util.*; + import reactor.core.publisher.Mono; import reactor.core.publisher.SignalType; -import we.config.SystemConfig; -import we.monitor.FizzMonitorService; -import we.plugin.auth.ApiConfigService; -import we.plugin.auth.AppService; -import we.stats.BlockType; -import we.stats.FlowStat; -import we.stats.IncrRequestResult; -import we.stats.ResourceConfig; -import we.stats.circuitbreaker.CircuitBreakManager; -import we.stats.circuitbreaker.CircuitBreaker; -import we.stats.degrade.DegradeRule; -import we.stats.ratelimit.ResourceRateLimitConfig; -import we.stats.ratelimit.ResourceRateLimitConfigService; -import we.util.*; import javax.annotation.Resource; import java.util.ArrayList; diff --git a/fizz-core/src/main/java/we/filter/FlowControlFilterProperties.java b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilterProperties.java similarity index 95% rename from fizz-core/src/main/java/we/filter/FlowControlFilterProperties.java rename to fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilterProperties.java index 7ae08c4..9f22371 100644 --- a/fizz-core/src/main/java/we/filter/FlowControlFilterProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilterProperties.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/we/filter/PreprocessFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/PreprocessFilter.java similarity index 91% rename from fizz-core/src/main/java/we/filter/PreprocessFilter.java rename to fizz-core/src/main/java/com/fizzgate/filter/PreprocessFilter.java index 68dc612..0a30972 100644 --- a/fizz-core/src/main/java/we/filter/PreprocessFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/PreprocessFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,20 +25,22 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; + +import com.fizzgate.plugin.FixedPluginFilter; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.auth.AuthPluginFilter; +import com.fizzgate.plugin.auth.GatewayGroup; +import com.fizzgate.plugin.auth.GatewayGroupService; +import com.fizzgate.plugin.stat.StatPluginFilter; +import com.fizzgate.proxy.Route; +import com.fizzgate.util.ReactorUtils; +import com.fizzgate.util.Result; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.plugin.FixedPluginFilter; -import we.plugin.FizzPluginFilterChain; -import we.plugin.PluginConfig; -import we.plugin.auth.ApiConfig; -import we.plugin.auth.AuthPluginFilter; -import we.plugin.auth.GatewayGroup; -import we.plugin.auth.GatewayGroupService; -import we.plugin.stat.StatPluginFilter; -import we.proxy.Route; -import we.util.ReactorUtils; -import we.util.Result; -import we.util.ThreadContext; -import we.util.WebUtils; import javax.annotation.Resource; import java.util.*; diff --git a/fizz-core/src/main/java/we/filter/RouteFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/RouteFilter.java similarity index 97% rename from fizz-core/src/main/java/we/filter/RouteFilter.java rename to fizz-core/src/main/java/com/fizzgate/filter/RouteFilter.java index 747e15b..d88b018 100644 --- a/fizz-core/src/main/java/we/filter/RouteFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/RouteFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.filter; +package com.fizzgate.filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,15 +32,17 @@ import org.springframework.web.reactive.function.BodyExtractors; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.proxy.FizzWebClient; +import com.fizzgate.proxy.Route; +import com.fizzgate.proxy.dubbo.ApacheDubboGenericService; +import com.fizzgate.proxy.dubbo.DubboInterfaceDeclaration; +import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.util.*; + import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.plugin.auth.ApiConfig; -import we.proxy.FizzWebClient; -import we.proxy.Route; -import we.proxy.dubbo.ApacheDubboGenericService; -import we.proxy.dubbo.DubboInterfaceDeclaration; -import we.service_registry.RegistryCenterService; -import we.util.*; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; diff --git a/fizz-core/src/main/java/we/fizz/AggregateResource.java b/fizz-core/src/main/java/com/fizzgate/fizz/AggregateResource.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/AggregateResource.java rename to fizz-core/src/main/java/com/fizzgate/fizz/AggregateResource.java index 2d0dccb..bd5f4a4 100644 --- a/fizz-core/src/main/java/we/fizz/AggregateResource.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/AggregateResource.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; -import we.fizz.input.Input; +import com.fizzgate.fizz.input.Input; /** * diff --git a/fizz-core/src/main/java/we/fizz/AggregateResult.java b/fizz-core/src/main/java/com/fizzgate/fizz/AggregateResult.java similarity index 98% rename from fizz-core/src/main/java/we/fizz/AggregateResult.java rename to fizz-core/src/main/java/com/fizzgate/fizz/AggregateResult.java index 489021b..199735a 100644 --- a/fizz-core/src/main/java/we/fizz/AggregateResult.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/AggregateResult.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import org.springframework.util.MultiValueMap; diff --git a/fizz-core/src/main/java/we/fizz/AggregateService.java b/fizz-core/src/main/java/com/fizzgate/fizz/AggregateService.java similarity index 95% rename from fizz-core/src/main/java/we/fizz/AggregateService.java rename to fizz-core/src/main/java/com/fizzgate/fizz/AggregateService.java index 626cf55..763e88c 100644 --- a/fizz-core/src/main/java/we/fizz/AggregateService.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/AggregateService.java @@ -15,9 +15,16 @@ * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import com.alibaba.fastjson.JSON; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.fizz.input.Input; +import com.fizzgate.util.Consts; +import com.fizzgate.util.MapUtil; +import com.fizzgate.util.Utils; +import com.fizzgate.util.WebUtils; + import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,12 +37,6 @@ import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import we.config.SystemConfig; -import we.fizz.input.Input; -import we.util.Consts; -import we.util.MapUtil; -import we.util.Utils; -import we.util.WebUtils; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; diff --git a/fizz-core/src/main/java/we/fizz/ConfigLoader.java b/fizz-core/src/main/java/com/fizzgate/fizz/ConfigLoader.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/ConfigLoader.java rename to fizz-core/src/main/java/com/fizzgate/fizz/ConfigLoader.java index acb572a..54565a1 100644 --- a/fizz-core/src/main/java/we/fizz/ConfigLoader.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/ConfigLoader.java @@ -15,10 +15,18 @@ * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import com.fizzgate.config.AppConfigProperties; +import com.fizzgate.fizz.input.ClientInputConfig; +import com.fizzgate.fizz.input.Input; +import com.fizzgate.fizz.input.InputFactory; +import com.fizzgate.fizz.input.InputType; +import com.fizzgate.util.Consts; +import com.fizzgate.util.ReactorUtils; + import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.ThreadContext; import org.noear.snack.ONode; @@ -32,13 +40,6 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AppConfigProperties; -import we.fizz.input.ClientInputConfig; -import we.fizz.input.Input; -import we.fizz.input.InputFactory; -import we.fizz.input.InputType; -import we.util.Consts; -import we.util.ReactorUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; @@ -50,9 +51,9 @@ import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import static we.config.AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE; -import static we.util.Consts.S.FORWARD_SLASH; -import static we.util.Consts.S.FORWARD_SLASH_STR; +import static com.fizzgate.config.AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_TEMPLATE; +import static com.fizzgate.util.Consts.S.FORWARD_SLASH; +import static com.fizzgate.util.Consts.S.FORWARD_SLASH_STR; /** * diff --git a/fizz-core/src/main/java/we/fizz/ConfigLoaderProperties.java b/fizz-core/src/main/java/com/fizzgate/fizz/ConfigLoaderProperties.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/ConfigLoaderProperties.java rename to fizz-core/src/main/java/com/fizzgate/fizz/ConfigLoaderProperties.java index 08babc4..3e6cd7f 100644 --- a/fizz-core/src/main/java/we/fizz/ConfigLoaderProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/ConfigLoaderProperties.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/we/fizz/Pipeline.java b/fizz-core/src/main/java/com/fizzgate/fizz/Pipeline.java similarity index 95% rename from fizz-core/src/main/java/we/fizz/Pipeline.java rename to fizz-core/src/main/java/com/fizzgate/fizz/Pipeline.java index fbe1399..db5e4c9 100644 --- a/fizz-core/src/main/java/we/fizz/Pipeline.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/Pipeline.java @@ -15,9 +15,29 @@ * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import com.alibaba.fastjson.JSON; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.exception.ExecuteScriptException; +import com.fizzgate.exception.RedirectException; +import com.fizzgate.exception.StopAndResponseException; +import com.fizzgate.fizz.component.ComponentExecutor; +import com.fizzgate.fizz.component.ComponentResult; +import com.fizzgate.fizz.component.IComponent; +import com.fizzgate.fizz.component.StepContextPosition; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.field.FieldConfig; +import com.fizzgate.fizz.field.ValueTypeEnum; +import com.fizzgate.fizz.input.*; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.JsonSchemaUtils; +import com.fizzgate.util.MapUtil; +import com.fizzgate.xml.JsonToXml; +import com.fizzgate.xml.XmlToJson; +import com.fizzgate.xml.XmlToJson.Builder; + import org.apache.logging.log4j.ThreadContext; import org.noear.snack.ONode; import org.slf4j.Logger; @@ -30,27 +50,8 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.constants.CommonConstants; -import we.exception.ExecuteScriptException; -import we.exception.RedirectException; -import we.exception.StopAndResponseException; -import we.fizz.component.ComponentExecutor; -import we.fizz.component.ComponentResult; -import we.fizz.component.IComponent; -import we.fizz.component.StepContextPosition; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.field.FieldConfig; -import we.fizz.field.ValueTypeEnum; -import we.fizz.input.*; -import we.schema.util.I18nUtils; -import we.schema.util.PropertiesSupportUtils; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.JsonSchemaUtils; -import we.util.MapUtil; -import we.xml.JsonToXml; -import we.xml.XmlToJson; -import we.xml.XmlToJson.Builder; +import com.fizzgate.schema.util.I18nUtils; +import com.fizzgate.schema.util.PropertiesSupportUtils; import javax.script.ScriptException; import java.util.*; diff --git a/fizz-core/src/main/java/we/fizz/Step.java b/fizz-core/src/main/java/com/fizzgate/fizz/Step.java similarity index 92% rename from fizz-core/src/main/java/we/fizz/Step.java rename to fizz-core/src/main/java/com/fizzgate/fizz/Step.java index a3daadd..a691aaa 100644 --- a/fizz-core/src/main/java/we/fizz/Step.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/Step.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import java.lang.ref.SoftReference; import java.util.ArrayList; @@ -26,16 +26,17 @@ import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.springframework.context.ConfigurableApplicationContext; +import com.fizzgate.fizz.component.ComponentExecutor; +import com.fizzgate.fizz.component.ComponentResult; +import com.fizzgate.fizz.component.IComponent; +import com.fizzgate.fizz.component.StepContextPosition; +import com.fizzgate.fizz.input.Input; +import com.fizzgate.fizz.input.InputConfig; +import com.fizzgate.fizz.input.InputContext; +import com.fizzgate.fizz.input.InputFactory; +import com.fizzgate.fizz.input.InputType; + import reactor.core.publisher.Mono; -import we.fizz.component.ComponentExecutor; -import we.fizz.component.ComponentResult; -import we.fizz.component.IComponent; -import we.fizz.component.StepContextPosition; -import we.fizz.input.Input; -import we.fizz.input.InputConfig; -import we.fizz.input.InputContext; -import we.fizz.input.InputFactory; -import we.fizz.input.InputType; /** * diff --git a/fizz-core/src/main/java/we/fizz/StepContext.java b/fizz-core/src/main/java/com/fizzgate/fizz/StepContext.java similarity index 99% rename from fizz-core/src/main/java/we/fizz/StepContext.java rename to fizz-core/src/main/java/com/fizzgate/fizz/StepContext.java index 974cf92..3acce25 100644 --- a/fizz-core/src/main/java/we/fizz/StepContext.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/StepContext.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import java.util.ArrayList; import java.util.HashMap; @@ -27,8 +27,7 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.http.codec.multipart.FilePart; import com.alibaba.fastjson.JSON; - -import we.constants.CommonConstants; +import com.fizzgate.constants.CommonConstants; /** * diff --git a/fizz-core/src/main/java/we/fizz/StepResponse.java b/fizz-core/src/main/java/com/fizzgate/fizz/StepResponse.java similarity index 99% rename from fizz-core/src/main/java/we/fizz/StepResponse.java rename to fizz-core/src/main/java/com/fizzgate/fizz/StepResponse.java index 31caf1c..ba32083 100644 --- a/fizz-core/src/main/java/we/fizz/StepResponse.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/StepResponse.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz; +package com.fizzgate.fizz; import java.util.HashMap; import java.util.List; diff --git a/fizz-core/src/main/java/we/fizz/component/ComponentExecutor.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentExecutor.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/component/ComponentExecutor.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentExecutor.java index 80e2389..c6ff6e0 100644 --- a/fizz-core/src/main/java/we/fizz/component/ComponentExecutor.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentExecutor.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.component; +package com.fizzgate.fizz.component; import java.util.ArrayList; import java.util.List; @@ -24,11 +24,11 @@ import java.util.function.BiFunction; import org.noear.snack.ONode; import com.alibaba.fastjson.JSON; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.component.circle.Circle; +import com.fizzgate.fizz.component.condition.Condition; import reactor.core.publisher.Mono; -import we.fizz.StepContext; -import we.fizz.component.circle.Circle; -import we.fizz.component.condition.Condition; /** * Condition component diff --git a/fizz-core/src/main/java/we/fizz/component/ComponentResult.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentResult.java similarity index 64% rename from fizz-core/src/main/java/we/fizz/component/ComponentResult.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentResult.java index 9970380..ae853f2 100644 --- a/fizz-core/src/main/java/we/fizz/component/ComponentResult.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentResult.java @@ -1,4 +1,4 @@ -package we.fizz.component; +package com.fizzgate.fizz.component; public class ComponentResult { diff --git a/fizz-core/src/main/java/we/fizz/component/ComponentTypeEnum.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentTypeEnum.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/component/ComponentTypeEnum.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentTypeEnum.java index 5f47e20..fd33de9 100644 --- a/fizz-core/src/main/java/we/fizz/component/ComponentTypeEnum.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/ComponentTypeEnum.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.component; +package com.fizzgate.fizz.component; /** * Component Type diff --git a/fizz-core/src/main/java/we/fizz/component/IComponent.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/IComponent.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/component/IComponent.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/IComponent.java index 65e40cb..39901c8 100644 --- a/fizz-core/src/main/java/we/fizz/component/IComponent.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/IComponent.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.component; +package com.fizzgate.fizz.component; /** * Component interface diff --git a/fizz-core/src/main/java/we/fizz/component/OperatorEnum.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/OperatorEnum.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/component/OperatorEnum.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/OperatorEnum.java index 73a2eee..3c4b81e 100644 --- a/fizz-core/src/main/java/we/fizz/component/OperatorEnum.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/OperatorEnum.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.component; +package com.fizzgate.fizz.component; /** * Operator diff --git a/fizz-core/src/main/java/we/fizz/component/StepContextPosition.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/StepContextPosition.java similarity index 97% rename from fizz-core/src/main/java/we/fizz/component/StepContextPosition.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/StepContextPosition.java index 9afe709..879111c 100644 --- a/fizz-core/src/main/java/we/fizz/component/StepContextPosition.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/StepContextPosition.java @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.component; +package com.fizzgate.fizz.component; import lombok.Data; diff --git a/fizz-core/src/main/java/we/fizz/component/circle/Circle.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/circle/Circle.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/component/circle/Circle.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/circle/Circle.java index 308ee74..8382d56 100644 --- a/fizz-core/src/main/java/we/fizz/component/circle/Circle.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/circle/Circle.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.component.circle; +package com.fizzgate.fizz.component.circle; import java.util.Collection; import java.util.Collections; @@ -24,19 +24,20 @@ import java.util.function.BiFunction; import org.noear.snack.ONode; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.component.ComponentExecutor; +import com.fizzgate.fizz.component.ComponentResult; +import com.fizzgate.fizz.component.ComponentTypeEnum; +import com.fizzgate.fizz.component.IComponent; +import com.fizzgate.fizz.component.StepContextPosition; +import com.fizzgate.fizz.component.condition.Condition; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.field.ValueTypeEnum; +import com.fizzgate.fizz.input.PathMapping; + import lombok.Data; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.fizz.StepContext; -import we.fizz.component.ComponentExecutor; -import we.fizz.component.ComponentResult; -import we.fizz.component.ComponentTypeEnum; -import we.fizz.component.IComponent; -import we.fizz.component.StepContextPosition; -import we.fizz.component.condition.Condition; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.field.ValueTypeEnum; -import we.fizz.input.PathMapping; /** * Circle component diff --git a/fizz-core/src/main/java/we/fizz/component/circle/CircleItem.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/circle/CircleItem.java similarity index 95% rename from fizz-core/src/main/java/we/fizz/component/circle/CircleItem.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/circle/CircleItem.java index 34b6cc0..a1d25c4 100644 --- a/fizz-core/src/main/java/we/fizz/component/circle/CircleItem.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/circle/CircleItem.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.component.circle; +package com.fizzgate.fizz.component.circle; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/fizz-core/src/main/java/we/fizz/component/condition/Condition.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/condition/Condition.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/component/condition/Condition.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/condition/Condition.java index 2134bb3..e09ceb1 100644 --- a/fizz-core/src/main/java/we/fizz/component/condition/Condition.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/condition/Condition.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.component.condition; +package com.fizzgate.fizz.component.condition; import java.util.Collection; import java.util.Map; @@ -28,18 +28,18 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import com.alibaba.fastjson.JSON; +import com.fizzgate.fizz.component.ComponentTypeEnum; +import com.fizzgate.fizz.component.IComponent; +import com.fizzgate.fizz.component.OperatorEnum; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.field.RefDataTypeEnum; +import com.fizzgate.fizz.field.ValueTypeEnum; +import com.fizzgate.fizz.input.PathMapping; +import com.fizzgate.fizz.input.extension.request.RequestInput; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import we.fizz.component.ComponentTypeEnum; -import we.fizz.component.IComponent; -import we.fizz.component.OperatorEnum; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.field.RefDataTypeEnum; -import we.fizz.field.ValueTypeEnum; -import we.fizz.input.PathMapping; -import we.fizz.input.extension.request.RequestInput; /** * Condition component diff --git a/fizz-core/src/main/java/we/fizz/component/condition/ConditionValue.java b/fizz-core/src/main/java/com/fizzgate/fizz/component/condition/ConditionValue.java similarity index 88% rename from fizz-core/src/main/java/we/fizz/component/condition/ConditionValue.java rename to fizz-core/src/main/java/com/fizzgate/fizz/component/condition/ConditionValue.java index f89c49b..5414547 100644 --- a/fizz-core/src/main/java/we/fizz/component/condition/ConditionValue.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/component/condition/ConditionValue.java @@ -15,14 +15,15 @@ * along with this program. If not, see . */ -package we.fizz.component.condition; +package com.fizzgate.fizz.component.condition; + +import com.fizzgate.fizz.field.FixedDataTypeEnum; +import com.fizzgate.fizz.field.RefDataTypeEnum; +import com.fizzgate.fizz.field.ValueTypeEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import we.fizz.field.FixedDataTypeEnum; -import we.fizz.field.RefDataTypeEnum; -import we.fizz.field.ValueTypeEnum; /** * Condition value diff --git a/fizz-core/src/main/java/we/fizz/exception/FizzException.java b/fizz-core/src/main/java/com/fizzgate/fizz/exception/FizzException.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/exception/FizzException.java rename to fizz-core/src/main/java/com/fizzgate/fizz/exception/FizzException.java index c933ba3..6125f11 100644 --- a/fizz-core/src/main/java/we/fizz/exception/FizzException.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/exception/FizzException.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.exception; +package com.fizzgate.fizz.exception; public class FizzException extends Exception { public FizzException(Throwable exception) { diff --git a/fizz-core/src/main/java/we/fizz/exception/FizzRuntimeException.java b/fizz-core/src/main/java/com/fizzgate/fizz/exception/FizzRuntimeException.java similarity index 95% rename from fizz-core/src/main/java/we/fizz/exception/FizzRuntimeException.java rename to fizz-core/src/main/java/com/fizzgate/fizz/exception/FizzRuntimeException.java index 5b72d73..c3e5138 100644 --- a/fizz-core/src/main/java/we/fizz/exception/FizzRuntimeException.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/exception/FizzRuntimeException.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package we.fizz.exception; +package com.fizzgate.fizz.exception; -import we.fizz.StepContext; +import com.fizzgate.fizz.StepContext; public class FizzRuntimeException extends RuntimeException { diff --git a/fizz-core/src/main/java/we/fizz/field/FieldConfig.java b/fizz-core/src/main/java/com/fizzgate/fizz/field/FieldConfig.java similarity index 98% rename from fizz-core/src/main/java/we/fizz/field/FieldConfig.java rename to fizz-core/src/main/java/com/fizzgate/fizz/field/FieldConfig.java index 047a565..b1b736d 100644 --- a/fizz-core/src/main/java/we/fizz/field/FieldConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/field/FieldConfig.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.field; +package com.fizzgate.fizz.field; import java.util.Map; diff --git a/fizz-core/src/main/java/we/fizz/field/FixedDataTypeEnum.java b/fizz-core/src/main/java/com/fizzgate/fizz/field/FixedDataTypeEnum.java similarity index 97% rename from fizz-core/src/main/java/we/fizz/field/FixedDataTypeEnum.java rename to fizz-core/src/main/java/com/fizzgate/fizz/field/FixedDataTypeEnum.java index 9aa6950..4a3b10e 100644 --- a/fizz-core/src/main/java/we/fizz/field/FixedDataTypeEnum.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/field/FixedDataTypeEnum.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.field; +package com.fizzgate.fizz.field; /** * Data type of fixed value diff --git a/fizz-core/src/main/java/we/fizz/field/RefDataTypeEnum.java b/fizz-core/src/main/java/com/fizzgate/fizz/field/RefDataTypeEnum.java similarity index 97% rename from fizz-core/src/main/java/we/fizz/field/RefDataTypeEnum.java rename to fizz-core/src/main/java/com/fizzgate/fizz/field/RefDataTypeEnum.java index 3ef1c53..ca926a3 100644 --- a/fizz-core/src/main/java/we/fizz/field/RefDataTypeEnum.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/field/RefDataTypeEnum.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.field; +package com.fizzgate.fizz.field; /** * Data type of reference value diff --git a/fizz-core/src/main/java/we/fizz/field/ValueTypeEnum.java b/fizz-core/src/main/java/com/fizzgate/fizz/field/ValueTypeEnum.java similarity index 97% rename from fizz-core/src/main/java/we/fizz/field/ValueTypeEnum.java rename to fizz-core/src/main/java/com/fizzgate/fizz/field/ValueTypeEnum.java index 9500bb4..fab8b64 100644 --- a/fizz-core/src/main/java/we/fizz/field/ValueTypeEnum.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/field/ValueTypeEnum.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.field; +package com.fizzgate.fizz.field; /** * Value Type diff --git a/fizz-core/src/main/java/we/fizz/function/CodecFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/CodecFunc.java similarity index 98% rename from fizz-core/src/main/java/we/fizz/function/CodecFunc.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/CodecFunc.java index ca57020..23ad4b1 100644 --- a/fizz-core/src/main/java/we/fizz/function/CodecFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/CodecFunc.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import java.io.UnsupportedEncodingException; import java.security.Key; @@ -31,7 +31,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.util.DigestUtils; +import com.fizzgate.util.DigestUtils; /** * Codec Functions diff --git a/fizz-core/src/main/java/we/fizz/function/CommonFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/CommonFunc.java similarity index 99% rename from fizz-core/src/main/java/we/fizz/function/CommonFunc.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/CommonFunc.java index 6ce5e21..9b59ffc 100644 --- a/fizz-core/src/main/java/we/fizz/function/CommonFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/CommonFunc.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import java.lang.reflect.Array; import java.util.Collection; diff --git a/fizz-core/src/main/java/we/fizz/function/DateFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/DateFunc.java similarity index 98% rename from fizz-core/src/main/java/we/fizz/function/DateFunc.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/DateFunc.java index 09ede0e..86b4266 100644 --- a/fizz-core/src/main/java/we/fizz/function/DateFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/DateFunc.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -27,7 +27,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.exception.FizzRuntimeException; /** * Date Functions diff --git a/fizz-core/src/main/java/we/fizz/function/FuncExecutor.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/FuncExecutor.java similarity index 98% rename from fizz-core/src/main/java/we/fizz/function/FuncExecutor.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/FuncExecutor.java index 0fdbcba..4292196 100644 --- a/fizz-core/src/main/java/we/fizz/function/FuncExecutor.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/FuncExecutor.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; @@ -34,12 +34,13 @@ import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.input.Input; +import com.fizzgate.fizz.input.PathMapping; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.input.Input; -import we.fizz.input.PathMapping; /** * Function Register @@ -77,7 +78,7 @@ public class FuncExecutor { public static void init() { try { - Reflections reflections = new Reflections("we.fizz.function"); + Reflections reflections = new Reflections("com.fizzgate.fizz.function"); Set> types = reflections.getSubTypesOf(IFunc.class); for (Class fnType : types) { Method method = fnType.getMethod("getInstance"); diff --git a/fizz-core/src/main/java/we/fizz/function/IFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/IFunc.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/function/IFunc.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/IFunc.java index 2b7882e..3af99d4 100644 --- a/fizz-core/src/main/java/we/fizz/function/IFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/IFunc.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; /** * Function interface diff --git a/fizz-core/src/main/java/we/fizz/function/ListFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/ListFunc.java similarity index 98% rename from fizz-core/src/main/java/we/fizz/function/ListFunc.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/ListFunc.java index fa035ee..7c41a49 100644 --- a/fizz-core/src/main/java/we/fizz/function/ListFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/ListFunc.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import java.util.ArrayList; import java.util.HashMap; @@ -25,7 +25,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.exception.FizzRuntimeException; /** * List Functions diff --git a/fizz-core/src/main/java/we/fizz/function/MathFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/MathFunc.java similarity index 99% rename from fizz-core/src/main/java/we/fizz/function/MathFunc.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/MathFunc.java index ff26870..39c5752 100644 --- a/fizz-core/src/main/java/we/fizz/function/MathFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/MathFunc.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import java.math.BigDecimal; diff --git a/fizz-core/src/main/java/we/fizz/function/StringFunc.java b/fizz-core/src/main/java/com/fizzgate/fizz/function/StringFunc.java similarity index 99% rename from fizz-core/src/main/java/we/fizz/function/StringFunc.java rename to fizz-core/src/main/java/com/fizzgate/fizz/function/StringFunc.java index ed90889..cbd9293 100644 --- a/fizz-core/src/main/java/we/fizz/function/StringFunc.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/function/StringFunc.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import java.util.UUID; @@ -22,7 +22,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.exception.FizzRuntimeException; /** * String Functions diff --git a/fizz-core/src/main/java/we/fizz/input/ClientInputConfig.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/ClientInputConfig.java similarity index 99% rename from fizz-core/src/main/java/we/fizz/input/ClientInputConfig.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/ClientInputConfig.java index 9a47ed8..8bdffda 100644 --- a/fizz-core/src/main/java/we/fizz/input/ClientInputConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/ClientInputConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import java.util.HashMap; import java.util.Map; diff --git a/fizz-core/src/main/java/we/fizz/input/IInput.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/IInput.java similarity index 91% rename from fizz-core/src/main/java/we/fizz/input/IInput.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/IInput.java index f9fa67f..434f7a3 100644 --- a/fizz-core/src/main/java/we/fizz/input/IInput.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/IInput.java @@ -15,13 +15,15 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import org.springframework.context.ConfigurableApplicationContext; + +import com.fizzgate.fizz.Step; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.StepResponse; + import reactor.core.publisher.Mono; -import we.fizz.Step; -import we.fizz.StepContext; -import we.fizz.StepResponse; import java.lang.ref.SoftReference; import java.lang.reflect.Field; diff --git a/fizz-core/src/main/java/we/fizz/input/Input.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/Input.java similarity index 95% rename from fizz-core/src/main/java/we/fizz/input/Input.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/Input.java index f8e3952..70cc810 100644 --- a/fizz-core/src/main/java/we/fizz/input/Input.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/Input.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import java.lang.ref.SoftReference; import java.lang.reflect.Field; @@ -23,10 +23,12 @@ import java.util.Map; import org.reflections.Reflections; import org.springframework.context.ConfigurableApplicationContext; + +import com.fizzgate.fizz.Step; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.StepResponse; + import reactor.core.publisher.Mono; -import we.fizz.Step; -import we.fizz.StepContext; -import we.fizz.StepResponse; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/InputConfig.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputConfig.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/input/InputConfig.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/InputConfig.java index 3e40741..dc45fed 100644 --- a/fizz-core/src/main/java/we/fizz/input/InputConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputConfig.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import java.util.HashMap; import java.util.List; import java.util.Map; -import we.fizz.component.IComponent; +import com.fizzgate.fizz.component.IComponent; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/InputContext.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputContext.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/input/InputContext.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/InputContext.java index 58bfb0a..95759ac 100644 --- a/fizz-core/src/main/java/we/fizz/input/InputContext.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputContext.java @@ -16,13 +16,13 @@ */ -package we.fizz.input; +package com.fizzgate.fizz.input; import java.util.HashMap; import java.util.Map; -import we.fizz.StepContext; -import we.fizz.StepResponse; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.StepResponse; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/InputFactory.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputFactory.java similarity index 93% rename from fizz-core/src/main/java/we/fizz/input/InputFactory.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/InputFactory.java index 798379f..8ce98ad 100644 --- a/fizz-core/src/main/java/we/fizz/input/InputFactory.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputFactory.java @@ -15,12 +15,9 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; -import we.fizz.component.ComponentExecutor; import org.reflections.Reflections; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.input.extension.request.RequestInput; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -33,6 +30,10 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fizzgate.fizz.component.ComponentExecutor; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.input.extension.request.RequestInput; + /** * * @author linwaiwai @@ -96,7 +97,7 @@ public class InputFactory { } public static void loadInputClasses() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - Reflections reflections = new Reflections("we.fizz.input"); + Reflections reflections = new Reflections("com.fizzgate.fizz.input"); Set> subTypes = reflections.getSubTypesOf(Input.class); for (ClassinputType : subTypes){ Method initializeMethod = inputType.getMethod("initialize", Class.class); diff --git a/fizz-core/src/main/java/we/fizz/input/InputType.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputType.java similarity index 97% rename from fizz-core/src/main/java/we/fizz/input/InputType.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/InputType.java index 5c7f36b..e39e0fe 100644 --- a/fizz-core/src/main/java/we/fizz/input/InputType.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/InputType.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import java.util.HashMap; import java.util.Map; diff --git a/fizz-core/src/main/java/we/fizz/input/PathMapping.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/PathMapping.java similarity index 97% rename from fizz-core/src/main/java/we/fizz/input/PathMapping.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/PathMapping.java index d2b9fd2..f88f4a4 100644 --- a/fizz-core/src/main/java/we/fizz/input/PathMapping.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/PathMapping.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import java.util.*; import java.util.Map.Entry; @@ -24,13 +24,13 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.noear.snack.ONode; -import we.constants.CommonConstants; -import we.fizz.StepContext; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.function.FuncExecutor; -import we.fizz.function.IFunc; -import we.global_resource.GlobalResourceService; -import we.util.MapUtil; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.function.FuncExecutor; +import com.fizzgate.fizz.function.IFunc; +import com.fizzgate.global_resource.GlobalResourceService; +import com.fizzgate.util.MapUtil; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/RPCInput.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/RPCInput.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/input/RPCInput.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/RPCInput.java index 1116154..d676d16 100644 --- a/fizz-core/src/main/java/we/fizz/input/RPCInput.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/RPCInput.java @@ -15,18 +15,20 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import org.apache.logging.log4j.ThreadContext; import org.noear.snack.ONode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; + +import com.fizzgate.exception.ExecuteScriptException; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; + import reactor.core.publisher.Mono; -import we.exception.ExecuteScriptException; -import we.fizz.StepContext; -import we.util.Consts; -import we.util.JacksonUtils; import javax.script.ScriptException; import java.util.HashMap; diff --git a/fizz-core/src/main/java/we/fizz/input/RPCResponse.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/RPCResponse.java similarity index 97% rename from fizz-core/src/main/java/we/fizz/input/RPCResponse.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/RPCResponse.java index f015d61..5c5f502 100644 --- a/fizz-core/src/main/java/we/fizz/input/RPCResponse.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/RPCResponse.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import org.springframework.util.MultiValueMap; diff --git a/fizz-core/src/main/java/we/fizz/input/ScriptHelper.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/ScriptHelper.java similarity index 93% rename from fizz-core/src/main/java/we/fizz/input/ScriptHelper.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/ScriptHelper.java index 0bd11dd..c247e05 100644 --- a/fizz-core/src/main/java/we/fizz/input/ScriptHelper.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/ScriptHelper.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import java.util.Collection; import java.util.HashMap; @@ -29,16 +29,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; -import org.springframework.util.StringUtils; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.exception.ExecuteScriptException; +import com.fizzgate.exception.RedirectException; +import com.fizzgate.exception.StopAndResponseException; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.Script; +import com.fizzgate.util.ScriptUtils; -import we.constants.CommonConstants; -import we.exception.ExecuteScriptException; -import we.exception.RedirectException; -import we.exception.StopAndResponseException; -import we.fizz.StepContext; -import we.util.JacksonUtils; -import we.util.Script; -import we.util.ScriptUtils; +import org.springframework.util.StringUtils; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInput.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboInput.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInput.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboInput.java index d245a68..8b772cc 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInput.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboInput.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.dubbo; +package com.fizzgate.fizz.input.extension.dubbo; import org.apache.logging.log4j.ThreadContext; import org.noear.snack.ONode; @@ -23,19 +23,21 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.util.CollectionUtils; + +import com.fizzgate.FizzAppContext; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.exception.ExecuteScriptException; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.input.*; +import com.fizzgate.proxy.dubbo.ApacheDubboGenericService; +import com.fizzgate.proxy.dubbo.DubboInterfaceDeclaration; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; + import reactor.core.publisher.Mono; import reactor.util.retry.Retry; -import we.FizzAppContext; -import we.config.SystemConfig; -import we.constants.CommonConstants; -import we.exception.ExecuteScriptException; -import we.fizz.StepContext; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.input.*; -import we.proxy.dubbo.ApacheDubboGenericService; -import we.proxy.dubbo.DubboInterfaceDeclaration; -import we.util.Consts; -import we.util.JacksonUtils; import javax.script.ScriptException; import java.time.Duration; diff --git a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInputConfig.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboInputConfig.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInputConfig.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboInputConfig.java index 0f3e068..d3a3b7b 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInputConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboInputConfig.java @@ -14,14 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.input.extension.dubbo; +package com.fizzgate.fizz.input.extension.dubbo; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.input.InputConfig; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.input.InputConfig; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboRPCResponse.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboRPCResponse.java similarity index 89% rename from fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboRPCResponse.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboRPCResponse.java index 3b4e14e..a1f5a1a 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboRPCResponse.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/dubbo/DubboRPCResponse.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.dubbo; +package com.fizzgate.fizz.input.extension.dubbo; -import we.fizz.input.RPCResponse; +import com.fizzgate.fizz.input.RPCResponse; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/extension/grpc/GRPCResponse.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GRPCResponse.java similarity index 91% rename from fizz-core/src/main/java/we/fizz/input/extension/grpc/GRPCResponse.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GRPCResponse.java index 27e4ca5..a58d703 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/grpc/GRPCResponse.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GRPCResponse.java @@ -15,10 +15,11 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.grpc; +package com.fizzgate.fizz.input.extension.grpc; import org.springframework.http.HttpStatus; -import we.fizz.input.RPCResponse; + +import com.fizzgate.fizz.input.RPCResponse; /** * diff --git a/fizz-core/src/main/java/we/fizz/input/extension/grpc/GrpcInput.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GrpcInput.java similarity index 94% rename from fizz-core/src/main/java/we/fizz/input/extension/grpc/GrpcInput.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GrpcInput.java index be45866..9af9e11 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/grpc/GrpcInput.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GrpcInput.java @@ -15,27 +15,28 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.grpc; +package com.fizzgate.fizz.input.extension.grpc; import com.alibaba.fastjson.JSON; +import com.fizzgate.FizzAppContext; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.exception.ExecuteScriptException; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.input.*; +import com.fizzgate.proxy.grpc.GrpcGenericService; +import com.fizzgate.proxy.grpc.GrpcInstanceService; +import com.fizzgate.proxy.grpc.GrpcInterfaceDeclaration; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; + import org.apache.logging.log4j.ThreadContext; import org.noear.snack.ONode; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.util.CollectionUtils; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; -import we.FizzAppContext; -import we.config.SystemConfig; -import we.constants.CommonConstants; -import we.exception.ExecuteScriptException; -import we.fizz.StepContext; -import we.fizz.exception.FizzRuntimeException; -import we.fizz.input.*; -import we.proxy.grpc.GrpcGenericService; -import we.proxy.grpc.GrpcInstanceService; -import we.proxy.grpc.GrpcInterfaceDeclaration; -import we.util.Consts; -import we.util.JacksonUtils; import javax.script.ScriptException; import java.time.Duration; diff --git a/fizz-core/src/main/java/we/fizz/input/extension/grpc/GrpcInputConfig.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GrpcInputConfig.java similarity index 95% rename from fizz-core/src/main/java/we/fizz/input/extension/grpc/GrpcInputConfig.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GrpcInputConfig.java index d4e9e5b..fda7382 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/grpc/GrpcInputConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/grpc/GrpcInputConfig.java @@ -15,15 +15,15 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.grpc; - -import we.fizz.exception.FizzRuntimeException; -import we.fizz.input.InputConfig; +package com.fizzgate.fizz.input.extension.grpc; import java.util.Map; import org.apache.commons.lang3.StringUtils; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.fizz.input.InputConfig; + /** * * @author linwaiwai diff --git a/fizz-core/src/main/java/we/fizz/input/extension/request/RequestInput.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestInput.java similarity index 96% rename from fizz-core/src/main/java/we/fizz/input/extension/request/RequestInput.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestInput.java index e898fcf..bd6adc7 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/request/RequestInput.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestInput.java @@ -15,9 +15,26 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.request; +package com.fizzgate.fizz.input.extension.request; import com.alibaba.fastjson.JSON; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.exception.ExecuteScriptException; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.StepResponse; +import com.fizzgate.fizz.input.*; +import com.fizzgate.proxy.FizzWebClient; +import com.fizzgate.proxy.http.HttpInstanceService; +import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.MapUtil; +import com.fizzgate.util.TypeUtils; +import com.fizzgate.xml.JsonToXml; +import com.fizzgate.xml.XmlToJson; +import com.fizzgate.xml.XmlToJson.Builder; + import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.ThreadContext; import org.noear.snack.ONode; @@ -32,22 +49,6 @@ import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.constants.CommonConstants; -import we.exception.ExecuteScriptException; -import we.fizz.StepContext; -import we.fizz.StepResponse; -import we.fizz.input.*; -import we.proxy.FizzWebClient; -import we.proxy.http.HttpInstanceService; -import we.service_registry.RegistryCenterService; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.MapUtil; -import we.util.TypeUtils; -import we.xml.JsonToXml; -import we.xml.XmlToJson; -import we.xml.XmlToJson.Builder; import javax.script.ScriptException; import java.util.ArrayList; diff --git a/fizz-core/src/main/java/we/fizz/input/extension/request/RequestInputConfig.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestInputConfig.java similarity index 98% rename from fizz-core/src/main/java/we/fizz/input/extension/request/RequestInputConfig.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestInputConfig.java index b4b81a0..e51d918 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/request/RequestInputConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestInputConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.request; +package com.fizzgate.fizz.input.extension.request; import java.net.MalformedURLException; import java.net.URL; @@ -25,7 +25,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.util.MultiValueMap; import org.springframework.web.util.UriComponentsBuilder; -import we.fizz.input.InputConfig; +import com.fizzgate.fizz.input.InputConfig; diff --git a/fizz-core/src/main/java/we/fizz/input/extension/request/RequestRPCResponse.java b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestRPCResponse.java similarity index 91% rename from fizz-core/src/main/java/we/fizz/input/extension/request/RequestRPCResponse.java rename to fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestRPCResponse.java index f762a20..8518f2c 100644 --- a/fizz-core/src/main/java/we/fizz/input/extension/request/RequestRPCResponse.java +++ b/fizz-core/src/main/java/com/fizzgate/fizz/input/extension/request/RequestRPCResponse.java @@ -15,10 +15,11 @@ * along with this program. If not, see . */ -package we.fizz.input.extension.request; +package com.fizzgate.fizz.input.extension.request; import org.springframework.http.HttpStatus; -import we.fizz.input.RPCResponse; + +import com.fizzgate.fizz.input.RPCResponse; /** * diff --git a/fizz-core/src/main/java/we/global_resource/GlobalResource.java b/fizz-core/src/main/java/com/fizzgate/global_resource/GlobalResource.java similarity index 98% rename from fizz-core/src/main/java/we/global_resource/GlobalResource.java rename to fizz-core/src/main/java/com/fizzgate/global_resource/GlobalResource.java index f4a44d4..4bfe371 100644 --- a/fizz-core/src/main/java/we/global_resource/GlobalResource.java +++ b/fizz-core/src/main/java/com/fizzgate/global_resource/GlobalResource.java @@ -15,11 +15,11 @@ * along with this program. If not, see . */ -package we.global_resource; +package com.fizzgate.global_resource; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import we.util.JacksonUtils; +import com.fizzgate.util.JacksonUtils; import java.math.BigDecimal; import java.util.List; diff --git a/fizz-core/src/main/java/we/global_resource/GlobalResourceService.java b/fizz-core/src/main/java/com/fizzgate/global_resource/GlobalResourceService.java similarity index 96% rename from fizz-core/src/main/java/we/global_resource/GlobalResourceService.java rename to fizz-core/src/main/java/com/fizzgate/global_resource/GlobalResourceService.java index 6aab182..c9751c6 100644 --- a/fizz-core/src/main/java/we/global_resource/GlobalResourceService.java +++ b/fizz-core/src/main/java/com/fizzgate/global_resource/GlobalResourceService.java @@ -15,19 +15,21 @@ * along with this program. If not, see . */ -package we.global_resource; +package com.fizzgate.global_resource; import org.noear.snack.ONode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.fizz.input.PathMapping; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.Result; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.fizz.input.PathMapping; -import we.util.JacksonUtils; -import we.util.Result; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/legacy/RespEntity.java b/fizz-core/src/main/java/com/fizzgate/legacy/RespEntity.java similarity index 95% rename from fizz-core/src/main/java/we/legacy/RespEntity.java rename to fizz-core/src/main/java/com/fizzgate/legacy/RespEntity.java index ece10e0..6632b16 100644 --- a/fizz-core/src/main/java/we/legacy/RespEntity.java +++ b/fizz-core/src/main/java/com/fizzgate/legacy/RespEntity.java @@ -15,12 +15,12 @@ * along with this program. If not, see . */ -package we.legacy; +package com.fizzgate.legacy; import org.springframework.lang.Nullable; -import we.util.Consts; -import we.util.ThreadContext; +import com.fizzgate.util.Consts; +import com.fizzgate.util.ThreadContext; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/listener/AggregateChannelListener.java b/fizz-core/src/main/java/com/fizzgate/listener/AggregateChannelListener.java similarity index 97% rename from fizz-core/src/main/java/we/listener/AggregateChannelListener.java rename to fizz-core/src/main/java/com/fizzgate/listener/AggregateChannelListener.java index 9527e2a..59386fd 100644 --- a/fizz-core/src/main/java/we/listener/AggregateChannelListener.java +++ b/fizz-core/src/main/java/com/fizzgate/listener/AggregateChannelListener.java @@ -15,10 +15,11 @@ * along with this program. If not, see . */ -package we.listener; +package com.fizzgate.listener; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; +import com.fizzgate.fizz.ConfigLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,12 +32,11 @@ import org.springframework.util.StringUtils; import reactor.core.Disposable; import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; -import we.fizz.ConfigLoader; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import static we.config.AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_MESSAGE_LISTENER_CONTAINER; +import static com.fizzgate.config.AggregateRedisConfig.AGGREGATE_REACTIVE_REDIS_MESSAGE_LISTENER_CONTAINER; import java.net.InetAddress; import java.util.List; diff --git a/fizz-core/src/main/java/we/log/LogProperties.java b/fizz-core/src/main/java/com/fizzgate/log/LogProperties.java similarity index 76% rename from fizz-core/src/main/java/we/log/LogProperties.java rename to fizz-core/src/main/java/com/fizzgate/log/LogProperties.java index b9aa883..6f35a9d 100644 --- a/fizz-core/src/main/java/we/log/LogProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/log/LogProperties.java @@ -1,4 +1,4 @@ -package we.log; +package com.fizzgate.log; import lombok.Data; diff --git a/fizz-core/src/main/java/we/log/LogSend.java b/fizz-core/src/main/java/com/fizzgate/log/LogSend.java similarity index 98% rename from fizz-core/src/main/java/we/log/LogSend.java rename to fizz-core/src/main/java/com/fizzgate/log/LogSend.java index d274583..9f7ebf1 100644 --- a/fizz-core/src/main/java/we/log/LogSend.java +++ b/fizz-core/src/main/java/com/fizzgate/log/LogSend.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.log; +package com.fizzgate.log; /** * log send data entity diff --git a/fizz-core/src/main/java/we/log/LogSendAppender.java b/fizz-core/src/main/java/com/fizzgate/log/LogSendAppender.java similarity index 92% rename from fizz-core/src/main/java/we/log/LogSendAppender.java rename to fizz-core/src/main/java/com/fizzgate/log/LogSendAppender.java index f2b1b5a..8d9b6f8 100644 --- a/fizz-core/src/main/java/we/log/LogSendAppender.java +++ b/fizz-core/src/main/java/com/fizzgate/log/LogSendAppender.java @@ -1,4 +1,4 @@ -package we.log; +package com.fizzgate.log; import java.util.concurrent.atomic.AtomicInteger; diff --git a/fizz-core/src/main/java/we/log/LogSendAppenderWithLog4j2.java b/fizz-core/src/main/java/com/fizzgate/log/LogSendAppenderWithLog4j2.java similarity index 96% rename from fizz-core/src/main/java/we/log/LogSendAppenderWithLog4j2.java rename to fizz-core/src/main/java/com/fizzgate/log/LogSendAppenderWithLog4j2.java index 5a1f4fe..fd7ee87 100644 --- a/fizz-core/src/main/java/we/log/LogSendAppenderWithLog4j2.java +++ b/fizz-core/src/main/java/com/fizzgate/log/LogSendAppenderWithLog4j2.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.log; +package com.fizzgate.log; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.*; @@ -25,14 +25,15 @@ import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.core.layout.PatternLayout; -import we.FizzAppContext; -import we.util.Consts; -import we.util.NetworkUtils; + +import com.fizzgate.FizzAppContext; +import com.fizzgate.util.Consts; +import com.fizzgate.util.NetworkUtils; + +import static com.fizzgate.log.LogSendAppender.*; import java.io.Serializable; -import static we.log.LogSendAppender.*; - /** * log send appender with log4j2 * diff --git a/fizz-core/src/main/java/com/fizzgate/log/LogSendAppenderWithLogback.java b/fizz-core/src/main/java/com/fizzgate/log/LogSendAppenderWithLogback.java new file mode 100644 index 0000000..e8c2405 --- /dev/null +++ b/fizz-core/src/main/java/com/fizzgate/log/LogSendAppenderWithLogback.java @@ -0,0 +1,2 @@ +package com.fizzgate.log; + diff --git a/fizz-core/src/main/java/we/log/LogSendService.java b/fizz-core/src/main/java/com/fizzgate/log/LogSendService.java similarity index 97% rename from fizz-core/src/main/java/we/log/LogSendService.java rename to fizz-core/src/main/java/com/fizzgate/log/LogSendService.java index b1b4bd6..231160f 100644 --- a/fizz-core/src/main/java/we/log/LogSendService.java +++ b/fizz-core/src/main/java/com/fizzgate/log/LogSendService.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.log; +package com.fizzgate.log; /** * log send service interface, used by {@link LogSendAppenderWithLog4j2} to send log to fizz-manager diff --git a/fizz-core/src/main/java/we/log/RedisLogSendServiceImpl.java b/fizz-core/src/main/java/com/fizzgate/log/RedisLogSendServiceImpl.java similarity index 93% rename from fizz-core/src/main/java/we/log/RedisLogSendServiceImpl.java rename to fizz-core/src/main/java/com/fizzgate/log/RedisLogSendServiceImpl.java index 10d5148..5eca332 100644 --- a/fizz-core/src/main/java/we/log/RedisLogSendServiceImpl.java +++ b/fizz-core/src/main/java/com/fizzgate/log/RedisLogSendServiceImpl.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.log; +package com.fizzgate.log; import com.alibaba.fastjson.JSON; +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.config.AggregateRedisConfigProperties; + import org.springframework.data.redis.core.ReactiveStringRedisTemplate; -import we.config.AggregateRedisConfig; -import we.config.AggregateRedisConfigProperties; /** * {@link LogSendService} impl class, using redis channel to send log diff --git a/fizz-core/src/main/java/we/monitor/FizzMonitorService.java b/fizz-core/src/main/java/com/fizzgate/monitor/FizzMonitorService.java similarity index 96% rename from fizz-core/src/main/java/we/monitor/FizzMonitorService.java rename to fizz-core/src/main/java/com/fizzgate/monitor/FizzMonitorService.java index 38a76cf..5959007 100644 --- a/fizz-core/src/main/java/we/monitor/FizzMonitorService.java +++ b/fizz-core/src/main/java/com/fizzgate/monitor/FizzMonitorService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.monitor; +package com.fizzgate.monitor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,12 +23,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import we.config.AggregateRedisConfig; -import we.config.SchedConfig; -import we.util.Consts; -import we.util.DateTimeUtils; -import we.util.JacksonUtils; -import we.util.ThreadContext; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.config.SchedConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.DateTimeUtils; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ThreadContext; import javax.annotation.Resource; import java.util.HashMap; diff --git a/fizz-core/src/main/java/we/plugin/FixedPluginFilter.java b/fizz-core/src/main/java/com/fizzgate/plugin/FixedPluginFilter.java similarity index 97% rename from fizz-core/src/main/java/we/plugin/FixedPluginFilter.java rename to fizz-core/src/main/java/com/fizzgate/plugin/FixedPluginFilter.java index fd51e70..33151c6 100644 --- a/fizz-core/src/main/java/we/plugin/FixedPluginFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/FixedPluginFilter.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package we.plugin; +package com.fizzgate.plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.FizzAppContext; -import we.util.ThreadContext; +import com.fizzgate.FizzAppContext; +import com.fizzgate.util.ThreadContext; import java.util.*; diff --git a/fizz-core/src/main/java/we/plugin/FizzPluginFilter.java b/fizz-core/src/main/java/com/fizzgate/plugin/FizzPluginFilter.java similarity index 97% rename from fizz-core/src/main/java/we/plugin/FizzPluginFilter.java rename to fizz-core/src/main/java/com/fizzgate/plugin/FizzPluginFilter.java index afb4dfe..d5ed062 100644 --- a/fizz-core/src/main/java/we/plugin/FizzPluginFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/FizzPluginFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin; +package com.fizzgate.plugin; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; diff --git a/fizz-core/src/main/java/we/plugin/FizzPluginFilterChain.java b/fizz-core/src/main/java/com/fizzgate/plugin/FizzPluginFilterChain.java similarity index 95% rename from fizz-core/src/main/java/we/plugin/FizzPluginFilterChain.java rename to fizz-core/src/main/java/com/fizzgate/plugin/FizzPluginFilterChain.java index 07289f3..ff50658 100644 --- a/fizz-core/src/main/java/we/plugin/FizzPluginFilterChain.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/FizzPluginFilterChain.java @@ -15,16 +15,18 @@ * along with this program. If not, see . */ -package we.plugin; +package com.fizzgate.plugin; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; + +import com.fizzgate.Fizz; +import com.fizzgate.FizzAppContext; +import com.fizzgate.proxy.Route; +import com.fizzgate.util.ReactorUtils; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.Fizz; -import we.FizzAppContext; -import we.proxy.Route; -import we.util.ReactorUtils; -import we.util.WebUtils; import java.util.Iterator; import java.util.List; diff --git a/fizz-core/src/main/java/we/plugin/PluginConfig.java b/fizz-core/src/main/java/com/fizzgate/plugin/PluginConfig.java similarity index 96% rename from fizz-core/src/main/java/we/plugin/PluginConfig.java rename to fizz-core/src/main/java/com/fizzgate/plugin/PluginConfig.java index 334c0aa..5997ae3 100644 --- a/fizz-core/src/main/java/we/plugin/PluginConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/PluginConfig.java @@ -15,10 +15,11 @@ * along with this program. If not, see . */ -package we.plugin; +package com.fizzgate.plugin; import org.apache.commons.lang3.StringUtils; -import we.util.JacksonUtils; + +import com.fizzgate.util.JacksonUtils; import java.util.Collections; import java.util.HashMap; diff --git a/fizz-core/src/main/java/we/plugin/PluginFilter.java b/fizz-core/src/main/java/com/fizzgate/plugin/PluginFilter.java similarity index 94% rename from fizz-core/src/main/java/we/plugin/PluginFilter.java rename to fizz-core/src/main/java/com/fizzgate/plugin/PluginFilter.java index 039aa35..de70d66 100644 --- a/fizz-core/src/main/java/we/plugin/PluginFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/PluginFilter.java @@ -15,18 +15,20 @@ * along with this program. If not, see . */ -package we.plugin; +package com.fizzgate.plugin; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.filter.FilterResult; +import com.fizzgate.util.Consts; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.filter.FilterResult; -import we.util.Consts; -import we.util.WebUtils; import java.util.Map; diff --git a/fizz-core/src/main/java/we/plugin/auth/AbstractCustomAuth.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/AbstractCustomAuth.java similarity index 93% rename from fizz-core/src/main/java/we/plugin/auth/AbstractCustomAuth.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/AbstractCustomAuth.java index ca1b21e..f1f4dea 100644 --- a/fizz-core/src/main/java/we/plugin/auth/AbstractCustomAuth.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/AbstractCustomAuth.java @@ -15,12 +15,14 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.util.Result; +import com.fizzgate.util.Utils; + import reactor.core.publisher.Mono; -import we.util.Result; -import we.util.Utils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/plugin/auth/ApiConfig.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java similarity index 97% rename from fizz-core/src/main/java/we/plugin/auth/ApiConfig.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java index 9cebb86..ae944de 100644 --- a/fizz-core/src/main/java/we/plugin/auth/ApiConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java @@ -15,19 +15,20 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.proxy.Route; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.UrlTransformUtils; + import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.server.ServerWebExchange; -import we.plugin.PluginConfig; -import we.proxy.Route; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.UrlTransformUtils; import javax.annotation.Nullable; import java.util.*; diff --git a/fizz-core/src/main/java/we/plugin/auth/ApiConfig2apps.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig2apps.java similarity index 93% rename from fizz-core/src/main/java/we/plugin/auth/ApiConfig2apps.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig2apps.java index 870c06b..b398bed 100644 --- a/fizz-core/src/main/java/we/plugin/auth/ApiConfig2apps.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig2apps.java @@ -15,12 +15,12 @@ * along with this program. If not, see . */ -package we.plugin.auth; - -import we.util.JacksonUtils; +package com.fizzgate.plugin.auth; import java.util.List; +import com.fizzgate.util.JacksonUtils; + /** * @author hongqiaowei */ diff --git a/fizz-core/src/main/java/we/plugin/auth/ApiConfig2appsService.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig2appsService.java similarity index 96% rename from fizz-core/src/main/java/we/plugin/auth/ApiConfig2appsService.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig2appsService.java index b0eccfc..c7e8b2f 100644 --- a/fizz-core/src/main/java/we/plugin/auth/ApiConfig2appsService.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig2appsService.java @@ -15,18 +15,20 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReactorUtils; +import com.fizzgate.util.ThreadContext; + import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.ReactorUtils; -import we.util.ThreadContext; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/plugin/auth/ApiConfigService.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfigService.java similarity index 99% rename from fizz-core/src/main/java/we/plugin/auth/ApiConfigService.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfigService.java index 532d971..bb377a6 100644 --- a/fizz-core/src/main/java/we/plugin/auth/ApiConfigService.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfigService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -31,12 +31,14 @@ import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.util.*; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.config.SystemConfig; -import we.plugin.FizzPluginFilter; -import we.util.*; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/plugin/auth/ApiConfigServiceProperties.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfigServiceProperties.java similarity index 94% rename from fizz-core/src/main/java/we/plugin/auth/ApiConfigServiceProperties.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfigServiceProperties.java index 334030a..2a203da 100644 --- a/fizz-core/src/main/java/we/plugin/auth/ApiConfigServiceProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfigServiceProperties.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/fizz-core/src/main/java/we/plugin/auth/App.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/App.java similarity index 98% rename from fizz-core/src/main/java/we/plugin/auth/App.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/App.java index df5e2c3..d206d7f 100644 --- a/fizz-core/src/main/java/we/plugin/auth/App.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/App.java @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.apache.commons.lang3.StringUtils; -import we.util.Consts; -import we.util.JacksonUtils; + +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; import java.util.*; diff --git a/fizz-core/src/main/java/we/plugin/auth/AppService.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/AppService.java similarity index 97% rename from fizz-core/src/main/java/we/plugin/auth/AppService.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/AppService.java index 0913999..772e83a 100644 --- a/fizz-core/src/main/java/we/plugin/auth/AppService.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/AppService.java @@ -15,19 +15,21 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReactorUtils; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.ReactorUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/plugin/auth/AuthPluginFilter.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/AuthPluginFilter.java similarity index 94% rename from fizz-core/src/main/java/we/plugin/auth/AuthPluginFilter.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/AuthPluginFilter.java index 86e954e..87312ca 100644 --- a/fizz-core/src/main/java/we/plugin/auth/AuthPluginFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/AuthPluginFilter.java @@ -15,17 +15,19 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.plugin.PluginFilter; +import com.fizzgate.util.Consts; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.plugin.PluginFilter; -import we.util.Consts; -import we.util.WebUtils; import javax.annotation.Resource; import java.util.Collections; diff --git a/fizz-core/src/main/java/we/plugin/auth/CallbackConfig.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/CallbackConfig.java similarity index 94% rename from fizz-core/src/main/java/we/plugin/auth/CallbackConfig.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/CallbackConfig.java index ef66efe..13d2bde 100644 --- a/fizz-core/src/main/java/we/plugin/auth/CallbackConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/CallbackConfig.java @@ -15,14 +15,14 @@ * along with this program. If not, see . */ -package we.plugin.auth; - -import we.util.JacksonUtils; +package com.fizzgate.plugin.auth; import java.util.Collections; import java.util.List; import java.util.Map; +import com.fizzgate.util.JacksonUtils; + /** * @author hongqiaowei */ diff --git a/fizz-core/src/main/java/we/plugin/auth/CustomAuth.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/CustomAuth.java similarity index 97% rename from fizz-core/src/main/java/we/plugin/auth/CustomAuth.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/CustomAuth.java index f4e4352..13111a5 100644 --- a/fizz-core/src/main/java/we/plugin/auth/CustomAuth.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/CustomAuth.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; diff --git a/fizz-core/src/main/java/we/plugin/auth/GatewayGroup.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroup.java similarity index 94% rename from fizz-core/src/main/java/we/plugin/auth/GatewayGroup.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroup.java index c8b933f..95887c4 100644 --- a/fizz-core/src/main/java/we/plugin/auth/GatewayGroup.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroup.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.plugin.PluginConfig; -import we.util.JacksonUtils; + +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.util.JacksonUtils; import java.util.*; diff --git a/fizz-core/src/main/java/we/plugin/auth/GatewayGroup2apiConfig.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroup2apiConfig.java similarity index 96% rename from fizz-core/src/main/java/we/plugin/auth/GatewayGroup2apiConfig.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroup2apiConfig.java index f2695f9..3aebaf3 100644 --- a/fizz-core/src/main/java/we/plugin/auth/GatewayGroup2apiConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroup2apiConfig.java @@ -15,12 +15,13 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fizzgate.util.JacksonUtils; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.util.JacksonUtils; import java.util.HashMap; import java.util.HashSet; diff --git a/fizz-core/src/main/java/we/plugin/auth/GatewayGroupService.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroupService.java similarity index 97% rename from fizz-core/src/main/java/we/plugin/auth/GatewayGroupService.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroupService.java index f4dca04..606020c 100644 --- a/fizz-core/src/main/java/we/plugin/auth/GatewayGroupService.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/GatewayGroupService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; @@ -23,13 +23,15 @@ import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.NetworkUtils; +import com.fizzgate.util.ReactorUtils; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.NetworkUtils; -import we.util.ReactorUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/plugin/auth/Receiver.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/Receiver.java similarity index 92% rename from fizz-core/src/main/java/we/plugin/auth/Receiver.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/Receiver.java index 43e165a..34fb80a 100644 --- a/fizz-core/src/main/java/we/plugin/auth/Receiver.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/Receiver.java @@ -15,12 +15,13 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; + import org.apache.commons.lang3.StringUtils; -import we.util.Consts; -import we.util.JacksonUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/plugin/auth/ServiceConfig.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ServiceConfig.java similarity index 98% rename from fizz-core/src/main/java/we/plugin/auth/ServiceConfig.java rename to fizz-core/src/main/java/com/fizzgate/plugin/auth/ServiceConfig.java index 0a4038e..292522e 100644 --- a/fizz-core/src/main/java/we/plugin/auth/ServiceConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ServiceConfig.java @@ -15,14 +15,15 @@ * along with this program. If not, see . */ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.UrlTransformUtils; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpMethod; -import we.util.ThreadContext; -import we.util.UrlTransformUtils; import java.util.*; diff --git a/fizz-core/src/main/java/we/plugin/requestbody/RequestBodyPlugin.java b/fizz-core/src/main/java/com/fizzgate/plugin/requestbody/RequestBodyPlugin.java similarity index 90% rename from fizz-core/src/main/java/we/plugin/requestbody/RequestBodyPlugin.java rename to fizz-core/src/main/java/com/fizzgate/plugin/requestbody/RequestBodyPlugin.java index 3a01e87..542b034 100644 --- a/fizz-core/src/main/java/we/plugin/requestbody/RequestBodyPlugin.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/requestbody/RequestBodyPlugin.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.requestbody; +package com.fizzgate.plugin.requestbody; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; @@ -24,14 +24,16 @@ import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator; +import com.fizzgate.spring.web.server.ext.FizzServerWebExchangeDecorator; +import com.fizzgate.util.Consts; +import com.fizzgate.util.NettyDataBufferUtils; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.plugin.FizzPluginFilter; -import we.plugin.FizzPluginFilterChain; -import we.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator; -import we.spring.web.server.ext.FizzServerWebExchangeDecorator; -import we.util.Consts; -import we.util.NettyDataBufferUtils; -import we.util.WebUtils; import java.util.Map; diff --git a/fizz-core/src/main/java/we/plugin/stat/AccessStat.java b/fizz-core/src/main/java/com/fizzgate/plugin/stat/AccessStat.java similarity index 93% rename from fizz-core/src/main/java/we/plugin/stat/AccessStat.java rename to fizz-core/src/main/java/com/fizzgate/plugin/stat/AccessStat.java index 8f55f60..010d5a4 100644 --- a/fizz-core/src/main/java/we/plugin/stat/AccessStat.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/stat/AccessStat.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package we.plugin.stat; +package com.fizzgate.plugin.stat; -import we.util.JacksonUtils; +import com.fizzgate.util.JacksonUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/plugin/stat/AccessStatSchedConfig.java b/fizz-core/src/main/java/com/fizzgate/plugin/stat/AccessStatSchedConfig.java similarity index 93% rename from fizz-core/src/main/java/we/plugin/stat/AccessStatSchedConfig.java rename to fizz-core/src/main/java/com/fizzgate/plugin/stat/AccessStatSchedConfig.java index 20b4945..ed1610a 100644 --- a/fizz-core/src/main/java/we/plugin/stat/AccessStatSchedConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/stat/AccessStatSchedConfig.java @@ -15,18 +15,19 @@ * along with this program. If not, see . */ -package we.plugin.stat; +package com.fizzgate.plugin.stat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.scheduling.annotation.Scheduled; -import we.config.AggregateRedisConfig; -import we.config.SchedConfig; -import we.util.Consts; -import we.util.DateTimeUtils; -import we.util.StringUtils; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.config.SchedConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.DateTimeUtils; +import com.fizzgate.util.StringUtils; import javax.annotation.Resource; import java.util.Map; diff --git a/fizz-core/src/main/java/we/plugin/stat/StatPluginFilter.java b/fizz-core/src/main/java/com/fizzgate/plugin/stat/StatPluginFilter.java similarity index 95% rename from fizz-core/src/main/java/we/plugin/stat/StatPluginFilter.java rename to fizz-core/src/main/java/com/fizzgate/plugin/stat/StatPluginFilter.java index d668efa..e5ed774 100644 --- a/fizz-core/src/main/java/we/plugin/stat/StatPluginFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/stat/StatPluginFilter.java @@ -15,18 +15,20 @@ * along with this program. If not, see . */ -package we.plugin.stat; +package com.fizzgate.plugin.stat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.plugin.PluginFilter; +import com.fizzgate.util.Consts; +import com.fizzgate.util.DateTimeUtils; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.plugin.PluginFilter; -import we.util.Consts; -import we.util.DateTimeUtils; -import we.util.ThreadContext; -import we.util.WebUtils; import javax.annotation.Resource; import java.util.HashMap; diff --git a/fizz-core/src/main/java/we/plugin/stat/StatPluginFilterProperties.java b/fizz-core/src/main/java/com/fizzgate/plugin/stat/StatPluginFilterProperties.java similarity index 89% rename from fizz-core/src/main/java/we/plugin/stat/StatPluginFilterProperties.java rename to fizz-core/src/main/java/com/fizzgate/plugin/stat/StatPluginFilterProperties.java index 3697196..0731169 100644 --- a/fizz-core/src/main/java/we/plugin/stat/StatPluginFilterProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/stat/StatPluginFilterProperties.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.plugin.stat; +package com.fizzgate.plugin.stat; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; -import we.context.config.annotation.FizzRefreshScope; + +import com.fizzgate.context.config.annotation.FizzRefreshScope; /** * {@link StatPluginFilter} properties diff --git a/fizz-core/src/main/java/we/proxy/AbstractDiscoveryClientUriSelector.java b/fizz-core/src/main/java/com/fizzgate/proxy/AbstractDiscoveryClientUriSelector.java similarity index 92% rename from fizz-core/src/main/java/we/proxy/AbstractDiscoveryClientUriSelector.java rename to fizz-core/src/main/java/com/fizzgate/proxy/AbstractDiscoveryClientUriSelector.java index 4e2718f..c7c644f 100644 --- a/fizz-core/src/main/java/we/proxy/AbstractDiscoveryClientUriSelector.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/AbstractDiscoveryClientUriSelector.java @@ -15,10 +15,10 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; -import we.util.Consts; -import we.util.ThreadContext; +import com.fizzgate.util.Consts; +import com.fizzgate.util.ThreadContext; /** * Abstract implementation of {@code DiscoveryClientUriSelector} diff --git a/fizz-core/src/main/java/we/proxy/CallBackendConfig.java b/fizz-core/src/main/java/com/fizzgate/proxy/CallBackendConfig.java similarity index 97% rename from fizz-core/src/main/java/we/proxy/CallBackendConfig.java rename to fizz-core/src/main/java/com/fizzgate/proxy/CallBackendConfig.java index f7e60b2..fc48574 100644 --- a/fizz-core/src/main/java/we/proxy/CallBackendConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/CallBackendConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/proxy/CallbackReplayReq.java b/fizz-core/src/main/java/com/fizzgate/proxy/CallbackReplayReq.java similarity index 96% rename from fizz-core/src/main/java/we/proxy/CallbackReplayReq.java rename to fizz-core/src/main/java/com/fizzgate/proxy/CallbackReplayReq.java index 14eb047..671be93 100644 --- a/fizz-core/src/main/java/we/proxy/CallbackReplayReq.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/CallbackReplayReq.java @@ -15,16 +15,17 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.Utils; + import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; -import we.util.JacksonUtils; -import we.util.Utils; import java.util.List; import java.util.Map; diff --git a/fizz-core/src/main/java/we/proxy/CallbackService.java b/fizz-core/src/main/java/com/fizzgate/proxy/CallbackService.java similarity index 96% rename from fizz-core/src/main/java/we/proxy/CallbackService.java rename to fizz-core/src/main/java/com/fizzgate/proxy/CallbackService.java index baf1756..dd14621 100644 --- a/fizz-core/src/main/java/we/proxy/CallbackService.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/CallbackService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,18 +28,20 @@ import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.BodyExtractors; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.constants.CommonConstants; +import com.fizzgate.fizz.AggregateResult; +import com.fizzgate.fizz.AggregateService; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.auth.CallbackConfig; +import com.fizzgate.plugin.auth.Receiver; +import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.util.*; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.constants.CommonConstants; -import we.fizz.AggregateResult; -import we.fizz.AggregateService; -import we.plugin.auth.ApiConfig; -import we.plugin.auth.ApiConfigService; -import we.plugin.auth.CallbackConfig; -import we.plugin.auth.Receiver; -import we.service_registry.RegistryCenterService; -import we.util.*; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/proxy/DisableDiscoveryUriSelector.java b/fizz-core/src/main/java/com/fizzgate/proxy/DisableDiscoveryUriSelector.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/DisableDiscoveryUriSelector.java rename to fizz-core/src/main/java/com/fizzgate/proxy/DisableDiscoveryUriSelector.java index 5c8fdf4..23c527d 100644 --- a/fizz-core/src/main/java/we/proxy/DisableDiscoveryUriSelector.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/DisableDiscoveryUriSelector.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Service; diff --git a/fizz-core/src/main/java/we/proxy/DiscoveryClientUriSelector.java b/fizz-core/src/main/java/com/fizzgate/proxy/DiscoveryClientUriSelector.java similarity index 97% rename from fizz-core/src/main/java/we/proxy/DiscoveryClientUriSelector.java rename to fizz-core/src/main/java/com/fizzgate/proxy/DiscoveryClientUriSelector.java index 025290b..ab9e97a 100644 --- a/fizz-core/src/main/java/we/proxy/DiscoveryClientUriSelector.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/DiscoveryClientUriSelector.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; /** * A {@code DiscoveryClientUriSelector} is used to select the uri for the next request diff --git a/fizz-core/src/main/java/we/proxy/EurekaUriSelector.java b/fizz-core/src/main/java/com/fizzgate/proxy/EurekaUriSelector.java similarity index 99% rename from fizz-core/src/main/java/we/proxy/EurekaUriSelector.java rename to fizz-core/src/main/java/com/fizzgate/proxy/EurekaUriSelector.java index 287fa74..b90af42 100644 --- a/fizz-core/src/main/java/we/proxy/EurekaUriSelector.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/EurekaUriSelector.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; diff --git a/fizz-core/src/main/java/we/proxy/FailAggregateResult.java b/fizz-core/src/main/java/com/fizzgate/proxy/FailAggregateResult.java similarity index 92% rename from fizz-core/src/main/java/we/proxy/FailAggregateResult.java rename to fizz-core/src/main/java/com/fizzgate/proxy/FailAggregateResult.java index 0185a30..d77f0b6 100644 --- a/fizz-core/src/main/java/we/proxy/FailAggregateResult.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/FailAggregateResult.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; -import we.fizz.AggregateResult; +import com.fizzgate.fizz.AggregateResult; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/proxy/FizzFailClientResponse.java b/fizz-core/src/main/java/com/fizzgate/proxy/FizzFailClientResponse.java similarity index 99% rename from fizz-core/src/main/java/we/proxy/FizzFailClientResponse.java rename to fizz-core/src/main/java/com/fizzgate/proxy/FizzFailClientResponse.java index 3b9090d..bf9fa82 100644 --- a/fizz-core/src/main/java/we/proxy/FizzFailClientResponse.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/FizzFailClientResponse.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpStatus; diff --git a/fizz-core/src/main/java/we/proxy/FizzWebClient.java b/fizz-core/src/main/java/com/fizzgate/proxy/FizzWebClient.java similarity index 96% rename from fizz-core/src/main/java/we/proxy/FizzWebClient.java rename to fizz-core/src/main/java/com/fizzgate/proxy/FizzWebClient.java index d7f1f62..f9c4dd9 100644 --- a/fizz-core/src/main/java/we/proxy/FizzWebClient.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/FizzWebClient.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; @@ -30,18 +30,20 @@ import org.springframework.web.reactive.function.BodyInserter; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.WebClient; + +import com.fizzgate.config.ProxyWebClientConfig; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.exception.ExternalService4xxException; +import com.fizzgate.fizz.exception.FizzRuntimeException; +import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.util.Consts; +import com.fizzgate.util.NetworkUtils; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; -import we.config.ProxyWebClientConfig; -import we.config.SystemConfig; -import we.exception.ExternalService4xxException; -import we.fizz.exception.FizzRuntimeException; -import we.service_registry.RegistryCenterService; -import we.util.Consts; -import we.util.NetworkUtils; -import we.util.ThreadContext; -import we.util.WebUtils; import javax.annotation.Resource; import java.time.Duration; diff --git a/fizz-core/src/main/java/we/proxy/NacosUriSelector.java b/fizz-core/src/main/java/com/fizzgate/proxy/NacosUriSelector.java similarity index 99% rename from fizz-core/src/main/java/we/proxy/NacosUriSelector.java rename to fizz-core/src/main/java/com/fizzgate/proxy/NacosUriSelector.java index 8d16250..b69621a 100644 --- a/fizz-core/src/main/java/we/proxy/NacosUriSelector.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/NacosUriSelector.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; diff --git a/fizz-core/src/main/java/we/proxy/Route.java b/fizz-core/src/main/java/com/fizzgate/proxy/Route.java similarity index 96% rename from fizz-core/src/main/java/we/proxy/Route.java rename to fizz-core/src/main/java/com/fizzgate/proxy/Route.java index 52773b5..bcbbedf 100644 --- a/fizz-core/src/main/java/we/proxy/Route.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/Route.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; -import we.plugin.PluginConfig; -import we.util.Consts; -import we.util.JacksonUtils; + +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; import java.util.List; diff --git a/fizz-core/src/main/java/we/proxy/RpcInstanceService.java b/fizz-core/src/main/java/com/fizzgate/proxy/RpcInstanceService.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/RpcInstanceService.java rename to fizz-core/src/main/java/com/fizzgate/proxy/RpcInstanceService.java index a43a82b..c59e19d 100644 --- a/fizz-core/src/main/java/we/proxy/RpcInstanceService.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/RpcInstanceService.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; /** * RPC instance service interface diff --git a/fizz-core/src/main/java/we/proxy/RpcInstanceServiceImpl.java b/fizz-core/src/main/java/com/fizzgate/proxy/RpcInstanceServiceImpl.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/RpcInstanceServiceImpl.java rename to fizz-core/src/main/java/com/fizzgate/proxy/RpcInstanceServiceImpl.java index c048789..1d14462 100644 --- a/fizz-core/src/main/java/we/proxy/RpcInstanceServiceImpl.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/RpcInstanceServiceImpl.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; @@ -22,12 +22,14 @@ import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReactorUtils; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.ReactorUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/proxy/ServiceInstance.java b/fizz-core/src/main/java/com/fizzgate/proxy/ServiceInstance.java similarity index 94% rename from fizz-core/src/main/java/we/proxy/ServiceInstance.java rename to fizz-core/src/main/java/com/fizzgate/proxy/ServiceInstance.java index 278dd13..2c2e59b 100644 --- a/fizz-core/src/main/java/we/proxy/ServiceInstance.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/ServiceInstance.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; -import we.util.JacksonUtils; +import com.fizzgate.util.JacksonUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/proxy/ServiceTypePath.java b/fizz-core/src/main/java/com/fizzgate/proxy/ServiceTypePath.java similarity index 93% rename from fizz-core/src/main/java/we/proxy/ServiceTypePath.java rename to fizz-core/src/main/java/com/fizzgate/proxy/ServiceTypePath.java index 9f4af80..31cdc4a 100644 --- a/fizz-core/src/main/java/we/proxy/ServiceTypePath.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/ServiceTypePath.java @@ -15,12 +15,13 @@ * along with this program. If not, see . */ -package we.proxy; +package com.fizzgate.proxy; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; + import org.apache.commons.lang3.StringUtils; -import we.util.Consts; -import we.util.JacksonUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/proxy/dubbo/ApacheDubboGenericService.java b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/ApacheDubboGenericService.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/dubbo/ApacheDubboGenericService.java rename to fizz-core/src/main/java/com/fizzgate/proxy/dubbo/ApacheDubboGenericService.java index 15ffd62..d2a45db 100644 --- a/fizz-core/src/main/java/we/proxy/dubbo/ApacheDubboGenericService.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/ApacheDubboGenericService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy.dubbo; +package com.fizzgate.proxy.dubbo; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -29,8 +29,9 @@ import org.apache.dubbo.rpc.service.GenericService; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import com.fizzgate.fizz.exception.FizzException; + import reactor.core.publisher.Mono; -import we.fizz.exception.FizzException; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/proxy/dubbo/ApacheDubboGenericServiceProperties.java b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/ApacheDubboGenericServiceProperties.java similarity index 89% rename from fizz-core/src/main/java/we/proxy/dubbo/ApacheDubboGenericServiceProperties.java rename to fizz-core/src/main/java/com/fizzgate/proxy/dubbo/ApacheDubboGenericServiceProperties.java index 027b41c..3324e92 100644 --- a/fizz-core/src/main/java/we/proxy/dubbo/ApacheDubboGenericServiceProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/ApacheDubboGenericServiceProperties.java @@ -14,13 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.proxy.dubbo; +package com.fizzgate.proxy.dubbo; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; -import we.context.config.annotation.FizzRefreshScope; + +import com.fizzgate.context.config.annotation.FizzRefreshScope; /** * {@link ApacheDubboGenericService} properties diff --git a/fizz-core/src/main/java/we/proxy/dubbo/DubboInterfaceDeclaration.java b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/DubboInterfaceDeclaration.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/dubbo/DubboInterfaceDeclaration.java rename to fizz-core/src/main/java/com/fizzgate/proxy/dubbo/DubboInterfaceDeclaration.java index abaaf86..4e611af 100644 --- a/fizz-core/src/main/java/we/proxy/dubbo/DubboInterfaceDeclaration.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/DubboInterfaceDeclaration.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy.dubbo; +package com.fizzgate.proxy.dubbo; /** * diff --git a/fizz-core/src/main/java/we/proxy/dubbo/DubboUtils.java b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/DubboUtils.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/dubbo/DubboUtils.java rename to fizz-core/src/main/java/com/fizzgate/proxy/dubbo/DubboUtils.java index 840b7dc..84a25a2 100644 --- a/fizz-core/src/main/java/we/proxy/dubbo/DubboUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/dubbo/DubboUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy.dubbo; +package com.fizzgate.proxy.dubbo; import java.util.LinkedList; import java.util.List; diff --git a/fizz-core/src/main/java/we/proxy/grpc/GrpcGenericService.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcGenericService.java similarity index 88% rename from fizz-core/src/main/java/we/proxy/grpc/GrpcGenericService.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcGenericService.java index 09dde95..3711f85 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/GrpcGenericService.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcGenericService.java @@ -15,8 +15,13 @@ * along with this program. If not, see . */ -package we.proxy.grpc; +package com.fizzgate.proxy.grpc; +import com.fizzgate.fizz.exception.FizzException; +import com.fizzgate.proxy.grpc.client.CallResults; +import com.fizzgate.proxy.grpc.client.GrpcProxyClient; +import com.fizzgate.proxy.grpc.client.core.GrpcMethodDefinition; +import com.fizzgate.proxy.grpc.client.utils.ChannelFactory; import com.google.common.net.HostAndPort; import com.google.common.util.concurrent.ListenableFuture; import io.grpc.CallOptions; @@ -25,21 +30,15 @@ import org.apache.dubbo.rpc.service.GenericException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; -import we.fizz.exception.FizzException; + +import static com.fizzgate.proxy.grpc.client.utils.GrpcReflectionUtils.parseToMethodDefinition; import static io.grpc.CallOptions.DEFAULT; import static java.util.Collections.singletonList; -import we.proxy.grpc.client.CallResults; -import we.proxy.grpc.client.GrpcProxyClient; -import we.proxy.grpc.client.core.GrpcMethodDefinition; -import we.proxy.grpc.client.utils.ChannelFactory; - import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; -import static we.proxy.grpc.client.utils.GrpcReflectionUtils.parseToMethodDefinition; - @Service public class GrpcGenericService { diff --git a/fizz-core/src/main/java/we/proxy/grpc/GrpcInstanceService.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInstanceService.java similarity index 96% rename from fizz-core/src/main/java/we/proxy/grpc/GrpcInstanceService.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInstanceService.java index 285377b..db562b4 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/GrpcInstanceService.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInstanceService.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.proxy.grpc; +package com.fizzgate.proxy.grpc; /** * gRPC instance service interface diff --git a/fizz-core/src/main/java/we/proxy/grpc/GrpcInstanceServiceImpl.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInstanceServiceImpl.java similarity index 93% rename from fizz-core/src/main/java/we/proxy/grpc/GrpcInstanceServiceImpl.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInstanceServiceImpl.java index a49ace0..021ddff 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/GrpcInstanceServiceImpl.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInstanceServiceImpl.java @@ -14,10 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.proxy.grpc; +package com.fizzgate.proxy.grpc; import org.springframework.stereotype.Service; -import we.proxy.RpcInstanceService; + +import com.fizzgate.proxy.RpcInstanceService; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/proxy/grpc/GrpcInterfaceDeclaration.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInterfaceDeclaration.java similarity index 97% rename from fizz-core/src/main/java/we/proxy/grpc/GrpcInterfaceDeclaration.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInterfaceDeclaration.java index 1a23f77..b7b89c7 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/GrpcInterfaceDeclaration.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/GrpcInterfaceDeclaration.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy.grpc; +package com.fizzgate.proxy.grpc; public class GrpcInterfaceDeclaration { private String method; diff --git a/fizz-core/src/main/java/we/proxy/grpc/ListenableFutureAdapter.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/ListenableFutureAdapter.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/grpc/ListenableFutureAdapter.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/ListenableFutureAdapter.java index 6701fde..df57762 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/ListenableFutureAdapter.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/ListenableFutureAdapter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy.grpc; +package com.fizzgate.proxy.grpc; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/CallParams.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/CallParams.java similarity index 97% rename from fizz-core/src/main/java/we/proxy/grpc/client/CallParams.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/CallParams.java index 0b4bcc8..9cfad52 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/CallParams.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/CallParams.java @@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package we.proxy.grpc.client; +package com.fizzgate.proxy.grpc.client; import java.util.List; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/CallResults.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/CallResults.java similarity index 97% rename from fizz-core/src/main/java/we/proxy/grpc/client/CallResults.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/CallResults.java index e168939..debb106 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/CallResults.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/CallResults.java @@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package we.proxy.grpc.client; +package com.fizzgate.proxy.grpc.client; import static java.util.stream.Collectors.toList; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/GrpcClient.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/GrpcClient.java similarity index 92% rename from fizz-core/src/main/java/we/proxy/grpc/client/GrpcClient.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/GrpcClient.java index 2b7aa7e..fb04b10 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/GrpcClient.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/GrpcClient.java @@ -21,8 +21,10 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package we.proxy.grpc.client; +package com.fizzgate.proxy.grpc.client; +import static com.fizzgate.proxy.grpc.client.utils.GrpcReflectionUtils.fetchFullMethodName; +import static com.fizzgate.proxy.grpc.client.utils.GrpcReflectionUtils.fetchMethodType; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall; @@ -31,8 +33,6 @@ import static io.grpc.stub.ClientCalls.asyncServerStreamingCall; import static io.grpc.stub.ClientCalls.asyncUnaryCall; //import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; -import static we.proxy.grpc.client.utils.GrpcReflectionUtils.fetchFullMethodName; -import static we.proxy.grpc.client.utils.GrpcReflectionUtils.fetchMethodType; import java.util.List; @@ -41,6 +41,9 @@ import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fizzgate.proxy.grpc.client.core.CompositeStreamObserver; +import com.fizzgate.proxy.grpc.client.core.DoneObserver; +import com.fizzgate.proxy.grpc.client.core.DynamicMessageMarshaller; import com.google.common.util.concurrent.ListenableFuture; import com.google.protobuf.Descriptors.MethodDescriptor; import com.google.protobuf.DynamicMessage; @@ -49,9 +52,6 @@ import io.grpc.ClientCall; import io.grpc.MethodDescriptor.MethodType; import io.grpc.stub.StreamObserver; -import we.proxy.grpc.client.core.CompositeStreamObserver; -import we.proxy.grpc.client.core.DoneObserver; -import we.proxy.grpc.client.core.DynamicMessageMarshaller; /** * @author zhangjikai diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/GrpcProxyClient.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/GrpcProxyClient.java similarity index 92% rename from fizz-core/src/main/java/we/proxy/grpc/client/GrpcProxyClient.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/GrpcProxyClient.java index 3b39a1c..8d768db 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/GrpcProxyClient.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/GrpcProxyClient.java @@ -21,11 +21,15 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package we.proxy.grpc.client; +package com.fizzgate.proxy.grpc.client; import java.util.List; import java.util.concurrent.ExecutionException; +import com.fizzgate.proxy.grpc.client.core.GrpcMethodDefinition; +import com.fizzgate.proxy.grpc.client.core.ServiceResolver; +import com.fizzgate.proxy.grpc.client.utils.GrpcReflectionUtils; +import com.fizzgate.proxy.grpc.client.utils.MessageWriter; import com.google.common.util.concurrent.ListenableFuture; import com.google.protobuf.DescriptorProtos.FileDescriptorSet; import com.google.protobuf.Descriptors.MethodDescriptor; @@ -37,10 +41,6 @@ import io.grpc.Channel; import io.grpc.stub.StreamObserver; import org.springframework.stereotype.Service; -import we.proxy.grpc.client.core.GrpcMethodDefinition; -import we.proxy.grpc.client.core.ServiceResolver; -import we.proxy.grpc.client.utils.GrpcReflectionUtils; -import we.proxy.grpc.client.utils.MessageWriter; @Service /** * @author zhangjikai diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/core/CompositeStreamObserver.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/CompositeStreamObserver.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/grpc/client/core/CompositeStreamObserver.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/CompositeStreamObserver.java index 8b5cb47..19f01cd 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/core/CompositeStreamObserver.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/CompositeStreamObserver.java @@ -27,7 +27,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package we.proxy.grpc.client.core; +package com.fizzgate.proxy.grpc.client.core; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/core/DoneObserver.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/DoneObserver.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/grpc/client/core/DoneObserver.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/DoneObserver.java index 2c1f066..42aacf1 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/core/DoneObserver.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/DoneObserver.java @@ -27,7 +27,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package we.proxy.grpc.client.core; +package com.fizzgate.proxy.grpc.client.core; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/core/DynamicMessageMarshaller.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/DynamicMessageMarshaller.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/grpc/client/core/DynamicMessageMarshaller.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/DynamicMessageMarshaller.java index fec1d90..907efba 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/core/DynamicMessageMarshaller.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/DynamicMessageMarshaller.java @@ -27,7 +27,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package we.proxy.grpc.client.core; +package com.fizzgate.proxy.grpc.client.core; import java.io.IOException; import java.io.InputStream; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/core/GrpcMethodDefinition.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/GrpcMethodDefinition.java similarity index 97% rename from fizz-core/src/main/java/we/proxy/grpc/client/core/GrpcMethodDefinition.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/GrpcMethodDefinition.java index bb62b63..a2838fa 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/core/GrpcMethodDefinition.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/GrpcMethodDefinition.java @@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package we.proxy.grpc.client.core; +package com.fizzgate.proxy.grpc.client.core; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/core/ServerReflectionClient.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/ServerReflectionClient.java similarity index 99% rename from fizz-core/src/main/java/we/proxy/grpc/client/core/ServerReflectionClient.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/ServerReflectionClient.java index 74d700a..c0f1afc 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/core/ServerReflectionClient.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/ServerReflectionClient.java @@ -27,7 +27,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package we.proxy.grpc.client.core; +package com.fizzgate.proxy.grpc.client.core; import java.util.HashMap; import java.util.HashSet; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/core/ServiceResolver.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/ServiceResolver.java similarity index 99% rename from fizz-core/src/main/java/we/proxy/grpc/client/core/ServiceResolver.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/ServiceResolver.java index 94a7525..00feac4 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/core/ServiceResolver.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/core/ServiceResolver.java @@ -27,7 +27,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package we.proxy.grpc.client.core; +package com.fizzgate.proxy.grpc.client.core; import java.util.ArrayList; import java.util.HashMap; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/utils/ChannelFactory.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/ChannelFactory.java similarity index 98% rename from fizz-core/src/main/java/we/proxy/grpc/client/utils/ChannelFactory.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/ChannelFactory.java index 3eaca96..da1c377 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/utils/ChannelFactory.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/ChannelFactory.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy.grpc.client.utils; +package com.fizzgate.proxy.grpc.client.utils; import static io.grpc.Metadata.ASCII_STRING_MARSHALLER; import static java.util.Collections.emptyMap; diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/utils/GrpcReflectionUtils.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/GrpcReflectionUtils.java similarity index 97% rename from fizz-core/src/main/java/we/proxy/grpc/client/utils/GrpcReflectionUtils.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/GrpcReflectionUtils.java index 0320ca3..b5180c1 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/utils/GrpcReflectionUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/GrpcReflectionUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.proxy.grpc.client.utils; +package com.fizzgate.proxy.grpc.client.utils; import static com.google.common.base.Preconditions.checkArgument; import static io.grpc.MethodDescriptor.generateFullMethodName; @@ -33,6 +33,8 @@ import java.util.concurrent.ExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fizzgate.proxy.grpc.client.core.GrpcMethodDefinition; +import com.fizzgate.proxy.grpc.client.core.ServerReflectionClient; import com.google.common.util.concurrent.ListenableFuture; import com.google.protobuf.DescriptorProtos.FileDescriptorSet; import com.google.protobuf.Descriptors.Descriptor; @@ -46,8 +48,6 @@ import com.google.protobuf.util.JsonFormat.TypeRegistry; import io.grpc.Channel; import io.grpc.MethodDescriptor.MethodType; import io.grpc.Status; -import we.proxy.grpc.client.core.GrpcMethodDefinition; -import we.proxy.grpc.client.core.ServerReflectionClient; /** * @author zhangjikai diff --git a/fizz-core/src/main/java/we/proxy/grpc/client/utils/MessageWriter.java b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/MessageWriter.java similarity index 95% rename from fizz-core/src/main/java/we/proxy/grpc/client/utils/MessageWriter.java rename to fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/MessageWriter.java index a69d641..72d7a11 100644 --- a/fizz-core/src/main/java/we/proxy/grpc/client/utils/MessageWriter.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/grpc/client/utils/MessageWriter.java @@ -15,20 +15,20 @@ * along with this program. If not, see . */ -package we.proxy.grpc.client.utils; +package com.fizzgate.proxy.grpc.client.utils; import static com.google.protobuf.util.JsonFormat.TypeRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fizzgate.proxy.grpc.client.CallResults; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.Message; import com.google.protobuf.util.JsonFormat; import com.google.protobuf.util.JsonFormat.Printer; import io.grpc.stub.StreamObserver; -import we.proxy.grpc.client.CallResults; /** * @author zhangjikai diff --git a/fizz-core/src/main/java/we/proxy/http/HttpInstanceService.java b/fizz-core/src/main/java/com/fizzgate/proxy/http/HttpInstanceService.java similarity index 96% rename from fizz-core/src/main/java/we/proxy/http/HttpInstanceService.java rename to fizz-core/src/main/java/com/fizzgate/proxy/http/HttpInstanceService.java index 22a95f4..f276eec 100644 --- a/fizz-core/src/main/java/we/proxy/http/HttpInstanceService.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/http/HttpInstanceService.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.proxy.http; +package com.fizzgate.proxy.http; /** * HTTP instance service interface diff --git a/fizz-core/src/main/java/we/proxy/http/HttpInstanceServiceImpl.java b/fizz-core/src/main/java/com/fizzgate/proxy/http/HttpInstanceServiceImpl.java similarity index 93% rename from fizz-core/src/main/java/we/proxy/http/HttpInstanceServiceImpl.java rename to fizz-core/src/main/java/com/fizzgate/proxy/http/HttpInstanceServiceImpl.java index a05e79b..59bbbd6 100644 --- a/fizz-core/src/main/java/we/proxy/http/HttpInstanceServiceImpl.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/http/HttpInstanceServiceImpl.java @@ -14,10 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.proxy.http; +package com.fizzgate.proxy.http; import org.springframework.stereotype.Service; -import we.proxy.RpcInstanceService; + +import com.fizzgate.proxy.RpcInstanceService; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/proxy/package-info.java b/fizz-core/src/main/java/com/fizzgate/proxy/package-info.java similarity index 95% rename from fizz-core/src/main/java/we/proxy/package-info.java rename to fizz-core/src/main/java/com/fizzgate/proxy/package-info.java index 88bcdd4..b9132a3 100644 --- a/fizz-core/src/main/java/we/proxy/package-info.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/package-info.java @@ -18,7 +18,7 @@ * @author lancer * * 设想的包结构: - * we.fizz + * com.fizzgate.fizz * .config * .filter * .util @@ -27,4 +27,4 @@ * .route 路由逻辑 * .legacy */ -package we.proxy; +package com.fizzgate.proxy; diff --git a/fizz-core/src/main/java/we/service_registry/FizzServiceRegistration.java b/fizz-core/src/main/java/com/fizzgate/service_registry/FizzServiceRegistration.java similarity index 93% rename from fizz-core/src/main/java/we/service_registry/FizzServiceRegistration.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/FizzServiceRegistration.java index df74ac9..b0129d6 100644 --- a/fizz-core/src/main/java/we/service_registry/FizzServiceRegistration.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/FizzServiceRegistration.java @@ -15,17 +15,18 @@ * along with this program. If not, see . */ -package we.service_registry; +package com.fizzgate.service_registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.context.ApplicationContext; -import we.service_registry.eureka.FizzEurekaHelper; -import we.service_registry.nacos.FizzNacosHelper; -import we.util.PropertiesUtils; -import we.util.YmlUtils; + +import com.fizzgate.service_registry.eureka.FizzEurekaHelper; +import com.fizzgate.service_registry.nacos.FizzNacosHelper; +import com.fizzgate.util.PropertiesUtils; +import com.fizzgate.util.YmlUtils; import java.util.List; import java.util.Properties; diff --git a/fizz-core/src/main/java/we/service_registry/RegistryCenter.java b/fizz-core/src/main/java/com/fizzgate/service_registry/RegistryCenter.java similarity index 97% rename from fizz-core/src/main/java/we/service_registry/RegistryCenter.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/RegistryCenter.java index f2be1d5..0f402b1 100644 --- a/fizz-core/src/main/java/we/service_registry/RegistryCenter.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/RegistryCenter.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package we.service_registry; +package com.fizzgate.service_registry; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fizzgate.util.JacksonUtils; + import org.springframework.context.ApplicationContext; -import we.util.JacksonUtils; import java.util.Objects; diff --git a/fizz-core/src/main/java/we/service_registry/RegistryCenterService.java b/fizz-core/src/main/java/com/fizzgate/service_registry/RegistryCenterService.java similarity index 98% rename from fizz-core/src/main/java/we/service_registry/RegistryCenterService.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/RegistryCenterService.java index 0a52e07..6eb7a1b 100644 --- a/fizz-core/src/main/java/we/service_registry/RegistryCenterService.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/RegistryCenterService.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.service_registry; +package com.fizzgate.service_registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,11 +24,13 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.util.*; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.config.SystemConfig; -import we.util.*; import javax.annotation.Resource; import java.util.Collections; diff --git a/fizz-core/src/main/java/we/service_registry/eureka/FizzEurekaHelper.java b/fizz-core/src/main/java/com/fizzgate/service_registry/eureka/FizzEurekaHelper.java similarity index 98% rename from fizz-core/src/main/java/we/service_registry/eureka/FizzEurekaHelper.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/eureka/FizzEurekaHelper.java index 269a54d..e27245f 100644 --- a/fizz-core/src/main/java/we/service_registry/eureka/FizzEurekaHelper.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/eureka/FizzEurekaHelper.java @@ -15,8 +15,10 @@ * along with this program. If not, see . */ -package we.service_registry.eureka; +package com.fizzgate.service_registry.eureka; +import com.fizzgate.util.Consts; +import com.fizzgate.util.PropertiesUtils; import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.appinfo.HealthCheckHandler; import com.netflix.appinfo.InstanceInfo; @@ -32,8 +34,6 @@ import org.springframework.cloud.netflix.eureka.InstanceInfoFactory; import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration; import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry; import org.springframework.context.ApplicationContext; -import we.util.Consts; -import we.util.PropertiesUtils; import java.util.HashMap; import java.util.Map; diff --git a/fizz-core/src/main/java/we/service_registry/eureka/FizzEurekaServiceRegistration.java b/fizz-core/src/main/java/com/fizzgate/service_registry/eureka/FizzEurekaServiceRegistration.java similarity index 97% rename from fizz-core/src/main/java/we/service_registry/eureka/FizzEurekaServiceRegistration.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/eureka/FizzEurekaServiceRegistration.java index a8f2f74..d605242 100644 --- a/fizz-core/src/main/java/we/service_registry/eureka/FizzEurekaServiceRegistration.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/eureka/FizzEurekaServiceRegistration.java @@ -15,8 +15,11 @@ * along with this program. If not, see . */ -package we.service_registry.eureka; +package com.fizzgate.service_registry.eureka; +import com.fizzgate.service_registry.FizzServiceRegistration; +import com.fizzgate.util.Consts; +import com.fizzgate.util.Utils; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.DiscoveryClient; import com.netflix.discovery.EurekaClientConfig; @@ -27,9 +30,6 @@ import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean; import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration; import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry; import org.springframework.util.CollectionUtils; -import we.service_registry.FizzServiceRegistration; -import we.util.Consts; -import we.util.Utils; import java.util.*; diff --git a/fizz-core/src/main/java/we/service_registry/nacos/FizzNacosHelper.java b/fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosHelper.java similarity index 96% rename from fizz-core/src/main/java/we/service_registry/nacos/FizzNacosHelper.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosHelper.java index 8f70636..224d14b 100644 --- a/fizz-core/src/main/java/we/service_registry/nacos/FizzNacosHelper.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosHelper.java @@ -15,20 +15,21 @@ * along with this program. If not, see . */ -package we.service_registry.nacos; +package com.fizzgate.service_registry.nacos; import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.registry.NacosRegistration; import com.alibaba.cloud.nacos.registry.NacosServiceRegistry; import com.alibaba.nacos.api.PropertyKeyConst; import com.alibaba.nacos.api.naming.NamingService; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.PropertiesUtils; +import com.fizzgate.util.ReflectionUtils; + import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.PropertiesUtils; -import we.util.ReflectionUtils; import java.util.Properties; diff --git a/fizz-core/src/main/java/we/service_registry/nacos/FizzNacosProperties.java b/fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosProperties.java similarity index 99% rename from fizz-core/src/main/java/we/service_registry/nacos/FizzNacosProperties.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosProperties.java index ede338e..7924ae2 100644 --- a/fizz-core/src/main/java/we/service_registry/nacos/FizzNacosProperties.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosProperties.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.service_registry.nacos; +package com.fizzgate.service_registry.nacos; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; diff --git a/fizz-core/src/main/java/we/service_registry/nacos/FizzNacosServiceRegistration.java b/fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosServiceRegistration.java similarity index 97% rename from fizz-core/src/main/java/we/service_registry/nacos/FizzNacosServiceRegistration.java rename to fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosServiceRegistration.java index 01a3bbc..1ad32ff 100644 --- a/fizz-core/src/main/java/we/service_registry/nacos/FizzNacosServiceRegistration.java +++ b/fizz-core/src/main/java/com/fizzgate/service_registry/nacos/FizzNacosServiceRegistration.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.service_registry.nacos; +package com.fizzgate.service_registry.nacos; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.registry.NacosRegistration; @@ -35,11 +35,12 @@ import com.alibaba.nacos.common.remote.client.Connection; import com.alibaba.nacos.common.remote.client.RpcClientStatus; import com.alibaba.nacos.common.remote.client.grpc.GrpcClient; import com.alibaba.nacos.common.utils.ThreadUtils; +import com.fizzgate.service_registry.FizzServiceRegistration; +import com.fizzgate.util.Consts; +import com.fizzgate.util.ReflectionUtils; +import com.fizzgate.util.Utils; + import org.springframework.util.StringUtils; -import we.service_registry.FizzServiceRegistration; -import we.util.Consts; -import we.util.ReflectionUtils; -import we.util.Utils; import java.util.Collections; import java.util.List; diff --git a/fizz-core/src/main/java/we/stats/BlockType.java b/fizz-core/src/main/java/com/fizzgate/stats/BlockType.java similarity index 97% rename from fizz-core/src/main/java/we/stats/BlockType.java rename to fizz-core/src/main/java/com/fizzgate/stats/BlockType.java index 55005f1..4c02280 100644 --- a/fizz-core/src/main/java/we/stats/BlockType.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/BlockType.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; /** * diff --git a/fizz-core/src/main/java/we/stats/FlowStat.java b/fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java similarity index 99% rename from fizz-core/src/main/java/we/stats/FlowStat.java rename to fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java index 6cb6996..16417ec 100644 --- a/fizz-core/src/main/java/we/stats/FlowStat.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/FlowStat.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; import java.util.*; import java.util.Map.Entry; @@ -32,10 +32,11 @@ import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.web.server.ServerWebExchange; -import we.stats.circuitbreaker.CircuitBreakManager; -import we.stats.circuitbreaker.CircuitBreaker; -import we.util.ResourceIdUtils; -import we.util.WebUtils; + +import com.fizzgate.stats.circuitbreaker.CircuitBreakManager; +import com.fizzgate.stats.circuitbreaker.CircuitBreaker; +import com.fizzgate.util.ResourceIdUtils; +import com.fizzgate.util.WebUtils; /** * Flow Statistic diff --git a/fizz-core/src/main/java/we/stats/IncrRequestResult.java b/fizz-core/src/main/java/com/fizzgate/stats/IncrRequestResult.java similarity index 98% rename from fizz-core/src/main/java/we/stats/IncrRequestResult.java rename to fizz-core/src/main/java/com/fizzgate/stats/IncrRequestResult.java index 2025200..e932c90 100644 --- a/fizz-core/src/main/java/we/stats/IncrRequestResult.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/IncrRequestResult.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; /** * diff --git a/fizz-core/src/main/java/we/stats/ResourceConfig.java b/fizz-core/src/main/java/com/fizzgate/stats/ResourceConfig.java similarity index 98% rename from fizz-core/src/main/java/we/stats/ResourceConfig.java rename to fizz-core/src/main/java/com/fizzgate/stats/ResourceConfig.java index c5b95be..8c2b22f 100644 --- a/fizz-core/src/main/java/we/stats/ResourceConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/ResourceConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/fizz-core/src/main/java/we/stats/ResourceStat.java b/fizz-core/src/main/java/com/fizzgate/stats/ResourceStat.java similarity index 99% rename from fizz-core/src/main/java/we/stats/ResourceStat.java rename to fizz-core/src/main/java/com/fizzgate/stats/ResourceStat.java index 55ce2b7..f9049ec 100644 --- a/fizz-core/src/main/java/we/stats/ResourceStat.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/ResourceStat.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; import java.math.BigDecimal; import java.util.concurrent.ConcurrentHashMap; @@ -27,7 +27,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import we.stats.circuitbreaker.CircuitBreaker; + +import com.fizzgate.stats.circuitbreaker.CircuitBreaker; /** * diff --git a/fizz-core/src/main/java/we/stats/ResourceTimeWindowStat.java b/fizz-core/src/main/java/com/fizzgate/stats/ResourceTimeWindowStat.java similarity index 97% rename from fizz-core/src/main/java/we/stats/ResourceTimeWindowStat.java rename to fizz-core/src/main/java/com/fizzgate/stats/ResourceTimeWindowStat.java index 8cdcbb4..52f5bf8 100644 --- a/fizz-core/src/main/java/we/stats/ResourceTimeWindowStat.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/ResourceTimeWindowStat.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; import java.util.ArrayList; import java.util.List; diff --git a/fizz-core/src/main/java/we/stats/TimeSlot.java b/fizz-core/src/main/java/com/fizzgate/stats/TimeSlot.java similarity index 98% rename from fizz-core/src/main/java/we/stats/TimeSlot.java rename to fizz-core/src/main/java/com/fizzgate/stats/TimeSlot.java index fc3c53f..4ec5a29 100644 --- a/fizz-core/src/main/java/we/stats/TimeSlot.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/TimeSlot.java @@ -14,14 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.stats; - -import we.stats.circuitbreaker.CircuitBreaker; +package com.fizzgate.stats; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; +import com.fizzgate.stats.circuitbreaker.CircuitBreaker; + /** * * @author Francis Dong diff --git a/fizz-core/src/main/java/we/stats/TimeWindowStat.java b/fizz-core/src/main/java/com/fizzgate/stats/TimeWindowStat.java similarity index 99% rename from fizz-core/src/main/java/we/stats/TimeWindowStat.java rename to fizz-core/src/main/java/com/fizzgate/stats/TimeWindowStat.java index 11efe46..d71a0b6 100644 --- a/fizz-core/src/main/java/we/stats/TimeWindowStat.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/TimeWindowStat.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; import java.math.BigDecimal; diff --git a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreakManager.java b/fizz-core/src/main/java/com/fizzgate/stats/circuitbreaker/CircuitBreakManager.java similarity index 98% rename from fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreakManager.java rename to fizz-core/src/main/java/com/fizzgate/stats/circuitbreaker/CircuitBreakManager.java index 0ed2501..1cab5ad 100644 --- a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreakManager.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/circuitbreaker/CircuitBreakManager.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats.circuitbreaker; +package com.fizzgate.stats.circuitbreaker; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; @@ -23,11 +23,13 @@ import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.util.*; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.stats.FlowStat; -import we.util.*; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreaker.java b/fizz-core/src/main/java/com/fizzgate/stats/circuitbreaker/CircuitBreaker.java similarity index 98% rename from fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreaker.java rename to fizz-core/src/main/java/com/fizzgate/stats/circuitbreaker/CircuitBreaker.java index 7e6a637..839a8a2 100644 --- a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreaker.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/circuitbreaker/CircuitBreaker.java @@ -15,20 +15,21 @@ * along with this program. If not, see . */ -package we.stats.circuitbreaker; +package com.fizzgate.stats.circuitbreaker; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceStat; +import com.fizzgate.stats.TimeSlot; +import com.fizzgate.stats.TimeWindowStat; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ResourceIdUtils; + import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.server.ServerWebExchange; -import we.stats.FlowStat; -import we.stats.ResourceStat; -import we.stats.TimeSlot; -import we.stats.TimeWindowStat; -import we.util.JacksonUtils; -import we.util.ResourceIdUtils; import java.math.BigDecimal; import java.math.RoundingMode; diff --git a/fizz-core/src/main/java/we/stats/degrade/DegradeRule.java b/fizz-core/src/main/java/com/fizzgate/stats/degrade/DegradeRule.java similarity index 92% rename from fizz-core/src/main/java/we/stats/degrade/DegradeRule.java rename to fizz-core/src/main/java/com/fizzgate/stats/degrade/DegradeRule.java index 97851ff..97781a5 100644 --- a/fizz-core/src/main/java/we/stats/degrade/DegradeRule.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/degrade/DegradeRule.java @@ -14,14 +14,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.stats.degrade; +package com.fizzgate.stats.degrade; import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; -import org.apache.commons.lang3.StringUtils; -import we.util.JacksonUtils; +import com.fizzgate.util.JacksonUtils; -import static we.util.ResourceIdUtils.SERVICE_DEFAULT; +import lombok.Data; + +import static com.fizzgate.util.ResourceIdUtils.SERVICE_DEFAULT; + +import org.apache.commons.lang3.StringUtils; /** * Degrade rule entity diff --git a/fizz-core/src/main/java/we/stats/degrade/DegradeRuleService.java b/fizz-core/src/main/java/com/fizzgate/stats/degrade/DegradeRuleService.java similarity index 97% rename from fizz-core/src/main/java/we/stats/degrade/DegradeRuleService.java rename to fizz-core/src/main/java/com/fizzgate/stats/degrade/DegradeRuleService.java index e451193..ff0da8c 100644 --- a/fizz-core/src/main/java/we/stats/degrade/DegradeRuleService.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/degrade/DegradeRuleService.java @@ -14,19 +14,21 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.stats.degrade; +package com.fizzgate.stats.degrade; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.stats.circuitbreaker.CircuitBreakManager; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.Result; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.stats.circuitbreaker.CircuitBreakManager; -import we.util.JacksonUtils; -import we.util.Result; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/stats/ratelimit/ResourceRateLimitConfig.java b/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfig.java similarity index 92% rename from fizz-core/src/main/java/we/stats/ratelimit/ResourceRateLimitConfig.java rename to fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfig.java index 2634d0e..9eaf39b 100644 --- a/fizz-core/src/main/java/we/stats/ratelimit/ResourceRateLimitConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfig.java @@ -15,15 +15,16 @@ * along with this program. If not, see . */ -package we.stats.ratelimit; +package com.fizzgate.stats.ratelimit; import com.fasterxml.jackson.annotation.JsonIgnore; -import org.apache.commons.lang3.StringUtils; -import we.util.JacksonUtils; +import com.fizzgate.util.JacksonUtils; -import static we.util.ResourceIdUtils.APP_DEFAULT; -import static we.util.ResourceIdUtils.NODE; -import static we.util.ResourceIdUtils.SERVICE_DEFAULT; +import static com.fizzgate.util.ResourceIdUtils.APP_DEFAULT; +import static com.fizzgate.util.ResourceIdUtils.NODE; +import static com.fizzgate.util.ResourceIdUtils.SERVICE_DEFAULT; + +import org.apache.commons.lang3.StringUtils; /** * @author hongqiaowei diff --git a/fizz-core/src/main/java/we/stats/ratelimit/ResourceRateLimitConfigService.java b/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigService.java similarity index 98% rename from fizz-core/src/main/java/we/stats/ratelimit/ResourceRateLimitConfigService.java rename to fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigService.java index 21b47ba..32a8a4e 100644 --- a/fizz-core/src/main/java/we/stats/ratelimit/ResourceRateLimitConfigService.java +++ b/fizz-core/src/main/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigService.java @@ -15,19 +15,21 @@ * along with this program. If not, see . */ -package we.stats.ratelimit; +package com.fizzgate.stats.ratelimit; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.stereotype.Service; + +import com.fizzgate.config.AggregateRedisConfig; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReactorUtils; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.config.AggregateRedisConfig; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.ReactorUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; diff --git a/fizz-core/src/main/java/we/util/ResourceIdUtils.java b/fizz-core/src/main/java/com/fizzgate/util/ResourceIdUtils.java similarity index 92% rename from fizz-core/src/main/java/we/util/ResourceIdUtils.java rename to fizz-core/src/main/java/com/fizzgate/util/ResourceIdUtils.java index d9f476c..5223971 100644 --- a/fizz-core/src/main/java/we/util/ResourceIdUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/util/ResourceIdUtils.java @@ -14,11 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; + +import com.fizzgate.util.Consts; +import com.fizzgate.util.Utils; /** * Resource ID utility - * Extracted from {@link we.stats.ratelimit.ResourceRateLimitConfig} + * Extracted from {@link com.fizzgate.stats.ratelimit.ResourceRateLimitConfig} * * @author zhongjie */ diff --git a/fizz-core/src/main/java/we/util/WebUtils.java b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java similarity index 98% rename from fizz-core/src/main/java/we/util/WebUtils.java rename to fizz-core/src/main/java/com/fizzgate/util/WebUtils.java index cf2bdef..cb703bd 100644 --- a/fizz-core/src/main/java/we/util/WebUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -31,12 +31,20 @@ import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.filter.FilterResult; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.auth.AuthPluginFilter; +import com.fizzgate.proxy.Route; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.NettyDataBufferUtils; +import com.fizzgate.util.Result; +import com.fizzgate.util.ThreadContext; +import com.fizzgate.util.Utils; + import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.filter.FilterResult; -import we.plugin.auth.ApiConfig; -import we.plugin.auth.AuthPluginFilter; -import we.proxy.Route; import java.io.UnsupportedEncodingException; import java.net.URI; diff --git a/fizz-core/src/main/java/we/config/LogConfig.java b/fizz-core/src/main/java/we/config/LogConfig.java deleted file mode 100644 index ed11943..0000000 --- a/fizz-core/src/main/java/we/config/LogConfig.java +++ /dev/null @@ -1,104 +0,0 @@ -//package we.config; -// -//import ch.qos.logback.classic.LoggerContext; -//import ch.qos.logback.classic.PatternLayout; -//import ch.qos.logback.classic.spi.ILoggingEvent; -//import ch.qos.logback.core.Appender; -//import org.apache.commons.lang3.StringUtils; -//import org.apache.logging.log4j.core.appender.AbstractAppender; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.boot.autoconfigure.AutoConfigureAfter; -//import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -//import org.springframework.boot.context.event.ApplicationReadyEvent; -//import org.springframework.boot.context.event.ApplicationStartingEvent; -//import org.springframework.boot.context.event.SpringApplicationEvent; -//import org.springframework.boot.context.properties.ConfigurationProperties; -//import org.springframework.context.ApplicationEvent; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.context.event.EventListener; -//import we.log.LogProperties; -//import we.log.LogSendAppenderWithLogback; -// -//@Configuration -//public class LogConfig { -// -// @Bean -// @ConfigurationProperties("fizz.logging") -// public LogProperties logProperties() { -// return new LogProperties(); -// } -// -// @Configuration -// @ConditionalOnClass(AbstractAppender.class) -// @AutoConfigureAfter(AggregateRedisConfig.class) -// public static class CustomLog4j2Config { -// } -// -// @Configuration -// @ConditionalOnClass(LoggerContext.class) -// @AutoConfigureAfter(AggregateRedisConfig.class) -// public static class CustomLogbackConfig { -// @Bean -// public Object initLogSendAppenderWithLogback(LogProperties logProperties) { -// return new LoggingConfigurationApplicationListener(logProperties); -// } -// } -// -// public static class LoggingConfigurationApplicationListener { -// private static final Logger logger = LoggerFactory.getLogger(LoggingConfigurationApplicationListener.class); -// private static final String APPENDER_NAME = "fizzLogSendAppender"; -// private static final String LAYOUT = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %level %logger{36} - %msg%n"; -// private LogProperties logProperties; -// -// public LoggingConfigurationApplicationListener() { -// } -// -// public LoggingConfigurationApplicationListener(LogProperties logProperties) { -// this.logProperties = logProperties; -// } -// -// @EventListener -// public void contextRefreshed(SpringApplicationEvent event) { -// onApplicationEvent(event); -// } -// -// @EventListener -// public void applicationStarting(ApplicationStartingEvent event) { -// onApplicationEvent(event); -// } -// -// @EventListener -// public void applicationReady(ApplicationReadyEvent event) { -// onApplicationEvent(event); -// } -// -// public void onApplicationEvent(ApplicationEvent event) { -// LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); -// final ch.qos.logback.classic.Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME); -// String layoutConfig = StringUtils.isBlank(logProperties.getLayout()) ? LAYOUT : logProperties.getLayout(); -// -// final LogSendAppenderWithLogback newAppender = new LogSendAppenderWithLogback(); -// newAppender.setName(APPENDER_NAME); -// newAppender.setContext(context); -// PatternLayout layout = new PatternLayout(); -// layout.setPattern(layoutConfig); -// newAppender.setLayout(layout); -// -// Appender appender = root.getAppender(APPENDER_NAME); -// if (appender == null) { -// newAppender.start(); -// root.addAppender(newAppender); -// logger.info("Added fizz log send appender:{}", APPENDER_NAME); -// } else { -// newAppender.start(); -// root.detachAppender(APPENDER_NAME); -// root.addAppender(newAppender); -// logger.info("Refresh fizz log send appender:{}", APPENDER_NAME); -// } -// } -// } -// -// -//} diff --git a/fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java b/fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java deleted file mode 100644 index 9dde1b2..0000000 --- a/fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java +++ /dev/null @@ -1,94 +0,0 @@ -//package we.log; -// -//import ch.qos.logback.classic.spi.ILoggingEvent; -//import ch.qos.logback.core.AppenderBase; -//import ch.qos.logback.core.Layout; -//import ch.qos.logback.core.LogbackException; -//import lombok.Getter; -//import lombok.Setter; -//import we.FizzAppContext; -//import we.flume.clients.log4j2appender.LogService; -//import we.util.NetworkUtils; -// -//import static we.log.LogSendAppender.*; -// -///** -// * log send appender with logback -// * -// * @author huahuang -// */ -//public class LogSendAppenderWithLogback extends AppenderBase { -// -// //负责将日志事件转换为字符串,需Getter和Setter方法 -// @Getter -// @Setter -// private Layout layout; -// -// @Override -// protected void append(ILoggingEvent event) { -// try { -// if (logEnabled != null && !logEnabled) { -// return; -// } -// -// if (logEnabled == null && FizzAppContext.appContext == null && logSendService == null) { -// // local cache -// logSends[logSendIndex.getAndIncrement() % logSends.length] = new LogSend( -// this.getBizId(event.getArgumentArray()), NetworkUtils.getServerIp(), event.getLevel().levelInt, -// event.getTimeStamp(), this.getLayout().doLayout(event)); -// return; -// } -// -// if (logEnabled == null && logSendService == null) { -// // no legal logSendService, discard the local cache -// logEnabled = Boolean.FALSE; -// logSends = null; -// return; -// } -// -// if (logEnabled == null) { -// logEnabled = Boolean.TRUE; -// -// LogSend[] logSends; -// synchronized (LogSendAppender.class) { -// logSends = LogSendAppender.logSends; -// LogSendAppender.logSends = null; -// } -// -// // logSendService is ready, send the local cache -// if (logSends != null) { -// int size = Math.min(logSendIndex.get(), logSends.length); -// for (int i = 0; i < size; i++) { -// logSendService.send(logSends[i]); -// } -// } -// } -// -// LogSend logSend = new LogSend(this.getBizId(event.getArgumentArray()), NetworkUtils.getServerIp(), -// event.getLevel().levelInt, event.getTimeStamp(), this.getLayout().doLayout(event)); -// logSendService.send(logSend); -// } catch (Exception ex) { -// throw new LogbackException(event.getFormattedMessage(), ex); -// } -// } -// -// private String getBizId(Object[] parameters) { -// Object bizId = LogService.getBizId(); -// if (parameters != null) { -// for (int i = parameters.length - 1; i > -1; --i) { -// Object p = parameters[i]; -// if (p == LogService.BIZ_ID) { -// if (i != parameters.length - 1) { -// bizId = parameters[i + 1]; -// } -// break; -// } -// } -// } -// if (bizId == null) { -// return ""; -// } -// return bizId.toString(); -// } -// -//} diff --git a/fizz-core/src/test/java/we/LogKafkaTests.java b/fizz-core/src/test/java/com/fizzgate/LogKafkaTests.java similarity index 98% rename from fizz-core/src/test/java/we/LogKafkaTests.java rename to fizz-core/src/test/java/com/fizzgate/LogKafkaTests.java index 89b9f36..32a51e4 100644 --- a/fizz-core/src/test/java/we/LogKafkaTests.java +++ b/fizz-core/src/test/java/com/fizzgate/LogKafkaTests.java @@ -1,4 +1,4 @@ -package we; +package com.fizzgate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.ThreadContext; diff --git a/fizz-core/src/test/java/we/RedisClusterTests.java b/fizz-core/src/test/java/com/fizzgate/RedisClusterTests.java similarity index 95% rename from fizz-core/src/test/java/we/RedisClusterTests.java rename to fizz-core/src/test/java/com/fizzgate/RedisClusterTests.java index 6e73fec..cd7957d 100644 --- a/fizz-core/src/test/java/we/RedisClusterTests.java +++ b/fizz-core/src/test/java/com/fizzgate/RedisClusterTests.java @@ -1,12 +1,13 @@ -package we; +package com.fizzgate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; -import we.config.RedisReactiveConfig; -import we.config.RedisReactiveProperties; + +import com.fizzgate.config.RedisReactiveConfig; +import com.fizzgate.config.RedisReactiveProperties; public class RedisClusterTests { diff --git a/fizz-core/src/test/java/we/dedicated_line/DedicatedLineServiceTests.java b/fizz-core/src/test/java/com/fizzgate/dedicated_line/DedicatedLineServiceTests.java similarity index 80% rename from fizz-core/src/test/java/we/dedicated_line/DedicatedLineServiceTests.java rename to fizz-core/src/test/java/com/fizzgate/dedicated_line/DedicatedLineServiceTests.java index 5b6d95e..c2ab7c1 100644 --- a/fizz-core/src/test/java/we/dedicated_line/DedicatedLineServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/dedicated_line/DedicatedLineServiceTests.java @@ -1,4 +1,4 @@ -package we.dedicated_line; +package com.fizzgate.dedicated_line; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -7,11 +7,13 @@ import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import we.Fizz; -import we.redis.RedisProperties; -import we.redis.RedisServerConfiguration; -import we.redis.RedisTemplateConfiguration; -import we.util.ReflectionUtils; + +import com.fizzgate.Fizz; +import com.fizzgate.dedicated_line.DedicatedLineService; +import com.fizzgate.redis.RedisProperties; +import com.fizzgate.redis.RedisServerConfiguration; +import com.fizzgate.redis.RedisTemplateConfiguration; +import com.fizzgate.util.ReflectionUtils; import javax.annotation.Resource; diff --git a/fizz-core/src/test/java/we/filter/FlowControlFilterTests.java b/fizz-core/src/test/java/com/fizzgate/filter/FlowControlFilterTests.java similarity index 90% rename from fizz-core/src/test/java/we/filter/FlowControlFilterTests.java rename to fizz-core/src/test/java/com/fizzgate/filter/FlowControlFilterTests.java index cae1d66..098be23 100644 --- a/fizz-core/src/test/java/we/filter/FlowControlFilterTests.java +++ b/fizz-core/src/test/java/com/fizzgate/filter/FlowControlFilterTests.java @@ -1,4 +1,4 @@ -package we.filter; +package com.fizzgate.filter; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; @@ -8,16 +8,20 @@ import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebHandler; + +import com.fizzgate.controller.FlowControlController; +import com.fizzgate.filter.FlowControlFilter; +import com.fizzgate.filter.FlowControlFilterProperties; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceTimeWindowStat; +import com.fizzgate.stats.TimeWindowStat; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfig; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfigService; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReflectionUtils; +import com.fizzgate.util.ResourceIdUtils; + import reactor.core.publisher.Mono; -import we.controller.FlowControlController; -import we.stats.FlowStat; -import we.stats.ResourceTimeWindowStat; -import we.stats.TimeWindowStat; -import we.stats.ratelimit.ResourceRateLimitConfig; -import we.stats.ratelimit.ResourceRateLimitConfigService; -import we.util.JacksonUtils; -import we.util.ReflectionUtils; -import we.util.ResourceIdUtils; import java.util.HashMap; import java.util.List; diff --git a/fizz-core/src/test/java/we/fizz/InputValidateTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/InputValidateTests.java similarity index 93% rename from fizz-core/src/test/java/we/fizz/InputValidateTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/InputValidateTests.java index 283440f..40d923a 100644 --- a/fizz-core/src/test/java/we/fizz/InputValidateTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/InputValidateTests.java @@ -1,10 +1,13 @@ -package we.fizz; +package com.fizzgate.fizz; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; -import we.fizz.input.ClientInputConfig; -import we.fizz.input.Input; -import we.schema.util.I18nUtils; + +import com.fizzgate.fizz.Pipeline; +import com.fizzgate.fizz.input.ClientInputConfig; +import com.fizzgate.fizz.input.Input; + +import com.fizzgate.schema.util.I18nUtils; import java.util.HashMap; import java.util.Locale; diff --git a/fizz-core/src/test/java/we/fizz/component/CircleTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/component/CircleTests.java similarity index 88% rename from fizz-core/src/test/java/we/fizz/component/CircleTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/component/CircleTests.java index 59f9174..2e93bfd 100644 --- a/fizz-core/src/test/java/we/fizz/component/CircleTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/component/CircleTests.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.component; +package com.fizzgate.fizz.component; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -25,20 +25,17 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; -import we.fizz.StepContext; -import we.fizz.component.circle.Circle; -import we.fizz.component.circle.CircleItem; -import we.fizz.component.condition.Condition; -import we.fizz.component.condition.ConditionValue; -import we.fizz.field.FixedDataTypeEnum; -import we.fizz.field.RefDataTypeEnum; -import we.fizz.field.ValueTypeEnum; -/** - * - * @author Francis Dong - * - */ -import we.fizz.input.PathMapping; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.component.OperatorEnum; +import com.fizzgate.fizz.component.StepContextPosition; +import com.fizzgate.fizz.component.circle.Circle; +import com.fizzgate.fizz.component.circle.CircleItem; +import com.fizzgate.fizz.component.condition.Condition; +import com.fizzgate.fizz.component.condition.ConditionValue; +import com.fizzgate.fizz.field.FixedDataTypeEnum; +import com.fizzgate.fizz.field.RefDataTypeEnum; +import com.fizzgate.fizz.field.ValueTypeEnum; +import com.fizzgate.fizz.input.PathMapping; class CircleTests { @Test diff --git a/fizz-core/src/test/java/we/fizz/component/ConditionTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/component/ConditionTests.java similarity index 97% rename from fizz-core/src/test/java/we/fizz/component/ConditionTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/component/ConditionTests.java index 7216dcd..b28df21 100644 --- a/fizz-core/src/test/java/we/fizz/component/ConditionTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/component/ConditionTests.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.component; +package com.fizzgate.fizz.component; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -32,12 +32,13 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; -import we.fizz.component.condition.Condition; -import we.fizz.component.condition.ConditionValue; -import we.fizz.field.FixedDataTypeEnum; -import we.fizz.field.RefDataTypeEnum; -import we.fizz.field.ValueTypeEnum; -import we.fizz.input.PathMapping; +import com.fizzgate.fizz.component.OperatorEnum; +import com.fizzgate.fizz.component.condition.Condition; +import com.fizzgate.fizz.component.condition.ConditionValue; +import com.fizzgate.fizz.field.FixedDataTypeEnum; +import com.fizzgate.fizz.field.RefDataTypeEnum; +import com.fizzgate.fizz.field.ValueTypeEnum; +import com.fizzgate.fizz.input.PathMapping; /** * diff --git a/fizz-core/src/test/java/we/fizz/function/CodecFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/CodecFuncTests.java similarity index 96% rename from fizz-core/src/test/java/we/fizz/function/CodecFuncTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/function/CodecFuncTests.java index 8db0258..750abc9 100644 --- a/fizz-core/src/test/java/we/fizz/function/CodecFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/CodecFuncTests.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -24,8 +24,9 @@ import java.util.Map; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; -import we.fizz.input.PathMapping; -import we.util.DigestUtils; +import com.fizzgate.fizz.function.FuncExecutor; +import com.fizzgate.fizz.input.PathMapping; +import com.fizzgate.util.DigestUtils; /** * diff --git a/fizz-core/src/test/java/we/fizz/function/CommonFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/CommonFuncTests.java similarity index 99% rename from fizz-core/src/test/java/we/fizz/function/CommonFuncTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/function/CommonFuncTests.java index 93c8040..a195e6a 100644 --- a/fizz-core/src/test/java/we/fizz/function/CommonFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/CommonFuncTests.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -26,7 +26,8 @@ import java.util.Map; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; -import we.fizz.input.PathMapping; +import com.fizzgate.fizz.function.FuncExecutor; +import com.fizzgate.fizz.input.PathMapping; /** * diff --git a/fizz-core/src/test/java/we/fizz/function/DateFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/DateFuncTests.java similarity index 97% rename from fizz-core/src/test/java/we/fizz/function/DateFuncTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/function/DateFuncTests.java index e552e7a..075b75b 100644 --- a/fizz-core/src/test/java/we/fizz/function/DateFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/DateFuncTests.java @@ -14,12 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import com.fizzgate.fizz.function.FuncExecutor; + /** * * @author Francis Dong diff --git a/fizz-core/src/test/java/we/fizz/function/FuncExecutorTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/FuncExecutorTests.java similarity index 94% rename from fizz-core/src/test/java/we/fizz/function/FuncExecutorTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/function/FuncExecutorTests.java index d9ab62b..2972aed 100644 --- a/fizz-core/src/test/java/we/fizz/function/FuncExecutorTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/FuncExecutorTests.java @@ -14,12 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import com.fizzgate.fizz.function.CodecFunc; +import com.fizzgate.fizz.function.FuncExecutor; + /** * * @author Francis Dong diff --git a/fizz-core/src/test/java/we/fizz/function/ListFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/ListFuncTests.java similarity index 98% rename from fizz-core/src/test/java/we/fizz/function/ListFuncTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/function/ListFuncTests.java index f816e4e..81957fa 100644 --- a/fizz-core/src/test/java/we/fizz/function/ListFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/ListFuncTests.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -27,8 +27,8 @@ import org.junit.jupiter.api.Test; import org.noear.snack.ONode; import com.alibaba.fastjson.JSON; - -import we.fizz.input.PathMapping; +import com.fizzgate.fizz.function.FuncExecutor; +import com.fizzgate.fizz.input.PathMapping; /** * diff --git a/fizz-core/src/test/java/we/fizz/function/MathFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/MathFuncTests.java similarity index 98% rename from fizz-core/src/test/java/we/fizz/function/MathFuncTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/function/MathFuncTests.java index c34f80f..8f2f07d 100644 --- a/fizz-core/src/test/java/we/fizz/function/MathFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/MathFuncTests.java @@ -14,12 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import com.fizzgate.fizz.function.FuncExecutor; + /** * * @author Francis Dong diff --git a/fizz-core/src/test/java/we/fizz/function/StringFuncTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/function/StringFuncTests.java similarity index 98% rename from fizz-core/src/test/java/we/fizz/function/StringFuncTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/function/StringFuncTests.java index 83a97bc..bf03b75 100644 --- a/fizz-core/src/test/java/we/fizz/function/StringFuncTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/function/StringFuncTests.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package we.fizz.function; +package com.fizzgate.fizz.function; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -24,7 +24,8 @@ import java.util.Map; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; -import we.fizz.input.PathMapping; +import com.fizzgate.fizz.function.FuncExecutor; +import com.fizzgate.fizz.input.PathMapping; /** * diff --git a/fizz-core/src/test/java/com/fizzgate/fizz/group/DevTestGroup.java b/fizz-core/src/test/java/com/fizzgate/fizz/group/DevTestGroup.java new file mode 100644 index 0000000..ed1136a --- /dev/null +++ b/fizz-core/src/test/java/com/fizzgate/fizz/group/DevTestGroup.java @@ -0,0 +1,4 @@ +package com.fizzgate.fizz.group; + +public class DevTestGroup { +} diff --git a/fizz-core/src/test/java/com/fizzgate/fizz/group/FastTestGroup.java b/fizz-core/src/test/java/com/fizzgate/fizz/group/FastTestGroup.java new file mode 100644 index 0000000..3ce12ef --- /dev/null +++ b/fizz-core/src/test/java/com/fizzgate/fizz/group/FastTestGroup.java @@ -0,0 +1,4 @@ +package com.fizzgate.fizz.group; + +public class FastTestGroup { +} diff --git a/fizz-core/src/test/java/com/fizzgate/fizz/group/SlowTestGroup.java b/fizz-core/src/test/java/com/fizzgate/fizz/group/SlowTestGroup.java new file mode 100644 index 0000000..06d07d8 --- /dev/null +++ b/fizz-core/src/test/java/com/fizzgate/fizz/group/SlowTestGroup.java @@ -0,0 +1,4 @@ +package com.fizzgate.fizz.group; + +public class SlowTestGroup { +} diff --git a/fizz-core/src/test/java/we/fizz/input/DubboInputMockTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/input/DubboInputMockTests.java similarity index 86% rename from fizz-core/src/test/java/we/fizz/input/DubboInputMockTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/input/DubboInputMockTests.java index e050fda..8d01626 100644 --- a/fizz-core/src/test/java/we/fizz/input/DubboInputMockTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/input/DubboInputMockTests.java @@ -1,4 +1,4 @@ -package we.fizz.input; +package com.fizzgate.fizz.input; import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.rpc.service.GenericService; @@ -7,15 +7,17 @@ import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.context.ConfigurableApplicationContext; -import we.fizz.group.FastTestGroup; -import we.fizz.Step; -import we.fizz.StepContext; -import we.fizz.StepResponse; -import we.fizz.input.extension.dubbo.DubboInput; -import we.fizz.input.extension.dubbo.DubboInputConfig; -import we.proxy.dubbo.ApacheDubboGenericService; -import we.proxy.dubbo.DubboInterfaceDeclaration; +import com.fizzgate.fizz.Step; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.StepResponse; +import com.fizzgate.fizz.group.FastTestGroup; +import com.fizzgate.fizz.input.InputContext; +import com.fizzgate.fizz.input.InputFactory; +import com.fizzgate.fizz.input.extension.dubbo.DubboInput; +import com.fizzgate.fizz.input.extension.dubbo.DubboInputConfig; +import com.fizzgate.proxy.dubbo.ApacheDubboGenericService; +import com.fizzgate.proxy.dubbo.DubboInterfaceDeclaration; import java.lang.ref.SoftReference; import java.util.HashMap; diff --git a/fizz-core/src/test/java/we/fizz/input/DubboInputTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/input/DubboInputTests.java similarity index 86% rename from fizz-core/src/test/java/we/fizz/input/DubboInputTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/input/DubboInputTests.java index 251d62b..740c6bf 100644 --- a/fizz-core/src/test/java/we/fizz/input/DubboInputTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/input/DubboInputTests.java @@ -1,15 +1,16 @@ -package we.fizz.input; +package com.fizzgate.fizz.input; import org.junit.experimental.categories.Category; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import reactor.core.publisher.Mono; -import we.fizz.group.DevTestGroup; -import we.fizz.input.extension.dubbo.DubboInput; -import we.fizz.input.extension.dubbo.DubboInputConfig; +import com.fizzgate.fizz.group.DevTestGroup; +import com.fizzgate.fizz.input.extension.dubbo.DubboInput; +import com.fizzgate.fizz.input.extension.dubbo.DubboInputConfig; + +import reactor.core.publisher.Mono; import java.util.HashMap; import java.util.Map; diff --git a/fizz-core/src/test/java/we/fizz/input/GrpcInputMockTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/input/GrpcInputMockTests.java similarity index 86% rename from fizz-core/src/test/java/we/fizz/input/GrpcInputMockTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/input/GrpcInputMockTests.java index 2a20480..30f89a9 100644 --- a/fizz-core/src/test/java/we/fizz/input/GrpcInputMockTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/input/GrpcInputMockTests.java @@ -1,5 +1,17 @@ -package we.fizz.input; +package com.fizzgate.fizz.input; +import com.fizzgate.fizz.Step; +import com.fizzgate.fizz.StepContext; +import com.fizzgate.fizz.StepResponse; +import com.fizzgate.fizz.group.FastTestGroup; +import com.fizzgate.fizz.input.InputContext; +import com.fizzgate.fizz.input.InputFactory; +import com.fizzgate.fizz.input.extension.grpc.GrpcInput; +import com.fizzgate.fizz.input.extension.grpc.GrpcInputConfig; +import com.fizzgate.proxy.grpc.GrpcGenericService; +import com.fizzgate.proxy.grpc.GrpcInterfaceDeclaration; +import com.fizzgate.proxy.grpc.client.GrpcProxyClient; +import com.fizzgate.proxy.grpc.client.utils.ChannelFactory; import com.google.common.util.concurrent.ListenableFuture; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -7,16 +19,6 @@ import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.util.ReflectionTestUtils; -import we.fizz.group.FastTestGroup; -import we.fizz.Step; -import we.fizz.StepContext; -import we.fizz.StepResponse; -import we.fizz.input.extension.grpc.GrpcInput; -import we.fizz.input.extension.grpc.GrpcInputConfig; -import we.proxy.grpc.GrpcGenericService; -import we.proxy.grpc.GrpcInterfaceDeclaration; -import we.proxy.grpc.client.GrpcProxyClient; -import we.proxy.grpc.client.utils.ChannelFactory; import java.lang.ref.SoftReference; import java.util.HashMap; diff --git a/fizz-core/src/test/java/we/fizz/input/PathMappingTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/input/PathMappingTests.java similarity index 98% rename from fizz-core/src/test/java/we/fizz/input/PathMappingTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/input/PathMappingTests.java index 1ca3303..0c96983 100644 --- a/fizz-core/src/test/java/we/fizz/input/PathMappingTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/input/PathMappingTests.java @@ -1,4 +1,4 @@ -package we.fizz.input; +package com.fizzgate.fizz.input; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -14,9 +14,11 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; +import com.fizzgate.fizz.input.PathMapping; +import com.fizzgate.global_resource.GlobalResourceService; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import we.global_resource.GlobalResourceService; class PathMappingTests { diff --git a/fizz-core/src/test/java/we/fizz/input/RequestInputTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/input/RequestInputTests.java similarity index 96% rename from fizz-core/src/test/java/we/fizz/input/RequestInputTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/input/RequestInputTests.java index 76fbbcc..d60aaa4 100644 --- a/fizz-core/src/test/java/we/fizz/input/RequestInputTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/input/RequestInputTests.java @@ -15,14 +15,15 @@ * along with this program. If not, see . */ -package we.fizz.input; +package com.fizzgate.fizz.input; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Map; import org.junit.jupiter.api.Test; -import we.fizz.input.extension.request.RequestInput; + +import com.fizzgate.fizz.input.extension.request.RequestInput; /** * diff --git a/fizz-core/src/test/java/we/fizz/input/proxy/dubbo/ApacheDubboGenericServiceMockTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/input/proxy/dubbo/ApacheDubboGenericServiceMockTests.java similarity index 91% rename from fizz-core/src/test/java/we/fizz/input/proxy/dubbo/ApacheDubboGenericServiceMockTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/input/proxy/dubbo/ApacheDubboGenericServiceMockTests.java index bfafaa5..37548f6 100644 --- a/fizz-core/src/test/java/we/fizz/input/proxy/dubbo/ApacheDubboGenericServiceMockTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/input/proxy/dubbo/ApacheDubboGenericServiceMockTests.java @@ -1,4 +1,4 @@ -package we.fizz.input.proxy.dubbo; +package com.fizzgate.fizz.input.proxy.dubbo; import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.rpc.service.GenericService; @@ -8,9 +8,10 @@ import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; -import we.fizz.group.FastTestGroup; -import we.proxy.dubbo.ApacheDubboGenericService; -import we.proxy.dubbo.DubboInterfaceDeclaration; + +import com.fizzgate.fizz.group.FastTestGroup; +import com.fizzgate.proxy.dubbo.ApacheDubboGenericService; +import com.fizzgate.proxy.dubbo.DubboInterfaceDeclaration; import java.util.HashMap; import java.util.concurrent.CompletableFuture; diff --git a/fizz-core/src/test/java/we/fizz/input/proxy/dubbo/ApacheDubboGenericServiceTests.java b/fizz-core/src/test/java/com/fizzgate/fizz/input/proxy/dubbo/ApacheDubboGenericServiceTests.java similarity index 93% rename from fizz-core/src/test/java/we/fizz/input/proxy/dubbo/ApacheDubboGenericServiceTests.java rename to fizz-core/src/test/java/com/fizzgate/fizz/input/proxy/dubbo/ApacheDubboGenericServiceTests.java index 76ca08f..3de5d90 100644 --- a/fizz-core/src/test/java/we/fizz/input/proxy/dubbo/ApacheDubboGenericServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/fizz/input/proxy/dubbo/ApacheDubboGenericServiceTests.java @@ -1,4 +1,4 @@ -package we.fizz.input.proxy.dubbo; +package com.fizzgate.fizz.input.proxy.dubbo; import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.rpc.service.GenericService; @@ -7,8 +7,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; -import we.proxy.dubbo.ApacheDubboGenericService; -import we.proxy.dubbo.DubboInterfaceDeclaration; + +import com.fizzgate.proxy.dubbo.ApacheDubboGenericService; +import com.fizzgate.proxy.dubbo.DubboInterfaceDeclaration; import java.util.HashMap; import java.util.concurrent.CompletableFuture; diff --git a/fizz-core/src/test/java/we/global_resource/GlobalResourceTests.java b/fizz-core/src/test/java/com/fizzgate/global_resource/GlobalResourceTests.java similarity index 84% rename from fizz-core/src/test/java/we/global_resource/GlobalResourceTests.java rename to fizz-core/src/test/java/com/fizzgate/global_resource/GlobalResourceTests.java index ae3b207..0e98ed1 100644 --- a/fizz-core/src/test/java/we/global_resource/GlobalResourceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/global_resource/GlobalResourceTests.java @@ -1,6 +1,16 @@ -package we.global_resource; +package com.fizzgate.global_resource; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fizzgate.Fizz; +import com.fizzgate.FizzAppContext; +import com.fizzgate.global_resource.GlobalResource; +import com.fizzgate.global_resource.GlobalResourceService; +import com.fizzgate.redis.RedisProperties; +import com.fizzgate.redis.RedisServerConfiguration; +import com.fizzgate.redis.RedisTemplateConfiguration; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReflectionUtils; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.context.support.GenericApplicationContext; @@ -8,13 +18,6 @@ import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import we.Fizz; -import we.FizzAppContext; -import we.redis.RedisProperties; -import we.redis.RedisServerConfiguration; -import we.redis.RedisTemplateConfiguration; -import we.util.JacksonUtils; -import we.util.ReflectionUtils; import javax.annotation.Resource; import java.util.HashMap; diff --git a/fizz-core/src/test/java/we/plugin/PluginTests.java b/fizz-core/src/test/java/com/fizzgate/plugin/PluginTests.java similarity index 93% rename from fizz-core/src/test/java/we/plugin/PluginTests.java rename to fizz-core/src/test/java/com/fizzgate/plugin/PluginTests.java index 3cd58a6..379ff11 100644 --- a/fizz-core/src/test/java/we/plugin/PluginTests.java +++ b/fizz-core/src/test/java/com/fizzgate/plugin/PluginTests.java @@ -1,4 +1,4 @@ -package we.plugin; +package com.fizzgate.plugin; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -13,17 +13,24 @@ import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import org.springframework.web.server.WebHandler; + +import com.fizzgate.Fizz; +import com.fizzgate.FizzAppContext; +import com.fizzgate.config.SystemConfig; +import com.fizzgate.filter.PreprocessFilter; +import com.fizzgate.plugin.FixedPluginFilter; +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.plugin.PluginFilter; +import com.fizzgate.plugin.auth.*; +import com.fizzgate.plugin.stat.StatPluginFilter; +import com.fizzgate.plugin.stat.StatPluginFilterProperties; +import com.fizzgate.util.ReactorUtils; +import com.fizzgate.util.ReflectionUtils; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.Fizz; -import we.FizzAppContext; -import we.config.SystemConfig; -import we.filter.PreprocessFilter; -import we.plugin.auth.*; -import we.plugin.stat.StatPluginFilter; -import we.plugin.stat.StatPluginFilterProperties; -import we.util.ReactorUtils; -import we.util.ReflectionUtils; -import we.util.WebUtils; import java.util.ArrayList; import java.util.Collections; diff --git a/fizz-core/src/test/java/we/plugin/auth/ApiConfig2appsServiceTests.java b/fizz-core/src/test/java/com/fizzgate/plugin/auth/ApiConfig2appsServiceTests.java similarity index 88% rename from fizz-core/src/test/java/we/plugin/auth/ApiConfig2appsServiceTests.java rename to fizz-core/src/test/java/com/fizzgate/plugin/auth/ApiConfig2appsServiceTests.java index b20d25c..95dd1ab 100644 --- a/fizz-core/src/test/java/we/plugin/auth/ApiConfig2appsServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/plugin/auth/ApiConfig2appsServiceTests.java @@ -1,4 +1,4 @@ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -6,10 +6,12 @@ import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import we.redis.RedisProperties; -import we.redis.RedisServerConfiguration; -import we.redis.RedisTemplateConfiguration; -import we.util.ReflectionUtils; + +import com.fizzgate.plugin.auth.ApiConfig2appsService; +import com.fizzgate.redis.RedisProperties; +import com.fizzgate.redis.RedisServerConfiguration; +import com.fizzgate.redis.RedisTemplateConfiguration; +import com.fizzgate.util.ReflectionUtils; import javax.annotation.Resource; import java.util.HashMap; diff --git a/fizz-core/src/test/java/we/plugin/auth/ApiConfigServiceTests.java b/fizz-core/src/test/java/com/fizzgate/plugin/auth/ApiConfigServiceTests.java similarity index 86% rename from fizz-core/src/test/java/we/plugin/auth/ApiConfigServiceTests.java rename to fizz-core/src/test/java/com/fizzgate/plugin/auth/ApiConfigServiceTests.java index 3fc3c09..0c0a01a 100644 --- a/fizz-core/src/test/java/we/plugin/auth/ApiConfigServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/plugin/auth/ApiConfigServiceTests.java @@ -1,4 +1,4 @@ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -7,11 +7,14 @@ import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import we.FizzAppContext; -import we.redis.RedisProperties; -import we.redis.RedisServerConfiguration; -import we.redis.RedisTemplateConfiguration; -import we.util.ReflectionUtils; + +import com.fizzgate.FizzAppContext; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.auth.ApiConfigServiceProperties; +import com.fizzgate.redis.RedisProperties; +import com.fizzgate.redis.RedisServerConfiguration; +import com.fizzgate.redis.RedisTemplateConfiguration; +import com.fizzgate.util.ReflectionUtils; import javax.annotation.Resource; import java.util.HashMap; diff --git a/fizz-core/src/test/java/we/plugin/auth/AppTests.java b/fizz-core/src/test/java/com/fizzgate/plugin/auth/AppTests.java similarity index 96% rename from fizz-core/src/test/java/we/plugin/auth/AppTests.java rename to fizz-core/src/test/java/com/fizzgate/plugin/auth/AppTests.java index 6f07a41..89c7788 100644 --- a/fizz-core/src/test/java/we/plugin/auth/AppTests.java +++ b/fizz-core/src/test/java/com/fizzgate/plugin/auth/AppTests.java @@ -1,7 +1,9 @@ -package we.plugin.auth; +package com.fizzgate.plugin.auth; import org.junit.jupiter.api.Test; +import com.fizzgate.plugin.auth.App; + import static org.junit.jupiter.api.Assertions.assertTrue; /** diff --git a/fizz-core/src/test/java/we/proxy/CallbackServiceTests.java b/fizz-core/src/test/java/com/fizzgate/proxy/CallbackServiceTests.java similarity index 90% rename from fizz-core/src/test/java/we/proxy/CallbackServiceTests.java rename to fizz-core/src/test/java/com/fizzgate/proxy/CallbackServiceTests.java index 0246408..b0e16e4 100644 --- a/fizz-core/src/test/java/we/proxy/CallbackServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/proxy/CallbackServiceTests.java @@ -1,4 +1,4 @@ -package we.proxy; +package com.fizzgate.proxy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,13 +11,17 @@ import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ExchangeStrategies; + +import com.fizzgate.fizz.AggregateService; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.auth.CallbackConfig; +import com.fizzgate.plugin.auth.Receiver; +import com.fizzgate.proxy.CallbackService; +import com.fizzgate.proxy.FizzWebClient; +import com.fizzgate.util.ReflectionUtils; + import reactor.core.publisher.Mono; -import we.fizz.AggregateService; -import we.plugin.auth.ApiConfig; -import we.plugin.auth.ApiConfigService; -import we.plugin.auth.CallbackConfig; -import we.plugin.auth.Receiver; -import we.util.ReflectionUtils; import java.util.ArrayList; import java.util.Collections; diff --git a/fizz-core/src/test/java/we/proxy/FizzWebClientTests.java b/fizz-core/src/test/java/com/fizzgate/proxy/FizzWebClientTests.java similarity index 94% rename from fizz-core/src/test/java/we/proxy/FizzWebClientTests.java rename to fizz-core/src/test/java/com/fizzgate/proxy/FizzWebClientTests.java index baf80cb..873bcd5 100644 --- a/fizz-core/src/test/java/we/proxy/FizzWebClientTests.java +++ b/fizz-core/src/test/java/com/fizzgate/proxy/FizzWebClientTests.java @@ -1,7 +1,9 @@ -package we.proxy; +package com.fizzgate.proxy; import org.junit.jupiter.api.Test; +import com.fizzgate.proxy.FizzWebClient; + import static org.junit.jupiter.api.Assertions.assertEquals; /** diff --git a/fizz-core/src/test/java/we/redis/RedisProperties.java b/fizz-core/src/test/java/com/fizzgate/redis/RedisProperties.java similarity index 97% rename from fizz-core/src/test/java/we/redis/RedisProperties.java rename to fizz-core/src/test/java/com/fizzgate/redis/RedisProperties.java index a6b449f..3bb6875 100644 --- a/fizz-core/src/test/java/we/redis/RedisProperties.java +++ b/fizz-core/src/test/java/com/fizzgate/redis/RedisProperties.java @@ -1,4 +1,4 @@ -package we.redis; +package com.fizzgate.redis; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.TestConfiguration; diff --git a/fizz-core/src/test/java/we/redis/RedisServerConfiguration.java b/fizz-core/src/test/java/com/fizzgate/redis/RedisServerConfiguration.java similarity index 96% rename from fizz-core/src/test/java/we/redis/RedisServerConfiguration.java rename to fizz-core/src/test/java/com/fizzgate/redis/RedisServerConfiguration.java index 7736ed6..3c6f871 100644 --- a/fizz-core/src/test/java/we/redis/RedisServerConfiguration.java +++ b/fizz-core/src/test/java/com/fizzgate/redis/RedisServerConfiguration.java @@ -1,4 +1,4 @@ -package we.redis; +package com.fizzgate.redis; import org.springframework.boot.test.context.TestConfiguration; import redis.embedded.RedisServer; diff --git a/fizz-core/src/test/java/we/redis/RedisTemplateConfiguration.java b/fizz-core/src/test/java/com/fizzgate/redis/RedisTemplateConfiguration.java similarity index 98% rename from fizz-core/src/test/java/we/redis/RedisTemplateConfiguration.java rename to fizz-core/src/test/java/com/fizzgate/redis/RedisTemplateConfiguration.java index 997f0e1..e3ff8b7 100644 --- a/fizz-core/src/test/java/we/redis/RedisTemplateConfiguration.java +++ b/fizz-core/src/test/java/com/fizzgate/redis/RedisTemplateConfiguration.java @@ -1,4 +1,4 @@ -package we.redis; +package com.fizzgate.redis; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; diff --git a/fizz-core/src/test/java/we/service_registry/RegistryCenterServiceTests.java b/fizz-core/src/test/java/com/fizzgate/service_registry/RegistryCenterServiceTests.java similarity index 87% rename from fizz-core/src/test/java/we/service_registry/RegistryCenterServiceTests.java rename to fizz-core/src/test/java/com/fizzgate/service_registry/RegistryCenterServiceTests.java index 6d21dd1..2c1996d 100644 --- a/fizz-core/src/test/java/we/service_registry/RegistryCenterServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/service_registry/RegistryCenterServiceTests.java @@ -1,7 +1,19 @@ -package we.service_registry; +package com.fizzgate.service_registry; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.CharsetUtil; + +import com.fizzgate.Fizz; +import com.fizzgate.redis.RedisProperties; +import com.fizzgate.redis.RedisServerConfiguration; +import com.fizzgate.redis.RedisTemplateConfiguration; +import com.fizzgate.service_registry.FizzServiceRegistration; +import com.fizzgate.service_registry.RegistryCenter; +import com.fizzgate.service_registry.RegistryCenterService; +import com.fizzgate.service_registry.eureka.FizzEurekaServiceRegistration; +import com.fizzgate.util.PropertiesUtils; +import com.fizzgate.util.ReflectionUtils; +import com.fizzgate.util.YmlUtils; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.DiscoveryClient; import org.junit.jupiter.api.BeforeEach; @@ -11,14 +23,6 @@ import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import we.Fizz; -import we.redis.RedisProperties; -import we.redis.RedisServerConfiguration; -import we.redis.RedisTemplateConfiguration; -import we.service_registry.eureka.FizzEurekaServiceRegistration; -import we.util.PropertiesUtils; -import we.util.ReflectionUtils; -import we.util.YmlUtils; import javax.annotation.Resource; import java.util.HashMap; diff --git a/fizz-core/src/test/java/we/stats/FlowStatTests.java b/fizz-core/src/test/java/com/fizzgate/stats/FlowStatTests.java similarity index 98% rename from fizz-core/src/test/java/we/stats/FlowStatTests.java rename to fizz-core/src/test/java/com/fizzgate/stats/FlowStatTests.java index 238541b..0b797cc 100644 --- a/fizz-core/src/test/java/we/stats/FlowStatTests.java +++ b/fizz-core/src/test/java/com/fizzgate/stats/FlowStatTests.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats; +package com.fizzgate.stats; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -30,7 +30,15 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; -import we.util.JacksonUtils; + +import com.fizzgate.stats.BlockType; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.IncrRequestResult; +import com.fizzgate.stats.ResourceConfig; +import com.fizzgate.stats.ResourceStat; +import com.fizzgate.stats.ResourceTimeWindowStat; +import com.fizzgate.stats.TimeWindowStat; +import com.fizzgate.util.JacksonUtils; /** * diff --git a/fizz-core/src/test/java/we/stats/circuitbreaker/CircuitBreakManagerTests.java b/fizz-core/src/test/java/com/fizzgate/stats/circuitbreaker/CircuitBreakManagerTests.java similarity index 89% rename from fizz-core/src/test/java/we/stats/circuitbreaker/CircuitBreakManagerTests.java rename to fizz-core/src/test/java/com/fizzgate/stats/circuitbreaker/CircuitBreakManagerTests.java index 4758b66..812a562 100644 --- a/fizz-core/src/test/java/we/stats/circuitbreaker/CircuitBreakManagerTests.java +++ b/fizz-core/src/test/java/com/fizzgate/stats/circuitbreaker/CircuitBreakManagerTests.java @@ -1,6 +1,19 @@ -package we.stats.circuitbreaker; +package com.fizzgate.stats.circuitbreaker; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fizzgate.Fizz; +import com.fizzgate.redis.RedisProperties; +import com.fizzgate.redis.RedisServerConfiguration; +import com.fizzgate.redis.RedisTemplateConfiguration; +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceStat; +import com.fizzgate.stats.TimeSlot; +import com.fizzgate.stats.circuitbreaker.CircuitBreakManager; +import com.fizzgate.stats.circuitbreaker.CircuitBreaker; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReflectionUtils; +import com.fizzgate.util.ResourceIdUtils; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,16 +24,6 @@ import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import we.Fizz; -import we.redis.RedisProperties; -import we.redis.RedisServerConfiguration; -import we.redis.RedisTemplateConfiguration; -import we.stats.FlowStat; -import we.stats.ResourceStat; -import we.stats.TimeSlot; -import we.util.JacksonUtils; -import we.util.ReflectionUtils; -import we.util.ResourceIdUtils; import javax.annotation.Resource; import java.util.HashMap; diff --git a/fizz-core/src/test/java/we/stats/ratelimit/RateLimitTests.java b/fizz-core/src/test/java/com/fizzgate/stats/ratelimit/RateLimitTests.java similarity index 96% rename from fizz-core/src/test/java/we/stats/ratelimit/RateLimitTests.java rename to fizz-core/src/test/java/com/fizzgate/stats/ratelimit/RateLimitTests.java index e6b01d8..ef40d03 100644 --- a/fizz-core/src/test/java/we/stats/ratelimit/RateLimitTests.java +++ b/fizz-core/src/test/java/com/fizzgate/stats/ratelimit/RateLimitTests.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.stats.ratelimit; +package com.fizzgate.stats.ratelimit; import io.netty.buffer.UnpooledByteBufAllocator; import io.netty.channel.ChannelOption; @@ -27,14 +27,16 @@ import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.http.client.reactive.ReactorResourceFactory; import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; + +import com.fizzgate.stats.FlowStat; +import com.fizzgate.stats.ResourceTimeWindowStat; +import com.fizzgate.util.Consts; +import com.fizzgate.util.DateTimeUtils; + import reactor.core.publisher.Mono; import reactor.netty.http.client.HttpClient; import reactor.netty.resources.ConnectionProvider; import reactor.netty.resources.LoopResources; -import we.stats.FlowStat; -import we.stats.ResourceTimeWindowStat; -import we.util.Consts; -import we.util.DateTimeUtils; import java.time.Duration; import java.util.List; diff --git a/fizz-core/src/test/java/we/stats/ratelimit/ResourceRateLimitConfigServiceTests.java b/fizz-core/src/test/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigServiceTests.java similarity index 88% rename from fizz-core/src/test/java/we/stats/ratelimit/ResourceRateLimitConfigServiceTests.java rename to fizz-core/src/test/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigServiceTests.java index 099b095..a04cd56 100644 --- a/fizz-core/src/test/java/we/stats/ratelimit/ResourceRateLimitConfigServiceTests.java +++ b/fizz-core/src/test/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigServiceTests.java @@ -1,4 +1,4 @@ -package we.stats.ratelimit; +package com.fizzgate.stats.ratelimit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -6,10 +6,13 @@ import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; -import we.redis.RedisProperties; -import we.redis.RedisServerConfiguration; -import we.redis.RedisTemplateConfiguration; -import we.util.ResourceIdUtils; + +import com.fizzgate.redis.RedisProperties; +import com.fizzgate.redis.RedisServerConfiguration; +import com.fizzgate.redis.RedisTemplateConfiguration; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfig; +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfigService; +import com.fizzgate.util.ResourceIdUtils; import javax.annotation.Resource; diff --git a/fizz-core/src/test/java/we/stats/ratelimit/ResourceRateLimitConfigTests.java b/fizz-core/src/test/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigTests.java similarity index 92% rename from fizz-core/src/test/java/we/stats/ratelimit/ResourceRateLimitConfigTests.java rename to fizz-core/src/test/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigTests.java index e8c0e1e..99b2931 100644 --- a/fizz-core/src/test/java/we/stats/ratelimit/ResourceRateLimitConfigTests.java +++ b/fizz-core/src/test/java/com/fizzgate/stats/ratelimit/ResourceRateLimitConfigTests.java @@ -1,8 +1,10 @@ -package we.stats.ratelimit; +package com.fizzgate.stats.ratelimit; import org.junit.jupiter.api.Test; -import we.util.JacksonUtils; -import we.util.ResourceIdUtils; + +import com.fizzgate.stats.ratelimit.ResourceRateLimitConfig; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ResourceIdUtils; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/fizz-core/src/test/java/we/util/MapUtilTests.java b/fizz-core/src/test/java/com/fizzgate/util/MapUtilTests.java similarity index 98% rename from fizz-core/src/test/java/we/util/MapUtilTests.java rename to fizz-core/src/test/java/com/fizzgate/util/MapUtilTests.java index a03ca50..aae9c04 100644 --- a/fizz-core/src/test/java/we/util/MapUtilTests.java +++ b/fizz-core/src/test/java/com/fizzgate/util/MapUtilTests.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.util; +package com.fizzgate.util; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -26,6 +26,8 @@ import java.util.Map; import org.junit.jupiter.api.Test; +import com.fizzgate.util.MapUtil; + /** * * @author Francis Dong diff --git a/fizz-core/src/test/java/we/util/WebUtilsTests.java b/fizz-core/src/test/java/com/fizzgate/util/WebUtilsTests.java similarity index 98% rename from fizz-core/src/test/java/we/util/WebUtilsTests.java rename to fizz-core/src/test/java/com/fizzgate/util/WebUtilsTests.java index 9e2dc47..84aa970 100644 --- a/fizz-core/src/test/java/we/util/WebUtilsTests.java +++ b/fizz-core/src/test/java/com/fizzgate/util/WebUtilsTests.java @@ -1,6 +1,8 @@ -package we.util; +package com.fizzgate.util; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fizzgate.util.WebUtils; + import org.junit.jupiter.api.Test; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; diff --git a/fizz-core/src/test/java/we/util/YmlUtilsTest.java b/fizz-core/src/test/java/com/fizzgate/util/YmlUtilsTest.java similarity index 91% rename from fizz-core/src/test/java/we/util/YmlUtilsTest.java rename to fizz-core/src/test/java/com/fizzgate/util/YmlUtilsTest.java index ecb6b9a..8deb04b 100644 --- a/fizz-core/src/test/java/we/util/YmlUtilsTest.java +++ b/fizz-core/src/test/java/com/fizzgate/util/YmlUtilsTest.java @@ -1,10 +1,13 @@ -package we.util; +package com.fizzgate.util; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.CharsetUtil; import org.junit.jupiter.api.Test; import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean; +import com.fizzgate.util.PropertiesUtils; +import com.fizzgate.util.YmlUtils; + import java.io.IOException; import java.util.HashMap; import java.util.Map; diff --git a/fizz-core/src/test/java/we/fizz/group/DevTestGroup.java b/fizz-core/src/test/java/we/fizz/group/DevTestGroup.java deleted file mode 100644 index c9c9468..0000000 --- a/fizz-core/src/test/java/we/fizz/group/DevTestGroup.java +++ /dev/null @@ -1,4 +0,0 @@ -package we.fizz.group; - -public class DevTestGroup { -} diff --git a/fizz-core/src/test/java/we/fizz/group/FastTestGroup.java b/fizz-core/src/test/java/we/fizz/group/FastTestGroup.java deleted file mode 100644 index 8d9abd1..0000000 --- a/fizz-core/src/test/java/we/fizz/group/FastTestGroup.java +++ /dev/null @@ -1,4 +0,0 @@ -package we.fizz.group; - -public class FastTestGroup { -} diff --git a/fizz-core/src/test/java/we/fizz/group/SlowTestGroup.java b/fizz-core/src/test/java/we/fizz/group/SlowTestGroup.java deleted file mode 100644 index a99bbc6..0000000 --- a/fizz-core/src/test/java/we/fizz/group/SlowTestGroup.java +++ /dev/null @@ -1,4 +0,0 @@ -package we.fizz.group; - -public class SlowTestGroup { -} diff --git a/fizz-core/src/test/resources/log4j2-test.xml b/fizz-core/src/test/resources/log4j2-test.xml index 4148b77..9f303d8 100644 --- a/fizz-core/src/test/resources/log4j2-test.xml +++ b/fizz-core/src/test/resources/log4j2-test.xml @@ -16,6 +16,6 @@ - + diff --git a/fizz-plugin/plugin-core.md b/fizz-plugin/plugin-core.md index 880b301..e0f5e5c 100755 --- a/fizz-plugin/plugin-core.md +++ b/fizz-plugin/plugin-core.md @@ -17,7 +17,7 @@ title: plugin core > @FizzConfig 参数说明: > -> contentParser :配置内容解析器。选填,默认是 json 解析器 JsonParser 。也可以自定义解析器,只需实现 we.plugin.core.filter.config.ContentParser 接口 +> contentParser :配置内容解析器。选填,默认是 json 解析器 JsonParser 。也可以自定义解析器,只需实现 com.fizzgate.plugin.core.filter.config.ContentParser 接口 注意:默认解析器 JsonParser 的 parseRouterCfg 方法只对第一层的 json string 做了增强,但这也足够用了。如(注意 varJson 是个 json 字符串,并不是 json 对象): ```groovy @@ -63,7 +63,7 @@ void parseRouterCfg() { ``` **3、编写插件逻辑** -继承 we.plugin.core.filter.AbstractFizzPlugin ,并实现 pluginName 和 doFilter 方法 +继承 com.fizzgate.plugin.core.filter.AbstractFizzPlugin ,并实现 pluginName 和 doFilter 方法 > pluginName 方法:获取插件名称。无参,返回插件名称,要与网关后台配置的插件名称一致 > @@ -83,7 +83,7 @@ void parseRouterCfg() { 示例: ```java -package we.fizz.plugin.example.plugin; +package com.fizzgate.fizz.plugin.example.plugin; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -91,15 +91,15 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; -import we.plugin.core.filter.AbstractFizzPlugin; -import we.plugin.core.filter.config.FizzConfig; -import we.plugin.auth.ApiConfig; -import we.util.WebUtils; +import com.fizzgate.plugin.core.filter.AbstractFizzPlugin; +import com.fizzgate.plugin.core.filter.config.FizzConfig; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.util.WebUtils; import java.util.Map; -import static we.fizz.plugin.example.plugin.ExamplePlugin.PluginConfig; -import static we.fizz.plugin.example.plugin.ExamplePlugin.RouterConfig; +import static com.fizzgate.fizz.plugin.example.plugin.ExamplePlugin.PluginConfig; +import static com.fizzgate.fizz.plugin.example.plugin.ExamplePlugin.RouterConfig; @Slf4j @Component diff --git a/fizz-plugin/src/main/java/we/plugin/basicAuth/BasicAuthPluginFilter.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/basicAuth/BasicAuthPluginFilter.java similarity index 94% rename from fizz-plugin/src/main/java/we/plugin/basicAuth/BasicAuthPluginFilter.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/basicAuth/BasicAuthPluginFilter.java index 97e7f77..5d60077 100644 --- a/fizz-plugin/src/main/java/we/plugin/basicAuth/BasicAuthPluginFilter.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/basicAuth/BasicAuthPluginFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.basicAuth; +package com.fizzgate.plugin.basicAuth; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -25,13 +25,15 @@ import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReactorUtils; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.plugin.FizzPluginFilter; -import we.plugin.FizzPluginFilterChain; -import we.plugin.PluginConfig; -import we.util.JacksonUtils; -import we.util.ReactorUtils; -import we.util.WebUtils; import java.util.Base64; import java.util.HashMap; diff --git a/fizz-plugin/src/main/java/we/plugin/basicAuth/GlobalConfig.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/basicAuth/GlobalConfig.java similarity index 96% rename from fizz-plugin/src/main/java/we/plugin/basicAuth/GlobalConfig.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/basicAuth/GlobalConfig.java index 30da4a0..7ca77e6 100644 --- a/fizz-plugin/src/main/java/we/plugin/basicAuth/GlobalConfig.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/basicAuth/GlobalConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.basicAuth; +package com.fizzgate.plugin.basicAuth; import java.util.Map; diff --git a/fizz-plugin/src/main/java/we/plugin/core/config/WeFizzPluginAutoConfiguration.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/config/WeFizzPluginAutoConfiguration.java similarity index 61% rename from fizz-plugin/src/main/java/we/plugin/core/config/WeFizzPluginAutoConfiguration.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/core/config/WeFizzPluginAutoConfiguration.java index f9a2585..96369dd 100644 --- a/fizz-plugin/src/main/java/we/plugin/core/config/WeFizzPluginAutoConfiguration.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/config/WeFizzPluginAutoConfiguration.java @@ -1,17 +1,18 @@ -package we.plugin.core.config; +package com.fizzgate.plugin.core.config; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import we.plugin.core.filter.config.parser.JsonParser; -import we.plugin.core.spring.FizzPluginAliasProcessor; + +import com.fizzgate.plugin.core.filter.config.parser.JsonParser; +import com.fizzgate.plugin.core.spring.FizzPluginAliasProcessor; /** * @author huanghua */ @Configuration -@ComponentScan({"we.config", "we.fizz", "we.plugin", "we.filter", "we.proxy", "we.stats"/*, "we.plugin.core"*/}) +@ComponentScan({"com.fizzgate.config", "com.fizzgate.fizz", "com.fizzgate.plugin", "com.fizzgate.filter", "com.fizzgate.proxy", "com.fizzgate.stats"/*, "com.fizzgate.plugin.core"*/}) public class WeFizzPluginAutoConfiguration { @Bean diff --git a/fizz-plugin/src/main/java/we/plugin/core/filter/AbstractFizzPlugin.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/AbstractFizzPlugin.java similarity index 92% rename from fizz-plugin/src/main/java/we/plugin/core/filter/AbstractFizzPlugin.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/AbstractFizzPlugin.java index 80fb5b5..c55a17f 100644 --- a/fizz-plugin/src/main/java/we/plugin/core/filter/AbstractFizzPlugin.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/AbstractFizzPlugin.java @@ -1,19 +1,21 @@ -package we.plugin.core.filter; +package com.fizzgate.plugin.core.filter; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.Fizz; +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.plugin.PluginConfig; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.auth.ApiConfigService; +import com.fizzgate.plugin.core.filter.config.ContentParser; +import com.fizzgate.plugin.core.filter.config.FizzConfig; +import com.fizzgate.plugin.core.filter.config.parser.JsonParser; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.Fizz; -import we.plugin.FizzPluginFilter; -import we.plugin.PluginConfig; -import we.plugin.auth.ApiConfig; -import we.plugin.auth.ApiConfigService; -import we.plugin.core.filter.config.ContentParser; -import we.plugin.core.filter.config.FizzConfig; -import we.plugin.core.filter.config.parser.JsonParser; -import we.util.WebUtils; import javax.annotation.Resource; import java.lang.reflect.ParameterizedType; diff --git a/fizz-plugin/src/main/java/we/plugin/core/filter/config/ConfigUtils.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/ConfigUtils.java similarity index 96% rename from fizz-plugin/src/main/java/we/plugin/core/filter/config/ConfigUtils.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/ConfigUtils.java index 6b44215..1444998 100644 --- a/fizz-plugin/src/main/java/we/plugin/core/filter/config/ConfigUtils.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/ConfigUtils.java @@ -1,4 +1,4 @@ -package we.plugin.core.filter.config; +package com.fizzgate.plugin.core.filter.config; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; diff --git a/fizz-plugin/src/main/java/we/plugin/core/filter/config/ContentParser.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/ContentParser.java similarity index 87% rename from fizz-plugin/src/main/java/we/plugin/core/filter/config/ContentParser.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/ContentParser.java index f99c4af..b44316e 100644 --- a/fizz-plugin/src/main/java/we/plugin/core/filter/config/ContentParser.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/ContentParser.java @@ -1,4 +1,4 @@ -package we.plugin.core.filter.config; +package com.fizzgate.plugin.core.filter.config; import java.util.Map; diff --git a/fizz-plugin/src/main/java/we/plugin/core/filter/config/FizzConfig.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/FizzConfig.java similarity index 75% rename from fizz-plugin/src/main/java/we/plugin/core/filter/config/FizzConfig.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/FizzConfig.java index 557fc20..bdd4576 100644 --- a/fizz-plugin/src/main/java/we/plugin/core/filter/config/FizzConfig.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/FizzConfig.java @@ -1,9 +1,9 @@ -package we.plugin.core.filter.config; - -import we.plugin.core.filter.config.parser.JsonParser; +package com.fizzgate.plugin.core.filter.config; import java.lang.annotation.*; +import com.fizzgate.plugin.core.filter.config.parser.JsonParser; + import static java.lang.annotation.ElementType.TYPE; /** diff --git a/fizz-plugin/src/main/java/we/plugin/core/filter/config/parser/JsonParser.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/parser/JsonParser.java similarity index 96% rename from fizz-plugin/src/main/java/we/plugin/core/filter/config/parser/JsonParser.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/parser/JsonParser.java index 71c587d..7ff49dc 100644 --- a/fizz-plugin/src/main/java/we/plugin/core/filter/config/parser/JsonParser.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/filter/config/parser/JsonParser.java @@ -1,14 +1,14 @@ -package we.plugin.core.filter.config.parser; +package com.fizzgate.plugin.core.filter.config.parser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fizzgate.plugin.core.filter.config.ContentParser; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; -import we.plugin.core.filter.config.ContentParser; import javax.annotation.Resource; import java.lang.reflect.Field; diff --git a/fizz-plugin/src/main/java/we/plugin/core/spring/FizzPluginAliasProcessor.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/spring/FizzPluginAliasProcessor.java similarity index 95% rename from fizz-plugin/src/main/java/we/plugin/core/spring/FizzPluginAliasProcessor.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/core/spring/FizzPluginAliasProcessor.java index 5756e0f..fbf2fbe 100644 --- a/fizz-plugin/src/main/java/we/plugin/core/spring/FizzPluginAliasProcessor.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/spring/FizzPluginAliasProcessor.java @@ -1,4 +1,4 @@ -package we.plugin.core.spring; +package com.fizzgate.plugin.core.spring; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.config.BeanDefinition; @@ -7,7 +7,8 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.CollectionUtils; -import we.plugin.core.filter.AbstractFizzPlugin; + +import com.fizzgate.plugin.core.filter.AbstractFizzPlugin; import javax.annotation.PostConstruct; import java.util.Map; diff --git a/fizz-plugin/src/main/java/we/plugin/dedicatedline/auth/DedicatedLineApiAuthPluginFilter.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/auth/DedicatedLineApiAuthPluginFilter.java similarity index 92% rename from fizz-plugin/src/main/java/we/plugin/dedicatedline/auth/DedicatedLineApiAuthPluginFilter.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/auth/DedicatedLineApiAuthPluginFilter.java index b0ee3cf..1160c9d 100644 --- a/fizz-plugin/src/main/java/we/plugin/dedicatedline/auth/DedicatedLineApiAuthPluginFilter.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/auth/DedicatedLineApiAuthPluginFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.dedicatedline.auth; +package com.fizzgate.plugin.dedicatedline.auth; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; @@ -26,13 +26,15 @@ import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.dedicated_line.DedicatedLineService; +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.util.Consts; +import com.fizzgate.util.ReactorUtils; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.dedicated_line.DedicatedLineService; -import we.plugin.FizzPluginFilter; -import we.plugin.FizzPluginFilterChain; -import we.util.Consts; -import we.util.ReactorUtils; -import we.util.WebUtils; import javax.annotation.Resource; import java.util.Map; diff --git a/fizz-plugin/src/main/java/we/plugin/dedicatedline/codec/DedicatedLineCodecPluginFilter.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/codec/DedicatedLineCodecPluginFilter.java similarity index 91% rename from fizz-plugin/src/main/java/we/plugin/dedicatedline/codec/DedicatedLineCodecPluginFilter.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/codec/DedicatedLineCodecPluginFilter.java index 79a6d5b..76fa380 100644 --- a/fizz-plugin/src/main/java/we/plugin/dedicatedline/codec/DedicatedLineCodecPluginFilter.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/codec/DedicatedLineCodecPluginFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.dedicatedline.codec; +package com.fizzgate.plugin.dedicatedline.codec; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.SymmetricAlgorithm; @@ -33,16 +33,18 @@ import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.dedicated_line.DedicatedLineService; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.plugin.requestbody.RequestBodyPlugin; +import com.fizzgate.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator; +import com.fizzgate.spring.http.server.reactive.ext.FizzServerHttpResponseDecorator; +import com.fizzgate.util.Consts; +import com.fizzgate.util.NettyDataBufferUtils; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.dedicated_line.DedicatedLineService; -import we.plugin.FizzPluginFilterChain; -import we.plugin.requestbody.RequestBodyPlugin; -import we.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator; -import we.spring.http.server.reactive.ext.FizzServerHttpResponseDecorator; -import we.util.Consts; -import we.util.NettyDataBufferUtils; -import we.util.WebUtils; import javax.annotation.Resource; import java.util.Map; diff --git a/fizz-plugin/src/main/java/we/plugin/dedicatedline/pairing/DedicatedLinePairingPluginFilter.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/pairing/DedicatedLinePairingPluginFilter.java similarity index 92% rename from fizz-plugin/src/main/java/we/plugin/dedicatedline/pairing/DedicatedLinePairingPluginFilter.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/pairing/DedicatedLinePairingPluginFilter.java index b8307a4..82f3827 100644 --- a/fizz-plugin/src/main/java/we/plugin/dedicatedline/pairing/DedicatedLinePairingPluginFilter.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/dedicatedline/pairing/DedicatedLinePairingPluginFilter.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.dedicatedline.pairing; +package com.fizzgate.plugin.dedicatedline.pairing; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.ThreadContext; @@ -26,15 +26,17 @@ import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.config.SystemConfig; +import com.fizzgate.dedicated_line.DedicatedLineService; +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.util.Consts; +import com.fizzgate.util.DigestUtils; +import com.fizzgate.util.ReactorUtils; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.config.SystemConfig; -import we.dedicated_line.DedicatedLineService; -import we.plugin.FizzPluginFilter; -import we.plugin.FizzPluginFilterChain; -import we.util.Consts; -import we.util.DigestUtils; -import we.util.ReactorUtils; -import we.util.WebUtils; import javax.annotation.Resource; import java.util.Map; diff --git a/fizz-plugin/src/main/java/we/plugin/grayrelease/GrayReleasePlugin.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/grayrelease/GrayReleasePlugin.java similarity index 98% rename from fizz-plugin/src/main/java/we/plugin/grayrelease/GrayReleasePlugin.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/grayrelease/GrayReleasePlugin.java index e1857bb..cf628ce 100644 --- a/fizz-plugin/src/main/java/we/plugin/grayrelease/GrayReleasePlugin.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/grayrelease/GrayReleasePlugin.java @@ -15,12 +15,19 @@ * along with this program. If not, see . */ -package we.plugin.grayrelease; +package com.fizzgate.plugin.grayrelease; import com.auth0.jwt.JWT; import com.auth0.jwt.interfaces.Claim; import com.auth0.jwt.interfaces.DecodedJWT; import com.fasterxml.jackson.core.type.TypeReference; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.requestbody.RequestBodyPlugin; +import com.fizzgate.proxy.Route; +import com.fizzgate.spring.web.server.ext.FizzServerWebExchangeDecorator; +import com.fizzgate.util.*; + import inet.ipaddr.AddressStringException; import inet.ipaddr.IPAddress; import inet.ipaddr.IPAddressSeqRange; @@ -37,12 +44,6 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; -import we.plugin.FizzPluginFilterChain; -import we.plugin.auth.ApiConfig; -import we.plugin.requestbody.RequestBodyPlugin; -import we.proxy.Route; -import we.spring.web.server.ext.FizzServerWebExchangeDecorator; -import we.util.*; import java.nio.charset.StandardCharsets; import java.util.*; diff --git a/fizz-plugin/src/main/java/we/plugin/jwt/GlobalConfig.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/jwt/GlobalConfig.java similarity index 97% rename from fizz-plugin/src/main/java/we/plugin/jwt/GlobalConfig.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/jwt/GlobalConfig.java index 3976363..0eaa450 100644 --- a/fizz-plugin/src/main/java/we/plugin/jwt/GlobalConfig.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/jwt/GlobalConfig.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package we.plugin.jwt; +package com.fizzgate.plugin.jwt; /** * diff --git a/fizz-plugin/src/main/java/we/plugin/jwt/JwtAuthPluginFilter.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/jwt/JwtAuthPluginFilter.java similarity index 97% rename from fizz-plugin/src/main/java/we/plugin/jwt/JwtAuthPluginFilter.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/jwt/JwtAuthPluginFilter.java index 13ad9c7..19eeb8b 100644 --- a/fizz-plugin/src/main/java/we/plugin/jwt/JwtAuthPluginFilter.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/jwt/JwtAuthPluginFilter.java @@ -15,13 +15,18 @@ * along with this program. If not, see . */ -package we.plugin.jwt; +package com.fizzgate.plugin.jwt; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.JWTVerifier; +import com.fizzgate.plugin.PluginFilter; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.PemUtils; +import com.fizzgate.util.WebUtils; + import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,10 +35,6 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; -import we.plugin.PluginFilter; -import we.util.JacksonUtils; -import we.util.PemUtils; -import we.util.WebUtils; import java.security.interfaces.ECPublicKey; import java.security.interfaces.RSAPublicKey; diff --git a/fizz-plugin/src/main/java/we/plugin/myplugin/MyPlugin.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/myplugin/MyPlugin.java similarity index 81% rename from fizz-plugin/src/main/java/we/plugin/myplugin/MyPlugin.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/myplugin/MyPlugin.java index 753d65c..a0761ef 100644 --- a/fizz-plugin/src/main/java/we/plugin/myplugin/MyPlugin.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/myplugin/MyPlugin.java @@ -1,10 +1,12 @@ -package we.plugin.myplugin; +package com.fizzgate.plugin.myplugin; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.plugin.FizzPluginFilter; +import com.fizzgate.plugin.FizzPluginFilterChain; + import reactor.core.publisher.Mono; -import we.plugin.FizzPluginFilter; -import we.plugin.FizzPluginFilterChain; import java.util.Map; diff --git a/fizz-plugin/src/main/java/we/plugin/myplugin/MyPluginPlus.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/myplugin/MyPluginPlus.java similarity index 89% rename from fizz-plugin/src/main/java/we/plugin/myplugin/MyPluginPlus.java rename to fizz-plugin/src/main/java/com/fizzgate/plugin/myplugin/MyPluginPlus.java index 3f6976e..3a64be1 100644 --- a/fizz-plugin/src/main/java/we/plugin/myplugin/MyPluginPlus.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/myplugin/MyPluginPlus.java @@ -1,15 +1,17 @@ -package we.plugin.myplugin; +package com.fizzgate.plugin.myplugin; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; + +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.core.filter.AbstractFizzPlugin; +import com.fizzgate.plugin.core.filter.config.FizzConfig; +import com.fizzgate.util.WebUtils; + import reactor.core.publisher.Mono; -import we.plugin.auth.ApiConfig; -import we.plugin.core.filter.AbstractFizzPlugin; -import we.plugin.core.filter.config.FizzConfig; -import we.util.WebUtils; import java.util.Map; diff --git a/fizz-plugin/src/main/resources/META-INF/spring.factories b/fizz-plugin/src/main/resources/META-INF/spring.factories index 4421ac1..807628e 100644 --- a/fizz-plugin/src/main/resources/META-INF/spring.factories +++ b/fizz-plugin/src/main/resources/META-INF/spring.factories @@ -1,3 +1,3 @@ # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - we.plugin.core.config.WeFizzPluginAutoConfiguration \ No newline at end of file + com.fizzgate.plugin.core.config.WeFizzPluginAutoConfiguration \ No newline at end of file diff --git a/fizz-plugin/src/test/java/we/plugin/basicAuth/BasicAuthPluginFilterTests.java b/fizz-plugin/src/test/java/com/fizzgate/plugin/basicAuth/BasicAuthPluginFilterTests.java similarity index 95% rename from fizz-plugin/src/test/java/we/plugin/basicAuth/BasicAuthPluginFilterTests.java rename to fizz-plugin/src/test/java/com/fizzgate/plugin/basicAuth/BasicAuthPluginFilterTests.java index 82b5b2e..3e973ba 100644 --- a/fizz-plugin/src/test/java/we/plugin/basicAuth/BasicAuthPluginFilterTests.java +++ b/fizz-plugin/src/test/java/com/fizzgate/plugin/basicAuth/BasicAuthPluginFilterTests.java @@ -15,10 +15,13 @@ * along with this program. If not, see . */ -package we.plugin.basicAuth; +package com.fizzgate.plugin.basicAuth; import org.junit.jupiter.api.Test; +import com.fizzgate.plugin.basicAuth.BasicAuthPluginFilter; +import com.fizzgate.plugin.basicAuth.GlobalConfig; + import java.util.Base64; import java.util.HashMap; import java.util.Map; diff --git a/fizz-plugin/src/test/java/we/plugin/core/filter/config/parser/JsonParserTest.java b/fizz-plugin/src/test/java/com/fizzgate/plugin/core/filter/config/parser/JsonParserTest.java similarity index 93% rename from fizz-plugin/src/test/java/we/plugin/core/filter/config/parser/JsonParserTest.java rename to fizz-plugin/src/test/java/com/fizzgate/plugin/core/filter/config/parser/JsonParserTest.java index 271f275..87bb4bf 100644 --- a/fizz-plugin/src/test/java/we/plugin/core/filter/config/parser/JsonParserTest.java +++ b/fizz-plugin/src/test/java/com/fizzgate/plugin/core/filter/config/parser/JsonParserTest.java @@ -1,11 +1,12 @@ -package we.plugin.core.filter.config.parser; +package com.fizzgate.plugin.core.filter.config.parser; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fizzgate.plugin.core.filter.config.FizzConfig; +import com.fizzgate.plugin.core.filter.config.parser.JsonParser; import com.google.common.collect.Maps; import lombok.Data; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import we.plugin.core.filter.config.FizzConfig; import java.lang.reflect.Field; import java.util.Map; diff --git a/fizz-plugin/src/test/java/we/plugin/grayrelease/GrayReleasePluginTests.java b/fizz-plugin/src/test/java/com/fizzgate/plugin/grayrelease/GrayReleasePluginTests.java similarity index 95% rename from fizz-plugin/src/test/java/we/plugin/grayrelease/GrayReleasePluginTests.java rename to fizz-plugin/src/test/java/com/fizzgate/plugin/grayrelease/GrayReleasePluginTests.java index ee0fe0b..e80fe32 100644 --- a/fizz-plugin/src/test/java/we/plugin/grayrelease/GrayReleasePluginTests.java +++ b/fizz-plugin/src/test/java/com/fizzgate/plugin/grayrelease/GrayReleasePluginTests.java @@ -1,6 +1,18 @@ -package we.plugin.grayrelease; +package com.fizzgate.plugin.grayrelease; import com.fasterxml.jackson.core.type.TypeReference; +import com.fizzgate.filter.AggregateFilter; +import com.fizzgate.filter.FilterResult; +import com.fizzgate.fizz.ConfigLoader; +import com.fizzgate.plugin.FizzPluginFilterChain; +import com.fizzgate.plugin.auth.ApiConfig; +import com.fizzgate.plugin.grayrelease.GrayReleasePlugin; +import com.fizzgate.proxy.Route; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReflectionUtils; +import com.fizzgate.util.WebUtils; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; @@ -9,16 +21,6 @@ import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Mono; -import we.filter.AggregateFilter; -import we.filter.FilterResult; -import we.fizz.ConfigLoader; -import we.plugin.FizzPluginFilterChain; -import we.plugin.auth.ApiConfig; -import we.proxy.Route; -import we.util.Consts; -import we.util.JacksonUtils; -import we.util.ReflectionUtils; -import we.util.WebUtils; import java.util.HashMap; import java.util.Map; diff --git a/fizz-plugin/src/test/java/we/plugin/jwtAuth/JwtAuthPluginFilterTests.java b/fizz-plugin/src/test/java/com/fizzgate/plugin/jwtAuth/JwtAuthPluginFilterTests.java similarity index 97% rename from fizz-plugin/src/test/java/we/plugin/jwtAuth/JwtAuthPluginFilterTests.java rename to fizz-plugin/src/test/java/com/fizzgate/plugin/jwtAuth/JwtAuthPluginFilterTests.java index 8e45a28..f59bf55 100644 --- a/fizz-plugin/src/test/java/we/plugin/jwtAuth/JwtAuthPluginFilterTests.java +++ b/fizz-plugin/src/test/java/com/fizzgate/plugin/jwtAuth/JwtAuthPluginFilterTests.java @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -package we.plugin.jwtAuth; +package com.fizzgate.plugin.jwtAuth; import com.auth0.jwt.interfaces.DecodedJWT; +import com.fizzgate.plugin.jwt.JwtAuthPluginFilter; + import org.junit.jupiter.api.Test; -import we.plugin.jwt.JwtAuthPluginFilter; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories b/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories index d6a8789..f521152 100644 --- a/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,53 +1,53 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -we.config.AggregateRedisConfig,\ -we.config.ApolloConfig,\ -we.config.AppConfigProperties,\ -we.config.FlowControlConfig,\ -we.config.FlowStatSchedConfig,\ -we.config.ProxyWebClientConfig,\ -we.config.RefreshLocalCacheConfig,\ -we.config.SystemConfig,\ -we.config.WebServerConfig,\ -we.config.FizzGatewayNodeStatSchedConfig,\ -we.controller.HealthCheckController,\ -we.controller.CacheCheckController,\ -we.controller.CallbackController,\ -we.controller.ConfigController,\ -we.controller.FlowControlController,\ -we.controller.ManagerConfigController,\ -we.filter.AggregateFilter,\ -we.filter.CallbackFilter,\ -we.filter.CorsFilterConfig,\ -we.filter.FilterExceptionHandlerConfig,\ -we.filter.FizzLogFilter,\ -we.filter.FlowControlFilter,\ -we.filter.PreprocessFilter,\ -we.filter.RouteFilter,\ -we.fizz.AggregateService,\ -we.fizz.ConfigLoader,\ -we.listener.AggregateChannelListener,\ -we.plugin.auth.ApiConfigService,\ -we.plugin.auth.ApiConfig2appsService,\ -we.plugin.auth.AppService,\ -we.plugin.auth.AuthPluginFilter,\ -we.plugin.auth.GatewayGroupService,\ -we.plugin.basicAuth.BasicAuthPluginFilter,\ -we.plugin.jwt.JwtAuthPluginFilter,\ -we.plugin.stat.StatPluginFilter,\ -we.proxy.dubbo.ApacheDubboGenericService,\ -we.proxy.grpc.client.GrpcProxyClient,\ -we.proxy.grpc.GrpcGenericService,\ -we.proxy.grpc.GrpcInstanceServiceImpl,\ -we.proxy.http.HttpInstanceServiceImpl,\ -we.proxy.CallbackService,\ -we.proxy.DisableDiscoveryUriSelector,\ -we.proxy.EurekaUriSelector,\ -we.proxy.FizzWebClient,\ -we.proxy.NacosUriSelector,\ -we.proxy.RpcInstanceServiceImpl,\ -we.stats.ratelimit.ResourceRateLimitConfigService,\ -we.global_resource.GlobalResourceService,\ -we.dedicated_line.DedicatedLineWebServer +com.fizzgate.config.AggregateRedisConfig,\ +com.fizzgate.config.ApolloConfig,\ +com.fizzgate.config.AppConfigProperties,\ +com.fizzgate.config.FlowControlConfig,\ +com.fizzgate.config.FlowStatSchedConfig,\ +com.fizzgate.config.ProxyWebClientConfig,\ +com.fizzgate.config.RefreshLocalCacheConfig,\ +com.fizzgate.config.SystemConfig,\ +com.fizzgate.config.WebServerConfig,\ +com.fizzgate.config.FizzGatewayNodeStatSchedConfig,\ +com.fizzgate.controller.HealthCheckController,\ +com.fizzgate.controller.CacheCheckController,\ +com.fizzgate.controller.CallbackController,\ +com.fizzgate.controller.ConfigController,\ +com.fizzgate.controller.FlowControlController,\ +com.fizzgate.controller.ManagerConfigController,\ +com.fizzgate.filter.AggregateFilter,\ +com.fizzgate.filter.CallbackFilter,\ +com.fizzgate.filter.CorsFilterConfig,\ +com.fizzgate.filter.FilterExceptionHandlerConfig,\ +com.fizzgate.filter.FizzLogFilter,\ +com.fizzgate.filter.FlowControlFilter,\ +com.fizzgate.filter.PreprocessFilter,\ +com.fizzgate.filter.RouteFilter,\ +com.fizzgate.fizz.AggregateService,\ +com.fizzgate.fizz.ConfigLoader,\ +com.fizzgate.listener.AggregateChannelListener,\ +com.fizzgate.plugin.auth.ApiConfigService,\ +com.fizzgate.plugin.auth.ApiConfig2appsService,\ +com.fizzgate.plugin.auth.AppService,\ +com.fizzgate.plugin.auth.AuthPluginFilter,\ +com.fizzgate.plugin.auth.GatewayGroupService,\ +com.fizzgate.plugin.basicAuth.BasicAuthPluginFilter,\ +com.fizzgate.plugin.jwt.JwtAuthPluginFilter,\ +com.fizzgate.plugin.stat.StatPluginFilter,\ +com.fizzgate.proxy.dubbo.ApacheDubboGenericService,\ +com.fizzgate.proxy.grpc.client.GrpcProxyClient,\ +com.fizzgate.proxy.grpc.GrpcGenericService,\ +com.fizzgate.proxy.grpc.GrpcInstanceServiceImpl,\ +com.fizzgate.proxy.http.HttpInstanceServiceImpl,\ +com.fizzgate.proxy.CallbackService,\ +com.fizzgate.proxy.DisableDiscoveryUriSelector,\ +com.fizzgate.proxy.EurekaUriSelector,\ +com.fizzgate.proxy.FizzWebClient,\ +com.fizzgate.proxy.NacosUriSelector,\ +com.fizzgate.proxy.RpcInstanceServiceImpl,\ +com.fizzgate.stats.ratelimit.ResourceRateLimitConfigService,\ +com.fizzgate.global_resource.GlobalResourceService,\ +com.fizzgate.dedicated_line.DedicatedLineWebServer # Application Listeners -org.springframework.context.ApplicationListener=we.context.event.FizzApplicationListener +org.springframework.context.ApplicationListener=com.fizzgate.context.event.FizzApplicationListener diff --git a/repo/com/networknt/json-schema-validator-i18n-support/1.0.39_5/json-schema-validator-i18n-support-1.0.39_5.jar b/repo/com/networknt/json-schema-validator-i18n-support/1.0.39_5/json-schema-validator-i18n-support-1.0.39_5.jar deleted file mode 100644 index dd823eb37ea42433ecd7970bfc0bb73b85d836da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188874 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∓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 RWq^NC&;?ji0ZAFx{{Wzs7L@=1 diff --git a/repo/com/networknt/json-schema-validator-i18n-support/1.0.39_6/json-schema-validator-i18n-support-1.0.39_6.jar b/repo/com/networknt/json-schema-validator-i18n-support/1.0.39_6/json-schema-validator-i18n-support-1.0.39_6.jar new file mode 100644 index 0000000000000000000000000000000000000000..b37291a98cfdd934d6ad4b1adeeb11b0f84b2dff GIT binary patch literal 195706 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 #?P9Lj(j!o;Ym`m}14) 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ǥ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.0.0 com.networknt json-schema-validator-i18n-support - 1.0.39_5 + 1.0.39_6 POM was created from install:install-file JsonSchemaValidator diff --git a/repo/com/networknt/json-schema-validator-i18n-support/maven-metadata-local.xml b/repo/com/networknt/json-schema-validator-i18n-support/maven-metadata-local.xml index f30f588..614a6a4 100644 --- a/repo/com/networknt/json-schema-validator-i18n-support/maven-metadata-local.xml +++ b/repo/com/networknt/json-schema-validator-i18n-support/maven-metadata-local.xml @@ -3,9 +3,9 @@ com.networknt json-schema-validator-i18n-support - 1.0.39_5 + 1.0.39_6 - 1.0.39_5 + 1.0.39_6 20210430081305 From ed7863f57b1c22dbd2d77703511a06b73718bede Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Sat, 4 Feb 2023 11:52:15 +0800 Subject: [PATCH 23/37] Fizz config support ConditionalOnXXX annotations --- .../config/FizzBeanFactoryPostProcessor.java | 39 ++-- .../config/FizzEnvironmentPostProcessor.java | 199 ++++++++++++++++++ .../main/resources/META-INF/spring.factories | 6 +- 3 files changed, 224 insertions(+), 20 deletions(-) create mode 100644 fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java diff --git a/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java index 44a06e1..439cbb4 100644 --- a/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java +++ b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java @@ -17,13 +17,10 @@ package com.fizzgate.beans.factory.config; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fizzgate.config.FizzConfigConfiguration; -import com.fizzgate.config.RedisReactiveProperties; import com.fizzgate.context.config.annotation.FizzRefreshScope; -import com.fizzgate.context.event.FizzRefreshEvent; -import com.fizzgate.util.*; - +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReflectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -38,13 +35,11 @@ import org.springframework.context.EnvironmentAware; import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; -import org.springframework.core.env.MapPropertySource; -import org.springframework.core.env.MutablePropertySources; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import java.util.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; /** * @author hongqiaowei @@ -54,25 +49,31 @@ public class FizzBeanFactoryPostProcessor implements BeanFactoryPostProcessor, E private static final Logger LOGGER = LoggerFactory.getLogger(FizzBeanFactoryPostProcessor.class); - private ApplicationContext applicationContext; + private static ApplicationContext applicationContext; + private ConfigurableEnvironment environment; - private final Map property2beanMap = new HashMap<>(); + private final Map property2beanMap = new HashMap<>(); private ReactiveStringRedisTemplate reactiveStringRedisTemplate; + + protected static ApplicationContext getApplicationContext() { + return applicationContext; + } + @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { String fizzConfigEnable = environment.getProperty("fizz.config.enable", Consts.S.TRUE); if (fizzConfigEnable.equals(Consts.S.TRUE)) { - initReactiveStringRedisTemplate(); - initFizzPropertySource(); + // initReactiveStringRedisTemplate(); + // initFizzPropertySource(); initBeanProperty2beanMap(beanFactory); } } - private void initReactiveStringRedisTemplate() { + /* private void initReactiveStringRedisTemplate() { RedisReactiveProperties redisReactiveProperties = new RedisReactiveProperties() { }; @@ -92,9 +93,9 @@ public class FizzBeanFactoryPostProcessor implements BeanFactoryPostProcessor, E } reactiveStringRedisTemplate = ReactiveRedisHelper.getStringRedisTemplate(redisReactiveProperties); - } + } */ - private void initFizzPropertySource() { + /* private void initFizzPropertySource() { MutablePropertySources propertySources = environment.getPropertySources(); Map sources = new HashMap<>(); MapPropertySource fizzPropertySource = new MapPropertySource(FizzConfigConfiguration.PROPERTY_SOURCE, sources); @@ -191,7 +192,7 @@ public class FizzBeanFactoryPostProcessor implements BeanFactoryPostProcessor, E if (result.code == Result.FAIL) { throw new RuntimeException(result.msg, result.t); } - } + } */ private void initBeanProperty2beanMap(ConfigurableListableBeanFactory beanFactory) { ClassLoader beanClassLoader = beanFactory.getBeanClassLoader(); diff --git a/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java new file mode 100644 index 0000000..08d1bd3 --- /dev/null +++ b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java @@ -0,0 +1,199 @@ +package com.fizzgate.beans.factory.config; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fizzgate.config.FizzConfigConfiguration; +import com.fizzgate.config.RedisReactiveProperties; +import com.fizzgate.context.event.FizzRefreshEvent; +import com.fizzgate.util.Consts; +import com.fizzgate.util.JacksonUtils; +import com.fizzgate.util.ReactiveRedisHelper; +import com.fizzgate.util.Result; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.event.ApplicationPreparedEvent; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.boot.logging.DeferredLog; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.event.SmartApplicationListener; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; +import org.springframework.data.redis.core.ReactiveStringRedisTemplate; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author hongqiaowei + */ + +public class FizzEnvironmentPostProcessor implements EnvironmentPostProcessor, SmartApplicationListener { + + private static final DeferredLog LOGGER = new DeferredLog(); + + private static Logger LOG = null; + + + private ConfigurableEnvironment environment; + + private ReactiveStringRedisTemplate reactiveStringRedisTemplate; + + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + String fizzConfigEnable = environment.getProperty("fizz.config.enable", Consts.S.TRUE); + if (fizzConfigEnable.equals(Consts.S.TRUE)) { + String host = environment.getProperty("aggregate.redis.host"); + String clusterNodes = environment.getProperty("aggregate.redis.clusterNodes"); + if (StringUtils.isNotBlank(host) || StringUtils.isNotBlank(clusterNodes)) { + this.environment = environment; + initReactiveStringRedisTemplate(); + initFizzPropertySource(); + } + } + } + + private void initReactiveStringRedisTemplate() { + RedisReactiveProperties redisReactiveProperties = new RedisReactiveProperties() { + }; + + String host = environment.getProperty("aggregate.redis.host"); + if (StringUtils.isBlank(host)) { + redisReactiveProperties.setType(RedisReactiveProperties.CLUSTER); + redisReactiveProperties.setClusterNodes(environment.getProperty("aggregate.redis.clusterNodes")); + } else { + redisReactiveProperties.setHost(host); + redisReactiveProperties.setPort(Integer.parseInt(environment.getProperty("aggregate.redis.port"))); + redisReactiveProperties.setDatabase(Integer.parseInt(environment.getProperty("aggregate.redis.database"))); + } + + String password = environment.getProperty("aggregate.redis.password"); + if (StringUtils.isNotBlank(password)) { + redisReactiveProperties.setPassword(password); + } + + reactiveStringRedisTemplate = ReactiveRedisHelper.getStringRedisTemplate(redisReactiveProperties); + } + + private void initFizzPropertySource() { + MutablePropertySources propertySources = environment.getPropertySources(); + Map sources = new HashMap<>(); + MapPropertySource fizzPropertySource = new MapPropertySource(FizzConfigConfiguration.PROPERTY_SOURCE, sources); + propertySources.addFirst(fizzPropertySource); + + Result result = Result.succ(); + Flux> fizzConfigs = reactiveStringRedisTemplate.opsForHash().entries("fizz_config"); + fizzConfigs.collectList() + .defaultIfEmpty(Collections.emptyList()) + .flatMap( + es -> { + if (es.isEmpty()) { + LOGGER.info("no fizz configs"); + } else { + String value = null; + try { + for (Map.Entry e : es) { + String key = (String) e.getKey(); + value = (String) e.getValue(); + Map config = JacksonUtils.readValue(value, new TypeReference>(){}); + sources.put(key, config.get(key)); + } + } catch (Throwable t) { + result.code = Result.FAIL; + result.msg = "init fizz configs error, json: " + value; + result.t = t; + } + } + return Mono.empty(); + } + ) + .onErrorReturn( + throwable -> { + result.code = Result.FAIL; + result.msg = "init fizz configs error"; + result.t = throwable; + return true; + }, + result + ) + .block(); + + if (result.code == Result.FAIL) { + throw new RuntimeException(result.msg, result.t); + } + if (!sources.isEmpty()) { + LOGGER.info("fizz configs: " + JacksonUtils.writeValueAsString(sources)); + } + + String channel = "fizz_config_channel"; + reactiveStringRedisTemplate.listenToChannel(channel) + .doOnError( + t -> { + result.code = Result.FAIL; + result.msg = "lsn " + channel + " channel error"; + result.t = t; + LOGGER.error("lsn channel " + channel + " error", t); + } + ) + .doOnSubscribe( + s -> { + LOGGER.info("success to lsn on " + channel); + } + ) + .doOnNext( + msg -> { + if (LOG == null) { + LOG = LoggerFactory.getLogger(FizzEnvironmentPostProcessor.class); + } + String message = msg.getMessage(); + try { + Map changedPropertyValueMap = new HashMap<>(); + List> changes = JacksonUtils.readValue(message, new TypeReference>>(){}); + for (Map change : changes) { + int isDeleted = (int) change.remove("isDeleted"); + Map.Entry propertyValue = change.entrySet().iterator().next(); + String property = propertyValue.getKey(); + Object v = null; + if (isDeleted == 1) { + sources.remove(property); + } else { + v = propertyValue.getValue(); + sources.put(property, v); + } + changedPropertyValueMap.put(property, v); + } + LOG.info("new fizz configs: " + JacksonUtils.writeValueAsString(sources)); + ApplicationContext applicationContext = FizzBeanFactoryPostProcessor.getApplicationContext(); + FizzRefreshEvent refreshEvent = new FizzRefreshEvent(applicationContext, FizzRefreshEvent.ENV_CHANGE, changedPropertyValueMap); + applicationContext.publishEvent(refreshEvent); + } catch (Throwable t) { + LOG.error("update fizz config " + message + " error", t); + } + } + ) + .subscribe(); + + if (result.code == Result.FAIL) { + throw new RuntimeException(result.msg, result.t); + } + } + + @Override + public boolean supportsEventType(Class eventType) { + return ApplicationPreparedEvent.class.isAssignableFrom(eventType); + } + + @Override + public void onApplicationEvent(ApplicationEvent event) { + if (event instanceof ApplicationPreparedEvent) { + LOGGER.replayTo(FizzEnvironmentPostProcessor.class); + } + } +} \ No newline at end of file diff --git a/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories b/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories index f521152..dcba522 100644 --- a/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/fizz-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -50,4 +50,8 @@ com.fizzgate.global_resource.GlobalResourceService,\ com.fizzgate.dedicated_line.DedicatedLineWebServer # Application Listeners -org.springframework.context.ApplicationListener=com.fizzgate.context.event.FizzApplicationListener +org.springframework.context.ApplicationListener=\ +com.fizzgate.context.event.FizzApplicationListener,\ +com.fizzgate.beans.factory.config.FizzEnvironmentPostProcessor + +org.springframework.boot.env.EnvironmentPostProcessor=com.fizzgate.beans.factory.config.FizzEnvironmentPostProcessor From 50869cd03a9789d829e3f2aaf6ae344e3dee0b4f Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Tue, 7 Feb 2023 10:10:26 +0800 Subject: [PATCH 24/37] add package path to componentScan --- .../plugin/core/config/WeFizzPluginAutoConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fizz-plugin/src/main/java/com/fizzgate/plugin/core/config/WeFizzPluginAutoConfiguration.java b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/config/WeFizzPluginAutoConfiguration.java index 96369dd..aea0fdf 100644 --- a/fizz-plugin/src/main/java/com/fizzgate/plugin/core/config/WeFizzPluginAutoConfiguration.java +++ b/fizz-plugin/src/main/java/com/fizzgate/plugin/core/config/WeFizzPluginAutoConfiguration.java @@ -12,7 +12,7 @@ import com.fizzgate.plugin.core.spring.FizzPluginAliasProcessor; * @author huanghua */ @Configuration -@ComponentScan({"com.fizzgate.config", "com.fizzgate.fizz", "com.fizzgate.plugin", "com.fizzgate.filter", "com.fizzgate.proxy", "com.fizzgate.stats"/*, "com.fizzgate.plugin.core"*/}) +@ComponentScan({"we.config", "we.fizz", "we.plugin", "we.filter", "we.proxy", "we.stats", "com.fizzgate.config", "com.fizzgate.fizz", "com.fizzgate.plugin", "com.fizzgate.filter", "com.fizzgate.proxy", "com.fizzgate.stats"/*, "com.fizzgate.plugin.core"*/}) public class WeFizzPluginAutoConfiguration { @Bean From 84f087e1c1b5f69ff913904fb33a41edf5a70232 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Fri, 10 Feb 2023 18:07:19 +0800 Subject: [PATCH 25/37] Fix problem when update fizz config dynamically --- .../config/FizzBeanFactoryPostProcessor.java | 8 ++++++++ .../config/FizzEnvironmentPostProcessor.java | 16 +++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java index 439cbb4..573cc60 100644 --- a/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java +++ b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzBeanFactoryPostProcessor.java @@ -17,6 +17,7 @@ package com.fizzgate.beans.factory.config; +import com.fizzgate.config.FizzConfigConfiguration; import com.fizzgate.context.config.annotation.FizzRefreshScope; import com.fizzgate.util.Consts; import com.fizzgate.util.JacksonUtils; @@ -35,6 +36,8 @@ import org.springframework.context.EnvironmentAware; import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import java.util.HashMap; @@ -69,6 +72,11 @@ public class FizzBeanFactoryPostProcessor implements BeanFactoryPostProcessor, E if (fizzConfigEnable.equals(Consts.S.TRUE)) { // initReactiveStringRedisTemplate(); // initFizzPropertySource(); + + Map sources = FizzEnvironmentPostProcessor.getSources(); + MapPropertySource fizzPropertySource = new MapPropertySource(FizzConfigConfiguration.PROPERTY_SOURCE + "AfterBeanFactory", sources); + environment.getPropertySources().addFirst(fizzPropertySource); + initBeanProperty2beanMap(beanFactory); } } diff --git a/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java index 08d1bd3..c0b9583 100644 --- a/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java +++ b/fizz-core/src/main/java/com/fizzgate/beans/factory/config/FizzEnvironmentPostProcessor.java @@ -18,6 +18,7 @@ import org.springframework.boot.logging.DeferredLog; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; +import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.MutablePropertySources; @@ -34,18 +35,28 @@ import java.util.Map; * @author hongqiaowei */ -public class FizzEnvironmentPostProcessor implements EnvironmentPostProcessor, SmartApplicationListener { +public class FizzEnvironmentPostProcessor implements EnvironmentPostProcessor, SmartApplicationListener, Ordered { private static final DeferredLog LOGGER = new DeferredLog(); private static Logger LOG = null; + private static final Map sources = new HashMap<>(); + private ConfigurableEnvironment environment; private ReactiveStringRedisTemplate reactiveStringRedisTemplate; + protected static Map getSources() { + return sources; + } + + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE; + } + @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { String fizzConfigEnable = environment.getProperty("fizz.config.enable", Consts.S.TRUE); @@ -84,8 +95,7 @@ public class FizzEnvironmentPostProcessor implements EnvironmentPostProcessor, S private void initFizzPropertySource() { MutablePropertySources propertySources = environment.getPropertySources(); - Map sources = new HashMap<>(); - MapPropertySource fizzPropertySource = new MapPropertySource(FizzConfigConfiguration.PROPERTY_SOURCE, sources); + MapPropertySource fizzPropertySource = new MapPropertySource(FizzConfigConfiguration.PROPERTY_SOURCE + "AfterEnv", sources); propertySources.addFirst(fizzPropertySource); Result result = Result.succ(); From f409c0db44407e5389da24abf5eb2e9b83d6420d Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Fri, 10 Feb 2023 18:09:13 +0800 Subject: [PATCH 26/37] Handler client request with / path --- .../main/java/com/fizzgate/util/WebUtils.java | 124 ++++++++++++------ .../java/com/fizzgate/util/WebUtilsTests.java | 36 +++++ 2 files changed, 117 insertions(+), 43 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java index cb703bd..79e2b32 100644 --- a/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java @@ -224,23 +224,36 @@ public abstract class WebUtils { if (svc == null) { String p = exchange.getRequest().getPath().value(); int secFS = p.indexOf(Consts.S.FORWARD_SLASH, 1); - String prefix = p.substring(0, secFS); - if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { - if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { - int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); - svc = p.substring(secFS + 1, trdFS); - } else { - svc = p.substring(1, secFS); - } - } else { - if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { - int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); - if (trdFS == -1) { - trdFS = p.length(); - } - svc = p.substring(secFS + 1, trdFS); + if (secFS == -1) { + if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { + svc = p.substring(1); } else { - throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); + String prefix = p.substring(1); + if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + throw Utils.runtimeExceptionWithoutStack("no service in request path"); + } else { + throw Utils.runtimeExceptionWithoutStack("request prefix is wrong and no service in request path"); + } + } + } else { + String prefix = p.substring(0, secFS); + if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { + if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); + svc = p.substring(secFS + 1, trdFS); + } else { + svc = p.substring(1, secFS); + } + } else { + if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); + if (trdFS == -1) { + trdFS = p.length(); + } + svc = p.substring(secFS + 1, trdFS); + } else { + throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); + } } } exchange.getAttributes().put(clientService, svc); @@ -356,25 +369,37 @@ public abstract class WebUtils { // p = exchange.getRequest().getPath().value(); p = exchange.getRequest().getURI().getPath(); int secFS = p.indexOf(Consts.S.FORWARD_SLASH, 1); - String prefix = p.substring(0, secFS); - if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { - if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { - int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); - p = p.substring(trdFS); - } else { - p = p.substring(secFS); - } - } else { - - if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { - int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); - if (trdFS == -1) { - p = Consts.S.FORWARD_SLASH_STR; + if (secFS == -1) { + if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { + p = Consts.S.FORWARD_SLASH_STR; + } else { + String prefix = p.substring(1); + if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + throw Utils.runtimeExceptionWithoutStack("no service and request path"); } else { + throw Utils.runtimeExceptionWithoutStack("request prefix is wrong, no service and request path"); + } + } + } else { + String prefix = p.substring(0, secFS); + if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { + if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); p = p.substring(trdFS); + } else { + p = p.substring(secFS); } } else { - throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); + if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); + if (trdFS == -1) { + p = Consts.S.FORWARD_SLASH_STR; + } else { + p = p.substring(trdFS); + } + } else { + throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); + } } } exchange.getAttributes().put(clientRequestPath, p); @@ -394,19 +419,32 @@ public abstract class WebUtils { String prefix = exchange.getAttribute(clientRequestPathPrefix); if (prefix == null) { String path = exchange.getRequest().getPath().value(); - int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); - prefix = path.substring(0, secFS); - if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { - if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { - prefix = prefix + Consts.S.FORWARD_SLASH; - } else { - prefix = Consts.S.FORWARD_SLASH_STR; - } - } else { - if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { - prefix = prefix + Consts.S.FORWARD_SLASH; + int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); + if (secFS == -1) { + prefix = path.substring(1); + if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { + prefix = Consts.S.FORWARD_SLASH_STR; } else { - throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); + if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + prefix = prefix + Consts.S.FORWARD_SLASH; + } else { + throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); + } + } + } else { + prefix = path.substring(0, secFS); + if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { + if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + prefix = prefix + Consts.S.FORWARD_SLASH; + } else { + prefix = Consts.S.FORWARD_SLASH_STR; + } + } else { + if (gatewayPrefix.equals(prefix) || SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { + prefix = prefix + Consts.S.FORWARD_SLASH; + } else { + throw Utils.runtimeExceptionWithoutStack("wrong prefix " + prefix); + } } } exchange.getAttributes().put(clientRequestPathPrefix, prefix); diff --git a/fizz-core/src/test/java/com/fizzgate/util/WebUtilsTests.java b/fizz-core/src/test/java/com/fizzgate/util/WebUtilsTests.java index 84aa970..438ce0f 100644 --- a/fizz-core/src/test/java/com/fizzgate/util/WebUtilsTests.java +++ b/fizz-core/src/test/java/com/fizzgate/util/WebUtilsTests.java @@ -71,6 +71,24 @@ public class WebUtilsTests { assertEquals("/ybiz1", clientReqPath); clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); assertEquals("/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/aservice/").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("aservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/aservice").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("aservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/", clientReqPathPrefix); mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/_proxytest/xservice/ybiz?a=b").build(); mockExchange = MockServerWebExchange.from(mockRequest); @@ -90,6 +108,24 @@ public class WebUtilsTests { assertEquals("/ybiz1", clientReqPath); clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); assertEquals("/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/aservice/").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("aservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/", clientReqPathPrefix); + + mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/aservice").build(); + mockExchange = MockServerWebExchange.from(mockRequest); + clientService = WebUtils.getClientService(mockExchange); + assertEquals("aservice", clientService); + clientReqPath = WebUtils.getClientReqPath(mockExchange); + assertEquals("/", clientReqPath); + clientReqPathPrefix = WebUtils.getClientReqPathPrefix(mockExchange); + assertEquals("/", clientReqPathPrefix); mockRequest = MockServerHttpRequest.get("http://127.0.0.1:8600/_proxytest/xservice/ybiz?a=b").build(); mockExchange = MockServerWebExchange.from(mockRequest); From 581657cc7404dff0a2ab665c9d607d0e4e8b50f4 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Sat, 11 Feb 2023 12:06:09 +0800 Subject: [PATCH 27/37] Support X-Forwarded-For header --- .../src/main/resources/application.yml | 4 +++- .../java/com/fizzgate/config/SystemConfig.java | 16 +++++++++++----- .../java/com/fizzgate/filter/RouteFilter.java | 1 + .../java/com/fizzgate/proxy/FizzWebClient.java | 15 +++++++++++++-- .../main/java/com/fizzgate/util/WebUtils.java | 15 ++++++++++++--- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/fizz-bootstrap/src/main/resources/application.yml b/fizz-bootstrap/src/main/resources/application.yml index 7dd11e5..9bd105e 100644 --- a/fizz-bootstrap/src/main/resources/application.yml +++ b/fizz-bootstrap/src/main/resources/application.yml @@ -126,7 +126,9 @@ fizz: fast-fail-when-registry-center-down: false web-client: - x-forwarded-for: false + x-forwarded-for: + enable: true # default + append-gateway-ip: true # default # dedicated-line: # server: diff --git a/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java b/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java index d3f992c..12768cb 100644 --- a/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java @@ -21,7 +21,6 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; @@ -133,11 +132,18 @@ public class SystemConfig { @Value("${fizz.fast-fail-when-registry-center-down:false}") private boolean fastFailWhenRegistryCenterDown; - @Value("${fizz.web-client.x-forwarded-for:false}") - private boolean fizzWebClientXForwardedFor; + @Value("${fizz.web-client.x-forwarded-for.enable:true}") + private boolean fizzWebClientXForwardedForEnable; - public boolean isFizzWebClientXForwardedFor() { - return fizzWebClientXForwardedFor; + @Value("${fizz.web-client.x-forwarded-for.append-gateway-ip:true}") + private boolean fizzWebClientXForwardedForAppendGatewayIp; + + public boolean isFizzWebClientXForwardedForAppendGatewayIp() { + return fizzWebClientXForwardedForAppendGatewayIp; + } + + public boolean isFizzWebClientXForwardedForEnable() { + return fizzWebClientXForwardedForEnable; } public boolean isFastFailWhenRegistryCenterDown() { diff --git a/fizz-core/src/main/java/com/fizzgate/filter/RouteFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/RouteFilter.java index d88b018..65d9863 100644 --- a/fizz-core/src/main/java/com/fizzgate/filter/RouteFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/RouteFilter.java @@ -108,6 +108,7 @@ public class RouteFilter extends FizzWebFilter { if (route != null && route.type != ApiConfig.Type.DUBBO) { hdrs = WebUtils.mergeAppendHeaders(exchange); + WebUtils.setXForwardedFor(exchange, hdrs); } if (route == null) { diff --git a/fizz-core/src/main/java/com/fizzgate/proxy/FizzWebClient.java b/fizz-core/src/main/java/com/fizzgate/proxy/FizzWebClient.java index f9c4dd9..a29fc01 100644 --- a/fizz-core/src/main/java/com/fizzgate/proxy/FizzWebClient.java +++ b/fizz-core/src/main/java/com/fizzgate/proxy/FizzWebClient.java @@ -26,6 +26,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.reactive.function.BodyInserter; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.ClientResponse; @@ -51,6 +52,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static com.google.common.net.HttpHeaders.X_FORWARDED_FOR; + /** * @author hongqiaowei */ @@ -239,8 +242,16 @@ public class FizzWebClient { ); } setHostHeader(uri, hdrs); - if (systemConfig.isFizzWebClientXForwardedFor()) { - hdrs.add(com.google.common.net.HttpHeaders.X_FORWARDED_FOR, NetworkUtils.getServerIp()); + if (systemConfig.isFizzWebClientXForwardedForEnable()) { + List values = hdrs.get(X_FORWARDED_FOR); + /* if (CollectionUtils.isEmpty(values)) { + hdrs.add(X_FORWARDED_FOR, WebUtils.getOriginIp(null)); + } */ + if (systemConfig.isFizzWebClientXForwardedForAppendGatewayIp()) { + hdrs.add(X_FORWARDED_FOR, NetworkUtils.getServerIp()); + } + } else { + hdrs.remove(X_FORWARDED_FOR); } } ); diff --git a/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java index 79e2b32..7690831 100644 --- a/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java @@ -28,6 +28,7 @@ import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.lang.Nullable; +import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.server.ServerWebExchange; @@ -67,7 +68,7 @@ public abstract class WebUtils { private static final String clientService = "cs@"; - private static final String xForwardedFor = "X-FORWARDED-FOR"; + private static final String xForwardedFor = "X-Forwarded-For"; private static final String unknown = "unknown"; @@ -527,9 +528,9 @@ public abstract class WebUtils { public static HttpHeaders mergeAppendHeaders(ServerWebExchange exchange) { ServerHttpRequest req = exchange.getRequest(); Map appendHeaders = getAppendHeaders(exchange); - if (appendHeaders.isEmpty()) { + /* if (appendHeaders.isEmpty()) { return req.getHeaders(); - } + } */ HttpHeaders hdrs = new HttpHeaders(); req.getHeaders().forEach( (h, vs) -> { @@ -963,4 +964,12 @@ public abstract class WebUtils { content = StringUtils.isBlank(content) ? Consts.S.EMPTY : content; return buildDirectResponseAndBindContext(exchange, httpStatus, headers, content); } + + public static void setXForwardedFor(ServerWebExchange exchange, HttpHeaders headers) { + List values = headers.get(xForwardedFor); + if (CollectionUtils.isEmpty(values)) { + String originIp = getOriginIp(exchange); + headers.add(xForwardedFor, originIp); + } + } } From e9e05f08a9c283d01dddd636c2b6dac21b4db364 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 13 Feb 2023 11:27:23 +0800 Subject: [PATCH 28/37] Set X-Forwarded-For header --- .../java/com/fizzgate/filter/AggregateFilter.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java index aa6d782..2eee103 100644 --- a/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java @@ -32,12 +32,14 @@ import com.fizzgate.util.MapUtil; import com.fizzgate.util.NettyDataBufferUtils; import com.fizzgate.util.WebUtils; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.ThreadContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -68,6 +70,8 @@ import java.util.Set; public class AggregateFilter implements WebFilter { private static final Logger LOGGER = LoggerFactory.getLogger(AggregateFilter.class); + + private static final String X_FORWARDED_FOR = "X-FORWARDED-FOR"; @Resource private ConfigLoader configLoader; @@ -129,7 +133,12 @@ public class AggregateFilter implements WebFilter { Pipeline pipeline = aggregateResource.getPipeline(); Input input = aggregateResource.getInput(); - Map headers = MapUtil.headerToHashMap(request.getHeaders()); + HttpHeaders hds = request.getHeaders(); + if (CollectionUtils.isEmpty(hds.get(X_FORWARDED_FOR)) && systemConfig.isFizzWebClientXForwardedForEnable()) { + hds.add(X_FORWARDED_FOR, WebUtils.getOriginIp(exchange)); + } + + Map headers = MapUtil.headerToHashMap(hds); Map fizzHeaders = (Map) exchange.getAttributes().get(WebUtils.APPEND_HEADERS); if (fizzHeaders != null && !fizzHeaders.isEmpty()) { Set> entrys = fizzHeaders.entrySet(); From 6e359c5e6b2b4c3dedba7ab4ccd3d14b4c443d9c Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Tue, 14 Feb 2023 10:55:52 +0800 Subject: [PATCH 29/37] Set X-Forwarded-For header --- .../src/main/java/com/fizzgate/filter/AggregateFilter.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java index 2eee103..96a73fc 100644 --- a/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/AggregateFilter.java @@ -134,11 +134,10 @@ public class AggregateFilter implements WebFilter { Input input = aggregateResource.getInput(); HttpHeaders hds = request.getHeaders(); - if (CollectionUtils.isEmpty(hds.get(X_FORWARDED_FOR)) && systemConfig.isFizzWebClientXForwardedForEnable()) { - hds.add(X_FORWARDED_FOR, WebUtils.getOriginIp(exchange)); - } - Map headers = MapUtil.headerToHashMap(hds); + if (CollectionUtils.isEmpty(hds.get(X_FORWARDED_FOR)) && systemConfig.isFizzWebClientXForwardedForEnable()) { + headers.put(X_FORWARDED_FOR, WebUtils.getOriginIp(exchange)); + } Map fizzHeaders = (Map) exchange.getAttributes().get(WebUtils.APPEND_HEADERS); if (fizzHeaders != null && !fizzHeaders.isEmpty()) { Set> entrys = fizzHeaders.entrySet(); From 7c325c088754576472d70358926ad4a81672f9f2 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Tue, 14 Feb 2023 18:15:33 +0800 Subject: [PATCH 30/37] Add default timeout for route --- fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java index ae944de..58acc2f 100644 --- a/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/plugin/auth/ApiConfig.java @@ -114,7 +114,7 @@ public class ApiConfig { public String rpcGroup; - public long timeout = 0; + public long timeout = 20_000; public int retryCount = 0; From 8f190b3877ca2fb9d09474888452cf502c5d46c6 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 16 Feb 2023 10:30:32 +0800 Subject: [PATCH 31/37] Fix gateway prefix problem --- .../com/fizzgate/filter/FlowControlFilter.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java index 760563d..603d2e6 100644 --- a/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java @@ -125,11 +125,17 @@ public class FlowControlFilter extends FizzWebFilter { String service = null; if (!favReq) { - int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); - if (secFS == -1) { - return WebUtils.responseError(exchange, HttpStatus.INTERNAL_SERVER_ERROR.value(), "request path should like /optional-prefix/service-name/real-biz-path"); + + String gatewayPrefix = systemConfig.getGatewayPrefix(); + if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { + service = Consts.S.FORWARD_SLASH_STR; + } else { + int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); + if (secFS == -1) { + return WebUtils.responseError(exchange, HttpStatus.INTERNAL_SERVER_ERROR.value(), "request path should like /gateway-prefix/service-name/real-biz-path"); + } + service = path.substring(1, secFS); } - service = path.substring(1, secFS); if (service.equals(admin) || service.equals(actuator)) { adminReq = true; From 82e929f03bc44c678606d68336090ccde3ee4db8 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Thu, 16 Feb 2023 14:53:08 +0800 Subject: [PATCH 32/37] Fix gateway prefix problem --- .../java/com/fizzgate/filter/FlowControlFilter.java | 7 ++++++- .../src/main/java/com/fizzgate/util/WebUtils.java | 12 ++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java index 603d2e6..6446d11 100644 --- a/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java +++ b/fizz-core/src/main/java/com/fizzgate/filter/FlowControlFilter.java @@ -128,7 +128,12 @@ public class FlowControlFilter extends FizzWebFilter { String gatewayPrefix = systemConfig.getGatewayPrefix(); if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { - service = Consts.S.FORWARD_SLASH_STR; + int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); + if (secFS == -1) { + service = path.substring(1); + } else { + service = path.substring(1, secFS); + } } else { int secFS = path.indexOf(Consts.S.FORWARD_SLASH, 1); if (secFS == -1) { diff --git a/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java index 7690831..852005d 100644 --- a/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java +++ b/fizz-core/src/main/java/com/fizzgate/util/WebUtils.java @@ -241,7 +241,11 @@ public abstract class WebUtils { if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); - svc = p.substring(secFS + 1, trdFS); + if (trdFS == -1) { + svc = p.substring(secFS + 1); + } else { + svc = p.substring(secFS + 1, trdFS); + } } else { svc = p.substring(1, secFS); } @@ -386,7 +390,11 @@ public abstract class WebUtils { if (StringUtils.isBlank(gatewayPrefix) || Consts.S.FORWARD_SLASH_STR.equals(gatewayPrefix)) { if (SystemConfig.DEFAULT_GATEWAY_TEST_PREFIX.equals(prefix)) { int trdFS = p.indexOf(Consts.S.FORWARD_SLASH, secFS + 1); - p = p.substring(trdFS); + if (trdFS == -1) { + p = Consts.S.FORWARD_SLASH_STR; + } else { + p = p.substring(trdFS); + } } else { p = p.substring(secFS); } From 32ae0a2111a1435eebc4057d51ce9c8ccedc9cf5 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Fri, 17 Feb 2023 11:35:20 +0800 Subject: [PATCH 33/37] Set gateway default prefix to / --- fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java b/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java index 12768cb..38d81d5 100644 --- a/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java +++ b/fizz-core/src/main/java/com/fizzgate/config/SystemConfig.java @@ -44,7 +44,7 @@ public class SystemConfig { private static final Logger log = LoggerFactory.getLogger(SystemConfig.class); - public static final String DEFAULT_GATEWAY_PREFIX = "/proxy"; + public static final String DEFAULT_GATEWAY_PREFIX = "/"; public static final String DEFAULT_GATEWAY_TEST_PREFIX = "/_proxytest"; public static final String DEFAULT_GATEWAY_TEST = "_proxytest"; public static final String DEFAULT_GATEWAY_TEST_PREFIX0 = "/_proxytest/"; @@ -217,7 +217,7 @@ public class SystemConfig { return proxySetHeaders; } - @Value("${gateway.prefix:/proxy}") + @Value("${gateway.prefix:/}") public void setGatewayPrefix(String gp) { gatewayPrefix = gp; WebUtils.setGatewayPrefix(gatewayPrefix); From 4540064754d7a884d05ac416ec7d1f841cf0aaf5 Mon Sep 17 00:00:00 2001 From: dxfeng10 Date: Fri, 17 Feb 2023 12:02:01 +0800 Subject: [PATCH 34/37] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 95794a2..3cecc67 100644 --- a/README.md +++ b/README.md @@ -243,7 +243,7 @@ docker run --rm -d -p 8600:8600 \ -v $PWD/logs:/opt/fizz-gateway-community/logs fizzgate/fizz-gateway-community:{version} ``` -最后访问网关,地址形式为:http://127.0.0.1:8600/proxy/[服务名]/[API_Path] +最后访问网关,地址形式为:http://127.0.0.1:8600/[服务名]/[API_Path] ## 官方技术交流群 From 03dd2eee3471605f71e5ae5a5f82a301a57a2118 Mon Sep 17 00:00:00 2001 From: dxfeng10 Date: Fri, 17 Feb 2023 12:02:29 +0800 Subject: [PATCH 35/37] Update README.en-us.md --- README.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.en-us.md b/README.en-us.md index 777e257..94bfbb6 100644 --- a/README.en-us.md +++ b/README.en-us.md @@ -242,7 +242,7 @@ docker run --rm -d -p 8600:8600 \ -v $PWD/logs:/opt/fizz-gateway-community/logs fizzgate/fizz-gateway-community:{version} ``` -Finally visit the gateway, the address format is: http://127.0.0.1:8600/proxy/[Service name]/[API Path] +Finally visit the gateway, the address format is: http://127.0.0.1:8600/[Service name]/[API Path] ## Official technical exchange group From a5794cf081df9b53783ee875f95ccb287c74eef5 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Fri, 17 Feb 2023 17:00:35 +0800 Subject: [PATCH 36/37] Release 2.7.1 --- README.en-us.md | 3 ++- README.md | 3 ++- docker-compose.yml | 6 +++--- fizz-bootstrap/pom.xml | 10 +++++----- fizz-common/pom.xml | 2 +- fizz-core/pom.xml | 2 +- fizz-plugin/pom.xml | 2 +- fizz-spring-boot-starter/pom.xml | 2 +- pom.xml | 10 +++++----- 9 files changed, 21 insertions(+), 19 deletions(-) diff --git a/README.en-us.md b/README.en-us.md index 94bfbb6..f2bcb7e 100644 --- a/README.en-us.md +++ b/README.en-us.md @@ -4,7 +4,7 @@ English | [简体中文](./README.md)

- Version + Version Documentation @@ -128,6 +128,7 @@ Starting from v1.3.0, the frontend and backend of the management backend are mer | v2.6.5 | v2.6.5 | | v2.6.6 | v2.6.6 | | v2.7.0 | v2.7.0 | +| v2.7.1 | v2.7.1 | Please download the corresponding management backend version according to the version of the community version diff --git a/README.md b/README.md index 3cecc67..422432f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

- Version + Version Documentation @@ -130,6 +130,7 @@ API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path] | v2.6.5 | v2.6.5 | | v2.6.6 | v2.6.6 | | v2.7.0 | v2.7.0 | +| v2.7.1 | v2.7.1 | 请根据社区版的版本下载对应的管理后台版本 diff --git a/docker-compose.yml b/docker-compose.yml index 0c999fc..77d39ae 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.6" services: fizz-mysql: - image: "fizzgate/fizz-mysql:2.7.0" + image: "fizzgate/fizz-mysql:2.7.1" container_name: fizz-mysql restart: always hostname: fizz-mysql @@ -27,7 +27,7 @@ services: - fizz fizz-gateway-community: - image: "fizzgate/fizz-gateway-community:2.7.0" + image: "fizzgate/fizz-gateway-community:2.7.1" container_name: fizz-gateway-community restart: always hostname: fizz-gateway-community @@ -48,7 +48,7 @@ services: - fizz fizz-manager-professional: - image: "fizzgate/fizz-manager-professional:2.7.0" + image: "fizzgate/fizz-manager-professional:2.7.1" container_name: fizz-manager-professional restart: always hostname: fizz-manager-professional diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index 9fc02de..40c2cd6 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -6,7 +6,7 @@ fizz-gateway-community com.fizzgate - 2.7.0 + 2.7.1 ../pom.xml @@ -18,12 +18,12 @@ Dragonfruit-SR3 Dysprosium-SR25 5.3.7.RELEASE - 4.1.87.Final - 4.4.15 + 4.1.89.Final + 4.4.16 2.17.2 1.7.36 3.12.0 - 1.18.24 + 1.18.26 2.7.7 1.16.1 3.4.6 @@ -32,7 +32,7 @@ 1.15 2.11.1 2.8.9 - 2.0.56.Final + 2.0.58.Final 2.2.9.RELEASE 1.33 Moore-SR13--> diff --git a/fizz-common/pom.xml b/fizz-common/pom.xml index 11e383f..9953932 100644 --- a/fizz-common/pom.xml +++ b/fizz-common/pom.xml @@ -5,7 +5,7 @@ fizz-gateway-community com.fizzgate - 2.7.0 + 2.7.1 ../pom.xml 4.0.0 diff --git a/fizz-core/pom.xml b/fizz-core/pom.xml index aa01aed..d4278cd 100644 --- a/fizz-core/pom.xml +++ b/fizz-core/pom.xml @@ -5,7 +5,7 @@ fizz-gateway-community com.fizzgate - 2.7.0 + 2.7.1 ../pom.xml 4.0.0 diff --git a/fizz-plugin/pom.xml b/fizz-plugin/pom.xml index 4f62a6d..1c192eb 100644 --- a/fizz-plugin/pom.xml +++ b/fizz-plugin/pom.xml @@ -5,7 +5,7 @@ fizz-gateway-community com.fizzgate - 2.7.0 + 2.7.1 ../pom.xml 4.0.0 diff --git a/fizz-spring-boot-starter/pom.xml b/fizz-spring-boot-starter/pom.xml index 38d1735..6cae080 100644 --- a/fizz-spring-boot-starter/pom.xml +++ b/fizz-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ fizz-gateway-community com.fizzgate - 2.7.0 + 2.7.1 ../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index bc2451d..6d349b1 100644 --- a/pom.xml +++ b/pom.xml @@ -10,8 +10,8 @@ Dysprosium-SR25 5.3.7.RELEASE 2.2.7.RELEASE - 4.1.87.Final - 4.4.15 + 4.1.89.Final + 4.4.16 2.17.2 1.7.36 2.7.7 @@ -22,7 +22,7 @@ 0.8.2 0.9.11 2.11.1 - 2.0.56.Final + 2.0.58.Final 2.2.9.RELEASE 1.33 Moore-SR13 @@ -38,7 +38,7 @@ fizz-gateway-community ${project.artifactId} fizz gateway community - 2.7.0 + 2.7.1 pom fizz-common @@ -344,7 +344,7 @@ org.projectlombok lombok - 1.18.24 + 1.18.26 From 684950ad934b948c9e77f3c29b99ba510b3ad5d1 Mon Sep 17 00:00:00 2001 From: hongqiaowei Date: Fri, 17 Feb 2023 18:22:40 +0800 Subject: [PATCH 37/37] Fix GrayReleasePluginTests problem --- .../plugin/grayrelease/GrayReleasePluginTests.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fizz-plugin/src/test/java/com/fizzgate/plugin/grayrelease/GrayReleasePluginTests.java b/fizz-plugin/src/test/java/com/fizzgate/plugin/grayrelease/GrayReleasePluginTests.java index e80fe32..655c993 100644 --- a/fizz-plugin/src/test/java/com/fizzgate/plugin/grayrelease/GrayReleasePluginTests.java +++ b/fizz-plugin/src/test/java/com/fizzgate/plugin/grayrelease/GrayReleasePluginTests.java @@ -73,7 +73,7 @@ public class GrayReleasePluginTests { .build(); client.post() - .uri("/proxy/aservice/apath/xxx") + .uri("/aservice/apath/xxx") .contentType(MediaType.APPLICATION_JSON) .bodyValue("{\"user\":\"henry\",\"tools\":{\"gun\":\"ak\"}}") .exchange() @@ -126,18 +126,18 @@ public class GrayReleasePluginTests { .build(); client.get() - .uri("/proxy/aservice/apath/xxx") + .uri("/aservice/apath/xxx") .exchange(); Assertions.assertEquals("/a/b/c?name1=value1&name2=value2", changedRoute[0].getBackendPathQuery()); Assertions.assertEquals("http://1.2.3.4:8080", changedRoute[0].nextHttpHostPort); client.get() - .uri("/proxy/aservice/apath/xxx") + .uri("/aservice/apath/xxx") .exchange(); Assertions.assertEquals("http://1.2.3.5:8080", changedRoute[0].nextHttpHostPort); client.get() - .uri("/proxy/aservice/apath/xxx") + .uri("/aservice/apath/xxx") .exchange(); Assertions.assertEquals("http://1.2.3.4:8080", changedRoute[0].nextHttpHostPort); }