From 49b612f8385de0fe44e2ce45ed4d54ceb4aba2e6 Mon Sep 17 00:00:00 2001 From: Fabricio Cabral Date: Mon, 24 Dec 2018 00:19:52 -0300 Subject: [PATCH] #882 Un-exclude findbugs from qulice checks --- pom.xml | 7 ---- .../java/org/takes/facets/auth/PsToken.java | 27 ++++++++----- .../java/org/takes/facets/auth/Token.java | 9 ++++- .../takes/facets/auth/signatures/SiHmac.java | 2 +- .../org/takes/facets/fork/FkHitRefresh.java | 39 ++++++++----------- .../org/takes/facets/forward/RsForward.java | 27 ++++++++++++- .../org/takes/facets/forward/TkForward.java | 22 +++++------ src/main/java/org/takes/misc/Expires.java | 11 ++---- .../java/org/takes/rq/form/RqFormBase.java | 8 ++-- src/main/java/org/takes/rs/RsGzip.java | 24 ++++++------ src/main/java/org/takes/rs/RsPrettyJson.java | 16 ++++---- 11 files changed, 104 insertions(+), 88 deletions(-) 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); }