From 4551ee169947a9427dae1d4ea4fc15ce57d9a5ca Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:50:35 +0200 Subject: [PATCH] Fixed remaining PMD issues --- .github/scripts/generate-quality-report.py | 17 ++- .../src/com/codename1/ads/InnerActive.java | 3 +- .../src/com/codename1/annotations/Async.java | 1 + .../codename1/charts/compat/PathMeasure.java | 4 +- .../com/codename1/components/Accordion.java | 2 +- .../src/com/codename1/components/Ads.java | 3 +- .../codename1/facebook/FaceBookAccess.java | 1 - .../com/codename1/facebook/ui/LikeButton.java | 2 +- .../impl/CodenameOneImplementation.java | 24 +--- .../src/com/codename1/io/JSONSanitizer.java | 3 +- .../src/com/codename1/io/NetworkManager.java | 9 +- CodenameOne/src/com/codename1/io/Util.java | 2 +- .../io/gzip/DeflaterOutputStream.java | 4 +- .../src/com/codename1/io/gzip/InfBlocks.java | 126 +++++++++--------- .../src/com/codename1/io/gzip/Inflate.java | 4 + .../src/com/codename1/io/tar/TarEntry.java | 4 +- .../src/com/codename1/io/tar/TarHeader.java | 9 ++ .../src/com/codename1/location/Location.java | 2 +- .../src/com/codename1/maps/BoundingBox.java | 2 +- .../src/com/codename1/maps/MapComponent.java | 2 +- .../src/com/codename1/media/AudioBuffer.java | 2 +- .../src/com/codename1/payment/Purchase.java | 2 +- .../com/codename1/properties/MapProperty.java | 34 ++--- .../com/codename1/ui/BrowserComponent.java | 11 +- .../ui/CommonProgressAnimations.java | 4 +- CodenameOne/src/com/codename1/ui/Display.java | 13 +- .../src/com/codename1/ui/TextSelection.java | 22 ++- .../ui/animations/MorphTransition.java | 2 +- .../com/codename1/ui/html/HTMLComponent.java | 4 +- .../com/codename1/ui/layouts/mig/Grid.java | 8 +- .../codename1/ui/layouts/mig/LayoutUtil.java | 2 + .../src/com/codename1/ui/spinner/Picker.java | 5 +- .../com/codename1/ui/spinner/Spinner3D.java | 3 +- .../src/com/codename1/ui/util/Resources.java | 5 +- .../src/com/codename1/ui/util/UIBuilder.java | 11 +- .../src/com/codename1/util/EasyThread.java | 2 +- .../src/com/codename1/util/MathUtil.java | 2 +- .../src/com/codename1/util/TRoundingMode.java | 2 +- .../src/com/codename1/util/regex/RE.java | 18 +-- .../util/regex/ReaderCharacterIterator.java | 1 + .../util/regex/StreamCharacterIterator.java | 1 + maven/core-unittests/pmd.xml | 2 + .../ui/CommonProgressAnimationsTest.java | 6 - 43 files changed, 209 insertions(+), 177 deletions(-) diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index 6e08d9e70b..bf273baca2 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -931,7 +931,22 @@ def _is_exempt(f: Finding) -> bool: "SimplifyBooleanReturns", "UnusedLocalVariable", "UnnecessaryConstructor", - "UnnecessaryImport" + "UnnecessaryImport", + "AvoidStringBufferField", + "LogicInversion", + "DefaultLabelNotLastInSwitchStmt", + "SingularField", + "InstantiationToGetClass", + "UnnecessaryModifier", + "FinalFieldCouldBeStatic", + "AvoidInstanceofChecksInCatchClause", + "AvoidUsingOctalValues", + "NonThreadSafeSingleton", + "ComparisonWithNaN", + "DontUseFloatTypeForLoopIndices", + "MissingStaticMethodInNonInstantiatableClass", + "OverrideBothEqualsAndHashcode", + "UnnecessarySemicolon" } violations = [f for f in pmd.findings if f.rule in forbidden_pmd_rules] if violations: diff --git a/CodenameOne/src/com/codename1/ads/InnerActive.java b/CodenameOne/src/com/codename1/ads/InnerActive.java index 695367fc07..d7b87ad422 100644 --- a/CodenameOne/src/com/codename1/ads/InnerActive.java +++ b/CodenameOne/src/com/codename1/ads/InnerActive.java @@ -40,7 +40,7 @@ public class InnerActive extends AdsService { // PMD Fix: UnusedPrivateField rem private static final String protocolVersion = "Sm2m-1.5.3"; private static boolean testAds = true; - private final String REQUEST_URL = "http://m2m1.inner-active.com/simpleM2M/clientRequestHtmlAd"; + private static final String REQUEST_URL = "http://m2m1.inner-active.com/simpleM2M/clientRequestHtmlAd"; //Distribution channel ID private int po = 559; private String os; @@ -160,7 +160,6 @@ public boolean equals(Object o) { return super.equals(o) && po == that.po && banner == that.banner && - REQUEST_URL.equals(that.REQUEST_URL) && (os == null ? that.os == null : os.equals(that.os)) && (hid == null ? that.hid == null : hid.equals(that.hid)); } diff --git a/CodenameOne/src/com/codename1/annotations/Async.java b/CodenameOne/src/com/codename1/annotations/Async.java index 953fc89439..d415909bbd 100644 --- a/CodenameOne/src/com/codename1/annotations/Async.java +++ b/CodenameOne/src/com/codename1/annotations/Async.java @@ -16,6 +16,7 @@ * * @author egor */ +@SuppressWarnings("PMD.MissingStaticMethodInNonInstantiatableClass") public final class Async { /** diff --git a/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java b/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java index 1de6d1a576..26eba06418 100644 --- a/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java +++ b/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java @@ -33,12 +33,10 @@ public class PathMeasure { private final GeneralPath path; - private final boolean forceClosed; public PathMeasure(GeneralPath p, boolean b) { path = p; - forceClosed = b; - if (forceClosed && path != null) { + if (b && path != null) { path.closePath(); } } diff --git a/CodenameOne/src/com/codename1/components/Accordion.java b/CodenameOne/src/com/codename1/components/Accordion.java index 67f68a8c01..4f0292ffb1 100644 --- a/CodenameOne/src/com/codename1/components/Accordion.java +++ b/CodenameOne/src/com/codename1/components/Accordion.java @@ -222,7 +222,7 @@ public void expand(Component body) { if (autoClose) { for (Component cc : this) { AccordionContent c = (AccordionContent) cc; - c.openClose(!(body == c.body)); + c.openClose(body != c.body); } } else { for (Component cc : this) { diff --git a/CodenameOne/src/com/codename1/components/Ads.java b/CodenameOne/src/com/codename1/components/Ads.java index fdea1ddcdf..acc4e8757c 100644 --- a/CodenameOne/src/com/codename1/components/Ads.java +++ b/CodenameOne/src/com/codename1/components/Ads.java @@ -521,8 +521,7 @@ public String[] getPropertyNames() { */ @Override public Class[] getPropertyTypes() { - Class c = new String[0].getClass(); - return new Class[]{String.class, Integer.class, String.class, String.class, String.class, String.class, c}; + return new Class[]{String.class, Integer.class, String.class, String.class, String.class, String.class, String.class}; } /** diff --git a/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java b/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java index 023154cebf..550f5e6e8d 100644 --- a/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java +++ b/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java @@ -1320,7 +1320,6 @@ public GetPostActionListener(Post post, ActionListener callback) { @Override public void actionPerformed(NetworkEvent evt) { final Object val = evt.getMetaData(); - ; if (val instanceof Vector) { final Vector v = (Vector) val; final Object o = v.elementAt(0); diff --git a/CodenameOne/src/com/codename1/facebook/ui/LikeButton.java b/CodenameOne/src/com/codename1/facebook/ui/LikeButton.java index 5d80070941..a5a80fcb38 100644 --- a/CodenameOne/src/com/codename1/facebook/ui/LikeButton.java +++ b/CodenameOne/src/com/codename1/facebook/ui/LikeButton.java @@ -118,7 +118,7 @@ public String[] getPropertyNames() { */ @Override public Class[] getPropertyTypes() { - return new Class[]{String.class, String.class, String.class, String.class, new String[0].getClass()}; + return new Class[]{String.class, String.class, String.class, String.class, String.class}; } /** diff --git a/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java b/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java index 0f6a1bef90..9148bc6217 100644 --- a/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java +++ b/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java @@ -223,44 +223,28 @@ private static int round(double d) { * This is a temporary workaround for an XMLVM Bug! */ public static Class getStringArrayClass() { - try { - return String[].class; - } catch (Throwable t) { - return new String[0].getClass(); - } + return String[].class; } /** * This is a temporary workaround for an XMLVM Bug! */ public static Class getStringArray2DClass() { - try { - return String[][].class; - } catch (Throwable t) { - return new String[1][].getClass(); - } + return String[][].class; } /** * This is a temporary workaround for an XMLVM Bug! */ public static Class getImageArrayClass() { - try { - return Image[].class; - } catch (Throwable t) { - return new Image[0].getClass(); - } + return Image[].class; } /** * This is a temporary workaround for an XMLVM Bug! */ public static Class getObjectArrayClass() { - try { - return Object[].class; - } catch (Throwable t) { - return new Object[0].getClass(); - } + return Object[].class; } /** diff --git a/CodenameOne/src/com/codename1/io/JSONSanitizer.java b/CodenameOne/src/com/codename1/io/JSONSanitizer.java index e2d22b0898..464570fda5 100644 --- a/CodenameOne/src/com/codename1/io/JSONSanitizer.java +++ b/CodenameOne/src/com/codename1/io/JSONSanitizer.java @@ -127,6 +127,7 @@ final class JSONSanitizer { * If {@code null}, then no unclean constructs have been found in * {@code jsonish} yet. */ + @SuppressWarnings("PMD.AvoidStringBufferField") private StringBuilder sanitizedJson; /** * The length of the prefix of {@link #jsonish} that has been written onto @@ -236,7 +237,7 @@ private static boolean canonicalizeNumber( if (fractionEnd == sanEnd) { expStart = expEnd = sanEnd; } else { - if (!('e' == (sanitizedJson.charAt(fractionEnd) | 32))) { + if ('e' != (sanitizedJson.charAt(fractionEnd) | 32)) { throw new RuntimeException("AssertionError: 'e' == (sanitizedJson.charAt(fractionEnd) | 32))"); } expStart = fractionEnd + 1; diff --git a/CodenameOne/src/com/codename1/io/NetworkManager.java b/CodenameOne/src/com/codename1/io/NetworkManager.java index fe73928f14..cacbf3efb2 100644 --- a/CodenameOne/src/com/codename1/io/NetworkManager.java +++ b/CodenameOne/src/com/codename1/io/NetworkManager.java @@ -669,7 +669,7 @@ public void removeErrorListener(ActionListener e) { * * @param al action listener */ - public final void addProgressListener(ActionListener al) { + public void addProgressListener(ActionListener al) { if (progressListeners == null) { progressListeners = new EventDispatcher(); progressListeners.setBlocking(false); @@ -1076,5 +1076,12 @@ public boolean equals(Object o) { return this == o; } + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (aps != null ? aps.hashCode() : 0); + result = 31 * result + currentAP; + return result; + } } } diff --git a/CodenameOne/src/com/codename1/io/Util.java b/CodenameOne/src/com/codename1/io/Util.java index b7a11396c7..63a47a1343 100644 --- a/CodenameOne/src/com/codename1/io/Util.java +++ b/CodenameOne/src/com/codename1/io/Util.java @@ -1230,7 +1230,7 @@ public static void readFully(InputStream i, byte b[]) throws IOException { * input stream does not support reading after close, or * another I/O error occurs. */ - public static final void readFully(InputStream i, byte b[], int off, int len) throws IOException { + public static void readFully(InputStream i, byte b[], int off, int len) throws IOException { if (len < 0) { throw new IndexOutOfBoundsException(); } diff --git a/CodenameOne/src/com/codename1/io/gzip/DeflaterOutputStream.java b/CodenameOne/src/com/codename1/io/gzip/DeflaterOutputStream.java index 48cd41d89f..0984fdbc7b 100644 --- a/CodenameOne/src/com/codename1/io/gzip/DeflaterOutputStream.java +++ b/CodenameOne/src/com/codename1/io/gzip/DeflaterOutputStream.java @@ -37,7 +37,6 @@ public class DeflaterOutputStream extends FilterOutputStream { protected static final int DEFAULT_BUFSIZE = 512; protected final Deflater deflater; - private final byte[] buf1 = new byte[1]; protected byte[] buffer; protected boolean mydeflater = false; private boolean closed = false; @@ -78,8 +77,7 @@ public DeflaterOutputStream(OutputStream out, @Override public void write(int b) throws IOException { - buf1[0] = (byte) (b & 0xff); - write(buf1, 0, 1); + write(new byte[] {(byte) (b & 0xff)}, 0, 1); } @Override diff --git a/CodenameOne/src/com/codename1/io/gzip/InfBlocks.java b/CodenameOne/src/com/codename1/io/gzip/InfBlocks.java index dafce5ca39..c39b747a05 100644 --- a/CodenameOne/src/com/codename1/io/gzip/InfBlocks.java +++ b/CodenameOne/src/com/codename1/io/gzip/InfBlocks.java @@ -401,46 +401,15 @@ int proc(int r) { case DTREE: while (true) { t = table; - if (!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) { - break; - } - - int[] h; - int i; - int j; - int c; + if (index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) { + int[] h; + int i; + int j; + int c; - t = bb[0]; - - while (k < (t)) { - if (n != 0) { - r = Z_OK; - } else { - bitb = b; - bitk = k; - z.availIn = n; - z.totalIn += p - z.nextInIndex; - z.nextInIndex = p; - write = q; - return inflateFlush(r); - } - n--; - b |= (z.nextIn[p++] & 0xff) << k; - k += 8; - } - - t = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 1]; - c = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 2]; - - if (c < 16) { - b >>>= (t); - k -= (t); - blens[index++] = c; - } else { // c == 16..18 - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; + t = bb[0]; - while (k < (t + i)) { + while (k < (t)) { if (n != 0) { r = Z_OK; } else { @@ -457,36 +426,67 @@ int proc(int r) { k += 8; } - b >>>= (t); - k -= (t); + t = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 1]; + c = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 2]; + + if (c < 16) { + b >>>= (t); + k -= (t); + blens[index++] = c; + } else { // c == 16..18 + i = c == 18 ? 7 : c - 14; + j = c == 18 ? 11 : 3; + + while (k < (t + i)) { + if (n != 0) { + r = Z_OK; + } else { + bitb = b; + bitk = k; + z.availIn = n; + z.totalIn += p - z.nextInIndex; + z.nextInIndex = p; + write = q; + return inflateFlush(r); + } + n--; + b |= (z.nextIn[p++] & 0xff) << k; + k += 8; + } - j += (b & inflate_mask[i]); + b >>>= (t); + k -= (t); - b >>>= (i); - k -= (i); + j += (b & inflate_mask[i]); - i = index; - t = table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) { - blens = null; - mode = BAD; - z.msg = "invalid bit length repeat"; - r = Z_DATA_ERROR; + b >>>= (i); + k -= (i); - bitb = b; - bitk = k; - z.availIn = n; - z.totalIn += p - z.nextInIndex; - z.nextInIndex = p; - write = q; - return inflateFlush(r); - } + i = index; + t = table; + if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) { + blens = null; + mode = BAD; + z.msg = "invalid bit length repeat"; + r = Z_DATA_ERROR; - c = c == 16 ? blens[i - 1] : 0; - do { - blens[i++] = c; - } while (--j != 0); - index = i; + bitb = b; + bitk = k; + z.availIn = n; + z.totalIn += p - z.nextInIndex; + z.nextInIndex = p; + write = q; + return inflateFlush(r); + } + + c = c == 16 ? blens[i - 1] : 0; + do { + blens[i++] = c; + } while (--j != 0); + index = i; + } + } else { + break; } } diff --git a/CodenameOne/src/com/codename1/io/gzip/Inflate.java b/CodenameOne/src/com/codename1/io/gzip/Inflate.java index d9d65fde80..bdd6cda50d 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Inflate.java +++ b/CodenameOne/src/com/codename1/io/gzip/Inflate.java @@ -75,6 +75,8 @@ final class Inflate { static final private int FLAGS = 23; static private final byte[] mark = {(byte) 0, (byte) 0, (byte) 0xff, (byte) 0xff}; private final ZStream z; + + @SuppressWarnings("PMD.SingularField") private final byte[] crcbuf = new byte[4]; int mode; // current inflate mode // mode dependent information @@ -93,6 +95,8 @@ final class Inflate { int wbits; // log2(window size) (8..15, defaults to 15) InfBlocks blocks; // current inflate_blocks state GZIPHeader gheader = null; + + @SuppressWarnings("PMD.SingularField") private int flags; private int need_bytes = -1; private java.io.ByteArrayOutputStream tmp_string = null; diff --git a/CodenameOne/src/com/codename1/io/tar/TarEntry.java b/CodenameOne/src/com/codename1/io/tar/TarEntry.java index 8dcb2c7964..0f9ceaefd6 100644 --- a/CodenameOne/src/com/codename1/io/tar/TarEntry.java +++ b/CodenameOne/src/com/codename1/io/tar/TarEntry.java @@ -184,7 +184,7 @@ public void extractTarHeader(String entryName) { header.name = new StringBuffer(name); if (fileSystem.isDirectory(file)) { - header.mode = 040755; + header.mode = 0x41ed; header.linkFlag = TarHeader.LF_DIR; if (header.name.charAt(header.name.length() - 1) != '/') { header.name.append("/"); @@ -192,7 +192,7 @@ public void extractTarHeader(String entryName) { header.size = 0; } else { header.size = fileSystem.getLength(file); - header.mode = 0100644; + header.mode = 0x81a4; header.linkFlag = TarHeader.LF_NORMAL; } diff --git a/CodenameOne/src/com/codename1/io/tar/TarHeader.java b/CodenameOne/src/com/codename1/io/tar/TarHeader.java index e370434ec3..dc0ef7d2ff 100644 --- a/CodenameOne/src/com/codename1/io/tar/TarHeader.java +++ b/CodenameOne/src/com/codename1/io/tar/TarHeader.java @@ -114,6 +114,7 @@ public class TarHeader { public static final int DEVLEN = 8; // Header values + @SuppressWarnings("PMD.AvoidStringBufferField") public StringBuffer name; public int mode; public int userId; @@ -122,9 +123,17 @@ public class TarHeader { public long modTime; public int checkSum; public byte linkFlag; + + @SuppressWarnings("PMD.AvoidStringBufferField") public StringBuffer linkName; + + @SuppressWarnings("PMD.AvoidStringBufferField") public StringBuffer magic; + + @SuppressWarnings("PMD.AvoidStringBufferField") public StringBuffer userName; + + @SuppressWarnings("PMD.AvoidStringBufferField") public StringBuffer groupName; public int devMajor; public int devMinor; diff --git a/CodenameOne/src/com/codename1/location/Location.java b/CodenameOne/src/com/codename1/location/Location.java index 0a3878bd61..1d9c91df2b 100644 --- a/CodenameOne/src/com/codename1/location/Location.java +++ b/CodenameOne/src/com/codename1/location/Location.java @@ -95,7 +95,7 @@ public float getAccuracy() { } public void setAccuracy(float accuracy) { - if (accuracy != Float.NaN) { + if (Float.isNaN(accuracy)) { this.accuracy = accuracy; } } diff --git a/CodenameOne/src/com/codename1/maps/BoundingBox.java b/CodenameOne/src/com/codename1/maps/BoundingBox.java index 5828a11690..9591871c52 100644 --- a/CodenameOne/src/com/codename1/maps/BoundingBox.java +++ b/CodenameOne/src/com/codename1/maps/BoundingBox.java @@ -152,7 +152,7 @@ public boolean contains(Coord cur) { return false; } double longitude = cur.getLongitude(); - return !(longitude < getSouthWest().getLongitude()) && !(longitude > getNorthEast().getLongitude()); + return (longitude >= getSouthWest().getLongitude()) && (longitude <= getNorthEast().getLongitude()); } /** diff --git a/CodenameOne/src/com/codename1/maps/MapComponent.java b/CodenameOne/src/com/codename1/maps/MapComponent.java index 7f324b35ae..1b45328033 100644 --- a/CodenameOne/src/com/codename1/maps/MapComponent.java +++ b/CodenameOne/src/com/codename1/maps/MapComponent.java @@ -62,7 +62,7 @@ public class MapComponent extends Container { private static final int doubleTapThreshold = 200; private final MapProvider _map; private final Vector _layers; - private final boolean _debugInfo = false; + private static final boolean _debugInfo = false; private Coord _center; private int _zoom; private boolean _needTiles = true; diff --git a/CodenameOne/src/com/codename1/media/AudioBuffer.java b/CodenameOne/src/com/codename1/media/AudioBuffer.java index be33711acb..60aa9e72b8 100644 --- a/CodenameOne/src/com/codename1/media/AudioBuffer.java +++ b/CodenameOne/src/com/codename1/media/AudioBuffer.java @@ -280,7 +280,7 @@ public void downSample(int targetSampleRate) { } } len = size / numChannels; - for (float i = 0; i < len; i += stepSize) { + for (float i = 0; i < len; i += stepSize) { // NOPMD DontUseFloatTypeForLoopIndices int i0 = (int) Math.floor(i); int i1 = (int) Math.ceil(i); diff --git a/CodenameOne/src/com/codename1/payment/Purchase.java b/CodenameOne/src/com/codename1/payment/Purchase.java index ab34e96075..9b468381d7 100644 --- a/CodenameOne/src/com/codename1/payment/Purchase.java +++ b/CodenameOne/src/com/codename1/payment/Purchase.java @@ -574,7 +574,7 @@ public final boolean synchronizeReceiptsSync(long ifOlderThanMs) { * @param callback Callback called when request is complete. Passed {@code true} if * the data was successfully fetched. {@code false} otherwise. */ - private final void loadReceipts(long ifOlderThanMs, final SuccessCallback callback) { + private void loadReceipts(long ifOlderThanMs, final SuccessCallback callback) { if (loadInProgress) { Log.p("Did not load receipts because another load is in progress"); callback.onSucess(false); diff --git a/CodenameOne/src/com/codename1/properties/MapProperty.java b/CodenameOne/src/com/codename1/properties/MapProperty.java index 95d8063feb..babcfa6f48 100644 --- a/CodenameOne/src/com/codename1/properties/MapProperty.java +++ b/CodenameOne/src/com/codename1/properties/MapProperty.java @@ -34,8 +34,8 @@ * * @author Shai Almog */ -public class MapProperty extends PropertyBase, K> implements Iterable> { - private final LinkedHashMap value = new LinkedHashMap(); +public class MapProperty extends PropertyBase, K> implements Iterable> { + private final LinkedHashMap value = new LinkedHashMap(); private Class keyType; private Class valueType; @@ -88,7 +88,7 @@ public Class getValueType() { * @param key the map key * @return the property value */ - public T2 get(T1 key) { + public J get(T key) { internalGet(); return value.get(key); } @@ -109,7 +109,7 @@ public int size() { * @param key the key to set * @param v the new value */ - public K set(T1 key, T2 v) { + public K set(T key, J v) { value.put(key, v); firePropertyChanged(); internalSet(); @@ -123,7 +123,7 @@ public K set(T1 key, T2 v) { * @param key the key to set * @param v the new value */ - public K put(T1 key, T2 v) { + public K put(T key, J v) { return set(key, v); } @@ -132,7 +132,7 @@ public K put(T1 key, T2 v) { * * @param key the key */ - public K remove(T1 key) { + public K remove(T key) { value.remove(key); internalSet(); return (K) parent.parent; @@ -169,7 +169,7 @@ public int hashCode() { * @return an iterator */ @Override - public Iterator> iterator() { + public Iterator> iterator() { internalGet(); return value.entrySet().iterator(); } @@ -179,7 +179,7 @@ public Iterator> iterator() { * * @return the keys */ - public Set keySet() { + public Set keySet() { return value.keySet(); } @@ -188,7 +188,7 @@ public Set keySet() { * * @return the values */ - public Collection valueSet() { + public Collection valueSet() { return value.values(); } @@ -197,9 +197,9 @@ public Collection valueSet() { * * @return a map */ - public Map asMap() { + public Map asMap() { internalGet(); - return new LinkedHashMap(value); + return new LinkedHashMap(value); } /** @@ -208,11 +208,11 @@ public Map asMap() { * * @return a map */ - public Map asExplodedMap() { - Map m = new LinkedHashMap(); - for (Map.Entry entry : value.entrySet()) { - T1 k = entry.getKey(); - T2 v = entry.getValue(); + public Map asExplodedMap() { + Map m = new LinkedHashMap(); + for (Map.Entry entry : value.entrySet()) { + T k = entry.getKey(); + J v = entry.getValue(); if (v instanceof PropertyBusinessObject) { m.put(k, ((PropertyBusinessObject) v).getPropertyIndex().toMapRepresentation()); } else { @@ -229,7 +229,7 @@ public Map asExplodedMap() { * @param t the map of elements to set * @return the parent object for chaining */ - public K setMap(Map t) { + public K setMap(Map t) { value.clear(); value.putAll(t); firePropertyChanged(); diff --git a/CodenameOne/src/com/codename1/ui/BrowserComponent.java b/CodenameOne/src/com/codename1/ui/BrowserComponent.java index 9a3dcad12b..5136441488 100644 --- a/CodenameOne/src/com/codename1/ui/BrowserComponent.java +++ b/CodenameOne/src/com/codename1/ui/BrowserComponent.java @@ -2123,15 +2123,12 @@ public Map getAndWait(int timeout, Collection properties) out.put(prop, new JSRef((String) propVal.get("value"), (String) propVal.get("type"))); } return out; + } catch (RuntimeException e) { + throw e; } catch (Exception ex) { - if (ex instanceof RuntimeException) { - throw (RuntimeException) ex; - } else { - Log.e(ex); - throw new RuntimeException(ex.getMessage(), ex); - } + Log.e(ex); + throw new RuntimeException(ex.getMessage(), ex); } - } /** diff --git a/CodenameOne/src/com/codename1/ui/CommonProgressAnimations.java b/CodenameOne/src/com/codename1/ui/CommonProgressAnimations.java index 2a826f6d3d..fbd3f824e0 100644 --- a/CodenameOne/src/com/codename1/ui/CommonProgressAnimations.java +++ b/CodenameOne/src/com/codename1/ui/CommonProgressAnimations.java @@ -238,8 +238,8 @@ protected Dimension calcPreferredSize() { public static class LoadingTextAnimation extends ProgressAnimation { private static final String loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; - private final int lettersPerChunk = 3; - private final int cyclesPerChunk = 3; // Number of cycles required to type a letter. + private static final int lettersPerChunk = 3; + private static final int cyclesPerChunk = 3; // Number of cycles required to type a letter. private final int pauseLength = Display.getInstance().getFrameRate(); private int pauseCounter = 0; private int rows = 3; diff --git a/CodenameOne/src/com/codename1/ui/Display.java b/CodenameOne/src/com/codename1/ui/Display.java index 17e89beecf..6e91a80c5d 100644 --- a/CodenameOne/src/com/codename1/ui/Display.java +++ b/CodenameOne/src/com/codename1/ui/Display.java @@ -421,6 +421,9 @@ public final class Display extends CN1Constants { private int previousKeyPressed; private int lastKeyPressed; private int lastDragOffset; + + // huge false positive from PMD... + @SuppressWarnings("PMD.SingularField") private Form eventForm; /** @@ -1469,10 +1472,10 @@ public void invokeAndBlock(Runnable r, boolean dropEvents) { } else { r.run(); } + } catch (BlockingDisallowedException re) { + Log.e(re); + throw re; } catch (RuntimeException re) { - if (!(re instanceof BlockingDisallowedException)) { - Log.e(re); - } throw re; } finally { this.dropEvents = false; @@ -2319,8 +2322,6 @@ private int handleEvent(int offset, int[] inputEventStackTmp) { offset++; } break; - default: - break; case POINTER_PRESSED: if (recursivePointerReleaseA) { recursivePointerReleaseB = true; @@ -2465,6 +2466,8 @@ private int handleEvent(int offset, int[] inputEventStackTmp) { case SHOW_NOTIFY: f.showNotify(); break; + default: + break; } return offset; } diff --git a/CodenameOne/src/com/codename1/ui/TextSelection.java b/CodenameOne/src/com/codename1/ui/TextSelection.java index 78c7eedc2d..525fd22076 100644 --- a/CodenameOne/src/com/codename1/ui/TextSelection.java +++ b/CodenameOne/src/com/codename1/ui/TextSelection.java @@ -173,7 +173,7 @@ public int compare(Component o1, Component o2) { private final EventDispatcher textSelectionListeners = new EventDispatcher(); private final Rectangle tmpRect = new Rectangle(); private final Component root; - private final boolean ltr = true; + private boolean rtl; private final TextSelectionTrigger trigger = getDefaultTextSelectionTrigger(); private SelectionMask selectionMask; private boolean enabled; @@ -589,7 +589,7 @@ public void update() { selectionRoot = root; } - final TreeSet selectedComponents = new TreeSet(ltr ? LTRComparator : RTLComparator); + final TreeSet selectedComponents = new TreeSet(rtl ? RTLComparator : LTRComparator); $("*", selectionRoot).each(new ComponentClosure() { @Override public void call(Component c) { @@ -642,6 +642,24 @@ private boolean isVerticallyCoveredByBounds(Component cmp, Rectangle bounds) { return false; } + /** + * Indicates if selection is operating in RTL (Right to left, bidi) mode. + * + * @return true if the selection is in RTL mode + */ + public boolean isRtl() { + return rtl; + } + + /** + * Toggles selection RTL (Right to left, bidi) mode. + * + * @param rtl true to activate the right to left mode + */ + public void setRtl(boolean rtl) { + this.rtl = rtl; + } + private void updateSnappedSelectedBounds() { snappedSelectedBounds.setBounds(selectedBounds.getX(), selectedBounds.getY(), selectedBounds.getWidth(), selectedBounds.getHeight()); for (Span span : selectedSpans) { diff --git a/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java b/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java index 213309bb52..73a6d25ef5 100644 --- a/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java +++ b/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java @@ -126,7 +126,7 @@ public MorphTransition morph(String source, String to) { * {@inheritDoc} */ @Override - public final void initTransition() { + public void initTransition() { animationMotion = Motion.createEaseInOutMotion(0, 255, duration); animationMotion.start(); Container s = (Container) getSource(); diff --git a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java index 241aa8a432..29d1d17de7 100644 --- a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java +++ b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java @@ -2956,8 +2956,6 @@ private void processTag(HTMLElement element, int align) { newLineIfNotEmpty(curAlign); pushContainer(child); break; - default: - break; case HTMLElement.TAG_FIELDSET: newLineIfNotEmpty(curAlign); Container newCont = new Container(); @@ -3270,6 +3268,8 @@ private void processTag(HTMLElement element, int align) { curTable.startSegment(HTMLTableModel.SEGMENT_TFOOT); } break; + default: + break; } if (child.getNumChildren() > 0) { diff --git a/CodenameOne/src/com/codename1/ui/layouts/mig/Grid.java b/CodenameOne/src/com/codename1/ui/layouts/mig/Grid.java index 66380fa6a6..bfe19fa930 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/mig/Grid.java +++ b/CodenameOne/src/com/codename1/ui/layouts/mig/Grid.java @@ -2413,10 +2413,6 @@ private void validateSize() { for (int i = LayoutUtil.MIN; i <= LayoutUtil.MAX; i++) { switch (contentBias) { case -1: // None - default: - horSizes[i] = getSize(hBS, i, true, useVisualPadding, -1); - verSizes[i] = getSize(vBS, i, false, useVisualPadding, -1); - break; case 0: // Hor horSizes[i] = getSize(hBS, i, true, useVisualPadding, -1); verSizes[i] = getSize(vBS, i, false, useVisualPadding, sizeHint > 0 ? sizeHint : horSizes[i]); @@ -2425,6 +2421,10 @@ private void validateSize() { verSizes[i] = getSize(vBS, i, false, useVisualPadding, -1); horSizes[i] = getSize(hBS, i, true, useVisualPadding, sizeHint > 0 ? sizeHint : verSizes[i]); break; + default: + horSizes[i] = getSize(hBS, i, true, useVisualPadding, -1); + verSizes[i] = getSize(vBS, i, false, useVisualPadding, -1); + break; } } diff --git a/CodenameOne/src/com/codename1/ui/layouts/mig/LayoutUtil.java b/CodenameOne/src/com/codename1/ui/layouts/mig/LayoutUtil.java index d5697e78a7..48a8351525 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/mig/LayoutUtil.java +++ b/CodenameOne/src/com/codename1/ui/layouts/mig/LayoutUtil.java @@ -121,6 +121,7 @@ public static void setGlobalDebugMillis(int millis) { * this method you indicate that you will take responsibility for the design time value. * @param b true means design time on. */ + @SuppressWarnings("PMD.NonThreadSafeSingleton") public static void setDesignTime(ContainerWrapper cw, boolean b) { if (DT_MAP == null) { DT_MAP = new HashMap(); @@ -180,6 +181,7 @@ public static void setDesignTimeEmptySize(int pixels) { * @param con The object. if null the method does nothing. * @param s The creation string. if null the method does nothing. */ + @SuppressWarnings("PMD.NonThreadSafeSingleton") static void putCCString(Object con, String s) { if (s != null && con != null && isDesignTime(null)) { if (CR_MAP == null) { diff --git a/CodenameOne/src/com/codename1/ui/spinner/Picker.java b/CodenameOne/src/com/codename1/ui/spinner/Picker.java index 26afdabb63..a4f21fce99 100644 --- a/CodenameOne/src/com/codename1/ui/spinner/Picker.java +++ b/CodenameOne/src/com/codename1/ui/spinner/Picker.java @@ -207,8 +207,6 @@ public void actionPerformed(ActionEvent evt) { } break; } - default: - break; case Display.PICKER_TYPE_CALENDAR: showInteractionDialog(); evt.consume(); @@ -323,7 +321,8 @@ public void actionPerformed(ActionEvent evt) { } break; } - + default: + break; } updateValue(); } diff --git a/CodenameOne/src/com/codename1/ui/spinner/Spinner3D.java b/CodenameOne/src/com/codename1/ui/spinner/Spinner3D.java index 9447d0f0aa..bc37f881b9 100644 --- a/CodenameOne/src/com/codename1/ui/spinner/Spinner3D.java +++ b/CodenameOne/src/com/codename1/ui/spinner/Spinner3D.java @@ -37,7 +37,6 @@ class Spinner3D extends Container implements InternalPickerWidget { private final SpinnerNode root; - private final Scene scene; private final ScrollingContainer scroller; @@ -50,7 +49,7 @@ public Spinner3D(ListModel listModel) { super(BoxLayout.y()); setScrollableY(false); root = new SpinnerNode(); - scene = new Scene() { + Scene scene = new Scene() { @Override public void setWidth(int width) { super.setWidth(width); diff --git a/CodenameOne/src/com/codename1/ui/util/Resources.java b/CodenameOne/src/com/codename1/ui/util/Resources.java index 2230576610..e054599f9c 100644 --- a/CodenameOne/src/com/codename1/ui/util/Resources.java +++ b/CodenameOne/src/com/codename1/ui/util/Resources.java @@ -1267,11 +1267,8 @@ Font createTrueTypeFont(Font f, String fontName, String fileName, float fontSize case 3: // millimetres fontSize = Display.getInstance().convertToPixels((int) (fontSize * 10), true) / 10.0f; break; - case 4: // pixels break; - default: - break; case 5: // rem fontSize = Font.getDefaultFont().getHeight() * fontSize; break; @@ -1287,6 +1284,8 @@ Font createTrueTypeFont(Font f, String fontName, String fileName, float fontSize case 9: // vmax fontSize = Math.max(CN.getDisplayWidth(), CN.getDisplayHeight()) * fontSize / 100f; break; + default: + break; } if (!failOnMissingTruetype) { try { diff --git a/CodenameOne/src/com/codename1/ui/util/UIBuilder.java b/CodenameOne/src/com/codename1/ui/util/UIBuilder.java index b1f34b13e2..3711d5bad9 100644 --- a/CodenameOne/src/com/codename1/ui/util/UIBuilder.java +++ b/CodenameOne/src/com/codename1/ui/util/UIBuilder.java @@ -1062,8 +1062,6 @@ private Component createComponent(DataInputStream in, Container parent, Containe } } break; - default: - break; case PROPERTY_EMBED: root.putClientProperty(EMBEDDED_FORM_FLAG, ""); @@ -1183,8 +1181,7 @@ private Component createComponent(DataInputStream in, Container parent, Containe layout = b; break; } - default: - break; + case LAYOUT_BORDER: { BorderLayout b = new BorderLayout(); if (in.readBoolean()) { @@ -1231,6 +1228,9 @@ private Component createComponent(DataInputStream in, Container parent, Containe case LAYOUT_TABLE: layout = new TableLayout(in.readInt(), in.readInt()); break; + + default: + break; } ((Container) cmp).setLayout(layout); break; @@ -1505,6 +1505,9 @@ private Component createComponent(DataInputStream in, Container parent, Containe case PROPERTY_MIN_VALUE: ((Slider) cmp).setMinValue(in.readInt()); break; + + default: + break; } property = in.readInt(); diff --git a/CodenameOne/src/com/codename1/util/EasyThread.java b/CodenameOne/src/com/codename1/util/EasyThread.java index 04974b6917..0fc5a44be3 100644 --- a/CodenameOne/src/com/codename1/util/EasyThread.java +++ b/CodenameOne/src/com/codename1/util/EasyThread.java @@ -248,7 +248,7 @@ public void removeErrorListener(ErrorListener err) { * * @param newPriority priority to set this thread to */ - public final void setPriority(int newPriority) { + public void setPriority(int newPriority) { t.setPriority(newPriority); } diff --git a/CodenameOne/src/com/codename1/util/MathUtil.java b/CodenameOne/src/com/codename1/util/MathUtil.java index eeccfa3759..fef8cf06fd 100644 --- a/CodenameOne/src/com/codename1/util/MathUtil.java +++ b/CodenameOne/src/com/codename1/util/MathUtil.java @@ -379,7 +379,7 @@ public static final double atan2(double b, double a) { return ieee754Atan2(a, b); } - private static final double ieee754Exp(double x) { + private static double ieee754Exp(double x) { double y; double c; double t; diff --git a/CodenameOne/src/com/codename1/util/TRoundingMode.java b/CodenameOne/src/com/codename1/util/TRoundingMode.java index 98f7bfc28a..eda5edcfee 100644 --- a/CodenameOne/src/com/codename1/util/TRoundingMode.java +++ b/CodenameOne/src/com/codename1/util/TRoundingMode.java @@ -84,7 +84,7 @@ enum TRoundingMode { /** * The old constant of BigDecimal. */ - @SuppressWarnings("unused") + @SuppressWarnings({"unused", "PMD.SingularField"}) private final int bigDecimalRM; /** diff --git a/CodenameOne/src/com/codename1/util/regex/RE.java b/CodenameOne/src/com/codename1/util/regex/RE.java index 9b7936c3ef..5008a2842d 100644 --- a/CodenameOne/src/com/codename1/util/regex/RE.java +++ b/CodenameOne/src/com/codename1/util/regex/RE.java @@ -939,24 +939,24 @@ protected int matchNodes(int firstNode, int lastNode, int idxStart) { switch (opdata) { case E_ALNUM: case E_NALNUM: - if (!((RECharacter.isLetterOrDigit(c) || c == '_') == (opdata == E_ALNUM))) { - return -1; + if ((RECharacter.isLetterOrDigit(c) || c == '_') == (opdata == E_ALNUM)) { + break; } - break; + return -1; case E_DIGIT: case E_NDIGIT: - if (!(RECharacter.isDigit(c) == (opdata == E_DIGIT))) { - return -1; + if (RECharacter.isDigit(c) == (opdata == E_DIGIT)) { + break; } - break; + return -1; case E_SPACE: case E_NSPACE: - if (!(RECharacter.isWhitespace(c) == (opdata == E_SPACE))) { - return -1; + if (RECharacter.isWhitespace(c) == (opdata == E_SPACE)) { + break; } - break; + return -1; } idx++; break; diff --git a/CodenameOne/src/com/codename1/util/regex/ReaderCharacterIterator.java b/CodenameOne/src/com/codename1/util/regex/ReaderCharacterIterator.java index b8e1aacdba..2bdfacf042 100644 --- a/CodenameOne/src/com/codename1/util/regex/ReaderCharacterIterator.java +++ b/CodenameOne/src/com/codename1/util/regex/ReaderCharacterIterator.java @@ -35,6 +35,7 @@ public final class ReaderCharacterIterator implements CharacterIterator { /** * Buffer of read chars */ + @SuppressWarnings("PMD.AvoidStringBufferField") private final StringBuffer buff; /** diff --git a/CodenameOne/src/com/codename1/util/regex/StreamCharacterIterator.java b/CodenameOne/src/com/codename1/util/regex/StreamCharacterIterator.java index e8de93d546..7a92991024 100644 --- a/CodenameOne/src/com/codename1/util/regex/StreamCharacterIterator.java +++ b/CodenameOne/src/com/codename1/util/regex/StreamCharacterIterator.java @@ -35,6 +35,7 @@ public final class StreamCharacterIterator implements CharacterIterator { /** * Buffer of read chars */ + @SuppressWarnings("PMD.AvoidStringBufferField") private final StringBuffer buff; /** diff --git a/maven/core-unittests/pmd.xml b/maven/core-unittests/pmd.xml index ee5d750b9a..c01076e021 100644 --- a/maven/core-unittests/pmd.xml +++ b/maven/core-unittests/pmd.xml @@ -23,6 +23,8 @@ + + diff --git a/maven/core-unittests/src/test/java/com/codename1/ui/CommonProgressAnimationsTest.java b/maven/core-unittests/src/test/java/com/codename1/ui/CommonProgressAnimationsTest.java index 73a9db4dcb..6b40fe7809 100644 --- a/maven/core-unittests/src/test/java/com/codename1/ui/CommonProgressAnimationsTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/ui/CommonProgressAnimationsTest.java @@ -115,12 +115,6 @@ void testEmptyAnimationPreferredSizeMatchesContent() { @Test void testLoadingTextAnimationEntersPauseCycle() throws Exception { LoadingTextAnimation animation = new LoadingTextAnimation(); - Field cyclesPerChunk = LoadingTextAnimation.class.getDeclaredField("cyclesPerChunk"); - cyclesPerChunk.setAccessible(true); - cyclesPerChunk.setInt(animation, 2); - Field lettersPerChunk = LoadingTextAnimation.class.getDeclaredField("lettersPerChunk"); - lettersPerChunk.setAccessible(true); - lettersPerChunk.setInt(animation, 1); Field strlenField = LoadingTextAnimation.class.getDeclaredField("strlen"); strlenField.setAccessible(true); strlenField.setInt(animation, 1);