From affee4f9147e10cc134058933c84072303402011 Mon Sep 17 00:00:00 2001 From: bibonix Date: Wed, 6 May 2026 06:19:18 +0000 Subject: [PATCH 1/2] Upgrade qulice to 0.27.6 and grizzly to 5.0.1, fix violations Bumps qulice-maven-plugin from 0.25.1 to 0.27.6 and org.glassfish.grizzly:grizzly-http-servlet-server from 4.0.2 to 5.0.1. The new qulice version surfaces additional checkstyle/PMD rules; the source is adjusted to satisfy them (drop blank Javadoc lines before @-clauses and blank lines before closing braces, extract long XPath templates into static constants, restructure fluent chains, refactor RtSttc constructor to delegate to a static factory, replace SttcRule no-arg ctor with fromProperties() and drop public 'srule' field). Build passes 'mvn install -Pqulice' cleanly. --- pom.xml | 4 +- src/main/java/co/stateful/Atomic.java | 8 ++- src/main/java/co/stateful/Counter.java | 2 - src/main/java/co/stateful/Counters.java | 2 - src/main/java/co/stateful/Lock.java | 2 - src/main/java/co/stateful/Locks.java | 2 - src/main/java/co/stateful/RtCounter.java | 17 +++-- src/main/java/co/stateful/RtCounters.java | 16 ++--- src/main/java/co/stateful/RtLock.java | 2 - src/main/java/co/stateful/RtLocks.java | 2 - src/main/java/co/stateful/RtSttc.java | 63 ++++++++++++------- src/main/java/co/stateful/Sttc.java | 1 - .../java/co/stateful/cached/CdCounters.java | 1 - src/main/java/co/stateful/cached/CdLocks.java | 1 - src/main/java/co/stateful/cached/CdSttc.java | 1 - .../java/co/stateful/cached/package-info.java | 1 - src/main/java/co/stateful/mock/MkCounter.java | 1 - .../java/co/stateful/mock/MkCounters.java | 2 - src/main/java/co/stateful/mock/MkLock.java | 1 - src/main/java/co/stateful/mock/MkLocks.java | 2 - src/main/java/co/stateful/mock/MkSttc.java | 1 - .../java/co/stateful/retry/ReCounter.java | 1 - .../java/co/stateful/retry/ReCounters.java | 1 - src/main/java/co/stateful/retry/ReLock.java | 1 - src/main/java/co/stateful/retry/ReLocks.java | 1 - src/test/java/co/stateful/AtomicTest.java | 14 ++--- src/test/java/co/stateful/RtCounterTest.java | 1 - .../java/co/stateful/RtCountersITCase.java | 9 +-- src/test/java/co/stateful/RtLockTest.java | 1 - src/test/java/co/stateful/RtLocksITCase.java | 13 +--- src/test/java/co/stateful/RtLocksTest.java | 22 ++----- src/test/java/co/stateful/SttcRule.java | 20 +++--- src/test/java/co/stateful/package-info.java | 1 - 33 files changed, 89 insertions(+), 128 deletions(-) diff --git a/pom.xml b/pom.xml index c31253d..161e4e4 100644 --- a/pom.xml +++ b/pom.xml @@ -142,7 +142,7 @@ org.glassfish.grizzly grizzly-http-servlet-server - 4.0.2 + 5.0.1 test @@ -214,7 +214,7 @@ com.qulice qulice-maven-plugin - 0.25.1 + 0.27.6 findbugs:.* diff --git a/src/main/java/co/stateful/Atomic.java b/src/main/java/co/stateful/Atomic.java index 04f77f9..c66e77e 100644 --- a/src/main/java/co/stateful/Atomic.java +++ b/src/main/java/co/stateful/Atomic.java @@ -46,6 +46,11 @@ @EqualsAndHashCode(of = { "callable", "lock" }) public final class Atomic implements Callable { + /** + * Default maximum waiting time, in milliseconds (five minutes). + */ + private static final long DEFAULT_MAX = TimeUnit.MINUTES.toMillis(5L); + /** * Random. */ @@ -92,7 +97,7 @@ public Atomic(final Callable clbl, final Lock lck) { * @param lbl Label to use for locking and unlocking (can be empty) */ public Atomic(final Callable clbl, final Lock lck, final String lbl) { - this(clbl, lck, lbl, TimeUnit.MINUTES.toMillis(5L)); + this(clbl, lck, lbl, Atomic.DEFAULT_MAX); } // @checkstyle ParameterNumberCheck (15 lines) @@ -184,5 +189,4 @@ public T callQuietly() { throw new IllegalStateException(ex); } } - } diff --git a/src/main/java/co/stateful/Counter.java b/src/main/java/co/stateful/Counter.java index 8ecf180..10f0f34 100644 --- a/src/main/java/co/stateful/Counter.java +++ b/src/main/java/co/stateful/Counter.java @@ -9,7 +9,6 @@ /** * Counter. - * * @since 0.1 */ @Immutable @@ -36,5 +35,4 @@ public interface Counter { * @throws IOException If some I/O problem */ long incrementAndGet(long delta) throws IOException; - } diff --git a/src/main/java/co/stateful/Counters.java b/src/main/java/co/stateful/Counters.java index f790f7a..0732f37 100644 --- a/src/main/java/co/stateful/Counters.java +++ b/src/main/java/co/stateful/Counters.java @@ -9,7 +9,6 @@ /** * Counters. - * * @since 0.1 */ @Immutable @@ -44,5 +43,4 @@ public interface Counters { * @throws IOException If some I/O problem */ Counter get(String name) throws IOException; - } diff --git a/src/main/java/co/stateful/Lock.java b/src/main/java/co/stateful/Lock.java index 01ce62b..cd3722c 100644 --- a/src/main/java/co/stateful/Lock.java +++ b/src/main/java/co/stateful/Lock.java @@ -9,7 +9,6 @@ /** * Lock. - * * @since 0.3 */ @Immutable @@ -47,5 +46,4 @@ public interface Lock { * @since 0.11 */ boolean unlock(String label) throws IOException; - } diff --git a/src/main/java/co/stateful/Locks.java b/src/main/java/co/stateful/Locks.java index 12c52db..230d87b 100644 --- a/src/main/java/co/stateful/Locks.java +++ b/src/main/java/co/stateful/Locks.java @@ -9,7 +9,6 @@ /** * Locks. - * * @since 0.2 */ @Immutable @@ -31,5 +30,4 @@ public interface Locks { * @throws IOException If fails */ Lock get(String name) throws IOException; - } diff --git a/src/main/java/co/stateful/RtCounter.java b/src/main/java/co/stateful/RtCounter.java index 9710812..90881ef 100644 --- a/src/main/java/co/stateful/RtCounter.java +++ b/src/main/java/co/stateful/RtCounter.java @@ -19,7 +19,6 @@ /** * Counter. - * * @since 0.1 * @checkstyle MultipleStringLiteralsCheck (500 lines) */ @@ -29,6 +28,13 @@ @EqualsAndHashCode(of = { "label", "request" }) final class RtCounter implements Counter { + /** + * XPath template to a counter operation link. + * @checkstyle LineLength (3 lines) + */ + private static final String XPATH = + "/page/counters/counter[name='%s']/links/link[@rel='%s']/@href"; + /** * Its name. */ @@ -95,13 +101,6 @@ private Request front(final String ops) throws IOException { .as(RestResponse.class) .assertStatus(HttpURLConnection.HTTP_OK) .as(XmlResponse.class) - .rel( - String.format( - // @checkstyle LineLength (1 line) - "/page/counters/counter[name='%s']/links/link[@rel='%s']/@href", - this.label, ops - ) - ); + .rel(String.format(RtCounter.XPATH, this.label, ops)); } - } diff --git a/src/main/java/co/stateful/RtCounters.java b/src/main/java/co/stateful/RtCounters.java index a40c970..294662f 100644 --- a/src/main/java/co/stateful/RtCounters.java +++ b/src/main/java/co/stateful/RtCounters.java @@ -19,7 +19,6 @@ /** * Counters. - * * @since 0.1 * @checkstyle MultipleStringLiteralsCheck (500 lines) */ @@ -29,6 +28,13 @@ @EqualsAndHashCode(of = "request") final class RtCounters implements Counters { + /** + * XPath template to a counter delete link. + * @checkstyle LineLength (3 lines) + */ + private static final String XPATH_DELETE = + "/page/counters/counter[name='%s']/links/link[@rel='delete']/@href"; + /** * Entry request. */ @@ -81,13 +87,7 @@ public void delete(final String name) throws IOException { .as(RestResponse.class) .assertStatus(HttpURLConnection.HTTP_OK) .as(XmlResponse.class) - .rel( - String.format( - // @checkstyle LineLength (1 line) - "/page/counters/counter[name='%s']/links/link[@rel='delete']/@href", - name - ) - ) + .rel(String.format(RtCounters.XPATH_DELETE, name)) .header(HttpHeaders.ACCEPT, MediaType.TEXT_XML) .uri().queryParam("name", name).back() .fetch() diff --git a/src/main/java/co/stateful/RtLock.java b/src/main/java/co/stateful/RtLock.java index 5f16e20..467bf7a 100644 --- a/src/main/java/co/stateful/RtLock.java +++ b/src/main/java/co/stateful/RtLock.java @@ -20,7 +20,6 @@ /** * Lock. - * * @since 0.3 * @checkstyle MultipleStringLiteralsCheck (500 lines) */ @@ -111,5 +110,4 @@ private Request front(final String label) throws IOException { .as(XmlResponse.class) .rel(String.format("/page/links/link[@rel='%s']/@href", label)); } - } diff --git a/src/main/java/co/stateful/RtLocks.java b/src/main/java/co/stateful/RtLocks.java index b7ba30b..3089e23 100644 --- a/src/main/java/co/stateful/RtLocks.java +++ b/src/main/java/co/stateful/RtLocks.java @@ -18,7 +18,6 @@ /** * Locks. - * * @since 0.2 * @checkstyle MultipleStringLiteralsCheck (500 lines) */ @@ -58,5 +57,4 @@ public boolean exists(final String name) throws IOException { public Lock get(final String name) { return new RtLock(name, this.request); } - } diff --git a/src/main/java/co/stateful/RtSttc.java b/src/main/java/co/stateful/RtSttc.java index b012366..5fa301e 100644 --- a/src/main/java/co/stateful/RtSttc.java +++ b/src/main/java/co/stateful/RtSttc.java @@ -67,32 +67,16 @@ public final class RtSttc implements Sttc { * @param token Security token */ public RtSttc(final URN urn, final String token) { - this.request = new JdkRequest("https://www.stateful.co") - .through(OneMinuteWire.class) - .through(RetryWire.class) - .through(VerboseWire.class) - .through(CachingWire.class, "((POST|PUT|PATCH) .*|.*\\?.*)") - .header("X-Sttc-URN", urn.toString()) - .header("X-Sttc-Token", token) - .header(HttpHeaders.ACCEPT, MediaType.TEXT_XML) - .header(HttpHeaders.USER_AGENT, "java-sdk.stateful.co"); + // @checkstyle ConstructorsCodeFreeCheck (1 line) + this(RtSttc.entry(urn, token)); } /** - * Make an instance of it. - * @param urn Owner URN - * @param token Security token - * @return Sttc + * Ctor. + * @param req Entry request */ - @SuppressWarnings("PMD.ProhibitPublicStaticMethods") - public static Sttc make(final URN urn, final String token) { - final Sttc sttc; - if (token.matches("[A-F0-9\\-]{19}")) { - sttc = new RtSttc(urn, token); - } else { - sttc = new MkSttc(); - } - return sttc; + private RtSttc(final Request req) { + this.request = req; } @Override @@ -118,4 +102,39 @@ public Locks locks() throws IOException { .rel("/page/links/link[@rel='menu:locks']/@href") ); } + + /** + * Make an instance of it. + * @param urn Owner URN + * @param token Security token + * @return Sttc + */ + @SuppressWarnings("PMD.ProhibitPublicStaticMethods") + public static Sttc make(final URN urn, final String token) { + final Sttc sttc; + if (token.matches("[A-F0-9\\-]{19}")) { + sttc = new RtSttc(urn, token); + } else { + sttc = new MkSttc(); + } + return sttc; + } + + /** + * Build entry request. + * @param urn Owner URN + * @param token Security token + * @return Request + */ + private static Request entry(final URN urn, final String token) { + return new JdkRequest("https://www.stateful.co") + .through(OneMinuteWire.class) + .through(RetryWire.class) + .through(VerboseWire.class) + .through(CachingWire.class, "((POST|PUT|PATCH) .*|.*\\?.*)") + .header("X-Sttc-URN", urn.toString()) + .header("X-Sttc-Token", token) + .header(HttpHeaders.ACCEPT, MediaType.TEXT_XML) + .header(HttpHeaders.USER_AGENT, "java-sdk.stateful.co"); + } } diff --git a/src/main/java/co/stateful/Sttc.java b/src/main/java/co/stateful/Sttc.java index 6f90b5a..985a5ed 100644 --- a/src/main/java/co/stateful/Sttc.java +++ b/src/main/java/co/stateful/Sttc.java @@ -42,5 +42,4 @@ public interface Sttc { * @throws IOException If some I/O problem */ Locks locks() throws IOException; - } diff --git a/src/main/java/co/stateful/cached/CdCounters.java b/src/main/java/co/stateful/cached/CdCounters.java index ade1ed3..26c12ea 100644 --- a/src/main/java/co/stateful/cached/CdCounters.java +++ b/src/main/java/co/stateful/cached/CdCounters.java @@ -16,7 +16,6 @@ /** * Cached counters. - * * @since 0.7 */ @Immutable diff --git a/src/main/java/co/stateful/cached/CdLocks.java b/src/main/java/co/stateful/cached/CdLocks.java index f15397c..a7ac183 100644 --- a/src/main/java/co/stateful/cached/CdLocks.java +++ b/src/main/java/co/stateful/cached/CdLocks.java @@ -16,7 +16,6 @@ /** * Cached locks. - * * @since 0.7 */ @Immutable diff --git a/src/main/java/co/stateful/cached/CdSttc.java b/src/main/java/co/stateful/cached/CdSttc.java index 62a2cf2..2b23939 100644 --- a/src/main/java/co/stateful/cached/CdSttc.java +++ b/src/main/java/co/stateful/cached/CdSttc.java @@ -17,7 +17,6 @@ /** * Cached Sttc. - * * @since 0.7 */ @Immutable diff --git a/src/main/java/co/stateful/cached/package-info.java b/src/main/java/co/stateful/cached/package-info.java index 94c15da..6d4d7ca 100644 --- a/src/main/java/co/stateful/cached/package-info.java +++ b/src/main/java/co/stateful/cached/package-info.java @@ -5,7 +5,6 @@ /** * Cached SDK interfaces (highly recommended to use in production). - * * @since 0.7 */ package co.stateful.cached; diff --git a/src/main/java/co/stateful/mock/MkCounter.java b/src/main/java/co/stateful/mock/MkCounter.java index 1835f55..4303896 100644 --- a/src/main/java/co/stateful/mock/MkCounter.java +++ b/src/main/java/co/stateful/mock/MkCounter.java @@ -12,7 +12,6 @@ /** * Mock counter. - * * @since 0.1 */ @Immutable diff --git a/src/main/java/co/stateful/mock/MkCounters.java b/src/main/java/co/stateful/mock/MkCounters.java index ff331a3..7fab1f4 100644 --- a/src/main/java/co/stateful/mock/MkCounters.java +++ b/src/main/java/co/stateful/mock/MkCounters.java @@ -14,7 +14,6 @@ /** * Mock counters. - * * @since 0.1 */ @Immutable @@ -42,5 +41,4 @@ public void delete(final String name) { public Counter get(final String name) { return new MkCounter(); } - } diff --git a/src/main/java/co/stateful/mock/MkLock.java b/src/main/java/co/stateful/mock/MkLock.java index 123c62e..b4bfdd0 100644 --- a/src/main/java/co/stateful/mock/MkLock.java +++ b/src/main/java/co/stateful/mock/MkLock.java @@ -12,7 +12,6 @@ /** * Mock lock. - * * @since 0.3 */ @Immutable diff --git a/src/main/java/co/stateful/mock/MkLocks.java b/src/main/java/co/stateful/mock/MkLocks.java index 531a5ff..e3d2230 100644 --- a/src/main/java/co/stateful/mock/MkLocks.java +++ b/src/main/java/co/stateful/mock/MkLocks.java @@ -13,7 +13,6 @@ /** * Mock locks. - * * @since 0.2 */ @Immutable @@ -31,5 +30,4 @@ public boolean exists(final String name) { public Lock get(final String name) { return new MkLock(); } - } diff --git a/src/main/java/co/stateful/mock/MkSttc.java b/src/main/java/co/stateful/mock/MkSttc.java index 9c742c6..f7553a3 100644 --- a/src/main/java/co/stateful/mock/MkSttc.java +++ b/src/main/java/co/stateful/mock/MkSttc.java @@ -14,7 +14,6 @@ /** * Mock. - * * @since 0.1 */ @Immutable diff --git a/src/main/java/co/stateful/retry/ReCounter.java b/src/main/java/co/stateful/retry/ReCounter.java index 817aaaa..97b879d 100644 --- a/src/main/java/co/stateful/retry/ReCounter.java +++ b/src/main/java/co/stateful/retry/ReCounter.java @@ -15,7 +15,6 @@ /** * Retriable counter. - * * @since 0.5 */ @Immutable diff --git a/src/main/java/co/stateful/retry/ReCounters.java b/src/main/java/co/stateful/retry/ReCounters.java index 09f581d..9ed1139 100644 --- a/src/main/java/co/stateful/retry/ReCounters.java +++ b/src/main/java/co/stateful/retry/ReCounters.java @@ -16,7 +16,6 @@ /** * Retriable counters. - * * @since 0.5 */ @Immutable diff --git a/src/main/java/co/stateful/retry/ReLock.java b/src/main/java/co/stateful/retry/ReLock.java index 81d5516..25258f8 100644 --- a/src/main/java/co/stateful/retry/ReLock.java +++ b/src/main/java/co/stateful/retry/ReLock.java @@ -15,7 +15,6 @@ /** * Retriable lock. - * * @since 0.5 */ @Immutable diff --git a/src/main/java/co/stateful/retry/ReLocks.java b/src/main/java/co/stateful/retry/ReLocks.java index dda220f..8d16d54 100644 --- a/src/main/java/co/stateful/retry/ReLocks.java +++ b/src/main/java/co/stateful/retry/ReLocks.java @@ -16,7 +16,6 @@ /** * Retriable locks. - * * @since 0.5 */ @Immutable diff --git a/src/test/java/co/stateful/AtomicTest.java b/src/test/java/co/stateful/AtomicTest.java index 7beed95..31e4b52 100644 --- a/src/test/java/co/stateful/AtomicTest.java +++ b/src/test/java/co/stateful/AtomicTest.java @@ -48,19 +48,17 @@ void unlocksWhenCrashed() throws Exception { void callsUnlockAfterException() throws Exception { final Lock lock = Mockito.mock(Lock.class); Mockito.doReturn(true).when(lock).lock(Mockito.anyString()); - final Atomic atomic = new Atomic<>( - () -> { - throw new IOException("expected two"); - }, - lock - ); org.junit.jupiter.api.Assertions.assertAll( () -> org.junit.jupiter.api.Assertions.assertThrows( IOException.class, - atomic::call + () -> new Atomic<>( + () -> { + throw new IOException("expected two"); + }, + lock + ).call() ), () -> Mockito.verify(lock).unlock(Mockito.anyString()) ); } - } diff --git a/src/test/java/co/stateful/RtCounterTest.java b/src/test/java/co/stateful/RtCounterTest.java index 9e010e3..42726a5 100644 --- a/src/test/java/co/stateful/RtCounterTest.java +++ b/src/test/java/co/stateful/RtCounterTest.java @@ -121,5 +121,4 @@ void incrementSendsAcceptPlainHeader() throws Exception { Matchers.hasItem(MediaType.TEXT_PLAIN) ); } - } diff --git a/src/test/java/co/stateful/RtCountersITCase.java b/src/test/java/co/stateful/RtCountersITCase.java index 355cdbf..3069eb7 100644 --- a/src/test/java/co/stateful/RtCountersITCase.java +++ b/src/test/java/co/stateful/RtCountersITCase.java @@ -21,15 +21,9 @@ final class RtCountersITCase { */ private static final Random RANDOM = new SecureRandom(); - /** - * Region rule. - * @checkstyle VisibilityModifierCheck (3 lines) - */ - public final transient SttcRule srule = new SttcRule(); - @Test void incrementsAndSets() throws Exception { - final Counters counters = this.srule.get().counters(); + final Counters counters = SttcRule.fromProperties().get().counters(); final String name = String.format( "test-%s", RtCountersITCase.RANDOM.nextInt(Integer.MAX_VALUE) ); @@ -44,5 +38,4 @@ void incrementsAndSets() throws Exception { counters.delete(name); } } - } diff --git a/src/test/java/co/stateful/RtLockTest.java b/src/test/java/co/stateful/RtLockTest.java index abaacd4..fd27a38 100644 --- a/src/test/java/co/stateful/RtLockTest.java +++ b/src/test/java/co/stateful/RtLockTest.java @@ -170,5 +170,4 @@ void unlockSendsAcceptXmlHeader() throws Exception { Matchers.hasItem(MediaType.TEXT_XML) ); } - } diff --git a/src/test/java/co/stateful/RtLocksITCase.java b/src/test/java/co/stateful/RtLocksITCase.java index ed893c6..8c84f01 100644 --- a/src/test/java/co/stateful/RtLocksITCase.java +++ b/src/test/java/co/stateful/RtLocksITCase.java @@ -23,18 +23,12 @@ final class RtLocksITCase { */ private static final Random RANDOM = new SecureRandom(); - /** - * Region rule. - * @checkstyle VisibilityModifierCheck (3 lines) - */ - public final transient SttcRule srule = new SttcRule(); - @Test void locksAndUnlocks() throws Exception { MatcherAssert.assertThat( new Atomic<>( () -> "done", - this.srule.get().locks().get( + SttcRule.fromProperties().get().locks().get( String.format( "lck-%s", RtLocksITCase.RANDOM.nextInt(Integer.MAX_VALUE) @@ -47,7 +41,7 @@ void locksAndUnlocks() throws Exception { @Test void locksAndUnlocksInOneThread() throws Exception { - final Locks locks = this.srule.get().locks(); + final Locks locks = SttcRule.fromProperties().get().locks(); final String name = String.format( "test2-%s", RtLocksITCase.RANDOM.nextInt(Integer.MAX_VALUE) ); @@ -67,9 +61,8 @@ void rejectsIncorrectLockName() { Assumptions.assumeFalse(System.getProperty("sttc.urn").isEmpty()); Assertions.assertThrows( IllegalArgumentException.class, - () -> this.srule.get().locks() + () -> SttcRule.fromProperties().get().locks() .get("invalid name with spaces").lock("test-3") ); } - } diff --git a/src/test/java/co/stateful/RtLocksTest.java b/src/test/java/co/stateful/RtLocksTest.java index 19dc45c..35eeacc 100644 --- a/src/test/java/co/stateful/RtLocksTest.java +++ b/src/test/java/co/stateful/RtLocksTest.java @@ -10,7 +10,6 @@ import com.jcabi.http.request.JdkRequest; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; -import org.apache.commons.lang3.StringUtils; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; @@ -24,14 +23,8 @@ final class RtLocksTest { @Test void checksExistenceWhenLockPresent() throws Exception { final MkContainer container = new MkGrizzlyContainer() - .next( - new MkAnswer.Simple( - StringUtils.join( - "замок-αβγ", - "" - ) - ) - ) + // @checkstyle LineLength (1 line) + .next(new MkAnswer.Simple("замок-αβγ")) .start(); try { MatcherAssert.assertThat( @@ -47,14 +40,8 @@ void checksExistenceWhenLockPresent() throws Exception { @Test void checksExistenceWhenLockAbsent() throws Exception { final MkContainer container = new MkGrizzlyContainer() - .next( - new MkAnswer.Simple( - StringUtils.join( - "другий", - "" - ) - ) - ) + // @checkstyle LineLength (1 line) + .next(new MkAnswer.Simple("другий")) .start(); try { MatcherAssert.assertThat( @@ -99,5 +86,4 @@ void existsSendsAcceptXmlHeader() throws Exception { Matchers.hasItem(MediaType.TEXT_XML) ); } - } diff --git a/src/test/java/co/stateful/SttcRule.java b/src/test/java/co/stateful/SttcRule.java index 2e54d36..c028aa3 100644 --- a/src/test/java/co/stateful/SttcRule.java +++ b/src/test/java/co/stateful/SttcRule.java @@ -25,16 +25,6 @@ final class SttcRule { */ private final transient String token; - /** - * Ctor. - */ - SttcRule() { - this( - System.getProperty("sttc.urn"), - System.getProperty("sttc.token") - ); - } - /** * Ctor. * @param urn User URN @@ -62,4 +52,14 @@ Sttc get() { ); } + /** + * Make a new SttcRule from system properties. + * @return SttcRule + */ + static SttcRule fromProperties() { + return new SttcRule( + System.getProperty("sttc.urn"), + System.getProperty("sttc.token") + ); + } } diff --git a/src/test/java/co/stateful/package-info.java b/src/test/java/co/stateful/package-info.java index 4cd8810..1170b40 100644 --- a/src/test/java/co/stateful/package-info.java +++ b/src/test/java/co/stateful/package-info.java @@ -5,7 +5,6 @@ /** * SDK, tests. - * * @since 0.1 */ package co.stateful; From dd937a9f9335534f9798826b034210fbf99d13ff Mon Sep 17 00:00:00 2001 From: bibonix Date: Wed, 6 May 2026 07:21:44 +0000 Subject: [PATCH 2/2] Drop Java 17 from mvn matrix Qulice 0.27.6 and grizzly-http-servlet-server 5.0.1 are both built for Java 21 (class file version 65). With Java 17 in the matrix, those plugins/libraries fail with UnsupportedClassVersionError. Match the upstream jcabi pattern (e.g. jcabi-velocity) and run the mvn job on Java 21 only. --- .github/workflows/mvn.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mvn.yml b/.github/workflows/mvn.yml index 883c0f5..c6ff932 100644 --- a/.github/workflows/mvn.yml +++ b/.github/workflows/mvn.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: os: [ubuntu-24.04, windows-2022, macos-15] - java: [17, 21] + java: [21] steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5