Consistent use of StringUtils.hasLength(String) vs isEmpty(Object)

This commit is contained in:
Juergen Hoeller 2019-05-03 17:29:14 +02:00
parent 84266d71e9
commit a7949ac84a
18 changed files with 49 additions and 42 deletions

View File

@ -75,15 +75,20 @@ public abstract class StringUtils {
//--------------------------------------------------------------------- //---------------------------------------------------------------------
/** /**
* Check whether the given {@code String} is empty. * Check whether the given object (possibly a {@code String}) is empty.
* This is effectly a shortcut for {@code !hasLength(String)}.
* <p>This method accepts any Object as an argument, comparing it to * <p>This method accepts any Object as an argument, comparing it to
* {@code null} and the empty String. As a consequence, this method * {@code null} and the empty String. As a consequence, this method
* will never return {@code true} for a non-null non-String object. * will never return {@code true} for a non-null non-String object.
* <p>The Object signature is useful for general attribute handling code * <p>The Object signature is useful for general attribute handling code
* that commonly deals with Strings but generally has to iterate over * that commonly deals with Strings but generally has to iterate over
* Objects since attributes may e.g. be primitive value objects as well. * Objects since attributes may e.g. be primitive value objects as well.
* @param str the candidate String * <p><b>Note: If the object is typed to {@code String} upfront, prefer
* {@link #hasLength(String)} or {@link #hasText(String)} instead.</b>
* @param str the candidate object (possibly a {@code String})
* @since 3.2.1 * @since 3.2.1
* @see #hasLength(String)
* @see #hasText(String)
*/ */
public static boolean isEmpty(@Nullable Object str) { public static boolean isEmpty(@Nullable Object str) {
return (str == null || "".equals(str)); return (str == null || "".equals(str));
@ -102,7 +107,8 @@ public abstract class StringUtils {
* </pre> * </pre>
* @param str the {@code CharSequence} to check (may be {@code null}) * @param str the {@code CharSequence} to check (may be {@code null})
* @return {@code true} if the {@code CharSequence} is not {@code null} and has length * @return {@code true} if the {@code CharSequence} is not {@code null} and has length
* @see #hasText(String) * @see #hasLength(String)
* @see #hasText(CharSequence)
*/ */
public static boolean hasLength(@Nullable CharSequence str) { public static boolean hasLength(@Nullable CharSequence str) {
return (str != null && str.length() > 0); return (str != null && str.length() > 0);
@ -136,6 +142,8 @@ public abstract class StringUtils {
* @param str the {@code CharSequence} to check (may be {@code null}) * @param str the {@code CharSequence} to check (may be {@code null})
* @return {@code true} if the {@code CharSequence} is not {@code null}, * @return {@code true} if the {@code CharSequence} is not {@code null},
* its length is greater than 0, and it does not contain whitespace only * its length is greater than 0, and it does not contain whitespace only
* @see #hasText(String)
* @see #hasLength(CharSequence)
* @see Character#isWhitespace * @see Character#isWhitespace
*/ */
public static boolean hasText(@Nullable CharSequence str) { public static boolean hasText(@Nullable CharSequence str) {
@ -151,6 +159,8 @@ public abstract class StringUtils {
* @return {@code true} if the {@code String} is not {@code null}, its * @return {@code true} if the {@code String} is not {@code null}, its
* length is greater than 0, and it does not contain whitespace only * length is greater than 0, and it does not contain whitespace only
* @see #hasText(CharSequence) * @see #hasText(CharSequence)
* @see #hasLength(String)
* @see Character#isWhitespace
*/ */
public static boolean hasText(@Nullable String str) { public static boolean hasText(@Nullable String str) {
return (str != null && !str.isEmpty() && containsText(str)); return (str != null && !str.isEmpty() && containsText(str));

View File

@ -576,7 +576,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
} }
private String appendSql(@Nullable String sql, String statement) { private String appendSql(@Nullable String sql, String statement) {
return (StringUtils.isEmpty(sql) ? statement : sql + "; " + statement); return (StringUtils.hasLength(sql) ? sql + "; " + statement : statement);
} }
@Override @Override

View File

@ -699,7 +699,7 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable
*/ */
public Set<HttpMethod> getAllow() { public Set<HttpMethod> getAllow() {
String value = getFirst(ALLOW); String value = getFirst(ALLOW);
if (!StringUtils.isEmpty(value)) { if (StringUtils.hasLength(value)) {
String[] tokens = StringUtils.tokenizeToStringArray(value, ","); String[] tokens = StringUtils.tokenizeToStringArray(value, ",");
List<HttpMethod> result = new ArrayList<>(tokens.length); List<HttpMethod> result = new ArrayList<>(tokens.length);
for (String token : tokens) { for (String token : tokens) {

View File

@ -74,7 +74,7 @@ class UndertowServerHttpRequest extends AbstractServerHttpRequest {
Assert.notNull(exchange, "HttpServerExchange is required."); Assert.notNull(exchange, "HttpServerExchange is required.");
String requestURL = exchange.getRequestURL(); String requestURL = exchange.getRequestURL();
String query = exchange.getQueryString(); String query = exchange.getQueryString();
String requestUriAndQuery = StringUtils.isEmpty(query) ? requestURL : requestURL + "?" + query; String requestUriAndQuery = (StringUtils.hasLength(query) ? requestURL + "?" + query : requestURL);
return new URI(requestUriAndQuery); return new URI(requestUriAndQuery);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -213,8 +213,8 @@ public class RequestParamMethodArgumentResolver extends AbstractNamedValueMethod
} }
RequestParam requestParam = parameter.getParameterAnnotation(RequestParam.class); RequestParam requestParam = parameter.getParameterAnnotation(RequestParam.class);
String name = (requestParam == null || StringUtils.isEmpty(requestParam.name()) ? String name = (requestParam != null && StringUtils.hasLength(requestParam.name()) ?
parameter.getParameterName() : requestParam.name()); requestParam.name() : parameter.getParameterName());
Assert.state(name != null, "Unresolvable parameter name"); Assert.state(name != null, "Unresolvable parameter name");
if (value == null) { if (value == null) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -33,7 +33,6 @@ import org.springframework.util.StringUtils;
* <p>Provides options to create {@link UriBuilder} instances with a common * <p>Provides options to create {@link UriBuilder} instances with a common
* base URI, alternative encoding mode strategies, among others. * base URI, alternative encoding mode strategies, among others.
* *
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @since 5.0 * @since 5.0
* @see UriComponentsBuilder * @see UriComponentsBuilder
@ -222,31 +221,27 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory {
private final UriComponentsBuilder uriComponentsBuilder; private final UriComponentsBuilder uriComponentsBuilder;
public DefaultUriBuilder(String uriTemplate) { public DefaultUriBuilder(String uriTemplate) {
this.uriComponentsBuilder = initUriComponentsBuilder(uriTemplate); this.uriComponentsBuilder = initUriComponentsBuilder(uriTemplate);
} }
private UriComponentsBuilder initUriComponentsBuilder(String uriTemplate) { private UriComponentsBuilder initUriComponentsBuilder(String uriTemplate) {
UriComponentsBuilder result; UriComponentsBuilder result;
if (StringUtils.isEmpty(uriTemplate)) { if (!StringUtils.hasLength(uriTemplate)) {
result = baseUri != null ? baseUri.cloneBuilder() : UriComponentsBuilder.newInstance(); result = (baseUri != null ? baseUri.cloneBuilder() : UriComponentsBuilder.newInstance());
} }
else if (baseUri != null) { else if (baseUri != null) {
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uriTemplate); UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uriTemplate);
UriComponents uri = builder.build(); UriComponents uri = builder.build();
result = uri.getHost() == null ? baseUri.cloneBuilder().uriComponents(uri) : builder; result = (uri.getHost() == null ? baseUri.cloneBuilder().uriComponents(uri) : builder);
} }
else { else {
result = UriComponentsBuilder.fromUriString(uriTemplate); result = UriComponentsBuilder.fromUriString(uriTemplate);
} }
if (encodingMode.equals(EncodingMode.TEMPLATE_AND_VALUES)) { if (encodingMode.equals(EncodingMode.TEMPLATE_AND_VALUES)) {
result.encode(); result.encode();
} }
parsePathIfNecessary(result); parsePathIfNecessary(result);
return result; return result;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -172,7 +172,7 @@ public class VersionResourceResolver extends AbstractResourceResolver {
} }
String candidate = versionStrategy.extractVersion(requestPath); String candidate = versionStrategy.extractVersion(requestPath);
if (StringUtils.isEmpty(candidate)) { if (!StringUtils.hasLength(candidate)) {
return Mono.empty(); return Mono.empty();
} }

View File

@ -309,7 +309,7 @@ public class RedirectView extends AbstractUrlBasedView {
return false; return false;
} }
String targetHost = UriComponentsBuilder.fromUriString(targetUrl).build().getHost(); String targetHost = UriComponentsBuilder.fromUriString(targetUrl).build().getHost();
if (StringUtils.isEmpty(targetHost)) { if (!StringUtils.hasLength(targetHost)) {
return false; return false;
} }
for (String host : this.hosts) { for (String host : this.hosts) {

View File

@ -963,11 +963,12 @@ public class DispatcherServlet extends FrameworkServlet {
params = (request.getParameterMap().isEmpty() ? "" : "masked"); params = (request.getParameterMap().isEmpty() ? "" : "masked");
} }
String query = StringUtils.isEmpty(request.getQueryString()) ? "" : "?" + request.getQueryString(); String queryString = request.getQueryString();
String queryClause = (StringUtils.hasLength(queryString) ? "?" + queryString : "");
String dispatchType = (!request.getDispatcherType().equals(DispatcherType.REQUEST) ? String dispatchType = (!request.getDispatcherType().equals(DispatcherType.REQUEST) ?
"\"" + request.getDispatcherType().name() + "\" dispatch for " : ""); "\"" + request.getDispatcherType().name() + "\" dispatch for " : "");
String message = (dispatchType + request.getMethod() + " \"" + getRequestUri(request) + String message = (dispatchType + request.getMethod() + " \"" + getRequestUri(request) +
query + "\", parameters={" + params + "}"); queryClause + "\", parameters={" + params + "}");
if (traceOn) { if (traceOn) {
List<String> values = Collections.list(request.getHeaderNames()); List<String> values = Collections.list(request.getHeaderNames());

View File

@ -100,8 +100,9 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti
/** /**
* Set the log category for warn logging. The name will be passed to the underlying logger * Set the log category for warn logging. The name will be passed to the underlying logger
* implementation through Commons Logging, getting interpreted as a log category according * implementation through Commons Logging, getting interpreted as a log category according
* to the logger's configuration. If {@code null} is passed, warn logging is turned off. * to the logger's configuration. If {@code null} or empty String is passed, warn logging
* <p>By default there is no warn logging although sub-classes like * is turned off.
* <p>By default there is no warn logging although subclasses like
* {@link org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver} * {@link org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver}
* can change that default. Specify this setting to activate warn logging into a specific * can change that default. Specify this setting to activate warn logging into a specific
* category. Alternatively, override the {@link #logException} method for custom logging. * category. Alternatively, override the {@link #logException} method for custom logging.
@ -109,7 +110,7 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti
* @see java.util.logging.Logger#getLogger(String) * @see java.util.logging.Logger#getLogger(String)
*/ */
public void setWarnLogCategory(String loggerName) { public void setWarnLogCategory(String loggerName) {
this.warnLogger = (!StringUtils.isEmpty(loggerName) ? LogFactory.getLog(loggerName) : null); this.warnLogger = (StringUtils.hasLength(loggerName) ? LogFactory.getLog(loggerName) : null);
} }
/** /**

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -578,7 +578,7 @@ public class MvcUriComponentsBuilder {
return "/"; return "/";
} }
String[] paths = mapping.path(); String[] paths = mapping.path();
if (ObjectUtils.isEmpty(paths) || StringUtils.isEmpty(paths[0])) { if (ObjectUtils.isEmpty(paths) || !StringUtils.hasLength(paths[0])) {
return "/"; return "/";
} }
if (paths.length > 1 && logger.isTraceEnabled()) { if (paths.length > 1 && logger.isTraceEnabled()) {
@ -594,7 +594,7 @@ public class MvcUriComponentsBuilder {
throw new IllegalArgumentException("No @RequestMapping on: " + method.toGenericString()); throw new IllegalArgumentException("No @RequestMapping on: " + method.toGenericString());
} }
String[] paths = requestMapping.path(); String[] paths = requestMapping.path();
if (ObjectUtils.isEmpty(paths) || StringUtils.isEmpty(paths[0])) { if (ObjectUtils.isEmpty(paths) || !StringUtils.hasLength(paths[0])) {
return "/"; return "/";
} }
if (paths.length > 1 && logger.isTraceEnabled()) { if (paths.length > 1 && logger.isTraceEnabled()) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -125,7 +125,7 @@ public class PathVariableMethodArgumentResolver extends AbstractNamedValueMethod
} }
PathVariable ann = parameter.getParameterAnnotation(PathVariable.class); PathVariable ann = parameter.getParameterAnnotation(PathVariable.class);
String name = (ann != null && !StringUtils.isEmpty(ann.value()) ? ann.value() : parameter.getParameterName()); String name = (ann != null && StringUtils.hasLength(ann.value()) ? ann.value() : parameter.getParameterName());
String formatted = formatUriValue(conversionService, new TypeDescriptor(parameter.nestedIfOptional()), value); String formatted = formatUriValue(conversionService, new TypeDescriptor(parameter.nestedIfOptional()), value);
uriVariables.put(name, formatted); uriVariables.put(name, formatted);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -168,7 +168,7 @@ public class VersionResourceResolver extends AbstractResourceResolver {
} }
String candidateVersion = versionStrategy.extractVersion(requestPath); String candidateVersion = versionStrategy.extractVersion(requestPath);
if (StringUtils.isEmpty(candidateVersion)) { if (!StringUtils.hasLength(candidateVersion)) {
return null; return null;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -206,7 +206,7 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
String extension = null; String extension = null;
if (this.originalPath != null) { if (this.originalPath != null) {
extension = UriUtils.extractFileExtension(this.originalPath); extension = UriUtils.extractFileExtension(this.originalPath);
if (!StringUtils.isEmpty(extension)) { if (StringUtils.hasLength(extension)) {
int end = this.originalPath.length() - (extension.length() + 1); int end = this.originalPath.length() - (extension.length() + 1);
replacePath(this.originalPath.substring(0, end)); replacePath(this.originalPath.substring(0, end));
} }

View File

@ -650,7 +650,7 @@ public class RedirectView extends AbstractUrlBasedView implements SmartView {
return false; return false;
} }
String targetHost = UriComponentsBuilder.fromUriString(targetUrl).build().getHost(); String targetHost = UriComponentsBuilder.fromUriString(targetUrl).build().getHost();
if (StringUtils.isEmpty(targetHost)) { if (!StringUtils.hasLength(targetHost)) {
return false; return false;
} }
for (String host : getHosts()) { for (String host : getHosts()) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -420,7 +420,7 @@ public class SubProtocolWebSocketHandler
} }
SubProtocolHandler handler; SubProtocolHandler handler;
if (!StringUtils.isEmpty(protocol)) { if (StringUtils.hasLength(protocol)) {
handler = this.protocolHandlerLookup.get(protocol); handler = this.protocolHandlerLookup.get(protocol);
if (handler == null) { if (handler == null) {
throw new IllegalStateException( throw new IllegalStateException(

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -118,7 +118,7 @@ public abstract class AbstractHttpSendingTransportHandler extends AbstractTransp
String query = request.getURI().getQuery(); String query = request.getURI().getQuery();
MultiValueMap<String, String> params = UriComponentsBuilder.newInstance().query(query).build().getQueryParams(); MultiValueMap<String, String> params = UriComponentsBuilder.newInstance().query(query).build().getQueryParams();
String value = params.getFirst("c"); String value = params.getFirst("c");
if (StringUtils.isEmpty(value)) { if (!StringUtils.hasLength(value)) {
return null; return null;
} }
String result = UriUtils.decode(value, StandardCharsets.UTF_8); String result = UriUtils.decode(value, StandardCharsets.UTF_8);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -179,7 +179,7 @@ public class WebSocketServerSockJsSession extends AbstractSockJsSession implemen
public void handleMessage(TextMessage message, WebSocketSession wsSession) throws Exception { public void handleMessage(TextMessage message, WebSocketSession wsSession) throws Exception {
String payload = message.getPayload(); String payload = message.getPayload();
if (StringUtils.isEmpty(payload)) { if (!StringUtils.hasLength(payload)) {
return; return;
} }
String[] messages; String[] messages;