diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index a50e2b59e6..0a8513379e 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -773,7 +773,8 @@ def main() -> None: "SA_FIELD_SELF_ASSIGNMENT", "UC_USELESS_CONDITION", "EC_UNRELATED_TYPES", - "EQ_ALWAYS_FALSE" + "EQ_ALWAYS_FALSE", + "SBSC_USE_STRINGBUFFER_CONCATENATION" } violations = [ f for f in spotbugs.findings diff --git a/CodenameOne/src/com/codename1/ads/InnerActive.java b/CodenameOne/src/com/codename1/ads/InnerActive.java index 7d06563b03..b39fa8de1e 100644 --- a/CodenameOne/src/com/codename1/ads/InnerActive.java +++ b/CodenameOne/src/com/codename1/ads/InnerActive.java @@ -144,11 +144,11 @@ public void initService(Ads ads) { String[] keywords = ads.getKeywords(); if (keywords != null && keywords.length > 0) { int klen = keywords.length; - String k = ""; + StringBuilder k = new StringBuilder(); for (int i = 0; i < klen; i++) { - k += "," + keywords[i]; + k.append(",").append(keywords[i]); } - addParam(this, "k", k.substring(1)); + addParam(this, "k", k.toString().substring(1)); } if (testAds) { addParam(this, "test", "1"); diff --git a/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java b/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java index b1accd94cc..12877973b5 100644 --- a/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java +++ b/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java @@ -218,10 +218,12 @@ public Oauth2 createOAuth() { String scope = ""; if (permissions != null && permissions.length > 0) { int plen = permissions.length; + StringBuilder scopeBuilder = new StringBuilder(); for (int i = 0; i < plen; i++) { String permission = permissions[i]; - scope += permission + ","; + scopeBuilder.append(permission).append(","); } + scope = scopeBuilder.toString(); scope = scope.substring(0, scope.length() - 1); } Hashtable additionalParams = new Hashtable(); @@ -1221,21 +1223,21 @@ public void getUsersDetails(String[] usersIds, String[] fields, final ActionList checkAuthentication(); final FacebookRESTService con = new FacebookRESTService(token, "https://api.facebook.com/method/users.getInfo", false); - String ids = usersIds[0]; + StringBuilder ids = new StringBuilder(usersIds[0]); int ulen = usersIds.length; for (int i = 1; i < ulen; i++) { - ids += "," + usersIds[i]; + ids.append(",").append(usersIds[i]); } - con.addArgumentNoEncoding("uids", ids); + con.addArgumentNoEncoding("uids", ids.toString()); - String fieldsStr = fields[0]; + StringBuilder fieldsStr = new StringBuilder(fields[0]); int flen = fields.length; for (int i = 1; i < flen; i++) { - fieldsStr += "," + fields[i]; + fieldsStr.append(",").append(fields[i]); } - con.addArgumentNoEncoding("fields", fieldsStr); + con.addArgumentNoEncoding("fields", fieldsStr.toString()); con.addArgument("format", "json"); con.addResponseListener(new ActionListener() { diff --git a/CodenameOne/src/com/codename1/io/Log.java b/CodenameOne/src/com/codename1/io/Log.java index 9961af52d5..bbcf11e0df 100644 --- a/CodenameOne/src/com/codename1/io/Log.java +++ b/CodenameOne/src/com/codename1/io/Log.java @@ -335,10 +335,12 @@ public static String getLogContent() { Reader r = Util.getReader(FileSystemStorage.getInstance().openInputStream(instance.getFileURL())); char[] buffer = new char[1024]; int size = r.read(buffer); + StringBuilder textBuilder = new StringBuilder(); while (size > -1) { - text += new String(buffer, 0, size); + textBuilder.append(new String(buffer, 0, size)); size = r.read(buffer); } + text = textBuilder.toString(); r.close(); } return text; diff --git a/CodenameOne/src/com/codename1/io/Oauth2.java b/CodenameOne/src/com/codename1/io/Oauth2.java index d19daaa9a1..7665a6c0e1 100644 --- a/CodenameOne/src/com/codename1/io/Oauth2.java +++ b/CodenameOne/src/com/codename1/io/Oauth2.java @@ -385,15 +385,15 @@ public void actionPerformed(ActionEvent ev) { } private String buildURL() { - String URL = oauth2URL + "?client_id=" + Util.encodeUrl(clientId) - + "&redirect_uri=" + Util.encodeUrl(redirectURI); + StringBuilder URL = new StringBuilder(oauth2URL + "?client_id=" + Util.encodeUrl(clientId) + + "&redirect_uri=" + Util.encodeUrl(redirectURI)); if (scope != null) { - URL += "&scope=" + Util.encodeUrl(scope); + URL.append("&scope=").append(Util.encodeUrl(scope)); } if (clientSecret != null) { - URL += "&response_type=code"; + URL.append("&response_type=code"); } else { - URL += "&response_type=token"; + URL.append("&response_type=token"); } if (additionalParams != null) { @@ -401,10 +401,10 @@ private String buildURL() { while (e.hasMoreElements()) { String key = (String) e.nextElement(); String val = additionalParams.get(key).toString(); - URL += "&" + Util.encodeUrl(key) + "=" + Util.encodeUrl(val); + URL.append("&").append(Util.encodeUrl(key)).append("=").append(Util.encodeUrl(val)); } } - return URL; + return URL.toString(); } private Component createLoginComponent(final ActionListener al, final Form frm, final Form backToForm, final Dialog progress) { diff --git a/CodenameOne/src/com/codename1/io/Util.java b/CodenameOne/src/com/codename1/io/Util.java index 6f5f7c074f..0be813a283 100644 --- a/CodenameOne/src/com/codename1/io/Util.java +++ b/CodenameOne/src/com/codename1/io/Util.java @@ -2492,11 +2492,12 @@ private static String append(String a, int in) { private static String append(String a, long in, int length) { int lim = (length << 2) - 4; + StringBuilder sb = new StringBuilder(a); while (lim >= 0) { - a += (DIGITS[(byte) (in >> lim) & 0x0f]); + sb.append((DIGITS[(byte) (in >> lim) & 0x0f])); lim -= 4; } - return a; + return sb.toString(); } private static long getUniqueDeviceID() { @@ -2537,13 +2538,13 @@ private static long generateLongFromDeviceInfo() { * @return */ private static String sanitizeString(String input) { - String result = ""; + StringBuilder result = new StringBuilder(); for (char myChar : input.toCharArray()) { if ((myChar >= '0' && myChar <= '9') || (myChar >= 'a' && myChar <= 'z') || (myChar >= 'A' && myChar <= 'Z')) { - result += myChar; + result.append(myChar); } } - return result.substring(0, Math.min(10, result.length())).toUpperCase(); + return result.toString().substring(0, Math.min(10, result.length())).toUpperCase(); } /** diff --git a/CodenameOne/src/com/codename1/properties/PropertyXMLElement.java b/CodenameOne/src/com/codename1/properties/PropertyXMLElement.java index d3cbe42aed..54601eed8f 100644 --- a/CodenameOne/src/com/codename1/properties/PropertyXMLElement.java +++ b/CodenameOne/src/com/codename1/properties/PropertyXMLElement.java @@ -372,22 +372,22 @@ public String toString() { @Override public String toString(String spacing) { - String str = spacing; - str += "<" + getTagName(); + StringBuilder str = new StringBuilder(spacing); + str.append("<").append(getTagName()); Hashtable attributes = getAttributes(); if (attributes != null) { for (Enumeration e = attributes.keys(); e.hasMoreElements(); ) { String attrStr = (String) e.nextElement(); String val = (String) attributes.get(attrStr); - str += " " + attrStr + "='" + val + "'"; + str.append(" ").append(attrStr).append("='").append(val).append("'"); } } - str += ">\n"; + str.append(">\n"); Vector children = getChildren(); for (int i = 0; i < children.size(); i++) { - str += ((Element) children.get(i)).toString(spacing + ' '); + str.append(((Element) children.get(i)).toString(spacing + ' ')); } - str += spacing + "\n"; - return str; + str.append(spacing).append("\n"); + return str.toString(); } } diff --git a/CodenameOne/src/com/codename1/testing/TestUtils.java b/CodenameOne/src/com/codename1/testing/TestUtils.java index 3a5465f53e..10223d789f 100644 --- a/CodenameOne/src/com/codename1/testing/TestUtils.java +++ b/CodenameOne/src/com/codename1/testing/TestUtils.java @@ -262,12 +262,12 @@ private static String toString(int[] p) { if (p.length == 0) { return "{}"; } - String s = "{" + p[0]; + StringBuilder s = new StringBuilder("{" + p[0]); for (int iter = 1; iter < p.length; iter++) { - s += ", " + p[iter]; + s.append(", ").append(p[iter]); } - return s + "}"; + return s.append("}").toString(); } /** diff --git a/CodenameOne/src/com/codename1/ui/ComponentSelector.java b/CodenameOne/src/com/codename1/ui/ComponentSelector.java index 94b2a0fa61..a8f04a2f32 100644 --- a/CodenameOne/src/com/codename1/ui/ComponentSelector.java +++ b/CodenameOne/src/com/codename1/ui/ComponentSelector.java @@ -2229,12 +2229,13 @@ public ComponentSelector addTags(String... tags) { existing = ""; } + StringBuilder existingBuilder = new StringBuilder(existing); for (String tag : tags) { - if (existing.indexOf(" " + tag + " ") == -1) { - existing += " " + tag + " "; + if (existingBuilder.toString().indexOf(" " + tag + " ") == -1) { + existingBuilder.append(" ").append(tag).append(" "); } } - c.putClientProperty(PROPERTY_TAG, existing); + c.putClientProperty(PROPERTY_TAG, existingBuilder.toString()); } return this; @@ -2266,10 +2267,11 @@ public ComponentSelector removeTags(String... tags) { c.putClientProperty(PROPERTY_TAG, null); continue; } + StringBuilder existingBuilder = new StringBuilder(existing); for (String tag : existingSet) { - existing += " " + tag + " "; + existingBuilder.append(" ").append(tag).append(" "); } - c.putClientProperty(PROPERTY_TAG, existing); + c.putClientProperty(PROPERTY_TAG, existingBuilder.toString()); } return this; } diff --git a/CodenameOne/src/com/codename1/ui/Container.java b/CodenameOne/src/com/codename1/ui/Container.java index 13da5d6167..8111f45dbd 100644 --- a/CodenameOne/src/com/codename1/ui/Container.java +++ b/CodenameOne/src/com/codename1/ui/Container.java @@ -3095,18 +3095,18 @@ protected String paramString() { * @return the container components objects as list of Strings */ private String getComponentsNames() { - String ret = "["; + StringBuilder ret = new StringBuilder("["); int componentCount = components.size(); for (int iter = 0; iter < componentCount; iter++) { Component cmp = components.get(iter); String className = cmp.getClass().getName(); - ret += className.substring(className.lastIndexOf('.') + 1) + ", "; + ret.append(className.substring(className.lastIndexOf('.') + 1)).append(", "); } if (ret.length() > 1) { - ret = ret.substring(0, ret.length() - 2); + ret.setLength(ret.length() - 2); } - ret = ret + "]"; - return ret; + ret.append("]"); + return ret.toString(); } /** diff --git a/CodenameOne/src/com/codename1/ui/TextArea.java b/CodenameOne/src/com/codename1/ui/TextArea.java index 332e9eaf48..cb8a0704f0 100644 --- a/CodenameOne/src/com/codename1/ui/TextArea.java +++ b/CodenameOne/src/com/codename1/ui/TextArea.java @@ -1137,7 +1137,7 @@ private void initRowString() { if (useStringWidth || actAsLabel) { // fix for an infinite loop issue: http://forums.java.net/jive/thread.jspa?messageID=482802 //currentRowWidth = 0; - String currentRow = ""; + StringBuilder currentRowBuilder = new StringBuilder(); // search for "space" character at close as possible to the end of the row for (i = to; i < textLength && fastCharWidthCheck(text, from, i - from + 1, textAreaWidth, charWidth, font); i++) { @@ -1145,17 +1145,17 @@ private void initRowString() { /*if(updateRowWidth(c, font) >= textAreaWidth) { break; }*/ - currentRow += c; + currentRowBuilder.append(c); if (i < textLength - 1 && Character.isSurrogatePair(c, text[i + 1])) { // Surrogate pairs (e.g. emojis) shouldn't be split up. - currentRow += text[++i]; + currentRowBuilder.append(text[++i]); maxLength += 2; - if (font.stringWidth(currentRow) >= textAreaWidth) { + if (font.stringWidth(currentRowBuilder.toString()) >= textAreaWidth) { break; } continue; } - if (font.stringWidth(currentRow) >= textAreaWidth) { + if (font.stringWidth(currentRowBuilder.toString()) >= textAreaWidth) { break; } if (unsupported.indexOf(c) > -1) { diff --git a/CodenameOne/src/com/codename1/ui/html/CSSEngine.java b/CodenameOne/src/com/codename1/ui/html/CSSEngine.java index bea62eb5d8..c5f81a52ee 100644 --- a/CodenameOne/src/com/codename1/ui/html/CSSEngine.java +++ b/CodenameOne/src/com/codename1/ui/html/CSSEngine.java @@ -622,7 +622,7 @@ private void setTextTransformRecursive(Component cmp, int transformType) { String text = label.getText(); - String newText = ""; + StringBuilder newText = new StringBuilder(); boolean capNextLetter = true; for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); @@ -634,9 +634,9 @@ private void setTextTransformRecursive(Component cmp, int transformType) { } capNextLetter = false; } - newText += c; + newText.append(c); } - label.setText(newText); + label.setText(newText.toString()); break; default: break; @@ -803,25 +803,25 @@ private void setNowrapRecursive(final HTMLElement element) { String text = element.getText(); final Vector ui = element.getUi(); if ((text != null) && (ui != null) && (ui.size() > 1)) { //If it's just one word or already no-wrapped, no need to process - String word = ""; - String newText = ""; + StringBuilder word = new StringBuilder(); + StringBuilder newText = new StringBuilder(); for (int c = 0; c < text.length(); c++) { char ch = text.charAt(c); if ((ch == ' ') || (ch == '\n') || (ch == '\r') || (ch == '\t')) { - if (!word.equals("")) { - newText += word + " "; - word = ""; + if (word.length() > 0) { + newText.append(word).append(" "); + word.setLength(0); } } else { - word += ch; + word.append(ch); } } - if (!word.equals("")) { - newText += word + " "; + if (word.length() > 0) { + newText.append(word).append(" "); } final Label label = (Label) ui.elementAt(0); - setNowrapText(label, ui, newText, element); + setNowrapText(label, ui, newText.toString(), element); } } diff --git a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java index daa7718fb8..904eb1f2e7 100644 --- a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java +++ b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java @@ -1856,13 +1856,14 @@ private void checkRedirect(HTMLElement head) { if (seperator != -1) { String tempUrl = content.substring(seperator + 1); - redirectURL = ""; + StringBuilder redirectURLBuilder = new StringBuilder(); for (int i = 0; i < tempUrl.length(); i++) { char ch = tempUrl.charAt(i); if (!CSSParser.isWhiteSpace(ch)) { - redirectURL += ch; + redirectURLBuilder.append(ch); } } + redirectURL = redirectURLBuilder.toString(); if (redirectURL.startsWith("url=")) { // i.e. 10;url=http://.... redirectURL = redirectURL.substring(4); @@ -1986,22 +1987,22 @@ Vector showPreTagText(String text, int align) { return comps; //no text to show } - String line = ""; + StringBuilder line = new StringBuilder(); for (int c = 0; c < text.length(); c++) { char ch = text.charAt(c); if ((ch == 10) || (ch == 13)) { - if (!line.equals("")) { - comps.addElement(addString(line, align)); + if (line.length() > 0) { + comps.addElement(addString(line.toString(), align)); newLine(align); - line = ""; + line.setLength(0); } } else { - line += ch; + line.append(ch); } } - if (!line.equals("")) { - comps.addElement(addString(line, align)); + if (line.length() > 0) { + comps.addElement(addString(line.toString(), align)); newLine(align); } return comps; @@ -2009,8 +2010,8 @@ Vector showPreTagText(String text, int align) { Vector getWords(String text, int align, boolean returnComps) { Vector words = new Vector(); - String word = ""; - String leadSpace = ""; + StringBuilder word = new StringBuilder(); + StringBuilder leadSpace = new StringBuilder(); for (int c = 0; c < text.length(); c++) { char ch = text.charAt(c); if ((CJK_SUPPORT) && @@ -2020,40 +2021,42 @@ Vector getWords(String text, int align, boolean returnComps) { //((ch>=0x20000) && (ch<=0x2a6df)) || //CJK Unified Ideographs Extension B (Rare, historic) //((ch>=0x2f800) && (ch<=0x2fa1f)) //CJK Compatibility Ideographs Supplement (Unifiable variants) )) { // CJK (Chinese, Japanese, Korean) - word += ch; + word.append(ch); if (returnComps) { - words.addElement(addString(word, align)); + words.addElement(addString(word.toString(), align)); } else { - words.addElement(word); + words.addElement(word.toString()); } - word = ""; + word.setLength(0); } else { if ((ch == ' ') || (ch == '\n') || (ch == '\r') || (ch == '\t')) { if (word.length() != 0) { if (returnComps) { - words.addElement(addString(leadSpace + word + ' ', align)); - leadSpace = ""; + words.addElement(addString(leadSpace.toString() + word.toString() + ' ', align)); + leadSpace.setLength(0); } else { - words.addElement(word); + words.addElement(word.toString()); } - word = ""; + word.setLength(0); } else if ((words.isEmpty()) && (text.length() > 1)) { // The first word can have a leading space (only one, all whitespaces are aggregated to one space) - Unless this is just a space with no text - leadSpace = " "; + leadSpace.setLength(0); + leadSpace.append(' '); } - } else if ((!returnComps) && (font.stringWidth(word + ch) > width - leftIndent)) { //break words that are longer than the component's width - words.addElement(word); - word = "" + ch; + } else if ((!returnComps) && (font.stringWidth(word.toString() + ch) > width - leftIndent)) { //break words that are longer than the component's width + words.addElement(word.toString()); + word.setLength(0); + word.append(ch); } else { - word += ch; + word.append(ch); } } } if ((word.length() != 0) || (leadSpace.length() != 0)) { if (returnComps) { - words.addElement(addString(leadSpace + word, align)); + words.addElement(addString(leadSpace.toString() + word.toString(), align)); } else { if (word.length() != 0) { - words.addElement(word); + words.addElement(word.toString()); } } } @@ -2084,32 +2087,33 @@ private Vector showTextFixedWidth(String text, int align) { if (words.size() > 0) { int w = 0; - String wordStr = ""; + StringBuilder wordStr = new StringBuilder(); if ((CSSParser.isWhiteSpace(text.charAt(0))) && (curLine.getComponentCount() != 0)) { //leading space is trimmed if it is in the first component of the line - wordStr = " "; //leading space + wordStr.append(" "); //leading space } while (w < words.size()) { String nextWord = (String) words.elementAt(w); String space = ""; - if ((!wordStr.equals("")) && (!wordStr.equals(" "))) { + if ((wordStr.length() > 0) && (!wordStr.toString().equals(" "))) { space = " "; } - if (font.stringWidth(wordStr + space + nextWord) > spaceW - 2) { - comps.addElement(addString(wordStr, align)); + if (font.stringWidth(wordStr.toString() + space + nextWord) > spaceW - 2) { + comps.addElement(addString(wordStr.toString(), align)); newLineIfNotEmpty(align); spaceW = width - x; - wordStr = nextWord; + wordStr.setLength(0); + wordStr.append(nextWord); } else { - wordStr += space + nextWord; + wordStr.append(space).append(nextWord); } w++; } if (CSSParser.isWhiteSpace(text.charAt(text.length() - 1))) { - wordStr += " "; //trailing space + wordStr.append(" "); //trailing space } - comps.addElement(addString(wordStr, align)); + comps.addElement(addString(wordStr.toString(), align)); } return comps; @@ -2221,17 +2225,17 @@ private Label addString(String str, int align) { int spacesToAdd = (width - lbl.getPreferredW()) / spaceW; int spacesPerWord = spacesToAdd / (words.size() - 1); int addtlSpaces = spacesToAdd % (words.size() - 1); - String newStr = (String) words.elementAt(0); + StringBuilder newStr = new StringBuilder((String) words.elementAt(0)); for (int i = 1; i < words.size(); i++) { for (int j = 0; j < spacesPerWord; j++) { - newStr += ' '; + newStr.append(' '); } if (i - 1 < addtlSpaces) { - newStr += ' '; + newStr.append(' '); } - newStr += ' ' + (String) words.elementAt(i); + newStr.append(' ').append((String) words.elementAt(i)); } - lbl.setText(newStr); + lbl.setText(newStr.toString()); } } else { lbl.setPreferredW(width); @@ -2457,7 +2461,7 @@ private void handleImageMapArea(HTMLElement areaTag) { supportedShape = true; String coordsStr = areaTag.getAttributeById(HTMLElement.ATTR_COORDS); if ((coordsStr != null) && (hrefStr != null)) { - String curValStr = ""; + StringBuilder curValStr = new StringBuilder(); int[] coords = new int[4]; int curCoord = 0; boolean error = true; @@ -2465,15 +2469,15 @@ private void handleImageMapArea(HTMLElement areaTag) { for (int c = 0; c < coordsStr.length(); c++) { char ch = coordsStr.charAt(c); if (ch != ',') { - curValStr += ch; + curValStr.append(ch); } else { - coords[curCoord] = Integer.parseInt(curValStr); + coords[curCoord] = Integer.parseInt(curValStr.toString()); curCoord++; - curValStr = ""; + curValStr.setLength(0); } } if (curValStr.length() > 0) { - coords[curCoord] = Integer.parseInt(curValStr); + coords[curCoord] = Integer.parseInt(curValStr.toString()); curCoord++; } if (shape.equalsIgnoreCase("rect")) { diff --git a/CodenameOne/src/com/codename1/ui/html/HTMLElement.java b/CodenameOne/src/com/codename1/ui/html/HTMLElement.java index 3af67aaa67..8279a10667 100644 --- a/CodenameOne/src/com/codename1/ui/html/HTMLElement.java +++ b/CodenameOne/src/com/codename1/ui/html/HTMLElement.java @@ -971,11 +971,11 @@ static int getColor(String colorStr, int defaultColor) { } if (colorStr.length() == 3) { // shortened format rgb - translated to rrggbb - String newColStr = ""; + StringBuilder newColStr = new StringBuilder(); for (int i = 0; i < 3; i++) { - newColStr += colorStr.charAt(i) + "" + colorStr.charAt(i); + newColStr.append(colorStr.charAt(i)).append("").append(colorStr.charAt(i)); } - colorStr = newColStr; + colorStr = newColStr.toString(); } try { @@ -1159,23 +1159,23 @@ public String getSupportedAttributesList() { if ((id < 0) || (id >= TAG_ATTRIBUTES.length)) { return "Unknown"; } - String list = ""; + StringBuilder list = new StringBuilder(); for (int a = 0; a < TAG_ATTRIBUTES[id].length; a++) { - list += ATTRIBUTE_NAMES[TAG_ATTRIBUTES[id][a]] + ","; + list.append(ATTRIBUTE_NAMES[TAG_ATTRIBUTES[id][a]]).append(","); } if (supportsCoreAttributes()) { for (int a = 0; a < COMMON_ATTRIBUTES.length; a++) { - list += ATTRIBUTE_NAMES[COMMON_ATTRIBUTES[a]] + ","; + list.append(ATTRIBUTE_NAMES[COMMON_ATTRIBUTES[a]]).append(","); } } - if (list.endsWith(",")) { - list = list.substring(0, list.length() - 1); + if (list.length() > 0 && list.charAt(list.length() - 1) == ',') { + list.setLength(list.length() - 1); } - if (list.equals("")) { - list = "None"; + if (list.length() == 0) { + return "None"; } - return list; + return list.toString(); } /** @@ -1427,9 +1427,9 @@ public String getAttribute(String name) { * @return the printout of this tag */ public String toString(String spacing) { - String str = spacing; + StringBuilder str = new StringBuilder(spacing); if (!isTextElement()) { - str += "<" + getTagName(); + str.append("<").append(getTagName()); Hashtable attributes = getAttributes(); if (attributes != null) { for (Enumeration e = attributes.keys(); e.hasMoreElements(); ) { @@ -1437,22 +1437,22 @@ public String toString(String spacing) { String attrStr = getAttributeName(attrKey); String val = (String) attributes.get(attrKey); - str += " " + attrStr + "='" + val + "' (" + attrKey + ")"; + str.append(" ").append(attrStr).append("='").append(val).append("' (").append(attrKey).append(")"); } } - str += ">\n"; + str.append(">\n"); Vector children = getChildren(); if (children != null) { for (int i = 0; i < children.size(); i++) { - str += ((HTMLElement) children.elementAt(i)).toString(spacing + ' '); + str.append(((HTMLElement) children.elementAt(i)).toString(spacing + ' ')); } } - str += spacing + "\n"; + str.append(spacing).append("\n"); } else { - str += "'" + getText() + "'\n"; + str.append("'").append(getText()).append("'\n"); } - return str; + return str.toString(); } /** diff --git a/CodenameOne/src/com/codename1/ui/html/HTMLForm.java b/CodenameOne/src/com/codename1/ui/html/HTMLForm.java index dbdabac89f..db64cd7cf6 100644 --- a/CodenameOne/src/com/codename1/ui/html/HTMLForm.java +++ b/CodenameOne/src/com/codename1/ui/html/HTMLForm.java @@ -262,7 +262,7 @@ void submit(String submitKey, String submitVal) { String url = action; String params = null; if (comps.size() > 0) { - params = ""; + StringBuilder paramsBuilder = new StringBuilder(); for (Enumeration e = comps.keys(); e.hasMoreElements(); ) { String key = (String) e.nextElement(); Object input = comps.get(key); @@ -270,13 +270,13 @@ void submit(String submitKey, String submitVal) { String value = ""; if (input instanceof String) { //hidden value = HTMLUtils.encodeString((String) input); - params += key + "=" + value + "&"; + paramsBuilder.append(key).append("=").append(value).append("&"); } else if (input instanceof Hashtable) { //checkbox / radiobutton Hashtable options = (Hashtable) input; for (Enumeration e2 = options.keys(); e2.hasMoreElements(); ) { Button b = (Button) e2.nextElement(); if (b.isSelected()) { - params += key + "=" + HTMLUtils.encodeString((String) options.get(b)) + "&"; + paramsBuilder.append(key).append("=").append(HTMLUtils.encodeString((String) options.get(b))).append("&"); } } } else if (input instanceof TextArea) { //catches both textareas and text input fields @@ -318,13 +318,13 @@ void submit(String submitKey, String submitVal) { text = htmlC.getHTMLCallback().fieldSubmitted(htmlC, tf, url, key, text, type, errorMsg); } if (errorMsg == null) { - params += key + "=" + HTMLUtils.encodeString(text) + "&"; + paramsBuilder.append(key).append("=").append(HTMLUtils.encodeString(text)).append("&"); } } else if (input instanceof ComboBox) { // drop down lists (single selection) Object item = ((ComboBox) input).getSelectedItem(); if (item instanceof OptionItem) { value = ((OptionItem) item).getValue(); - params += key + "=" + HTMLUtils.encodeString(value) + "&"; + paramsBuilder.append(key).append("=").append(HTMLUtils.encodeString(value)).append("&"); } // if not - value may be an OPTGROUP label in an only optgroup combobox } else if (input instanceof MultiComboBox) { // drop down lists (multiple selection) Vector selected = ((MultiComboBox) input).getSelected(); @@ -332,16 +332,17 @@ void submit(String submitKey, String submitVal) { Object item = selected.elementAt(i); if (item instanceof OptionItem) { value = ((OptionItem) item).getValue(); - params += key + "=" + HTMLUtils.encodeString(value) + "&"; + paramsBuilder.append(key).append("=").append(HTMLUtils.encodeString(value)).append("&"); } // if not - value may be an OPTGROUP label in an only optgroup combobox } } } - if (params.endsWith("&")) { //trim the extra & - params = params.substring(0, params.length() - 1); + if (paramsBuilder.length() > 0 && paramsBuilder.charAt(paramsBuilder.length() - 1) == '&') { //trim the extra & + paramsBuilder.setLength(paramsBuilder.length() - 1); } + params = paramsBuilder.toString(); } // Add the submit button param, only if the key is non-null (unnamed submit buttons are not passed as parameters) diff --git a/CodenameOne/src/com/codename1/ui/html/HTMLInputFormat.java b/CodenameOne/src/com/codename1/ui/html/HTMLInputFormat.java index 75a030821e..002f2f6a1a 100644 --- a/CodenameOne/src/com/codename1/ui/html/HTMLInputFormat.java +++ b/CodenameOne/src/com/codename1/ui/html/HTMLInputFormat.java @@ -323,7 +323,7 @@ private boolean verifyChar(char c, int constraint) { * @return a printout of a user-friendly string describing the format */ public String toString() { - String str = ""; + StringBuilder str = new StringBuilder(); String followedBy = ""; int lastType = -1; String lastString = ""; @@ -333,7 +333,7 @@ public String toString() { if (constraint.count == FormatConstraint.COUNT_EXACTLY_ONE) { if (lastType != -1) { if (lastType != constraint.type) { - str += followedBy + singlesCount + lastString; + str.append(followedBy).append(singlesCount).append(lastString); followedBy = " followed by "; singlesCount = 1; lastType = constraint.type; @@ -348,13 +348,13 @@ public String toString() { } } else { if (lastType != -1) { - str += followedBy + singlesCount + lastString; + str.append(followedBy).append(singlesCount).append(lastString); followedBy = " followed by "; lastType = -1; singlesCount = 0; lastString = ""; } - str += followedBy + constraint; + str.append(followedBy).append(constraint); followedBy = " followed by "; } @@ -363,10 +363,10 @@ public String toString() { } if (lastType != -1) { - str += followedBy + singlesCount + lastString; + str.append(followedBy).append(singlesCount).append(lastString); } - return str; + return str.toString(); } // Inner classes: @@ -448,45 +448,45 @@ class FormatConstraint { * @return a printout of a user-friendly string describing this constraint */ public String toString() { - String str = ""; + StringBuilder str = new StringBuilder(); if (count == COUNT_EXACTLY_ONE) { - //str+=""; + //str.append(""); } else if (count == COUNT_NO_LIMIT) { - str += UIManager.getInstance().localize("html.format.anynumber", "any number of"); + str.append(UIManager.getInstance().localize("html.format.anynumber", "any number of")); } else { - str += UIManager.getInstance().localize("html.format.upto", "up to") + " " + count; + str.append(UIManager.getInstance().localize("html.format.upto", "up to")).append(" ").append(count); } - str += " "; + str.append(" "); String orString = " " + UIManager.getInstance().localize("html.format.or", "or") + " "; String or = ""; if ((type & TYPE_ANY) != 0) { - str += "any"; + str.append("any"); } else { if ((type & TYPE_LOWERCASE) != 0) { - str += UIManager.getInstance().localize("html.format.lowercase", "lowercase"); + str.append(UIManager.getInstance().localize("html.format.lowercase", "lowercase")); or = orString; } if ((type & TYPE_UPPERCASE) != 0) { - str += or + UIManager.getInstance().localize("html.format.uppercase", "uppercase"); + str.append(or).append(UIManager.getInstance().localize("html.format.uppercase", "uppercase")); or = orString; } if ((type & TYPE_NUMERIC) != 0) { - str += or + UIManager.getInstance().localize("html.format.numeric", "numeric"); + str.append(or).append(UIManager.getInstance().localize("html.format.numeric", "numeric")); or = orString; } if ((type & TYPE_SYMBOL) != 0) { - str += or + UIManager.getInstance().localize("html.format.symbol", "symbol"); + str.append(or).append(UIManager.getInstance().localize("html.format.symbol", "symbol")); } } - str += " "; + str.append(" "); if ((count != COUNT_EXACTLY_ONE) && (count != 1)) { - str += UIManager.getInstance().localize("html.format.chars", "characters"); + str.append(UIManager.getInstance().localize("html.format.chars", "characters")); } else { - str += UIManager.getInstance().localize("html.format.char", "character"); + str.append(UIManager.getInstance().localize("html.format.char", "character")); } - return str; + return str.toString(); } } diff --git a/CodenameOne/src/com/codename1/ui/html/ResourceThreadQueue.java b/CodenameOne/src/com/codename1/ui/html/ResourceThreadQueue.java index 143e3d0e60..c39d585931 100644 --- a/CodenameOne/src/com/codename1/ui/html/ResourceThreadQueue.java +++ b/CodenameOne/src/com/codename1/ui/html/ResourceThreadQueue.java @@ -320,30 +320,30 @@ synchronized void discardQueue() { * @return a printout of the threads queue */ public String toString() { - String str = ("---- Running ----\n"); + StringBuilder str = new StringBuilder("---- Running ----\n"); int i = 1; for (Enumeration e = running.elements(); e.hasMoreElements(); ) { ResourceThread t = (ResourceThread) e.nextElement(); if (t.imageUrl != null) { - str += "#" + i + ": " + t.imageUrl + "\n"; + str.append("#").append(i).append(": ").append(t.imageUrl).append("\n"); } else { - str += "#" + i + ": CSS - " + t.cssDocInfo.getUrl() + "\n"; + str.append("#").append(i).append(": CSS - ").append(t.cssDocInfo.getUrl()).append("\n"); } i++; } i = 1; - str += "Queue:\n"; + str.append("Queue:\n"); for (Enumeration e = queue.elements(); e.hasMoreElements(); ) { ResourceThread t = (ResourceThread) e.nextElement(); if (t.imageUrl != null) { - str += "#" + i + ": " + t.imageUrl + "\n"; + str.append("#").append(i).append(": ").append(t.imageUrl).append("\n"); } else { - str += "#" + i + ": CSS - " + t.cssDocInfo.getUrl() + "\n"; + str.append("#").append(i).append(": CSS - ").append(t.cssDocInfo.getUrl()).append("\n"); } i++; } - str += "---- count:" + threadCount + " ----\n"; - return str; + str.append("---- count:").append(threadCount).append(" ----\n"); + return str.toString(); } // Inner classes: diff --git a/CodenameOne/src/com/codename1/ui/plaf/DefaultLookAndFeel.java b/CodenameOne/src/com/codename1/ui/plaf/DefaultLookAndFeel.java index a69484ffc1..53a8f531fd 100644 --- a/CodenameOne/src/com/codename1/ui/plaf/DefaultLookAndFeel.java +++ b/CodenameOne/src/com/codename1/ui/plaf/DefaultLookAndFeel.java @@ -869,9 +869,11 @@ public Spans calculateTextAreaSpan(TextSelection sel, TextArea ta) { String displayText = ""; if ((ta.getConstraint() & TextArea.PASSWORD) != 0) { int rlen = rowText.length(); + StringBuilder displayTextBuilder = new StringBuilder(); for (int j = 0; j < rlen; j++) { - displayText += passwordChar; + displayTextBuilder.append(passwordChar); } + displayText = displayTextBuilder.toString(); } else { displayText = rowText; } @@ -960,9 +962,11 @@ public void drawTextArea(Graphics g, TextArea ta) { String displayText = ""; if ((ta.getConstraint() & TextArea.PASSWORD) != 0) { int rlen = rowText.length(); + StringBuilder displayTextBuilder = new StringBuilder(); for (int j = 0; j < rlen; j++) { - displayText += passwordChar; + displayTextBuilder.append(passwordChar); } + displayText = displayTextBuilder.toString(); } else { displayText = rowText; } @@ -1285,12 +1289,12 @@ public Dimension getTextAreaSize(TextArea ta, boolean pref) { prefH = (f.getHeight() + ta.getRowsGap()) * rows; if (!ta.isActAsLabel()) { int columns = ta.getColumns(); - String str = ""; + StringBuilder str = new StringBuilder(); for (int iter = 0; iter < columns; iter++) { - str += TextArea.getWidestChar(); + str.append(TextArea.getWidestChar()); } if (columns > 0) { - prefW = Math.max(prefW, f.stringWidth(str)); + prefW = Math.max(prefW, f.stringWidth(str.toString())); } } prefH = Math.max(prefH, rows * f.getHeight()); @@ -1882,19 +1886,21 @@ protected String getTextFieldString(TextArea ta) { String displayText = ""; if ((ta.getConstraint() & TextArea.PASSWORD) != 0) { // show the last character in a password field + StringBuilder displayTextBuilder = new StringBuilder(); if (ta.isPendingCommit()) { if (text.length() > 0) { int tlen = text.length(); for (int j = 0; j < tlen - 1; j++) { - displayText += passwordChar; + displayTextBuilder.append(passwordChar); } - displayText += text.charAt(text.length() - 1); + displayTextBuilder.append(text.charAt(text.length() - 1)); } } else { for (int j = 0; j < text.length(); j++) { - displayText += passwordChar; + displayTextBuilder.append(passwordChar); } } + displayText = displayTextBuilder.toString(); } else { displayText = text; } diff --git a/CodenameOne/src/com/codename1/xml/Element.java b/CodenameOne/src/com/codename1/xml/Element.java index af64416488..74cf7f6e53 100644 --- a/CodenameOne/src/com/codename1/xml/Element.java +++ b/CodenameOne/src/com/codename1/xml/Element.java @@ -710,27 +710,27 @@ public String toString() { */ public String toString(String spacing) { - String str = spacing; + StringBuilder str = new StringBuilder(spacing); if (!textElement) { - str += "<" + getTagName(); + str.append("<").append(getTagName()); if (attributes != null) { for (Enumeration e = attributes.keys(); e.hasMoreElements(); ) { String attrStr = (String) e.nextElement(); String val = (String) attributes.get(attrStr); - str += " " + attrStr + "='" + val + "'"; + str.append(" ").append(attrStr).append("='").append(val).append("'"); } } - str += ">\n"; + str.append(">\n"); if (children != null) { for (int i = 0; i < children.size(); i++) { - str += children.get(i).toString(spacing + ' '); + str.append(children.get(i).toString(spacing + ' ')); } } - str += spacing + "\n"; + str.append(spacing).append("\n"); } else { - str += "'" + name + "'\n"; + str.append("'").append(name).append("'\n"); } - return str; + return str.toString(); } /** diff --git a/CodenameOne/src/com/codename1/xml/XMLParser.java b/CodenameOne/src/com/codename1/xml/XMLParser.java index 3ee3dae780..5553c490cc 100644 --- a/CodenameOne/src/com/codename1/xml/XMLParser.java +++ b/CodenameOne/src/com/codename1/xml/XMLParser.java @@ -275,17 +275,17 @@ public Element parse(Reader is) { notifyError(ParserCallback.ERROR_NO_ROOTS, null, null, null, "XML document contains no root element."); return null; } else if (rootElement.getNumChildren() > 1) { - String roots = ""; + StringBuilder roots = new StringBuilder(); for (int i = 1; i < rootElement.getNumChildren(); i++) { Element elem = rootElement.getChildAt(i); if (elem.isTextElement()) { - roots += "Text (" + elem.getText() + "),"; + roots.append("Text (").append(elem.getText()).append("),"); } else { - roots += elem.getTagName() + ","; + roots.append(elem.getTagName()).append(","); } } - if (roots.endsWith(",")) { - roots = roots.substring(0, roots.length() - 1); + if (roots.length() > 0 && roots.charAt(roots.length() - 1) == ',') { + roots.setLength(roots.length() - 1); } Element firstRoot = rootElement.getChildAt(0);