From 3da942b2851c74a0464fb95bf6ed2de050d14cc9 Mon Sep 17 00:00:00 2001 From: trydofor Date: Thu, 14 Mar 2024 10:42:59 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9C=A8=20listen=20initToken=20in=20OkHtt?= =?UTF-8?q?pTokenClient.Tokenize=20#220?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../httprest/okhttp/OkHttpTokenizeLogin.java | 20 +++++++++++--- .../httprest/okhttp/OkHttpTokenizeOauth.java | 26 +++++++++++++++---- .../controller/api/OkHttpTokenizeTest.java | 8 ++++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeLogin.java b/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeLogin.java index 35be1a3cc..9a49fcc8b 100644 --- a/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeLogin.java +++ b/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeLogin.java @@ -14,6 +14,8 @@ import org.jetbrains.annotations.NotNull; import pro.fessional.wings.slardar.jackson.JacksonHelper; +import java.util.function.Consumer; + /** * Traditional Post-Form Login * @@ -66,6 +68,7 @@ public class OkHttpTokenizeLogin implements OkHttpTokenClient.Tokenize { private String headerUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"; private transient String token; + private transient Consumer initListener; @Override public boolean needToken(@NotNull Request request) { @@ -104,11 +107,20 @@ public boolean initToken(@NotNull Call.Factory callFactory) { if (cookieAuto) return true; - final String tkn = parseResponse(res); - if (tkn != null) { - token = tkn; + final String newTkn = parseResponse(res); + if (newTkn != null) { + token = newTkn; + if (initListener != null) { + try { + initListener.accept(newTkn); + } + catch (Exception e) { + log.warn("failed to listen login init", e); + } + } + return true; } - return tkn != null; + return false; } @Contract("_->param1") diff --git a/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeOauth.java b/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeOauth.java index 966ceb1ef..ce886f1d7 100644 --- a/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeOauth.java +++ b/wings/slardar/src/main/java/pro/fessional/wings/slardar/httprest/okhttp/OkHttpTokenizeOauth.java @@ -20,6 +20,8 @@ import pro.fessional.wings.slardar.context.Now; import pro.fessional.wings.slardar.jackson.JacksonHelper; +import java.util.function.Consumer; + /** * fedex authorization v1 * @@ -70,6 +72,7 @@ public class OkHttpTokenizeOauth implements OkHttpTokenClient.Tokenize { */ private int expireBuff = 30_000; private transient Token token; + private transient Consumer initListener; @Override public boolean needToken(@NotNull Request request) { @@ -91,19 +94,32 @@ public boolean fillToken(Request.Builder builder) { @Override public boolean initToken(@NotNull Call.Factory callFactory) { - final Token tkn = token; + final Token oldTkn = token; Token newTkn = null; - if (tkn != null && tkn.refresh != null) { - newTkn = fetchByRefresh(callFactory, tkn.refresh); + if (oldTkn != null && oldTkn.refresh != null) { + newTkn = fetchByRefresh(callFactory, oldTkn.refresh); } if (newTkn == null) { newTkn = fetchByGrantType(callFactory); } - token = newTkn; - return newTkn != null; + if (newTkn != null) { + token = newTkn; + + if (initListener != null) { + try { + initListener.accept(newTkn); + } + catch (Exception e) { + log.warn("failed to listen oauth init", e); + } + } + return true; + } + + return false; } @SuppressWarnings("DuplicatedCode") diff --git a/wings/warlock-shadow/src/test/java/pro/fessional/wings/warlock/controller/api/OkHttpTokenizeTest.java b/wings/warlock-shadow/src/test/java/pro/fessional/wings/warlock/controller/api/OkHttpTokenizeTest.java index 1c6a8c78e..53f48119c 100644 --- a/wings/warlock-shadow/src/test/java/pro/fessional/wings/warlock/controller/api/OkHttpTokenizeTest.java +++ b/wings/warlock-shadow/src/test/java/pro/fessional/wings/warlock/controller/api/OkHttpTokenizeTest.java @@ -16,6 +16,8 @@ import pro.fessional.wings.slardar.spring.prop.SlardarSessionProp; import pro.fessional.wings.warlock.spring.prop.WarlockUrlmapProp; +import java.util.concurrent.atomic.AtomicReference; + /** * @author trydofor * @since 2022-11-16 @@ -74,6 +76,8 @@ public void testOauthClientCredentials() { tokenize.setClientSecret(secret); tokenize.setAuthorizeUrl(host + urlmapProp.getOauthAuthorize()); tokenize.setAccessTokenUrl(host + urlmapProp.getOauthAccessToken()); + final AtomicReference token = new AtomicReference<>(); + tokenize.setInitListener(token::set); OkHttpTokenClient oauthClient = new OkHttpTokenClient(okHttpClient, tokenize); okhttp3.Request request = new okhttp3.Request.Builder() @@ -81,6 +85,7 @@ public void testOauthClientCredentials() { .post(OkHttpClientHelper.EMPTY) .build(); + Assertions.assertSame(token.get(), tokenize.getToken()); final String str = OkHttpClientHelper.executeString(oauthClient, request, false); Assertions.assertNotNull(str); Assertions.assertNotEquals("failed", str); @@ -96,6 +101,8 @@ public void testFormLogin() { tokenize.setUsername("trydofor"); tokenize.setPassword("moMxVKXxA8Pe9XX9"); tokenize.setHeaderAuth(slardarSessionProp.getHeaderName()); + final AtomicReference token = new AtomicReference<>(); + tokenize.setInitListener(token::set); OkHttpTokenClient oauthClient = new OkHttpTokenClient(okHttpClient, tokenize); okhttp3.Request request = new okhttp3.Request.Builder() @@ -103,6 +110,7 @@ public void testFormLogin() { .post(OkHttpClientHelper.EMPTY) .build(); + Assertions.assertSame(token.get(), tokenize.getToken()); final String str = OkHttpClientHelper.executeString(oauthClient, request, false); Assertions.assertNotNull(str); Assertions.assertNotEquals("failed", str); From e317192eca4db4e278ea53d36e8e4aebb2080367 Mon Sep 17 00:00:00 2001 From: trydofor Date: Mon, 18 Mar 2024 11:20:17 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E2=9E=95=20caching=20misdepends=20session?= =?UTF-8?q?=20#221?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- observe/docs | 2 +- wings/slardar-hazel-caching/pom.xml | 5 --- .../bean/HazelcastConfigConfiguration.java | 22 +++++++++++ .../resources/extra-conf/hazelcast-client.xml | 9 ----- .../resources/extra-conf/hazelcast-server.xml | 10 ----- wings/slardar-hazel-session/pom.xml | 12 ++++-- .../SlardarHazelSessionConfiguration.java | 38 +++++++++++++++++++ wings/slardar-sprint/pom.xml | 4 ++ 8 files changed, 74 insertions(+), 28 deletions(-) diff --git a/observe/docs b/observe/docs index 5f68973bb..b20668b3a 160000 --- a/observe/docs +++ b/observe/docs @@ -1 +1 @@ -Subproject commit 5f68973bb41b525e2e25179966a99d84a2431532 +Subproject commit b20668b3ae195e3c55a38923892abaffd7d5c17e diff --git a/wings/slardar-hazel-caching/pom.xml b/wings/slardar-hazel-caching/pom.xml index 43947125b..24e9e3f00 100644 --- a/wings/slardar-hazel-caching/pom.xml +++ b/wings/slardar-hazel-caching/pom.xml @@ -32,10 +32,5 @@ com.hazelcast hazelcast-spring - - - org.springframework.session - spring-session-hazelcast - diff --git a/wings/slardar-hazel-caching/src/main/java/pro/fessional/wings/slardar/spring/bean/HazelcastConfigConfiguration.java b/wings/slardar-hazel-caching/src/main/java/pro/fessional/wings/slardar/spring/bean/HazelcastConfigConfiguration.java index a4c04b28d..733fcfe4e 100644 --- a/wings/slardar-hazel-caching/src/main/java/pro/fessional/wings/slardar/spring/bean/HazelcastConfigConfiguration.java +++ b/wings/slardar-hazel-caching/src/main/java/pro/fessional/wings/slardar/spring/bean/HazelcastConfigConfiguration.java @@ -1,5 +1,7 @@ package pro.fessional.wings.slardar.spring.bean; +import com.hazelcast.config.GlobalSerializerConfig; +import com.hazelcast.config.SerializationConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.boot.autoconfigure.hazelcast.HazelcastConfigCustomizer; @@ -7,6 +9,7 @@ import org.springframework.context.annotation.Configuration; import pro.fessional.wings.silencer.spring.boot.ConditionalWingsEnabled; import pro.fessional.wings.slardar.cache.hazelcast.WingsHazelcastCacheCustomizer; +import pro.fessional.wings.slardar.serialize.KryoHazelcast; import pro.fessional.wings.slardar.spring.prop.SlardarCacheProp; import pro.fessional.wings.slardar.spring.prop.SlardarEnabledProp; @@ -39,4 +42,23 @@ public HazelcastConfigCustomizer wingsHazelcastCacheCustomizer(SlardarCacheProp log.info("SlardarHazelCaching spring-bean wingsHazelcastCacheCustomizer"); return new WingsHazelcastCacheCustomizer(conf); } + + @Bean + @ConditionalWingsEnabled + public HazelcastConfigCustomizer wingsHazelcastGlobalSerializer() { + log.info("SlardarHazelCaching spring-bean wingsHazelcastGlobalSerializer"); + return config -> { + SerializationConfig serialization = config.getSerializationConfig(); + GlobalSerializerConfig gs = serialization.getGlobalSerializerConfig(); + if (gs == null) { + GlobalSerializerConfig ngs = new GlobalSerializerConfig(); + ngs.setClassName(KryoHazelcast.class.getName()); + serialization.setGlobalSerializerConfig(ngs); + log.info("Wings hazelcast setGlobalSerializerConfig class=KryoHazelcast"); + } + else { + log.info("Wings hazelcast setGlobalSerializerConfig skipped, current=" + gs); + } + }; + } } diff --git a/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-client.xml b/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-client.xml index e8add326d..6108a7c0f 100644 --- a/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-client.xml +++ b/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-client.xml @@ -39,15 +39,6 @@ true INVALIDATE - - - - pro.fessional.wings.slardar.serialize.KryoHazelcast - - - - diff --git a/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-server.xml b/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-server.xml index c0ebe40f7..5d940c8bf 100644 --- a/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-server.xml +++ b/wings/slardar-hazel-caching/src/main/resources/extra-conf/hazelcast-server.xml @@ -52,16 +52,6 @@ - - - - pro.fessional.wings.slardar.serialize.KryoHazelcast - - - - - ETERNAL diff --git a/wings/slardar-hazel-session/pom.xml b/wings/slardar-hazel-session/pom.xml index a2dcff66a..01c232072 100644 --- a/wings/slardar-hazel-session/pom.xml +++ b/wings/slardar-hazel-session/pom.xml @@ -19,13 +19,19 @@ pro.fessional.wings - slardar-hazel-caching + slardar-webmvc + - pro.fessional.wings - slardar-webmvc + org.springframework.session + spring-session-hazelcast + + pro.fessional.wings + slardar-hazel-caching + test + org.springframework.boot spring-boot-starter-security diff --git a/wings/slardar-hazel-session/src/main/java/pro/fessional/wings/slardar/spring/bean/SlardarHazelSessionConfiguration.java b/wings/slardar-hazel-session/src/main/java/pro/fessional/wings/slardar/spring/bean/SlardarHazelSessionConfiguration.java index 24b66ed3d..943cc3560 100644 --- a/wings/slardar-hazel-session/src/main/java/pro/fessional/wings/slardar/spring/bean/SlardarHazelSessionConfiguration.java +++ b/wings/slardar-hazel-session/src/main/java/pro/fessional/wings/slardar/spring/bean/SlardarHazelSessionConfiguration.java @@ -1,13 +1,18 @@ package pro.fessional.wings.slardar.spring.bean; +import com.hazelcast.config.SerializationConfig; +import com.hazelcast.config.SerializerConfig; import com.hazelcast.core.HazelcastInstance; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.hazelcast.HazelcastConfigCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.session.FindByIndexNameSessionRepository; +import org.springframework.session.MapSession; import org.springframework.session.Session; +import org.springframework.session.hazelcast.HazelcastSessionSerializer; import org.springframework.session.security.SpringSessionBackedSessionRegistry; import pro.fessional.wings.silencer.spring.boot.ConditionalWingsEnabled; import pro.fessional.wings.slardar.session.HazelcastSessionHelper; @@ -39,4 +44,37 @@ public HazelcastSessionHelper wingsSessionHelper( log.info("SlardarHazelSession spring-bean wingsSessionHelper"); return new HazelcastSessionHelper(sessionRepository, hazelcastInstance, mapName); } + + /** + * spring FindByIndexNameSessionRepository + */ + @Bean + @ConditionalWingsEnabled + public HazelcastConfigCustomizer wingsHazelcastSessionSerializer() { + log.info("SlardarHazelSession spring-bean wingsHazelcastSessionSerializer"); + return config -> { + String msc = MapSession.class.getName(); + SerializationConfig serialization = config.getSerializationConfig(); + for (SerializerConfig ss : serialization.getSerializerConfigs()) { + String tcn = ss.getTypeClassName(); + if (tcn == null) { + Class tc = ss.getTypeClass(); + if (tc != null) { + tcn = tc.getName(); + } + } + + if (msc.equals(tcn)) { + log.warn("Wings hazelcast addSerializerConfig skipped, current=" + ss); + return; + } + } + + log.info("Wings hazelcast addSerializerConfig type=MapSession"); + SerializerConfig sessionSerializer = new SerializerConfig(); + sessionSerializer.setClass(HazelcastSessionSerializer.class); + sessionSerializer.setTypeClass(MapSession.class); + serialization.addSerializerConfig(sessionSerializer); + }; + } } diff --git a/wings/slardar-sprint/pom.xml b/wings/slardar-sprint/pom.xml index 0754b86cd..d6cae4b59 100644 --- a/wings/slardar-sprint/pom.xml +++ b/wings/slardar-sprint/pom.xml @@ -17,6 +17,10 @@ Integration of WebMvc/hazelcast/security-conf/admin/actuator + + pro.fessional.wings + slardar-hazel-caching + pro.fessional.wings slardar-hazel-session From 5e99f44797313412f3ebb18dc62a8ac2fba962ac Mon Sep 17 00:00:00 2001 From: trydofor Date: Tue, 19 Mar 2024 08:54:24 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9C=85=20clean=20table=20before=20flywav?= =?UTF-8?q?e=20init=20in=20testcase=20#223?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sample/TestWingsInitDatabaseSample.java | 5 + .../TestWingsSchemaGeneratorSample.java | 11 +-- .../jooq/WingsJooqDaoAliasImplTest.java | 37 ++++---- .../faceless/jooq/JooqDeleteListenerTest.java | 3 +- .../jooq/JooqMapperCompatibleTest.java | 30 +++--- .../jooq/JooqTableCudListenerTest.java | 3 +- .../jooq/TransactionalServiceTest.java | 25 +++-- .../sample/TestJooqDslAndDaoSample.java | 49 +++++----- .../sample/TestJooqMostSelectSample.java | 95 ++++++++++--------- .../faceless/flywave/FlywaveShardingTest.java | 4 +- .../wings/faceless/jooq/JooqShardingTest.java | 3 +- 11 files changed, 138 insertions(+), 127 deletions(-) diff --git a/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsInitDatabaseSample.java b/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsInitDatabaseSample.java index 1c840871f..70bbc0ad4 100644 --- a/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsInitDatabaseSample.java +++ b/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsInitDatabaseSample.java @@ -8,6 +8,7 @@ import org.springframework.boot.test.context.SpringBootTest; import pro.fessional.wings.faceless.flywave.SchemaRevisionManager; import pro.fessional.wings.faceless.flywave.WingsRevision; +import pro.fessional.wings.testing.faceless.database.TestingDatabaseHelper; import static pro.fessional.wings.faceless.flywave.WingsRevision.V90_22_0601_01_TestSchema; import static pro.fessional.wings.faceless.util.FlywaveRevisionScanner.REVISION_PATH_MASTER; @@ -24,10 +25,14 @@ public class TestWingsInitDatabaseSample { @Setter(onMethod_ = {@Autowired}) private SchemaRevisionManager schemaRevisionManager; + + @Setter(onMethod_ = {@Autowired}) + protected TestingDatabaseHelper testingDatabaseHelper; @Test @TmsLink("C12024") public void init060101() { + testingDatabaseHelper.cleanTable(); // init var sqls = scan(REVISION_PATH_MASTER, WingsRevision.V01_19_0521_01_EnumI18n.classpath()); schemaRevisionManager.publishRevision(WingsRevision.V00_19_0512_01_Schema.revision(), 0); diff --git a/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsSchemaGeneratorSample.java b/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsSchemaGeneratorSample.java index 48eebeb74..2c98c0ac0 100644 --- a/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsSchemaGeneratorSample.java +++ b/wings/faceless-flywave/src/test/java/pro/fessional/wings/faceless/sample/TestWingsSchemaGeneratorSample.java @@ -11,8 +11,6 @@ import pro.fessional.wings.faceless.util.FlywaveRevisionScanner; import pro.fessional.wings.testing.faceless.database.TestingDatabaseHelper; -import java.util.SortedMap; - import static pro.fessional.wings.faceless.flywave.WingsRevision.V90_22_0601_02_TestRecord; /** @@ -32,18 +30,17 @@ public class TestWingsSchemaGeneratorSample { @Setter(onMethod_ = {@Autowired}) - private TestingDatabaseHelper testingDatabaseHelper; + private SchemaRevisionManager schemaRevisionManager; @Setter(onMethod_ = {@Autowired}) - private SchemaRevisionManager schemaRevisionManager; + private TestingDatabaseHelper testingDatabaseHelper; @Test @TmsLink("C12026") public void init060102() { testingDatabaseHelper.cleanTable(); - final SortedMap sqls = FlywaveRevisionScanner - .scan(FlywaveRevisionScanner.REVISION_PATH_MASTER, - WingsRevision.V01_19_0521_01_EnumI18n.classpath()); + var sqls = FlywaveRevisionScanner.scan(FlywaveRevisionScanner.REVISION_PATH_MASTER, + WingsRevision.V01_19_0521_01_EnumI18n.classpath()); schemaRevisionManager.checkAndInitSql(sqls, 0, true); schemaRevisionManager.publishRevision(V90_22_0601_02_TestRecord.revision(), 0); } diff --git a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/database/jooq/WingsJooqDaoAliasImplTest.java b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/database/jooq/WingsJooqDaoAliasImplTest.java index 0bf9497e0..e44b65dc2 100644 --- a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/database/jooq/WingsJooqDaoAliasImplTest.java +++ b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/database/jooq/WingsJooqDaoAliasImplTest.java @@ -22,7 +22,6 @@ import java.time.LocalDateTime; import java.util.Arrays; -import java.util.SortedMap; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -51,7 +50,7 @@ public class WingsJooqDaoAliasImplTest { private SchemaRevisionManager schemaRevisionManager; @Setter(onMethod_ = {@Autowired}) - private TstShardingDao dao; + private TstShardingDao tstShardingDao; private final TstShardingTable tbl = TstShardingTable.TstSharding; private final LocalDateTime now = LocalDateTime.now(); @@ -60,7 +59,7 @@ public class WingsJooqDaoAliasImplTest { @TmsLink("C12081") public void test0DropAndInit() { testingDatabaseHelper.cleanTable(); - final SortedMap sqls = FlywaveRevisionScanner.scan(REVISION_PATH_MASTER, WingsRevision.V01_19_0521_01_EnumI18n.classpath()); + var sqls = FlywaveRevisionScanner.scan(REVISION_PATH_MASTER, WingsRevision.V01_19_0521_01_EnumI18n.classpath()); schemaRevisionManager.checkAndInitSql(sqls, 0, true); schemaRevisionManager.publishRevision(V90_22_0601_02_TestRecord.revision(), -1); } @@ -79,9 +78,9 @@ public void test1BatchLoadSeeLog() { new TstShardingRecord(303L, now, now, now, 9L, "batch load 303", "", ZH_CN) ); testcaseNotice("batch load, check log, ignore, 301-303, use `from dual where exists` check, then insert"); - dao.batchLoad(rds, true); + tstShardingDao.batchLoad(rds, true); testcaseNotice("batch load, check log, replace, 301-303, use on duplicate key update"); - dao.batchLoad(rds, false); + tstShardingDao.batchLoad(rds, false); } @Test @@ -93,7 +92,7 @@ public void test2BatchInsertSeeLog() { new TstShardingRecord(306L, now, now, now, 9L, "batch load 306", "", ZH_CN) ); testcaseNotice("batch Insert, check log, 304-306, in 2 batch"); - final var rs = dao.batchInsert(rds, 2); + final var rs = tstShardingDao.batchInsert(rds, 2); assertArrayEquals(new int[]{1, 1, 1}, rs); } @@ -106,16 +105,16 @@ public void test3BatchMergeSeeLog() { new TstShardingRecord(309L, now, now, now, 9L, "batch load 309", "", ZH_CN) ); testcaseNotice("batch Insert, check log, ignore, 307-309, in 2 batch, insert ignore"); - final var rs1 = dao.batchInsert(rds, 2, true); + final var rs1 = tstShardingDao.batchInsert(rds, 2, true); assertArrayEquals(new int[]{1, 1, 1}, rs1); testcaseNotice("batch Insert, check log, replace, 307-309, in 2 batch, replace into", "BUG https://github.com/apache/shardingsphere/issues/8226\n"); - final var rs2 = dao.batchInsert(rds, 2, false); + final var rs2 = tstShardingDao.batchInsert(rds, 2, false); assertArrayEquals(new int[]{1, 1, 1}, rs2); testcaseNotice("batch Merge, check log, on dupkey, 307-309, in 2 batch, duplicate"); testcaseNotice("insert into `tst_sharding` (`id`, .., `other_info`) values (?,..., ?) on duplicate key update `login_info` = ?, `other_info` = ?"); - final var rs3 = dao.batchMerge(tbl, rds, 2, tbl.LoginInfo, tbl.OtherInfo); + final var rs3 = tstShardingDao.batchMerge(tbl, rds, 2, tbl.LoginInfo, tbl.OtherInfo); assertArrayEquals(new int[]{1, 1, 1}, rs3); } @@ -128,7 +127,7 @@ public void test4BatchStoreSeeLog() { new TstShardingRecord(312L, now, now, now, 9L, "batch load 312", "merge", ZH_CN) ); testcaseNotice("batch Insert, check log, ignore, 307-309, in 2 batch"); - final var rs = dao.batchStore(rds, 2); + final var rs = tstShardingDao.batchStore(rds, 2); assertArrayEquals(new int[]{1, 1, 1}, rs); } @@ -141,10 +140,10 @@ public void test5BatchUpdateSeeLog() { new TstShardingRecord(311L, now, now, now, 9L, "batch load 311", "update", ZH_CN) ); testcaseNotice("batch Update, check log, 307-309, in 2 batch"); - final var rs1 = dao.batchUpdate(rds, 2); + final var rs1 = tstShardingDao.batchUpdate(rds, 2); assertArrayEquals(new int[]{1, 1, 1}, rs1); - final var rs2 = dao.batchUpdate(tbl, new Field[]{tbl.Id}, rds, 2, tbl.LoginInfo, tbl.OtherInfo); + final var rs2 = tstShardingDao.batchUpdate(tbl, new Field[]{tbl.Id}, rds, 2, tbl.LoginInfo, tbl.OtherInfo); assertArrayEquals(new int[]{1, 1, 1}, rs2); } @@ -153,7 +152,7 @@ public void test5BatchUpdateSeeLog() { public void test6SingleMergeSeeLog() { testcaseNotice("insert into `tst_sharding` (`id`, .., `other_info`) values (?,..., ?) on duplicate key update `login_info` = ?, `other_info` = ?"); TstSharding pojo = new TstSharding(312L, now, now, now, 9L, "batch load 312", "update-bymerge", ZH_CN); - final var rs = dao.mergeInto(tbl, pojo, tbl.LoginInfo, tbl.OtherInfo); + final var rs = tstShardingDao.mergeInto(tbl, pojo, tbl.LoginInfo, tbl.OtherInfo); assertEquals(2, rs); } @@ -166,17 +165,17 @@ public void test7BatchMergeSeeLog() { new TstShardingRecord(311L, now, now, now, 9L, "batch 311-merge", "update-merge", ZH_CN) ); testcaseNotice("313 insert, 310,311 update"); - final var rs = dao.batchMerge(tbl, new Field[]{tbl.Id}, rds, 2, tbl.LoginInfo, tbl.OtherInfo); + final var rs = tstShardingDao.batchMerge(tbl, new Field[]{tbl.Id}, rds, 2, tbl.LoginInfo, tbl.OtherInfo); assertArrayEquals(new int[]{1, 1, 1}, rs); } @Test @TmsLink("C12089") public void test8LogicDeleteSeeLog() { - dao.fetchById(1L); - dao.fetchOneById(1L); - dao.count(); - final TstShardingTable tbl = dao.getTable(); - dao.count(tbl, tbl.getOnlyLive()); + tstShardingDao.fetchById(1L); + tstShardingDao.fetchOneById(1L); + tstShardingDao.count(); + final TstShardingTable tbl = tstShardingDao.getTable(); + tstShardingDao.count(tbl, tbl.getOnlyLive()); } } diff --git a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqDeleteListenerTest.java b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqDeleteListenerTest.java index 0c2c0f9a4..924c57a96 100644 --- a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqDeleteListenerTest.java +++ b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqDeleteListenerTest.java @@ -23,7 +23,6 @@ import java.time.LocalDateTime; import java.util.Arrays; -import java.util.SortedMap; import static pro.fessional.wings.faceless.convention.EmptyValue.DATE_TIME; import static pro.fessional.wings.faceless.enums.autogen.StandardLanguage.ZH_CN; @@ -60,7 +59,7 @@ public class JooqDeleteListenerTest { @TmsLink("C12095") public void test0CleanTables() { testingDatabaseHelper.cleanTable(); - final SortedMap sqls = FlywaveRevisionScanner.scan(REVISION_PATH_MASTER); + var sqls = FlywaveRevisionScanner.scan(REVISION_PATH_MASTER); schemaRevisionManager.checkAndInitSql(sqls, 0, true); schemaRevisionManager.publishRevision(V90_22_0601_02_TestRecord.revision(), -1); } diff --git a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqMapperCompatibleTest.java b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqMapperCompatibleTest.java index 02c90e6c2..dd698cabb 100644 --- a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqMapperCompatibleTest.java +++ b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqMapperCompatibleTest.java @@ -40,13 +40,13 @@ public class JooqMapperCompatibleTest { private TestingDatabaseHelper testingDatabaseHelper; @Setter(onMethod_ = {@Autowired}) - private TstShardingDao dao; + private TstShardingDao tstShardingDao; @Test @TmsLink("C12098") public void test0Init() { testingDatabaseHelper.cleanTable(); - final var sqls = FlywaveRevisionScanner.scanMaster(); + var sqls = FlywaveRevisionScanner.scanMaster(); schemaRevisionManager.checkAndInitSql(sqls, 0, false); schemaRevisionManager.publishRevision(WingsRevision.V90_22_0601_02_TestRecord.revision(), 0); } @@ -54,7 +54,7 @@ public void test0Init() { @Test @TmsLink("C12099") public void test1Exist() { - final boolean b = dao.notTableExist(); + final boolean b = tstShardingDao.notTableExist(); Assertions.assertFalse(b); } @@ -67,8 +67,8 @@ public static class SameName { @Test @TmsLink("C12100") public void test1Lower() { - DSLContext ctx = dao.ctx(); - TstShardingTable t = dao.getTable(); + DSLContext ctx = tstShardingDao.ctx(); + TstShardingTable t = tstShardingDao.getTable(); Condition c = t.Id.gt(1L).and(t.Id.le(105L)); testcaseNotice("Case-sensitive alias, not supported by jooq, supported by sfm"); @@ -85,8 +85,8 @@ public void test1Lower() { @Test @TmsLink("C12101") public void test1Snake() { - DSLContext ctx = dao.ctx(); - TstShardingTable t = dao.getTable(); + DSLContext ctx = tstShardingDao.ctx(); + TstShardingTable t = tstShardingDao.getTable(); Condition c = t.Id.gt(1L).and(t.Id.le(105L)); testcaseNotice("Underscore alias, supported by both jooq and sfm"); @@ -109,8 +109,8 @@ public void test1Array() { vo.setId(101L); vo.setLoginInfo("login-info test"); - final TstShardingRecord rd = dao.newRecord(vo); - final Field[] fld = dao.getTable().fields(); + final TstShardingRecord rd = tstShardingDao.newRecord(vo); + final Field[] fld = tstShardingDao.getTable().fields(); final Object[] arr = rd.intoArray(); Assertions.assertNotNull(rd.getLoginInfo()); @@ -120,16 +120,16 @@ public void test1Array() { @Test @TmsLink("C12103") public void test2Array() { - TstShardingTable t = dao.getTable(); + TstShardingTable t = tstShardingDao.getTable(); Condition c = t.Id.eq(105L); - final TstShardingRecord rd = dao.ctx() - .selectFrom(t) - .where(c) - .fetchOne(); + final TstShardingRecord rd = tstShardingDao.ctx() + .selectFrom(t) + .where(c) + .fetchOne(); Assertions.assertNotNull(rd); Assertions.assertNotNull(rd.getLoginInfo()); final Object[] arr = rd.intoArray(); - final Field[] fld = dao.getTable().fields(); + final Field[] fld = tstShardingDao.getTable().fields(); Assertions.assertEquals(fld.length, arr.length, "Sfm bug https://github.com/arnaudroger/SimpleFlatMapper/issues/764"); } } diff --git a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqTableCudListenerTest.java b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqTableCudListenerTest.java index c298b45c8..960d1b4c1 100644 --- a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqTableCudListenerTest.java +++ b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/JooqTableCudListenerTest.java @@ -30,7 +30,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.SortedMap; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; @@ -79,7 +78,7 @@ public class JooqTableCudListenerTest { @TmsLink("C12104") public void test0Init() { testingDatabaseHelper.cleanTable(); - final SortedMap sqls = FlywaveRevisionScanner.scan(REVISION_PATH_MASTER); + var sqls = FlywaveRevisionScanner.scan(REVISION_PATH_MASTER); schemaRevisionManager.checkAndInitSql(sqls, 0, true); schemaRevisionManager.publishRevision(V90_22_0601_02_TestRecord.revision(), -1); } diff --git a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/TransactionalServiceTest.java b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/TransactionalServiceTest.java index efaec9119..b90fa68e3 100644 --- a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/TransactionalServiceTest.java +++ b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/jooq/TransactionalServiceTest.java @@ -15,6 +15,7 @@ import pro.fessional.wings.faceless.app.service.TestTransactionalManageService; import pro.fessional.wings.faceless.flywave.SchemaRevisionManager; import pro.fessional.wings.faceless.util.FlywaveRevisionScanner; +import pro.fessional.wings.testing.faceless.database.TestingDatabaseHelper; import java.util.concurrent.atomic.AtomicLong; @@ -42,10 +43,14 @@ public class TransactionalServiceTest { @Setter(onMethod_ = {@Autowired}) protected LightIdBufferedProvider lightIdBufferedProvider; + @Setter(onMethod_ = {@Autowired}) + protected TestingDatabaseHelper testingDatabaseHelper; + @Test @TmsLink("C12108") public void test0Init() { - final var sqls = FlywaveRevisionScanner.scanMaster(); + testingDatabaseHelper.cleanTable(); + var sqls = FlywaveRevisionScanner.scanMaster(); schemaRevisionManager.checkAndInitSql(sqls, 0, false); schemaRevisionManager.publishRevision(V90_22_0601_01_TestSchema.revision(), 0); } @@ -61,7 +66,7 @@ public void testDeclarativeTx() { Assertions.fail("should exception in create"); } catch (Exception e) { - log.info("insert failure", e); + log.info("should insert failure", e); } final long ild = id.get(); final long nxt = testTransactionalClauseService.getNextSequence(); @@ -76,7 +81,7 @@ public void testDeclarativeTx() { Assertions.fail("should exception in update"); } catch (Exception e) { - log.info("update failure", e); + log.info("should update failure", e); } // rollback @@ -89,7 +94,7 @@ public void testDeclarativeTx() { Assertions.fail("should exception in delete"); } catch (Exception e) { - log.info("delete failure", e); + log.info("should delete failure", e); } // rollback @@ -120,7 +125,7 @@ public void testWithoutTx() { Assertions.fail("should exception in create"); } catch (Exception e) { - log.info("insert failure", e); + log.info("should insert failure", e); } final long ild = id.get(); final long nxt = testTransactionalClauseService.getNextSequence(); @@ -135,7 +140,7 @@ public void testWithoutTx() { Assertions.fail("should exception in update"); } catch (Exception e) { - log.info("update failure", e); + log.info("should update failure", e); } final Integer uc = testTransactionalClauseService.selectInt(id.get()); @@ -147,7 +152,7 @@ public void testWithoutTx() { Assertions.fail("should exception in delete"); } catch (Exception e) { - log.info("delete failure", e); + log.info("should delete failure", e); } final Integer dc = testTransactionalClauseService.selectInt(id.get()); @@ -183,7 +188,7 @@ public void testProgrammaticTx(boolean rollback) { Assertions.fail("should exception in create"); } catch (Exception e) { - log.info("insert failure", e); + log.info("should insert failure", e); } final long ild = id.get(); final long nxt = testTransactionalClauseService.getNextSequence(); @@ -199,7 +204,7 @@ public void testProgrammaticTx(boolean rollback) { Assertions.fail("should exception in update"); } catch (Exception e) { - log.info("update failure", e); + log.info("should update failure", e); } // rollback final Integer uc = testTransactionalClauseService.selectInt(id.get()); @@ -211,7 +216,7 @@ public void testProgrammaticTx(boolean rollback) { Assertions.fail("should exception in delete"); } catch (Exception e) { - log.info("delete failure", e); + log.info("should delete failure", e); } // rollback final Integer dc = testTransactionalClauseService.selectInt(id.get()); diff --git a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqDslAndDaoSample.java b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqDslAndDaoSample.java index 0aaa9c42c..96e469cb2 100644 --- a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqDslAndDaoSample.java +++ b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqDslAndDaoSample.java @@ -25,6 +25,7 @@ import pro.fessional.wings.faceless.service.journal.JournalDiff; import pro.fessional.wings.faceless.spring.prop.FacelessJooqConfProp; import pro.fessional.wings.faceless.util.FlywaveRevisionScanner; +import pro.fessional.wings.testing.faceless.database.TestingDatabaseHelper; import pro.fessional.wings.testing.silencer.TestingLoggerAssert; import java.time.LocalDateTime; @@ -64,7 +65,10 @@ public class TestJooqDslAndDaoSample { private SchemaRevisionManager schemaRevisionManager; @Setter(onMethod_ = {@Autowired}) - private TstShardingDao dao; + private TestingDatabaseHelper testingDatabaseHelper; + + @Setter(onMethod_ = {@Autowired}) + private TstShardingDao tstShardingDao; @Setter(onMethod_ = {@Autowired}) private FacelessJooqConfProp prop; @@ -72,7 +76,8 @@ public class TestJooqDslAndDaoSample { @Test @TmsLink("C12112") public void test0Init() { - final var sqls = FlywaveRevisionScanner.scanMaster(); + testingDatabaseHelper.cleanTable(); + var sqls = FlywaveRevisionScanner.scanMaster(); schemaRevisionManager.checkAndInitSql(sqls, 0, true); schemaRevisionManager.publishRevision(V90_22_0601_01_TestSchema.revision(), 0); } @@ -91,35 +96,35 @@ public void test1Dao() { al.start(); testcaseNotice("Use alias"); - final var a = dao.getAlias(); + final var a = tstShardingDao.getAlias(); final var c = a.Id.gt(1L).and(a.CommitId.lt(200L)); // testcaseNotice("select count(*) from `tst_sharding` as `y8` where (`y8`.`id` = ? and `y8`.`commit_id` = ?)"); - final var i = dao.count(a, c); + final var i = tstShardingDao.count(a, c); // testcaseNotice("select * from `tst_sharding` as `y8` where (`y8`.`id` = ? and `y8`.`commit_id` = ?) limit ?"); - final var ft1 = dao.fetch(a, 0, 2, c, a.Id.desc()); + final var ft1 = tstShardingDao.fetch(a, 0, 2, c, a.Id.desc()); log.info("============count {}, ft2'size={}", i, ft1.size()); // testcaseNotice("select `id`, `commit_id` from `tst_sharding` where (`id` > ? and `commit_id` < ?) order by `id` desc limit ? offset ?"); - final var ft2 = dao.fetch(0, 2, (t, w) -> w + final var ft2 = tstShardingDao.fetch(0, 2, (t, w) -> w .where(t.Id.gt(1L).and(t.CommitId.lt(200L))) .query(t.Id, t.CommitId, t.Id.desc())); log.info("============count {}, ft2'size={}", i, ft2.size()); // table testcaseNotice("Use table"); - final var t = dao.getTable(); + final var t = tstShardingDao.getTable(); final var setter = new LinkedHashMap<>(); setter.put(t.CommitId, t.Id.add(1L)); setter.put(t.LoginInfo, "info"); // testcaseNotice("update `tst_sharding` set `commit_id` = (`id` + ?), `login_info` = ? where `id` = ?"); - final var u1 = dao.update(t, setter, t.Id.eq(2L)); + final var u1 = tstShardingDao.update(t, setter, t.Id.eq(2L)); log.info("============update {}", u1); final var po = new TstSharding(); po.setCommitId(2L); po.setLoginInfo("info"); // testcaseNotice("update `tst_sharding` set `commit_id` = ?, `login_info` = ? where `id` = ?"); - final var u2 = dao.update(t, po, t.Id.eq(2L)); + final var u2 = tstShardingDao.update(t, po, t.Id.eq(2L)); log.info("============update {}", u2); al.stop(); @@ -136,7 +141,7 @@ public void test2Dsl() { // final var nullOrder: OrderField? = null final var emptyOrder = new OrderField[]{}; final var t = TstShardingTable.TstSharding; - DSLContext dsl = dao.ctx(); + DSLContext dsl = tstShardingDao.ctx(); final var sql = dsl.select(t.Id, nullField) // null safe .from(t) .where(nullCond) // null safe @@ -217,9 +222,9 @@ public void test3Journal() { @TmsLink("C12116") public void test4DeleteDt() { testcaseNotice("Logic delete"); - final var c1 = dao.count(); + final var c1 = tstShardingDao.count(); log.info("count1={}", c1); - final var c2 = dao.count(TstShardingTable::getOnlyDied); + final var c2 = tstShardingDao.count(TstShardingTable::getOnlyDied); log.info("count2={}", c2); } @@ -227,8 +232,8 @@ public void test4DeleteDt() { @TmsLink("C12117") public void test4Shadow() { testcaseNotice("Shadow table"); - TstShardingTable upd = dao.newTable("", "_postfix"); - final var c1 = dao.count(upd, null); + TstShardingTable upd = tstShardingDao.newTable("", "_postfix"); + final var c1 = tstShardingDao.count(upd, null); log.info("count1={}", c1); } @@ -238,7 +243,7 @@ public void test5DiffDao() { testcaseNotice("Diff Dao"); TstSharding po = new TstSharding(); final long id = 20221024L; - final TstShardingTable t = dao.getTable(); + final TstShardingTable t = tstShardingDao.getTable(); final LocalDateTime now = LocalDateTime.of(2022, 10, 24, 12, 34, 56); po.setId(id); @@ -250,7 +255,7 @@ public void test5DiffDao() { po.setOtherInfo("other by diff insert"); po.setLanguage(ZH_CN); - final JournalDiff d0 = dao.diffInsert(po); + final JournalDiff d0 = tstShardingDao.diffInsert(po); log.warn("diffInsert0={}", d0); Assertions.assertNotNull(d0); Assertions.assertEquals(1, d0.getCount()); @@ -261,7 +266,7 @@ public void test5DiffDao() { Assertions.assertEquals(Arrays.asList(id, now, DATE_TIME, DATE_TIME, id, "login by diff insert", "other by diff insert", ZH_CN), d0.getValue2()); po.setId(id + 1); - final JournalDiff d1 = dao.diffInsert(po); + final JournalDiff d1 = tstShardingDao.diffInsert(po); log.warn("diffInsert1={}", d1); Assertions.assertNotNull(d1); Assertions.assertEquals(Arrays.asList(id + 1, now, DATE_TIME, DATE_TIME, id, "login by diff insert", "other by diff insert", ZH_CN), d1.getValue2()); @@ -270,7 +275,7 @@ public void test5DiffDao() { setter.put(t.CommitId, t.CommitId.add(1)); setter.put(t.LoginInfo, "login by diff update"); - final JournalDiff d2 = dao.diffUpdate(t, setter, t.Id.ge(id)); + final JournalDiff d2 = tstShardingDao.diffUpdate(t, setter, t.Id.ge(id)); log.warn("diffUpdate2={}", d2); Assertions.assertNotNull(d2); Assertions.assertEquals(2, d2.getCount()); @@ -280,7 +285,7 @@ public void test5DiffDao() { Assertions.assertEquals(Arrays.asList(id + 1, "login by diff update", id + 1, "login by diff update"), d2.getValue2()); - final JournalDiff d3 = dao.diffDelete(t, t.Id.ge(id)); + final JournalDiff d3 = tstShardingDao.diffDelete(t, t.Id.ge(id)); log.warn("diffDelete3={}", d3); JournalDiffHelper.tidy(d3, t.Language); // withDefault Assertions.assertNotNull(d3); @@ -300,8 +305,8 @@ public void test5DiffDsl() { testcaseNotice("Diff Dsl"); TstSharding po = new TstSharding(); final long id = 20221024L; - final TstShardingTable t = dao.getTable(); - final DSLContext dsl = dao.ctx(); + final TstShardingTable t = tstShardingDao.getTable(); + final DSLContext dsl = tstShardingDao.ctx(); final LocalDateTime now = LocalDateTime.of(2022, 10, 24, 12, 34, 56); po.setId(id); @@ -314,7 +319,7 @@ public void test5DiffDsl() { po.setLanguage(ZH_CN); final SelectConditionStep query = dsl.selectFrom(t).where(t.Id.eq(id)); - final JournalDiff d0 = JournalDiffHelper.diffInsert(t, query, () -> dao.insert(po)); + final JournalDiff d0 = JournalDiffHelper.diffInsert(t, query, () -> tstShardingDao.insert(po)); log.warn("diffInsert0={}", d0); Assertions.assertNotNull(d0); Assertions.assertEquals(1, d0.getCount()); diff --git a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqMostSelectSample.java b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqMostSelectSample.java index 797944561..2c4057959 100644 --- a/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqMostSelectSample.java +++ b/wings/faceless-jooq/src/test/java/pro/fessional/wings/faceless/sample/TestJooqMostSelectSample.java @@ -47,6 +47,7 @@ import pro.fessional.wings.faceless.enums.autogen.StandardLanguage; import pro.fessional.wings.faceless.flywave.SchemaRevisionManager; import pro.fessional.wings.faceless.util.FlywaveRevisionScanner; +import pro.fessional.wings.testing.faceless.database.TestingDatabaseHelper; import java.time.LocalDateTime; import java.util.ArrayList; @@ -82,12 +83,16 @@ public class TestJooqMostSelectSample { private SchemaRevisionManager schemaRevisionManager; @Setter(onMethod_ = {@Autowired}) - private TstShardingDao dao; + private TestingDatabaseHelper testingDatabaseHelper; + + @Setter(onMethod_ = {@Autowired}) + private TstShardingDao tstShardingDao; @Test @TmsLink("C12120") public void test0Init() { - final var sqls = FlywaveRevisionScanner.scanMaster(); + testingDatabaseHelper.cleanTable(); + var sqls = FlywaveRevisionScanner.scanMaster(); schemaRevisionManager.checkAndInitSql(sqls, 0, false); schemaRevisionManager.publishRevision(V90_22_0601_02_TestRecord.revision(), 0); } @@ -95,8 +100,8 @@ public void test0Init() { @Test @TmsLink("C12121") public void test1SelectOnDemand() { - DSLContext ctx = dao.ctx(); - TstShardingTable t = dao.getTable(); + DSLContext ctx = tstShardingDao.ctx(); + TstShardingTable t = tstShardingDao.getTable(); Condition c = t.Id.gt(1L).and(t.Id.le(105L)); testcaseNotice("1 field to List"); @@ -124,7 +129,7 @@ public void test1SelectOnDemand() { Map> grps = ctx.selectFrom(t) .where(c) .fetch() - .intoGroups(t.Id, dao.mapper()); + .intoGroups(t.Id, tstShardingDao.mapper()); testcaseNotice("2 fields to 2D array"); Object[][] arrs = ctx.select(t.Id, t.LoginInfo) @@ -174,8 +179,8 @@ static void into(@Nullable Record2 source, @NotNull DiffName targe @Test @TmsLink("C12122") public void test2InsertPojo() { - DSLContext ctx = dao.ctx(); - TstShardingTable t = dao.getTable(); + DSLContext ctx = tstShardingDao.ctx(); + TstShardingTable t = tstShardingDao.getTable(); Condition c = t.Id.gt(1L).and(t.Id.le(105L)); testcaseNotice("Multiple fields (subsets of the same name) to List *Recommended*"); @@ -237,8 +242,8 @@ public void test3MixingSql() { ); //////////////////////// execution //////////////////////// - DSLContext ctx = dao.ctx(); - TstShardingTable t = dao.getTable(); + DSLContext ctx = tstShardingDao.ctx(); + TstShardingTable t = tstShardingDao.getTable(); testcaseNotice("from `tst_sharding` where (id >= ? AND id <= ?)" , "from `tst_sharding` where (id >= 1 AND id <= 105)"); @@ -272,7 +277,7 @@ public void test3MixingSql() { @Test @TmsLink("C12124") public void test3BindSql() { - DSLContext ctx = dao.ctx(); + DSLContext ctx = tstShardingDao.ctx(); testcaseNotice("Binding by map or jackson pojo to map"); Map bd1 = new HashMap<>(); @@ -309,7 +314,7 @@ public void test3BindSql() { // Convert by record, Must have fields with the same name testcaseNotice("Binding by pojo, Convert by record, Must have fields with the same name"); - TstShardingRecord rc = dao.newRecord(bd3); + TstShardingRecord rc = tstShardingDao.newRecord(bd3); rc.from(bd3); List bv3 = ctx.fetch(""" SELECT id, login_info @@ -325,7 +330,7 @@ public void test3BindSql() { @TmsLink("C12125") public void test3DynamicSql() { // condition and `cond*` - TstShardingTable t = dao.getTable(); + TstShardingTable t = tstShardingDao.getTable(); // by builder, null friendly Condition d1 = WingsJooqUtil.condition("1=1"); @@ -355,31 +360,31 @@ public void test3DynamicSql() { SameName bd1 = new SameName(); bd1.setId(105L); bd1.setLoginInfo("LOGIN_INFO-05"); - TstShardingRecord rc1 = dao.newRecord(bd1); + TstShardingRecord rc1 = tstShardingDao.newRecord(bd1); // where (`id` = ? and `login_info` = ?) // (`id` = 105 and `login_info` = 'LOGIN_INFO-05') testcaseNotice("by Record and condChain `AND`"); Condition cd1 = WingsJooqUtil.condChain(AND, rc1); - List rs1 = dao.fetch(dao.getTable(), cd1); + List rs1 = tstShardingDao.fetch(tstShardingDao.getTable(), cd1); // SameName bd2 = new SameName(); bd2.setId(105L); bd2.setLoginInfo("LOGIN_INFO-06"); - TstShardingRecord rc2 = dao.newRecord(bd2); + TstShardingRecord rc2 = tstShardingDao.newRecord(bd2); // where (`id` = ? or `login_info` = ?) // where (`id` = 105 or `login_info` = 'LOGIN_INFO-06') testcaseNotice("by Record and condChain `OR`"); Condition cd2 = WingsJooqUtil.condChain(OR, rc2); - List rs2 = dao.fetch(dao.getTable(), cd2); + List rs2 = tstShardingDao.fetch(tstShardingDao.getTable(), cd2); // only id // where `id` = ? // where `id` = 105 testcaseNotice("by Record and condChain single field"); List cds = WingsJooqUtil.condField(rc2, t.Id); - List rs3 = dao.fetch(t, DSL.condition(OR, cds)); + List rs3 = tstShardingDao.fetch(t, DSL.condition(OR, cds)); // testcaseNotice("by string-value map"); @@ -390,13 +395,13 @@ public void test3DynamicSql() { // from `tst_sharding` where (id = ? and login_info = ?) Condition cd4 = WingsJooqUtil.condChain(map); - List rc4 = dao.fetch(t, cd4); + List rc4 = tstShardingDao.fetch(t, cd4); // from `tst_sharding` as `y8` where (`y8`.`login_info` = ? and `y8`.`id` = ?) testcaseNotice("by string-value map, and alias"); - TstShardingTable a = dao.getAlias(); + TstShardingTable a = tstShardingDao.getAlias(); Condition cd5 = WingsJooqUtil.condChain(map, true, a); - List rc5 = dao.fetch(a, cd5); + List rc5 = tstShardingDao.fetch(a, cd5); // use dao.update() to update @@ -437,10 +442,10 @@ public void test4JdbcTemplate() { @Test @TmsLink("C12127") public void test5PaginateJooq() { - DSLContext dsl = dao.ctx(); - TstShardingTable t = dao.getTable(); - TstShardingTable t1 = dao.getAlias(); - TstShardingTable t2 = dao.getAlias("t2"); + DSLContext dsl = tstShardingDao.ctx(); + TstShardingTable t = tstShardingDao.getTable(); + TstShardingTable t1 = tstShardingDao.getAlias(); + TstShardingTable t2 = tstShardingDao.getAlias("t2"); // testcaseNotice("use helperJooq, normal", @@ -449,7 +454,7 @@ public void test5PaginateJooq() { PageQuery page = new PageQuery().setSize(5).setPage(1).setSort("d"); Map> order = new HashMap<>(); order.put("d", t1.Id); - PageResult pr1 = PageJooqHelper.use(dao, page) + PageResult pr1 = PageJooqHelper.use(tstShardingDao, page) .count() .from(t1) .where(t1.Id.ge(1L)) @@ -457,7 +462,7 @@ public void test5PaginateJooq() { .fetch(t1.Id, t1.CommitId) .into(TstSharding.class); - PageResult pr2 = PageJooqHelper.use(dao.ctx(), page) + PageResult pr2 = PageJooqHelper.use(tstShardingDao.ctx(), page) .count() .from(t1) .where(t1.Id.ge(1L)) @@ -473,7 +478,7 @@ public void test5PaginateJooq() { testcaseNotice("use helperJooq, simple", "cached total to ignore `select count` in db", "select * from `tst_sharding` limit ?"); - PageResult pr3 = PageJooqHelper.use(dao, page, 10) + PageResult pr3 = PageJooqHelper.use(tstShardingDao, page, 10) .count() .from(t) .whereTrue() @@ -484,14 +489,14 @@ public void test5PaginateJooq() { testcaseNotice("use helperJooq wrap", "select count(*) as `c` from (select `t1`.* from `tst_sharding` as `t1` where `t1`.`id` >= ?) as `q`", "select `t1`.* from `tst_sharding` as `t1` where `t1`.`id` >= ? order by `id` asc limit ?"); - final var qry4 = dsl.select(t1.asterisk()).from(t1).where(t1.Id.ge(1L)); - PageResult pr4 = PageJooqHelper.use(dao, page) + final var qry4 = dsl.select(t1.asterisk()).from(t1).where(t1.Id.ge(1L)); + PageResult pr4 = PageJooqHelper.use(tstShardingDao, page) .wrap(qry4, order) .fetch() .into(TstSharding.class); - final var qry5 = dsl.select(t1.Id, t1.CommitId).from(t1).where(t1.Id.ge(1L)); - PageResult pr5 = PageJooqHelper.use(dao, page) + final var qry5 = dsl.select(t1.Id, t1.CommitId).from(t1).where(t1.Id.ge(1L)); + PageResult pr5 = PageJooqHelper.use(tstShardingDao, page) .wrap(qry5, order) .fetch() .into(it -> { @@ -593,22 +598,22 @@ public static class EnumDto { @Test @TmsLink("C12129") public void test6MapperEnum() { - final TstShardingTable t = dao.getTable(); + final TstShardingTable t = tstShardingDao.getTable(); DataType lang = SQLDataType.INTEGER.asConvertedDataType(JooqConsEnumConverter.of(StandardLanguage.class)); final Field langField = DSL.field(t.Language.getName(), lang); - final List sn = dao.ctx() - .select(t.Id, langField) - .from(t) - .fetch() - .into(EnumDto.class); + final List sn = tstShardingDao.ctx() + .select(t.Id, langField) + .from(t) + .fetch() + .into(EnumDto.class); log.info("sn={}", sn); // Global injected - final List sn2 = dao.ctx() - .select(t.Id, t.Language) - .from(t) - .fetch() - .into(EnumDto.class); + final List sn2 = tstShardingDao.ctx() + .select(t.Id, t.Language) + .from(t) + .fetch() + .into(EnumDto.class); log.info("sn2={}", sn2); } @@ -618,8 +623,8 @@ public void test7Function() { testcaseNotice("by DSL, get function of dialect", "select `id` from `tst_sharding` where (`modify_dt` > date_add(?, interval ? day) and substring(`other_info`, ?, ?) like ?)"); - final TstShardingTable t = dao.getTable(); - final String sql1 = dao + final TstShardingTable t = tstShardingDao.getTable(); + final String sql1 = tstShardingDao .ctx() .select(t.Id) .from(t) @@ -635,7 +640,7 @@ public void test7Function() { rw2.add(DSL.row(1L, "1")); rw2.add(DSL.row(2L, "2")); - final String sql2 = dao + final String sql2 = tstShardingDao .ctx() .select(t.Id) .from(t) diff --git a/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/flywave/FlywaveShardingTest.java b/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/flywave/FlywaveShardingTest.java index 603adc08e..332db3e18 100644 --- a/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/flywave/FlywaveShardingTest.java +++ b/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/flywave/FlywaveShardingTest.java @@ -14,8 +14,6 @@ import pro.fessional.wings.testing.database.TestingDataSource; import pro.fessional.wings.testing.faceless.database.TestingDatabaseHelper; -import java.util.SortedMap; - import static org.junit.jupiter.api.Assertions.assertEquals; import static pro.fessional.wings.faceless.flywave.WingsRevision.V90_22_0601_01_TestSchema; import static pro.fessional.wings.faceless.flywave.WingsRevision.V90_22_0601_02_TestRecord; @@ -45,7 +43,7 @@ public class FlywaveShardingTest { @TmsLink("C12131") public void test0CleanTables() { testingDatabaseHelper.cleanTable(); - final SortedMap sqls = FlywaveRevisionScanner.scanMaster(); + var sqls = FlywaveRevisionScanner.scanMaster(); schemaRevisionManager.checkAndInitSql(sqls, 0, true); } diff --git a/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/jooq/JooqShardingTest.java b/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/jooq/JooqShardingTest.java index b0a93635b..48fbad669 100644 --- a/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/jooq/JooqShardingTest.java +++ b/wings/faceless-shard/src/test/java/pro/fessional/wings/faceless/jooq/JooqShardingTest.java @@ -25,7 +25,6 @@ import java.time.LocalDateTime; import java.util.Arrays; -import java.util.SortedMap; import static pro.fessional.wings.faceless.enums.autogen.StandardLanguage.ZH_CN; import static pro.fessional.wings.faceless.flywave.WingsRevision.V90_22_0601_01_TestSchema; @@ -60,7 +59,7 @@ public class JooqShardingTest { @TmsLink("C12135") public void test0CleanTables() { testingDatabaseHelper.cleanTable(); - final SortedMap sqls = FlywaveRevisionScanner.scanMaster(); + var sqls = FlywaveRevisionScanner.scanMaster(); schemaRevisionManager.checkAndInitSql(sqls, 0, true); } From 7085c7bdaf80c8bf90e1c47ba8061a09a1362428 Mon Sep 17 00:00:00 2001 From: trydofor Date: Wed, 20 Mar 2024 12:17:30 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E2=9C=A8=20customize=20stacktrace=20logger?= =?UTF-8?q?=20in=20ExceptionResolver=20#222?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- observe/mirana | 2 +- pom.xml | 2 +- .../impl/DoubleKillExceptionResolver.java | 3 +- .../webmvc/SimpleExceptionResolver.java | 3 +- .../webmvc/WingsExceptionResolver.java | 19 +++-- .../errorhandle/DefaultExceptionResolver.java | 71 ++++++++++++++----- 6 files changed, 73 insertions(+), 27 deletions(-) diff --git a/observe/mirana b/observe/mirana index 6eda0885a..7f6b5f84f 160000 --- a/observe/mirana +++ b/observe/mirana @@ -1 +1 @@ -Subproject commit 6eda0885aa1cc62b6a12ee2771a5ab51327f9424 +Subproject commit 7f6b5f84fb6843fca33dd537ec3100c31cf0a794 diff --git a/pom.xml b/pom.xml index 40ce62147..c677adb47 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 1.11.0 2.2.3 - 2.7.1 + 2.7.2 1.5.1 2.3.3 2.0.47 diff --git a/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/concur/impl/DoubleKillExceptionResolver.java b/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/concur/impl/DoubleKillExceptionResolver.java index a55821a17..1ec8c1577 100644 --- a/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/concur/impl/DoubleKillExceptionResolver.java +++ b/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/concur/impl/DoubleKillExceptionResolver.java @@ -1,5 +1,6 @@ package pro.fessional.wings.slardar.concur.impl; +import org.jetbrains.annotations.NotNull; import org.springframework.core.annotation.Order; import pro.fessional.mirana.text.StringTemplate; import pro.fessional.wings.silencer.spring.WingsOrdered; @@ -21,7 +22,7 @@ public DoubleKillExceptionResolver(SimpleResponse defaultResponse) { } @Override - protected SimpleResponse resolve(DoubleKillException e) { + protected SimpleResponse resolve(@NotNull DoubleKillException e) { final String body = StringTemplate .dyn(defaultResponse.getResponseBody()) .bindStr("{key}", e.getProgressKey()) diff --git a/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/SimpleExceptionResolver.java b/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/SimpleExceptionResolver.java index bb1e09db9..90a8cc02c 100644 --- a/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/SimpleExceptionResolver.java +++ b/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/SimpleExceptionResolver.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; /** * @author trydofor @@ -14,7 +15,7 @@ public class SimpleExceptionResolver extends WingsException protected final SimpleResponse defaultResponse; @Override - protected SimpleResponse resolve(T ce) { + protected SimpleResponse resolve(@NotNull T ce) { return defaultResponse; } } diff --git a/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/WingsExceptionResolver.java b/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/WingsExceptionResolver.java index 4bab19d0d..5a739cd7b 100644 --- a/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/WingsExceptionResolver.java +++ b/wings/slardar-webmvc/src/main/java/pro/fessional/wings/slardar/webmvc/WingsExceptionResolver.java @@ -2,11 +2,15 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; +import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver; import pro.fessional.wings.slardar.servlet.response.view.PlainTextView; import java.lang.reflect.ParameterizedType; @@ -17,8 +21,11 @@ * @since 2021-03-25 */ @Slf4j -public abstract class WingsExceptionResolver extends AbstractHandlerExceptionResolver { +@Getter +@Setter +public abstract class WingsExceptionResolver implements HandlerExceptionResolver, Ordered { + private int order = Ordered.LOWEST_PRECEDENCE; protected final Class acceptClass; protected WingsExceptionResolver() { @@ -32,14 +39,15 @@ protected WingsExceptionResolver() { @Override @SuppressWarnings("unchecked") - protected ModelAndView doResolveException( + public ModelAndView resolveException( @NotNull HttpServletRequest request, - @NotNull HttpServletResponse response, Object handler, + @NotNull HttpServletResponse response, @Nullable Object handler, @NotNull Exception ex) { if (acceptClass.isInstance(ex)) { final SimpleResponse body = resolve((T) ex); if (body == null) return null; + ModelAndView mav = new ModelAndView(); PlainTextView pv = new PlainTextView(body.getContentType(), body.getResponseBody()); mav.setStatus(HttpStatus.valueOf(body.getHttpStatus())); @@ -56,5 +64,6 @@ protected ModelAndView doResolveException( * @param ex current exception * @return null if not support */ - protected abstract SimpleResponse resolve(T ex); + @Nullable + protected abstract SimpleResponse resolve(@NotNull T ex); } diff --git a/wings/warlock-shadow/src/main/java/pro/fessional/wings/warlock/errorhandle/DefaultExceptionResolver.java b/wings/warlock-shadow/src/main/java/pro/fessional/wings/warlock/errorhandle/DefaultExceptionResolver.java index bdf14ed0a..5b86cdf32 100644 --- a/wings/warlock-shadow/src/main/java/pro/fessional/wings/warlock/errorhandle/DefaultExceptionResolver.java +++ b/wings/warlock-shadow/src/main/java/pro/fessional/wings/warlock/errorhandle/DefaultExceptionResolver.java @@ -1,8 +1,13 @@ package pro.fessional.wings.warlock.errorhandle; import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Getter; +import lombok.Setter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; @@ -32,11 +37,15 @@ * @since 2021-03-25 */ @Slf4j +@Getter public class DefaultExceptionResolver extends SimpleExceptionResolver { protected final MessageSource messageSource; protected final ObjectMapper objectMapper; + @Setter(onMethod_ = {@Autowired(required = false)}) + protected Handler handler = null; + public DefaultExceptionResolver(SimpleResponse defaultResponse, MessageSource messageSource, ObjectMapper objectMapper) { super(defaultResponse); this.messageSource = messageSource; @@ -44,36 +53,49 @@ public DefaultExceptionResolver(SimpleResponse defaultResponse, MessageSource me } @Override - protected SimpleResponse resolve(Exception exception) { + protected SimpleResponse resolve(@NotNull Exception exception) { + SimpleResponse response = null; try { - Throwable tmp = exception; - for (; tmp != null; tmp = tmp.getCause()) { - if (tmp instanceof HttpStatusException ex) { - return handle(ex); + Throwable cause = exception; + for (; response == null && cause != null; cause = cause.getCause()) { + if (cause instanceof HttpStatusException ex) { + response = handle(ex); } - else if (tmp instanceof TerminalContextException ex) { - return handleUnauthorized(ex); + else if (cause instanceof TerminalContextException ex) { + response = handleUnauthorized(ex); } - else if (tmp instanceof CodeException ex) { - return handle(ex); + else if (cause instanceof CodeException ex) { + response = handle(ex); } - else if (tmp instanceof DataResult ex) { - return handle(ex); + else if (cause instanceof DataResult ex) { + response = handle(ex); } - else if (tmp instanceof AuthenticationException ex) { - return handleUnauthorized(ex); + else if (cause instanceof AuthenticationException ex) { + response = handleUnauthorized(ex); } - else if (tmp instanceof AccessDeniedException ex) { - return handleAccessDenied(ex); + else if (cause instanceof AccessDeniedException ex) { + response = handleAccessDenied(ex); } } + // handler + if (handler != null) { + // use original exception if response is null, otherwise the cause + response = handler.handle(response == null ? exception : cause, response); + } } - catch (Exception e) { + catch (Throwable e) { DummyBlock.ignore(e); } - log.error("unhandled exception, response default", exception); - return defaultResponse; + if (response == null) { + log.error("unhandled exception, response default", exception); + response = defaultResponse; + } + else { + log.debug("handled exception, response simple", exception); + } + + return response; } @SneakyThrows @@ -132,4 +154,17 @@ protected String resolveMessage(String code, Object... args) { Locale locale = LocaleZoneIdUtil.LocaleNonnull.get(); return messageSource.getMessage(code, args, locale); } + + /** + * handle response and exception after resolving cause + */ + public interface Handler { + /** + * use original exception if response is null, otherwise the cause + */ + @Nullable + default SimpleResponse handle(@NotNull Throwable cause, @Nullable SimpleResponse response) { + return response; + } + } }