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