diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java index e92baa4df40c..714eb6344254 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java @@ -656,7 +656,7 @@ private PointcutBody getPointcutBody(String[] tokens, int startIndex) { } if (tokens[currentIndex].endsWith(")")) { - sb.append(tokens[currentIndex].substring(0, tokens[currentIndex].length() - 1)); + sb.append(tokens[currentIndex], 0, tokens[currentIndex].length() - 1); return new PointcutBody(numTokensConsumed, sb.toString().trim()); } diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java b/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java index e73a34fb7fbe..dfd2e117d8ab 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java @@ -501,7 +501,7 @@ private void addStrippedPropertyPaths(List strippedPaths, String nestedP if (endIndex != -1) { String prefix = propertyPath.substring(0, startIndex); String key = propertyPath.substring(startIndex, endIndex + 1); - String suffix = propertyPath.substring(endIndex + 1, propertyPath.length()); + String suffix = propertyPath.substring(endIndex + 1); // Strip the first key. strippedPaths.add(nestedPath + prefix + suffix); // Search for further keys to strip, with the first key stripped. diff --git a/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java b/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java index ae951395220f..3c944ccd861c 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java @@ -106,8 +106,8 @@ private void determinePoolSizeRange(ThreadPoolTaskExecutor executor) { int maxPoolSize; int separatorIndex = this.poolSize.indexOf('-'); if (separatorIndex != -1) { - corePoolSize = Integer.valueOf(this.poolSize.substring(0, separatorIndex)); - maxPoolSize = Integer.valueOf(this.poolSize.substring(separatorIndex + 1, this.poolSize.length())); + corePoolSize = Integer.parseInt(this.poolSize.substring(0, separatorIndex)); + maxPoolSize = Integer.parseInt(this.poolSize.substring(separatorIndex + 1)); if (corePoolSize > maxPoolSize) { throw new IllegalArgumentException( "Lower bound of pool-size range must not exceed the upper bound"); diff --git a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java index 25ff4717c1c4..0438c817e086 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java +++ b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -199,7 +199,7 @@ public static MimeType parseMimeType(String mimeType) { throw new InvalidMimeTypeException(mimeType, "does not contain subtype after '/'"); } String type = fullType.substring(0, subIndex); - String subtype = fullType.substring(subIndex + 1, fullType.length()); + String subtype = fullType.substring(subIndex + 1); if (MimeType.WILDCARD_TYPE.equals(type) && !MimeType.WILDCARD_TYPE.equals(subtype)) { throw new InvalidMimeTypeException(mimeType, "wildcard type is legal only in '*/*' (all mime types)"); } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java index b81447ba573d..135914a3a3b2 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java @@ -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"); * you may not use this file except in compliance with the License. @@ -309,7 +309,7 @@ public void setConcurrency(String concurrency) { int separatorIndex = concurrency.indexOf('-'); if (separatorIndex != -1) { setConcurrentConsumers(Integer.parseInt(concurrency.substring(0, separatorIndex))); - setMaxConcurrentConsumers(Integer.parseInt(concurrency.substring(separatorIndex + 1, concurrency.length()))); + setMaxConcurrentConsumers(Integer.parseInt(concurrency.substring(separatorIndex + 1))); } else { setConcurrentConsumers(1); @@ -383,8 +383,7 @@ public final int getConcurrentConsumers() { public void setMaxConcurrentConsumers(int maxConcurrentConsumers) { Assert.isTrue(maxConcurrentConsumers > 0, "'maxConcurrentConsumers' value must be at least 1 (one)"); synchronized (this.lifecycleMonitor) { - this.maxConcurrentConsumers = - (maxConcurrentConsumers > this.concurrentConsumers ? maxConcurrentConsumers : this.concurrentConsumers); + this.maxConcurrentConsumers = Math.max(maxConcurrentConsumers, this.concurrentConsumers); } } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer.java index c3c09b7696f1..18d2003d9dd2 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/SimpleMessageListenerContainer.java @@ -108,7 +108,7 @@ public void setConcurrency(String concurrency) { try { int separatorIndex = concurrency.indexOf('-'); if (separatorIndex != -1) { - setConcurrentConsumers(Integer.parseInt(concurrency.substring(separatorIndex + 1, concurrency.length()))); + setConcurrentConsumers(Integer.parseInt(concurrency.substring(separatorIndex + 1))); } else { setConcurrentConsumers(Integer.parseInt(concurrency)); diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java index 1027d1f8bb6d..52cb8fc50dad 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java @@ -226,7 +226,7 @@ public void setConcurrency(String concurrency) { try { int separatorIndex = concurrency.indexOf('-'); if (separatorIndex != -1) { - setMaxConcurrency(Integer.parseInt(concurrency.substring(separatorIndex + 1, concurrency.length()))); + setMaxConcurrency(Integer.parseInt(concurrency.substring(separatorIndex + 1))); } else { setMaxConcurrency(Integer.parseInt(concurrency)); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java index ffc698432dc9..95b01a107140 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -263,7 +263,7 @@ private String unescape(String inString) { int index = inString.indexOf('\\'); while (index >= 0) { - sb.append(inString.substring(pos, index)); + sb.append(inString, pos, index); if (index + 1 >= inString.length()) { throw new StompConversionException("Illegal escape sequence at index " + index + ": " + inString); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java index a6dca75db660..335f72bdec64 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -223,7 +223,7 @@ else if (sb != null){ private StringBuilder getStringBuilder(@Nullable StringBuilder sb, String inString, int i) { if (sb == null) { sb = new StringBuilder(inString.length()); - sb.append(inString.substring(0, i)); + sb.append(inString, 0, i); } return sb; } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/setup/PatternMappingFilterProxy.java b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/PatternMappingFilterProxy.java index 0186bc553f7c..9d6b4aa0449c 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/setup/PatternMappingFilterProxy.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/PatternMappingFilterProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,7 +72,7 @@ public PatternMappingFilterProxy(Filter delegate, String... urlPatterns) { private void addUrlPattern(String urlPattern) { Assert.notNull(urlPattern, "Found null URL Pattern"); if (urlPattern.startsWith(EXTENSION_MAPPING_PATTERN)) { - this.endsWithMatches.add(urlPattern.substring(1, urlPattern.length())); + this.endsWithMatches.add(urlPattern.substring(1)); } else if (urlPattern.equals(PATH_MAPPING_PATTERN)) { this.startsWithMatches.add(""); @@ -82,7 +82,7 @@ else if (urlPattern.endsWith(PATH_MAPPING_PATTERN)) { this.exactMatches.add(urlPattern.substring(0, urlPattern.length() - 2)); } else { - if ("".equals(urlPattern)) { + if (urlPattern.isEmpty()) { urlPattern = "/"; } this.exactMatches.add(urlPattern); diff --git a/spring-web/src/main/java/org/springframework/web/util/UriTemplate.java b/spring-web/src/main/java/org/springframework/web/util/UriTemplate.java index 2b408ebc7073..22a6eebff480 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriTemplate.java @@ -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"); * you may not use this file except in compliance with the License. @@ -30,14 +30,19 @@ import org.springframework.util.Assert; /** - * Represents a URI template. A URI template is a URI-like String that contains variables - * enclosed by braces ({@code {}}) which can be expanded to produce an actual URI. + * Representation of a URI template that can be expanded with URI variables via + * {@link #expand(Map)}, {@link #expand(Object[])}, or matched to a URL via + * {@link #match(String)}. This class is designed to be thread-safe and + * reusable, and allows any number of expand or match calls. * - *

See {@link #expand(Map)}, {@link #expand(Object[])}, and {@link #match(String)} - * for example usages. - * - *

This class is designed to be thread-safe and reusable, allowing for any number - * of expand or match calls. + *

Note: this class uses {@link UriComponentsBuilder} + * internally to expand URI templates, and is merely a shortcut for already + * prepared URI templates. For more dynamic preparation and extra flexibility, + * e.g. around URI encoding, consider using {@code UriComponentsBuilder} or the + * higher level {@link DefaultUriBuilderFactory} which adds several encoding + * modes on top of {@code UriComponentsBuilder}. See the + * reference docs + * for further details. * * @author Arjen Poutsma * @author Juergen Hoeller @@ -220,7 +225,7 @@ else if (c == '}') { throw new IllegalArgumentException( "No custom regular expression specified after ':' in \"" + variable + "\""); } - String regex = variable.substring(idx + 1, variable.length()); + String regex = variable.substring(idx + 1); pattern.append('('); pattern.append(regex); pattern.append(')'); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RedirectView.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RedirectView.java index 4b3ae4f0b5dc..846a17495241 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RedirectView.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RedirectView.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -245,12 +245,12 @@ protected StringBuilder expandTargetUrlTemplate(String targetUrl, String name = matcher.group(1); Object value = (model.containsKey(name) ? model.get(name) : uriVariables.get(name)); Assert.notNull(value, () -> "No value for URI variable '" + name + "'"); - result.append(targetUrl.substring(endLastMatch, matcher.start())); + result.append(targetUrl, endLastMatch, matcher.start()); result.append(encodeUriVariable(value.toString())); endLastMatch = matcher.end(); found = matcher.find(); } - result.append(targetUrl.substring(endLastMatch, targetUrl.length())); + result.append(targetUrl.substring(endLastMatch)); return result; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java index cd238df21280..99482f2a9701 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java @@ -277,7 +277,7 @@ String createUrl() throws JspException { } else { if (this.context.endsWith("/")) { - url.append(this.context.substring(0, this.context.length() - 1)); + url.append(this.context, 0, this.context.length() - 1); } else { url.append(this.context); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java index 15dbca40efed..450de011df07 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java @@ -56,7 +56,7 @@ * but this behavior can be changed by overriding the * {@link #isEligibleProperty(String, Object)} method. * - *

A URL for this view is supposed to be a HTTP redirect URL, i.e. + *

A URL for this view is supposed to be an HTTP redirect URL, i.e. * suitable for HttpServletResponse's {@code sendRedirect} method, which * is what actually does the redirect if the HTTP 1.0 flag is on, or via sending * back an HTTP 303 code - if the HTTP 1.0 compatibility flag is off. @@ -386,7 +386,7 @@ protected StringBuilder replaceUriTemplateVariables( if (value == null) { throw new IllegalArgumentException("Model has no value for key '" + name + "'"); } - result.append(targetUrl.substring(endLastMatch, matcher.start())); + result.append(targetUrl, endLastMatch, matcher.start()); result.append(UriUtils.encodePathSegment(value.toString(), encodingScheme)); endLastMatch = matcher.end(); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketExtension.java b/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketExtension.java index 0a719fedef6d..1483bf7e7d2d 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketExtension.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketExtension.java @@ -160,7 +160,7 @@ private static WebSocketExtension parseExtension(String extension) { int eqIndex = parameter.indexOf('='); if (eqIndex != -1) { String attribute = parameter.substring(0, eqIndex); - String value = parameter.substring(eqIndex + 1, parameter.length()); + String value = parameter.substring(eqIndex + 1); parameters.put(attribute, value); } }