This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 9e72a1c58f SonarQube bug fixes
9e72a1c58f is described below

commit 9e72a1c58f56ae727573f0a16200b7b7af319b18
Author: James Bognar <[email protected]>
AuthorDate: Thu Feb 5 12:34:22 2026 -0500

    SonarQube bug fixes
---
 .../apache/juneau/bean/openapi3/ui/OpenApiUI.java  |  1 +
 .../apache/juneau/bean/swagger/ui/SwaggerUI.java   |  1 +
 .../apache/juneau/commons/utils/StringUtils.java   |  6 +-
 .../java/org/apache/juneau/BeanPropertyMeta.java   |  7 ++-
 .../apache/juneau/html/BasicHtmlDocTemplate.java   |  2 +-
 .../org/apache/juneau/html/HtmlParserSession.java  | 18 +++---
 .../apache/juneau/html/HtmlSerializerSession.java  | 24 ++++----
 .../org/apache/juneau/parser/ParserReader.java     |  9 ++-
 .../juneau/microservice/console/ConfigCommand.java | 33 +++++++----
 .../org/apache/juneau/rest/client/RestClient.java  |  6 +-
 .../assertion/FluentResponseBodyAssertion.java     |  9 ++-
 .../assertions/FluentRequestContentAssertion.java  | 11 ++--
 .../apache/juneau/rest/servlet/RestServlet.java    |  9 ++-
 scripts/release.py                                 | 68 ++++++++++++----------
 14 files changed, 122 insertions(+), 82 deletions(-)

diff --git 
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
 
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
index ef9c3fa64b..0db80298d4 100644
--- 
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
+++ 
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
@@ -41,6 +41,7 @@ import org.apache.juneau.swap.*;
  *     <li class='link'><a class="doclink" 
href="https://juneau.apache.org/docs/topics/JuneauBeanOpenApi3";>juneau-bean-openapi-v3</a>
  * </ul>
  */
