diff --git a/pom.xml b/pom.xml
index 49b7c0edd..9cdbdb49d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -417,13 +417,6 @@ SOFTWARE.
checkstyle:/src/site/resources/.*
-
- findbugs:.*
diff --git a/src/main/java/org/takes/facets/auth/PsToken.java b/src/main/java/org/takes/facets/auth/PsToken.java
index ddc62e20f..354165a7b 100644
--- a/src/main/java/org/takes/facets/auth/PsToken.java
+++ b/src/main/java/org/takes/facets/auth/PsToken.java
@@ -26,6 +26,7 @@
import java.io.IOException;
import java.io.StringReader;
import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Base64;
import java.util.Iterator;
@@ -125,18 +126,26 @@ public Opt enter(final Request req) throws IOException {
if (!head.isEmpty()) {
final String jwt = head.split(" ", 2)[1].trim();
final String[] parts = jwt.split(dot);
- final byte[] jwtheader = parts[0].getBytes();
- final byte[] jwtpayload = parts[1].getBytes();
- final byte[] jwtsign = parts[2].getBytes();
+ final byte[] jwtheader = parts[0].getBytes(
+ Charset.defaultCharset()
+ );
+ final byte[] jwtpayload = parts[1].getBytes(
+ Charset.defaultCharset()
+ );
+ final byte[] jwtsign = parts[2].getBytes(Charset.defaultCharset());
final ByteBuffer tocheck = ByteBuffer.allocate(
jwtheader.length + jwtpayload.length + 1
);
- tocheck.put(jwtheader).put(".".getBytes()).put(jwtpayload);
+ tocheck.put(jwtheader).put(".".getBytes(Charset.defaultCharset()))
+ .put(jwtpayload);
final byte[] checked = this.signature.sign(tocheck.array());
if (Arrays.equals(jwtsign, checked)) {
try (JsonReader rdr = Json.createReader(
new StringReader(
- new String(Base64.getDecoder().decode(jwtpayload))
+ new String(
+ Base64.getDecoder().decode(jwtpayload),
+ Charset.defaultCharset()
+ )
)
)) {
user = new Opt.Single<>(
@@ -161,7 +170,7 @@ public Response exit(final Response res,
jwtheader.length + jwtpayload.length + 1
);
tosign.put(jwtheader);
- tosign.put(".".getBytes());
+ tosign.put(".".getBytes(Charset.defaultCharset()));
tosign.put(jwtpayload);
final byte[] sign = this.signature.sign(tosign.array());
try (JsonReader reader = Json.createReader(res.body())) {
@@ -170,9 +179,9 @@ public Response exit(final Response res,
.add(
"jwt", String.format(
"%s.%s.%s",
- new String(jwtheader),
- new String(jwtpayload),
- new String(sign)
+ new String(jwtheader, Charset.defaultCharset()),
+ new String(jwtpayload, Charset.defaultCharset()),
+ new String(sign, Charset.defaultCharset())
)
)
.build();
diff --git a/src/main/java/org/takes/facets/auth/Token.java b/src/main/java/org/takes/facets/auth/Token.java
index 92bffa057..e89a63b9e 100644
--- a/src/main/java/org/takes/facets/auth/Token.java
+++ b/src/main/java/org/takes/facets/auth/Token.java
@@ -24,6 +24,7 @@
package org.takes.facets.auth;
import java.io.IOException;
+import java.nio.charset.Charset;
import java.util.Base64;
import java.util.Calendar;
import java.util.TimeZone;
@@ -92,7 +93,9 @@ public JsonObject json() {
@Override
public byte[] encoded() throws IOException {
- return Base64.getEncoder().encode(this.joseo.toString().getBytes());
+ return Base64.getEncoder().encode(
+ this.joseo.toString().getBytes(Charset.defaultCharset())
+ );
}
}
@@ -163,7 +166,9 @@ public JsonObject json() {
@Override
public byte[] encoded() throws IOException {
- return Base64.getEncoder().encode(this.jwto.toString().getBytes());
+ return Base64.getEncoder().encode(
+ this.jwto.toString().getBytes(Charset.defaultCharset())
+ );
}
}
}
diff --git a/src/main/java/org/takes/facets/auth/signatures/SiHmac.java b/src/main/java/org/takes/facets/auth/signatures/SiHmac.java
index 7e15ab273..b65335ee9 100644
--- a/src/main/java/org/takes/facets/auth/signatures/SiHmac.java
+++ b/src/main/java/org/takes/facets/auth/signatures/SiHmac.java
@@ -147,7 +147,7 @@ private byte[] encrypt(final byte[] bytes) throws IOException {
for (final byte byt : this.create().doFinal(bytes)) {
formatter.format("%02x", byt);
}
- return formatter.toString().getBytes();
+ return formatter.toString().getBytes(Charset.defaultCharset());
}
}
diff --git a/src/main/java/org/takes/facets/fork/FkHitRefresh.java b/src/main/java/org/takes/facets/fork/FkHitRefresh.java
index dd90d08d4..0a33c26a2 100644
--- a/src/main/java/org/takes/facets/fork/FkHitRefresh.java
+++ b/src/main/java/org/takes/facets/fork/FkHitRefresh.java
@@ -30,6 +30,7 @@
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import lombok.EqualsAndHashCode;
import org.takes.Request;
@@ -145,11 +146,6 @@ public Opt route(final Request req) throws IOException {
* A handle for serving hit-refresh feature.
*/
private static final class HitRefreshHandle {
- /**
- * A flag File, which is not yet instantiated.
- */
- private static final File INEXISTENT_FLAG = new File("/inexistent");
-
/**
* Directory to watch.
*/
@@ -159,7 +155,7 @@ private static final class HitRefreshHandle {
* Internal state. Flag file touched on every exec run.
* Instantiated at first touch.
*/
- private volatile File flag;
+ private final List flag;
/**
* A lock for concurrent access to flag file.
@@ -186,7 +182,7 @@ private HitRefreshHandle(final File dir,
final ReentrantReadWriteLock lock) {
this.dir = dir;
this.lock = lock;
- this.flag = HitRefreshHandle.INEXISTENT_FLAG;
+ this.flag = new CopyOnWriteArrayList<>();
}
/**
@@ -195,17 +191,15 @@ private HitRefreshHandle(final File dir,
* @throws IOException If fails
*/
public File touchedFile() throws IOException {
- this.lock.readLock().lock();
- final boolean cold = this.flag == HitRefreshHandle.INEXISTENT_FLAG;
- this.lock.readLock().unlock();
- if (cold) {
+ if (this.flag.isEmpty()) {
this.lock.writeLock().lock();
- this.flag = File.createTempFile("take", ".txt");
- this.flag.deleteOnExit();
+ final File file = File.createTempFile("take", ".txt");
+ file.deleteOnExit();
+ this.flag.add(file);
this.lock.writeLock().unlock();
this.touch();
}
- return this.flag;
+ return this.flag.get(0);
}
/**
@@ -226,11 +220,8 @@ public void touch() throws IOException {
* @throws IOException If fails
*/
private boolean expired() throws IOException {
- this.lock.readLock().lock();
- final boolean cold = this.flag == HitRefreshHandle.INEXISTENT_FLAG;
- this.lock.readLock().unlock();
- boolean expired = false;
- if (cold) {
+ final boolean expired;
+ if (this.flag.isEmpty()) {
expired = true;
} else {
expired = this.directoryUpdated();
@@ -246,9 +237,13 @@ private boolean expired() throws IOException {
* in README.md file and must be eliminated.
*/
private boolean directoryUpdated() {
- this.lock.readLock().lock();
- final long recent = this.flag.lastModified();
- this.lock.readLock().unlock();
+ final long recent;
+ try {
+ this.lock.readLock().lock();
+ recent = this.flag.get(0).lastModified();
+ } finally {
+ this.lock.readLock().unlock();
+ }
final File[] files = this.dir.listFiles();
boolean expired = false;
if (files != null) {
diff --git a/src/main/java/org/takes/facets/forward/RsForward.java b/src/main/java/org/takes/facets/forward/RsForward.java
index 82da5d01b..f39a47fd2 100644
--- a/src/main/java/org/takes/facets/forward/RsForward.java
+++ b/src/main/java/org/takes/facets/forward/RsForward.java
@@ -25,6 +25,8 @@
import java.io.IOException;
import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.net.HttpURLConnection;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -60,7 +62,7 @@ public class RsForward extends HttpException implements Response {
/**
* Original response.
*/
- private final transient Response origin;
+ private final Response origin;
/**
* Ctor.
@@ -171,4 +173,27 @@ public final Iterable head() throws IOException {
public final InputStream body() throws IOException {
return this.origin.body();
}
+
+ /**
+ * Set default object to write serializated data.
+ * @param stream Stream to write
+ * @throws IOException if fails
+ */
+ private static void writeObject(
+ final ObjectOutputStream stream
+ ) throws IOException {
+ stream.defaultWriteObject();
+ }
+
+ /**
+ * Set default object to read serializated data.
+ * @param stream Stream to read
+ * @throws IOException if fails
+ * @throws ClassNotFoundException if class doesn't exists
+ */
+ private static void readObject(
+ final ObjectInputStream stream
+ ) throws IOException, ClassNotFoundException {
+ stream.defaultReadObject();
+ }
}
diff --git a/src/main/java/org/takes/facets/forward/TkForward.java b/src/main/java/org/takes/facets/forward/TkForward.java
index 180a196e1..1dcb8a0e7 100644
--- a/src/main/java/org/takes/facets/forward/TkForward.java
+++ b/src/main/java/org/takes/facets/forward/TkForward.java
@@ -110,19 +110,17 @@ public InputStream body() throws IOException {
* @throws IOException If fails
*/
private Response load() throws IOException {
- synchronized (this.saved) {
- if (this.saved.isEmpty()) {
- Iterable head;
- InputStream body;
- try {
- head = this.origin.head();
- body = this.origin.body();
- } catch (final RsForward ex) {
- head = ex.head();
- body = ex.body();
- }
- this.saved.add(new RsSimple(head, body));
+ if (this.saved.isEmpty()) {
+ Iterable head;
+ InputStream body;
+ try {
+ head = this.origin.head();
+ body = this.origin.body();
+ } catch (final RsForward ex) {
+ head = ex.head();
+ body = ex.body();
}
+ this.saved.add(new RsSimple(head, body));
}
return this.saved.get(0);
}
diff --git a/src/main/java/org/takes/misc/Expires.java b/src/main/java/org/takes/misc/Expires.java
index e4f77699a..3b5a4b2c7 100644
--- a/src/main/java/org/takes/misc/Expires.java
+++ b/src/main/java/org/takes/misc/Expires.java
@@ -152,13 +152,10 @@ public Date(final String ptn, final Locale locale,
*/
public Date(final String ptn, final Locale locale,
final java.util.Date expires) {
- this.format = new ThreadLocal() {
- @Override
- protected SimpleDateFormat initialValue() {
- return new SimpleDateFormat(ptn, locale);
- }
- };
- this.expires = expires;
+ this.format = ThreadLocal.withInitial(
+ () -> new SimpleDateFormat(ptn, locale)
+ );
+ this.expires = new java.util.Date(expires.getTime());
}
@Override
diff --git a/src/main/java/org/takes/rq/form/RqFormBase.java b/src/main/java/org/takes/rq/form/RqFormBase.java
index 3b66b45b9..3dcf18c70 100644
--- a/src/main/java/org/takes/rq/form/RqFormBase.java
+++ b/src/main/java/org/takes/rq/form/RqFormBase.java
@@ -124,12 +124,10 @@ private static String decode(final CharSequence txt) {
* @throws IOException If something fails reading or parsing body
*/
private Map> map() throws IOException {
- synchronized (this.saved) {
- if (this.saved.isEmpty()) {
- this.saved.add(this.freshMap());
- }
- return this.saved.get(0);
+ if (this.saved.isEmpty()) {
+ this.saved.add(this.freshMap());
}
+ return this.saved.get(0);
}
/**
diff --git a/src/main/java/org/takes/rs/RsGzip.java b/src/main/java/org/takes/rs/RsGzip.java
index e3bd1ce37..d5c8b0a2f 100644
--- a/src/main/java/org/takes/rs/RsGzip.java
+++ b/src/main/java/org/takes/rs/RsGzip.java
@@ -80,19 +80,17 @@ public InputStream body() throws IOException {
* @throws IOException If fails
*/
private Response make() throws IOException {
- synchronized (this.zipped) {
- if (this.zipped.isEmpty()) {
- this.zipped.add(
- new RsWithHeader(
- new RsWithBody(
- this.origin,
- RsGzip.gzip(this.origin.body())
- ),
- "Content-Encoding",
- "gzip"
- )
- );
- }
+ if (this.zipped.isEmpty()) {
+ this.zipped.add(
+ new RsWithHeader(
+ new RsWithBody(
+ this.origin,
+ RsGzip.gzip(this.origin.body())
+ ),
+ "Content-Encoding",
+ "gzip"
+ )
+ );
}
return this.zipped.get(0);
}
diff --git a/src/main/java/org/takes/rs/RsPrettyJson.java b/src/main/java/org/takes/rs/RsPrettyJson.java
index f3e403679..467f5cd0e 100644
--- a/src/main/java/org/takes/rs/RsPrettyJson.java
+++ b/src/main/java/org/takes/rs/RsPrettyJson.java
@@ -85,15 +85,13 @@ public InputStream body() throws IOException {
* @throws IOException If fails
*/
private Response make() throws IOException {
- synchronized (this.transformed) {
- if (this.transformed.isEmpty()) {
- this.transformed.add(
- new RsWithBody(
- this.origin,
- RsPrettyJson.transform(this.origin.body())
- )
- );
- }
+ if (this.transformed.isEmpty()) {
+ this.transformed.add(
+ new RsWithBody(
+ this.origin,
+ RsPrettyJson.transform(this.origin.body())
+ )
+ );
}
return this.transformed.get(0);
}