+@SuppressWarnings("java:S1192")
 public class OpenApiUI extends ObjectSwap<OpenApi,Div> {
 
        private static class Session {
diff --git 
a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
 
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
index fd07315d7e..14715aaa73 100644
--- 
a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
+++ 
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
@@ -40,6 +40,7 @@ import org.apache.juneau.swap.*;
  *     <li class='link'><a class="doclink" 
href="https://juneau.apache.org/docs/topics/JuneauBeanSwagger2";>juneau-bean-swagger-v2</a>
  * </ul>
  */
+@SuppressWarnings("java:S1192")
 public class SwaggerUI extends ObjectSwap<Swagger,Div> {
 
        private static class Session {
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
index e1fa742979..2301474194 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
@@ -7567,7 +7567,7 @@ public class StringUtils {
                }
 
                if (needsDecode) {
-                       return safe(()->URLDecoder.decode(s, "UTF-8"));
+                       return safe(()->URLDecoder.decode(s, UTF_8.name()));
                }
                return s;
        }
@@ -7589,7 +7589,7 @@ public class StringUtils {
                        needsEncode |= (! 
URL_UNENCODED_CHARS.contains(s.charAt(i)));
 
                if (needsEncode) {
-                       return safe(()->URLEncoder.encode(s, "UTF-8"));
+                       return safe(()->URLEncoder.encode(s, UTF_8.name()));
                }
 
                return s;
@@ -7618,7 +7618,7 @@ public class StringUtils {
                                else if (c <= 127)
                                        sb.append('%').append(toHex2(c));
                                else
-                                       safe(()->sb.append(URLEncoder.encode("" 
+ c, "UTF-8")));  // Yuck.
+                                       safe(()->sb.append(URLEncoder.encode("" 
+ c, UTF_8.name())));  // Yuck.
                        }
                        s = sb.toString();
                }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 79c421ff89..234cbce4e7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -64,6 +64,9 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
        private static final String ARG_value = "value";
        private static final String ARG_innerField = "innerField";
 
+       // Error message constants
+       private static final String MSG_getterOrFieldNotDefined = "Getter or 
public field not defined on property ''{0}''";
+
        /**
         * BeanPropertyMeta builder class.
         */
@@ -848,7 +851,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                return (Map)getter.invoke(bean);
                        if (nn(field))
                                return (Map)field.get(bean);
-                       throw bex(beanMeta.getClassMeta(), "Getter or public 
field not defined on property ''{0}''", name);
+                       throw bex(beanMeta.getClassMeta(), 
MSG_getterOrFieldNotDefined, name);
                }
                return mape();
        }
@@ -1273,7 +1276,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        } else if (nn(field))
                                m = (Map)field.get(bean);
                        else
-                               throw bex(beanMeta.getClassMeta(), "Getter or 
public field not defined on property ''{0}''", name);
+                               throw bex(beanMeta.getClassMeta(), 
MSG_getterOrFieldNotDefined, name);
                        return (m == null ? null : m.get(pName));
                }
                if (nn(getter))
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
index 06949dc4ac..7a8f8f1287 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
@@ -36,7 +36,7 @@ import org.apache.juneau.commons.utils.*;
  *     <li class='link'><a class="doclink" 
href="https://juneau.apache.org/docs/topics/HtmlBasics";>HTML Basics</a>
  * </ul>
  */
-@SuppressWarnings("resource")
+@SuppressWarnings({"resource", "java:S1192"})
 public class BasicHtmlDocTemplate implements HtmlDocTemplate {
 
        private static boolean exists(String s) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index f9e4dd3b9f..40989864a0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -59,6 +59,10 @@ public class HtmlParserSession extends XmlParserSession {
        // Argument name constants for assertArgNotNull
        private static final String ARG_ctx = "ctx";
 
+       // HTML tag name constants
+       private static final String HTMLTAG_array = "array";
+       private static final String HTMLTAG_object = "object";
+
        /**
         * Builder class.
         */
@@ -392,18 +396,18 @@ public class HtmlParserSession extends XmlParserSession {
 
                } else if (tag == TABLE) {
 
-                       String typeName = getAttribute(r, 
getBeanTypePropertyName(eType), "object");
+                       String typeName = getAttribute(r, 
getBeanTypePropertyName(eType), HTMLTAG_object);
                        ClassMeta cm = getClassMeta(typeName, pMeta, eType);
 
                        if (nn(cm)) {
                                sType = eType = cm;
-                               typeName = sType.isCollectionOrArray() ? 
"array" : "object";
-                       } else if (! "array".equals(typeName)) {
+                               typeName = sType.isCollectionOrArray() ? 
HTMLTAG_array : HTMLTAG_object;
+                       } else if (! HTMLTAG_array.equals(typeName)) {
                                // Type name could be a subtype name.
-                               typeName = sType.isCollectionOrArray() ? 
"array" : "object";
+                               typeName = sType.isCollectionOrArray() ? 
HTMLTAG_array : HTMLTAG_object;
                        }
 
-                       if (typeName.equals("object")) {
+                       if (typeName.equals(HTMLTAG_object)) {
                                if (sType.isObject()) {
                                        o = parseIntoMap(r, 
newGenericMap(sType), sType.getKeyType(), sType.getValueType(), pMeta);
                                } else if (sType.isMap()) {
@@ -422,7 +426,7 @@ public class HtmlParserSession extends XmlParserSession {
                                }
                                skipTag(r, xTABLE);
 
-                       } else if (typeName.equals("array")) {
+                       } else if (typeName.equals(HTMLTAG_array)) {
                                if (sType.isObject())
                                        o = parseTableIntoCollection(r, 
(Collection)new JsonList(this), sType, pMeta);
                                else if (sType.isCollection())
@@ -439,7 +443,7 @@ public class HtmlParserSession extends XmlParserSession {
                        }
 
                } else if (tag == UL) {
-                       String typeName = getAttribute(r, 
getBeanTypePropertyName(eType), "array");
+                       String typeName = getAttribute(r, 
getBeanTypePropertyName(eType), HTMLTAG_array);
                        ClassMeta cm = getClassMeta(typeName, pMeta, eType);
                        if (nn(cm))
                                sType = eType = cm;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index a368e8ebbd..dfd50f2142 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -59,6 +59,10 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
        // Argument name constants for assertArgNotNull
        private static final String ARG_ctx = "ctx";
 
+       // HTML tag name constants
+       private static final String HTMLTAG_style = "style";
+       private static final String HTMLTAG_table = "table";
+
        /**
         * Builder class.
         */
@@ -405,7 +409,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
 
                int i = indent;
 
-               out.oTag(i, "table");
+               out.oTag(i, HTMLTAG_table);
 
                String typeName = m.getMeta().getDictionaryName();
                if (nn(typeName) && eType != m.getClassMeta())
@@ -445,7 +449,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                        out.oTag(i + 2, "td");
                        String style = getStyle(this, pMeta, value);
                        if (nn(style))
-                               out.attr("style", style);
+                               out.attr(HTMLTAG_style, style);
                        out.cTag();
 
                        try {
@@ -465,7 +469,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                        out.ie(i + 1).eTag("tr").nl(i + 1);
                });
 
-               out.ie(i).eTag("table").nl(i);
+               out.ie(i).eTag(HTMLTAG_table).nl(i);
        }
 
        @SuppressWarnings({ "rawtypes", "unchecked", "java:S3776", "java:S6541" 
})
@@ -504,7 +508,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
 
                if (nn(th)) {
 
-                       out.oTag(i, "table").attr(btpn, type2).w('>').nl(i + 1);
+                       out.oTag(i, HTMLTAG_table).attr(btpn, 
type2).w('>').nl(i + 1);
                        if (th.length > 0) {
                                out.sTag(i + 1, "tr").nl(i + 2);
                                for (var key : th) {
@@ -577,7 +581,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                                                        String style = 
getStyle(this, pMeta, value);
                                                        out.oTag(i + 2, "td");
                                                        if (nn(style))
-                                                               
out.attr("style", style);
+                                                               
out.attr(HTMLTAG_style, style);
                                                        out.cTag();
                                                        if (nn(link))
                                                                
out.oTag("a").attrUri("href", link).cTag();
@@ -592,7 +596,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                                }
                                out.ie(i + 1).eTag("tr").nl(i + 1);
                        }
-                       out.ie(i).eTag("table").nl(i);
+                       out.ie(i).eTag(HTMLTAG_table).nl(i);
 
                } else {
                        out.oTag(i, isDc ? "p" : "ul");
@@ -608,7 +612,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                                String style = getStyle(this, ppMeta, o);
                                String link = getLink(ppMeta);
                                if (nn(style) && ! isDc)
-                                       out.attr("style", style);
+                                       out.attr(HTMLTAG_style, style);
                                if (! isDc)
                                        out.cTag();
                                if (nn(link))
@@ -637,7 +641,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
 
                int i = indent;
 
-               out.oTag(i, "table");
+               out.oTag(i, HTMLTAG_table);
 
                if (nn(typeName) && nn(ppMeta) && ppMeta.getClassMeta() != 
aType)
                        out.attr(getBeanTypePropertyName(sType), typeName);
@@ -652,7 +656,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
 
                forEachEntry(m, x -> serializeMapEntry(out, x, keyType, 
valueType, i, ppMeta));
 
-               out.ie(i).eTag("table").nl(i);
+               out.ie(i).eTag(HTMLTAG_table).nl(i);
        }
 
        @SuppressWarnings("rawtypes")
@@ -673,7 +677,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                out.sTag(i + 1, "tr").nl(i + 2);
                out.oTag(i + 2, "td");
                if (nn(style))
-                       out.attr("style", style);
+                       out.attr(HTMLTAG_style, style);
                out.cTag();
                if (nn(link))
                        out.oTag(i + 3, "a").attrUri("href", 
link.replace("{#}", s(value))).cTag();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserReader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserReader.java
index 5f63ed5517..3f8698300d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserReader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserReader.java
@@ -45,6 +45,9 @@ import org.apache.juneau.commons.io.*;
 @SuppressWarnings("resource")
 public class ParserReader extends Reader implements Positionable {
 
+       // Error message constants
+       private static final String MSG_bufferUnderflow = "Buffer underflow.";
+
        /** Wrapped reader */
        protected final Reader r;
 
@@ -341,11 +344,11 @@ public class ParserReader extends Reader implements 
Positionable {
        public final ParserReader replace(int c, int offset) throws IOException 
{
                if (c < 0x10000) {
                        if (offset < 1)
-                               throw ioex("Buffer underflow.");
+                               throw ioex(MSG_bufferUnderflow);
                        buff[iCurrent - offset] = (char)c;
                } else {
                        if (offset < 2)
-                               throw ioex("Buffer underflow.");
+                               throw ioex(MSG_bufferUnderflow);
                        c -= 0x10000;
                        buff[iCurrent - offset] = (char)(0xd800 + (c >> 10));
                        buff[iCurrent - offset + 1] = (char)(0xdc00 + (c & 
0x3ff));
@@ -366,7 +369,7 @@ public class ParserReader extends Reader implements 
Positionable {
         */
        public ParserReader unread() throws IOException {
                if (iCurrent <= 0)
-                       throw ioex("Buffer underflow.");
+                       throw ioex(MSG_bufferUnderflow);
                iCurrent--;
                if (column == 0)
                        line--;
diff --git 
a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/console/ConfigCommand.java
 
b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/console/ConfigCommand.java
index 1e64918f04..8c2ad1fb97 100644
--- 
a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/console/ConfigCommand.java
+++ 
b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/console/ConfigCommand.java
@@ -34,6 +34,15 @@ import org.apache.juneau.microservice.*;
  */
 public class ConfigCommand extends ConsoleCommand {
 
+       // Message bundle key constants
+       private static final String MKEY_invalidArguments = "InvalidArguments";
+       private static final String MKEY_tooManyArguments = "TooManyArguments";
+       private static final String MKEY_keyNotFound = "KeyNotFound";
+       private static final String MKEY_configSet = "ConfigSet";
+       private static final String MKEY_configRemove = "ConfigRemove";
+       private static final String MKEY_description = "description";
+       private static final String MKEY_info = "info";
+
        private final Messages mb = Messages.of(ConfigCommand.class, 
"Messages");
 
        @Override /* Overridden from ConsoleCommand */
@@ -50,46 +59,46 @@ public class ConfigCommand extends ConsoleCommand {
                                        if (nn(val))
                                                out.println(val);
                                        else
-                                               
out.println(mb.getString("KeyNotFound", key));
+                                               
out.println(mb.getString(MKEY_keyNotFound, key));
                                } else {
-                                       
out.println(mb.getString("TooManyArguments"));
+                                       
out.println(mb.getString(MKEY_tooManyArguments));
                                }
                        } else if (option.equals("set")) {
                                // config set <key> <value>
                                if (args.size() == 4) {
                                        conf.set(key, args.getArg(3));
-                                       out.println(mb.getString("ConfigSet"));
+                                       
out.println(mb.getString(MKEY_configSet));
                                } else if (args.size() < 4) {
-                                       
out.println(mb.getString("InvalidArguments"));
+                                       
out.println(mb.getString(MKEY_invalidArguments));
                                } else {
-                                       
out.println(mb.getString("TooManyArguments"));
+                                       
out.println(mb.getString(MKEY_tooManyArguments));
                                }
                        } else if (option.equals("remove")) {
                                // config remove <key>
                                if (args.size() == 3) {
                                        if (conf.get(key).isPresent()) {
                                                conf.remove(key);
-                                               
out.println(mb.getString("ConfigRemove", key));
+                                               
out.println(mb.getString(MKEY_configRemove, key));
                                        } else {
-                                               
out.println(mb.getString("KeyNotFound", key));
+                                               
out.println(mb.getString(MKEY_keyNotFound, key));
                                        }
                                } else {
-                                       
out.println(mb.getString("TooManyArguments"));
+                                       
out.println(mb.getString(MKEY_tooManyArguments));
                                }
                        } else {
-                               out.println(mb.getString("InvalidArguments"));
+                               
out.println(mb.getString(MKEY_invalidArguments));
                        }
                } else {
-                       out.println(mb.getString("InvalidArguments"));
+                       out.println(mb.getString(MKEY_invalidArguments));
                }
                return false;
        }
 
        @Override /* Overridden from ConsoleCommand */
-       public String getDescription() { return mb.getString("description"); }
+       public String getDescription() { return mb.getString(MKEY_description); 
}
 
        @Override /* Overridden from ConsoleCommand */
-       public String getInfo() { return mb.getString("info"); }
+       public String getInfo() { return mb.getString(MKEY_info); }
 
        @Override /* Overridden from ConsoleCommand */
        public String getName() { return "config"; }
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 787eaa6a8b..4d39743299 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -7337,7 +7337,7 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         * @throws RestCallException REST call failed.
         */
        public RestRequest patch(Object uri) throws RestCallException {
-               return request(op("PATCH", uri, NO_BODY));
+               return request(op(PATCH, uri, NO_BODY));
        }
 
        /**
@@ -7379,7 +7379,7 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         * @throws RestCallException If any authentication errors occurred.
         */
        public RestRequest patch(Object uri, Object body) throws 
RestCallException {
-               return request(op("PATCH", uri, body));
+               return request(op(PATCH, uri, body));
        }
 
        /**
@@ -7405,7 +7405,7 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         * @throws RestCallException If any authentication errors occurred.
         */
        public RestRequest patch(Object uri, String body, ContentType 
contentType) throws RestCallException {
-               return request(op("PATCH", uri, 
stringBody(body))).header(contentType);
+               return request(op(PATCH, uri, 
stringBody(body))).header(contentType);
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/assertion/FluentResponseBodyAssertion.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/assertion/FluentResponseBodyAssertion.java
index 1b84a4b107..2115b89e18 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/assertion/FluentResponseBodyAssertion.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/assertion/FluentResponseBodyAssertion.java
@@ -104,6 +104,9 @@ import org.apache.juneau.serializer.*;
  */
 public class FluentResponseBodyAssertion<R> extends 
FluentObjectAssertion<ResponseContent,R> {
 
+       // Error message constants
+       private static final String MSG_exceptionDuringCall = "Exception 
occurred during call.";
+
        /**
         * Chained constructor.
         *
@@ -365,7 +368,7 @@ public class FluentResponseBodyAssertion<R> extends 
FluentObjectAssertion<Respon
                try {
                        return value().cache().asBytes();
                } catch (RestCallException e) {
-                       throw error(e, "Exception occurred during call.");
+                       throw error(e, MSG_exceptionDuringCall);
                }
        }
 
@@ -373,7 +376,7 @@ public class FluentResponseBodyAssertion<R> extends 
FluentObjectAssertion<Respon
                try {
                        return value().cache().as(type, args);
                } catch (RestCallException e) {
-                       throw error(e, "Exception occurred during call.");
+                       throw error(e, MSG_exceptionDuringCall);
                }
        }
 
@@ -382,7 +385,7 @@ public class FluentResponseBodyAssertion<R> extends 
FluentObjectAssertion<Respon
                try {
                        return value().cache().asString();
                } catch (RestCallException e) {
-                       throw error(e, "Exception occurred during call.");
+                       throw error(e, MSG_exceptionDuringCall);
                }
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/assertions/FluentRequestContentAssertion.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/assertions/FluentRequestContentAssertion.java
index a6a26dd7d5..02f4f62c2f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/assertions/FluentRequestContentAssertion.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/assertions/FluentRequestContentAssertion.java
@@ -103,6 +103,9 @@ import org.apache.juneau.serializer.*;
  */
 public class FluentRequestContentAssertion<R> extends 
FluentObjectAssertion<RequestContent,R> {
 
+       // Error message constants
+       private static final String MSG_exceptionDuringCall = "Exception 
occurred during call.";
+
        /**
         * Chained constructor.
         *
@@ -313,7 +316,7 @@ public class FluentRequestContentAssertion<R> extends 
FluentObjectAssertion<Requ
                try {
                        return value().cache().asBytes();
                } catch (IOException e) {
-                       throw error(e, "Exception occurred during call.");
+                       throw error(e, MSG_exceptionDuringCall);
                }
        }
 
@@ -321,7 +324,7 @@ public class FluentRequestContentAssertion<R> extends 
FluentObjectAssertion<Requ
                try {
                        return value().cache().as(c);
                } catch (IOException e) {
-                       throw error(e, "Exception occurred during call.");
+                       throw error(e, MSG_exceptionDuringCall);
                }
        }
 
@@ -329,7 +332,7 @@ public class FluentRequestContentAssertion<R> extends 
FluentObjectAssertion<Requ
                try {
                        return value().cache().as(c, args);
                } catch (IOException e) {
-                       throw error(e, "Exception occurred during call.");
+                       throw error(e, MSG_exceptionDuringCall);
                }
        }
 
@@ -338,7 +341,7 @@ public class FluentRequestContentAssertion<R> extends 
FluentObjectAssertion<Requ
                try {
                        return value().cache().asString();
                } catch (IOException e) {
-                       throw error(e, "Exception occurred during call.");
+                       throw error(e, MSG_exceptionDuringCall);
                }
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
index 839cf0ae39..869228eb2b 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
@@ -68,6 +68,9 @@ public abstract class RestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        private static final AnnotationProvider AP = 
AnnotationProvider.INSTANCE;
 
+       // Error message constants
+       private static final String MSG_servletInitError = "Servlet init error 
on class ''{0}''";
+
        private AtomicReference<RestContext> context = new AtomicReference<>();
        private AtomicReference<Exception> initException = new 
AtomicReference<>();
 
@@ -147,14 +150,14 @@ public abstract class RestServlet extends HttpServlet {
                        context.get().postInitChildFirst();
                } catch (ServletException e) {
                        initException.set(e);
-                       log(SEVERE, e, "Servlet init error on class ''{0}''", 
cn(this));
+                       log(SEVERE, e, MSG_servletInitError, cn(this));
                        throw e;
                } catch (BasicHttpException e) {
                        initException.set(e);
-                       log(SEVERE, e, "Servlet init error on class ''{0}''", 
cn(this));
+                       log(SEVERE, e, MSG_servletInitError, cn(this));
                } catch (Exception e) {
                        initException.set(new InternalServerError(e));
-                       log(SEVERE, e, "Servlet init error on class ''{0}''", 
cn(this));
+                       log(SEVERE, e, MSG_servletInitError, cn(this));
                }
        }
 
diff --git a/scripts/release.py b/scripts/release.py
index aeb86964b0..70a8fdd7b4 100755
--- a/scripts/release.py
+++ b/scripts/release.py
@@ -49,6 +49,12 @@ import urllib.request
 import xml.etree.ElementTree as ET
 from datetime import datetime, timedelta
 from pathlib import Path
+
+# Constants for duplicated string literals
+POM_XML = 'pom.xml'
+STAGING_DIR = '~/tmp/dist-release-juneau'
+SVN_DIST_URL = 'https://dist.apache.org/repos/dist/dev/juneau'
+RC_PATTERN = r'RC(\d+)'
 from typing import Dict, Optional, List
 
 # Minimum required versions
@@ -216,7 +222,7 @@ class ReleaseScript:
         # Get the Juneau root directory
         script_dir = Path(__file__).parent
         juneau_root = script_dir.parent
-        pom_path = juneau_root / 'pom.xml'
+        pom_path = juneau_root / POM_XML
         
         if not pom_path.exists():
             self.fail(f"pom.xml not found at {pom_path}")
@@ -248,7 +254,7 @@ class ReleaseScript:
             # Try to get default from history
             default_rc = None
             if history.get('X_RELEASE_CANDIDATE'):
-                rc_match = re.search(r'RC(\d+)', 
history.get('X_RELEASE_CANDIDATE', ''))
+                rc_match = re.search(RC_PATTERN, 
history.get('X_RELEASE_CANDIDATE', ''))
                 if rc_match:
                     default_rc = rc_match.group(1)
             
@@ -275,7 +281,7 @@ class ReleaseScript:
         
         staging = self._prompt_with_default(
             "Staging directory",
-            history.get('X_STAGING', '~/tmp/dist-release-juneau'),
+            history.get('X_STAGING', STAGING_DIR),
             required=True
         )
         
@@ -598,7 +604,7 @@ class ReleaseScript:
         self.message("Making git folder")
         self.start_timer()
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         
         # Clean up entire staging directory to start fresh (avoids issues from 
previous runs)
         if staging.exists():
@@ -618,7 +624,7 @@ class ReleaseScript:
         self.message("Cloning juneau.git")
         self.start_timer()
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         git_dir = staging / 'git'
         
         juneau_dir = git_dir / 'juneau'
@@ -635,7 +641,7 @@ class ReleaseScript:
         """Configure git user name and email."""
         self.message("Configuring git")
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         
         username = os.environ.get('X_USERNAME')
@@ -653,7 +659,7 @@ class ReleaseScript:
         self.message("Running clean verify")
         self.start_timer()
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         
         self.run_command(['mvn', 'clean', 'verify'], cwd=juneau_dir)
@@ -665,7 +671,7 @@ class ReleaseScript:
         """Create test workspace."""
         self.message("Creating test workspace")
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         workspace = juneau_dir / 'target' / 'workspace'
         
@@ -711,7 +717,7 @@ class ReleaseScript:
         self.message("Running deploy")
         self.start_timer()
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         
         self.run_command(['mvn', 'deploy', 
'-Daether.checksums.algorithms=MD5,SHA-1,SHA-512'], cwd=juneau_dir)
@@ -723,7 +729,7 @@ class ReleaseScript:
         """Run Maven release:prepare."""
         self.message("Running release:prepare")
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         
         version = os.environ.get('X_VERSION')
@@ -731,7 +737,7 @@ class ReleaseScript:
         next_version = os.environ.get('X_NEXT_VERSION')
         
         # Check that the current POM version is a SNAPSHOT (required by 
release:prepare)
-        pom_path = juneau_dir / 'pom.xml'
+        pom_path = juneau_dir / POM_XML
         if pom_path.exists():
             # Read version directly from POM (don't use current-release.py as 
it strips SNAPSHOT)
             try:
@@ -778,7 +784,7 @@ class ReleaseScript:
         """Run git diff."""
         self.message("Running git diff")
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         release = os.environ.get('X_RELEASE')
         
@@ -791,7 +797,7 @@ class ReleaseScript:
         self.message("Running release:perform")
         self.start_timer()
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         
         self.run_command(['mvn', 'release:perform', 
'-Daether.checksums.algorithms=MD5,SHA-1,SHA-512'], cwd=juneau_dir)
@@ -824,7 +830,7 @@ class ReleaseScript:
         self.message("Creating binary artifacts")
         self.start_timer()
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         version = os.environ.get('X_VERSION')
         release = os.environ.get('X_RELEASE')
         repo = self.state.get('X_REPO') or os.environ.get('X_REPO')
@@ -837,7 +843,7 @@ class ReleaseScript:
         if dist_dir.exists():
             shutil.rmtree(dist_dir)
         
-        self.run_command(['svn', 'checkout', 
'https://dist.apache.org/repos/dist/dev/juneau', 'dist'], cwd=staging)
+        self.run_command(['svn', 'checkout', SVN_DIST_URL, 'dist'], 
cwd=staging)
         
         # Remove old files
         source_dir = dist_dir / 'source'
@@ -926,7 +932,7 @@ class ReleaseScript:
         """Verify distribution files are available."""
         self.message("Verifying distribution")
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         version = os.environ.get('X_VERSION')
         release = os.environ.get('X_RELEASE')
         
@@ -937,7 +943,7 @@ class ReleaseScript:
             self.run_command(['svn', 'update'], cwd=dist_dir, check=False)
         else:
             # Fresh checkout
-            self.run_command(['svn', 'checkout', 
'https://dist.apache.org/repos/dist/dev/juneau', 'dist'], cwd=staging)
+            self.run_command(['svn', 'checkout', SVN_DIST_URL, 'dist'], 
cwd=staging)
         
         # Expected files
         source_dir = dist_dir / 'source' / release
@@ -978,7 +984,7 @@ class ReleaseScript:
             print(f"  āœ“ {file_path.relative_to(dist_dir)} ({size_mb:.2f} MB)")
         
         # Open browser for manual inspection
-        subprocess.Popen(['open', 
'https://dist.apache.org/repos/dist/dev/juneau'])
+        subprocess.Popen(['open', SVN_DIST_URL])
         
         print("\nāœ… Distribution verification successful. Voting can be 
started.")
         
@@ -1023,7 +1029,7 @@ class ReleaseScript:
     
     def _get_git_commit_hash(self, release_tag: str) -> Optional[str]:
         """Get git commit hash for a release tag."""
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         juneau_dir = staging / 'git' / 'juneau'
         
         try:
@@ -1058,7 +1064,7 @@ class ReleaseScript:
         vote_end_date = self._calculate_vote_end_date()
         
         # Extract RC number from release (e.g., "juneau-9.2.0-RC1" -> "RC1")
-        rc_match = re.search(r'RC(\d+)', release)
+            rc_match = re.search(RC_PATTERN, release)
         rc_number = rc_match.group(1) if rc_match else "x"
         
         # Generate email body
@@ -1144,7 +1150,7 @@ Anyone can participate in testing and voting, not just 
committers, please feel f
             print("Revert cancelled.")
             return
         
-        staging = Path(os.environ.get('X_STAGING', 
'~/tmp/dist-release-juneau')).expanduser()
+        staging = Path(os.environ.get('X_STAGING', STAGING_DIR)).expanduser()
         git_dir = staging / 'git' / 'juneau'
         
         # Pull latest changes from git
@@ -1187,7 +1193,7 @@ Anyone can participate in testing and voting, not just 
committers, please feel f
         # Step 2: Revert Maven versions
         print("\nStep 2: Reverting Maven versions...")
         development_version = f"{version}-SNAPSHOT"
-        if git_dir.exists() and (git_dir / 'pom.xml').exists():
+        if git_dir.exists() and (git_dir / POM_XML).exists():
             try:
                 print(f"  Reverting to development version: 
{development_version}")
                 self.run_command([
@@ -1366,7 +1372,7 @@ def main():
         # Try to extract from X_RELEASE environment variable
         x_release = os.environ.get('X_RELEASE')
         if x_release:
-            rc_match = re.search(r'RC(\d+)', x_release)
+            rc_match = re.search(RC_PATTERN, x_release)
             if rc_match:
                 rc = int(rc_match.group(1))
                 print(f"šŸ“Œ Detected RC number from X_RELEASE: {rc}")
@@ -1379,7 +1385,7 @@ def main():
                     state_data = json.load(f)
                 x_release = state_data.get('X_RELEASE')
                 if x_release and rc is None:
-                    rc_match = re.search(r'RC(\d+)', x_release)
+                    rc_match = re.search(RC_PATTERN, x_release)
                     if rc_match:
                         rc = int(rc_match.group(1))
                         print(f"šŸ“Œ Detected RC number from state file: {rc}")
@@ -1402,7 +1408,7 @@ def main():
             # Try to get version from pom.xml
             script_dir = Path(__file__).parent
             juneau_root = script_dir.parent
-            pom_path = juneau_root / 'pom.xml'
+            pom_path = juneau_root / POM_XML
             if pom_path.exists():
                 try:
                     result = subprocess.run(
@@ -1429,7 +1435,7 @@ def main():
                         history = json.load(f)
                     release_candidate = history.get('X_RELEASE_CANDIDATE', '')
                     if release_candidate:
-                        rc_match = re.search(r'RC(\d+)', release_candidate)
+                        rc_match = re.search(RC_PATTERN, release_candidate)
                         if rc_match:
                             rc = int(rc_match.group(1))
                             print(f"šŸ“Œ Detected RC number from history file: 
{rc}")
@@ -1479,7 +1485,7 @@ def main():
             os.environ['X_STAGING'] = state_data['X_STAGING']
         elif not os.environ.get('X_STAGING'):
             # Set default staging if not set
-            os.environ['X_STAGING'] = '~/tmp/dist-release-juneau'
+            os.environ['X_STAGING'] = STAGING_DIR
         
         script.revert_release()
         return
@@ -1490,7 +1496,7 @@ def main():
         # Try to extract from X_RELEASE environment variable
         x_release = os.environ.get('X_RELEASE')
         if x_release:
-            rc_match = re.search(r'RC(\d+)', x_release)
+            rc_match = re.search(RC_PATTERN, x_release)
             if rc_match:
                 rc = int(rc_match.group(1))
                 print(f"šŸ“Œ Detected RC number from X_RELEASE: {rc}")
@@ -1504,7 +1510,7 @@ def main():
                         state = json.load(f)
                     x_release = state.get('X_RELEASE')
                     if x_release:
-                        rc_match = re.search(r'RC(\d+)', x_release)
+                        rc_match = re.search(RC_PATTERN, x_release)
                         if rc_match:
                             rc = int(rc_match.group(1))
                             print(f"šŸ“Œ Detected RC number from state file: 
{rc}")
@@ -1515,7 +1521,7 @@ def main():
         if rc is None:
             script_dir = Path(__file__).parent
             juneau_root = script_dir.parent
-            pom_path = juneau_root / 'pom.xml'
+            pom_path = juneau_root / POM_XML
             if pom_path.exists():
                 try:
                     # Get version from pom
@@ -1536,7 +1542,7 @@ def main():
                         with open(history_file, 'r') as f:
                             history = json.load(f)
                         release_candidate = history.get('X_RELEASE_CANDIDATE', 
'')
-                        rc_match = re.search(r'RC(\d+)', release_candidate)
+                        rc_match = re.search(RC_PATTERN, release_candidate)
                         if rc_match:
                             rc = int(rc_match.group(1))
                             print(f"šŸ“Œ Detected RC number from history file: 
{rc}")


Reply via email to