Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: spring-projects/spring-framework
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v5.2.18.RELEASE
Choose a base ref
...
head repository: spring-projects/spring-framework
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v5.2.19.RELEASE
Choose a head ref

Commits on Oct 14, 2021

  1. Copy the full SHA
    f94794e View commit details

Commits on Oct 18, 2021

  1. Update Javadoc in DefaultResponseErrorHandler

    Closes gh-27569
    smilep authored and rstoyanchev committed Oct 18, 2021
    Copy the full SHA
    d1b3b8e View commit details
  2. Copy the full SHA
    7b149a6 View commit details
  3. Fix checkstyle warning

    rstoyanchev committed Oct 18, 2021
    Copy the full SHA
    52e2953 View commit details

Commits on Oct 19, 2021

  1. Fix Javadoc in [NamedParameter]JdbcOperations.queryForObject methods

    This commit fixes the Javadoc in all queryForObject(...) methods in
    JdbcOperations and NamedParameterJdbcOperations regarding what kinds of
    exceptions are thrown under which conditions.
    
    Closes gh-27559
    
    (cherry picked from commit 0853baa)
    sbrannen authored and jhoeller committed Oct 19, 2021
    Copy the full SHA
    2bec54e View commit details

Commits on Oct 20, 2021

  1. Copy the full SHA
    78a24c0 View commit details

Commits on Oct 22, 2021

  1. Return previous value in UndertowHeadersAdapter's remove() method

    Prior to this commit, UndertowHeadersAdapter's remove() method violated
    the java.util.Map contract by always returning null.
    
    This commit fixes this by returning the previous list stored under the
    specified key, and otherwise returning null if no previous value was
    present.
    
    Closes gh-27592
    sbrannen committed Oct 22, 2021
    Copy the full SHA
    dfc435d View commit details

Commits on Nov 4, 2021

  1. Copy the full SHA
    dd3ae4e View commit details

Commits on Nov 5, 2021

  1. Copy the full SHA
    9c4a33e View commit details

Commits on Nov 9, 2021

  1. Upgrade to Reactor Dysprosium-SR25

    Closes gh-27635
    snicoll committed Nov 9, 2021
    Copy the full SHA
    17c3976 View commit details
  2. Copy the full SHA
    f0de3a9 View commit details
  3. Polishing

    jhoeller committed Nov 9, 2021
    Copy the full SHA
    a439a83 View commit details

Commits on Nov 10, 2021

  1. Use ByteArrayDecoder in DefaultClientResponse::createException

    This commit changes DefaultClientResponse::createException to use
    the ByteArrayDecoder, instead of converting to DataBuffers and
    turning these into a byte array.
    
    Closes gh-27666
    poutsma committed Nov 10, 2021
    Copy the full SHA
    24ebb5e View commit details

Commits on Dec 8, 2021

  1. Copy the full SHA
    50f6db2 View commit details

Commits on Dec 9, 2021

  1. Copy the full SHA
    96a7fc6 View commit details

Commits on Dec 10, 2021

  1. Test status quo for null in varargs in SpEL expressions

    This commit also points out that `null` supplied as a single value for
    a varargs array of type Optional will be kept as `null` instead of being
    converted to Optional.empty(); whereas, if more than one value is passed
    to such a varargs array a null value will be properly converted to
    Optional.empty().
    
    See gh-27719
    sbrannen committed Dec 10, 2021
    Copy the full SHA
    e03e62c View commit details
  2. Upgrade to Log4j2 2.15.0

    snicoll committed Dec 10, 2021
    Copy the full SHA
    0668323 View commit details

Commits on Dec 14, 2021

  1. Copy the full SHA
    354dad6 View commit details
  2. Copy the full SHA
    67a4b63 View commit details
  3. Copy the full SHA
    842f5b3 View commit details
  4. Copy the full SHA
    ec13a3f View commit details
  5. Copy the full SHA
    e954d7f View commit details

Commits on Dec 15, 2021

  1. Upgrade to Log4j2 2.16.0

    snicoll committed Dec 15, 2021
    Copy the full SHA
    1a03ffe View commit details

Commits on Dec 16, 2021

  1. Release v5.2.19.RELEASE

    spring-builds committed Dec 16, 2021
    Copy the full SHA
    925b078 View commit details
Showing with 464 additions and 321 deletions.
  1. +1 −1 SECURITY.md
  2. +6 −6 build.gradle
  3. +1 −1 gradle.properties
  4. +4 −2 spring-aop/src/main/java/org/springframework/aop/framework/DefaultAopProxyFactory.java
  5. +4 −8 spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactoryBean.java
  6. +1 −1 .../main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
  7. +3 −1 ...-context-support/src/main/java/org/springframework/scheduling/quartz/LocalDataSourceJobStore.java
  8. +2 −1 spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java
  9. +4 −3 ...ntext/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java
  10. +2 −2 ...g-context/src/main/java/org/springframework/context/annotation/ComponentScanAnnotationParser.java
  11. +7 −7 spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java
  12. +6 −1 spring-context/src/main/java/org/springframework/context/annotation/Lazy.java
  13. +34 −4 spring-context/src/test/java/org/springframework/aop/framework/ProxyFactoryBeanTests.java
  14. +3 −3 spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java
  15. +20 −8 spring-core/src/main/java/org/springframework/core/log/LogFormatUtils.java
  16. +46 −17 spring-expression/src/test/java/org/springframework/expression/spel/MethodInvocationTests.java
  17. +10 −22 spring-expression/src/test/java/org/springframework/expression/spel/TestScenarioCreator.java
  18. +17 −10 spring-expression/src/test/java/org/springframework/expression/spel/VariableAndFunctionTests.java
  19. +12 −9 spring-expression/src/test/java/org/springframework/expression/spel/testresources/Inventor.java
  20. +35 −28 spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcOperations.java
  21. +10 −9 spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcOperations.java
  22. +3 −3 ...orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java
  23. +6 −6 ...pringframework/test/context/junit/jupiter/transaction/TimedTransactionalSpringExtensionTests.java
  24. +5 −5 spring-test/src/test/java/org/springframework/test/context/junit4/TimedSpringRunnerTests.java
  25. +1 −2 ...rc/main/java/org/springframework/dao/annotation/PersistenceExceptionTranslationPostProcessor.java
  26. +6 −1 spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHeadersAdapter.java
  27. +2 −2 spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java
  28. +2 −2 spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java
  29. +1 −7 ...webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponse.java
  30. +9 −6 spring-webflux/src/main/java/org/springframework/web/reactive/resource/PathResourceResolver.java
  31. +7 −3 spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java
  32. +29 −0 ...ux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java
  33. +3 −4 .../java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java
  34. +2 −2 ...bmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java
  35. +9 −6 spring-webmvc/src/main/java/org/springframework/web/servlet/resource/PathResourceResolver.java
  36. +7 −3 spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java
  37. +8 −4 ...bsocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java
  38. +5 −2 ...-websocket/src/main/java/org/springframework/web/socket/sockjs/support/AbstractSockJsService.java
  39. +4 −3 ...src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java
  40. +80 −68 src/docs/asciidoc/core/core-beans.adoc
  41. +47 −48 src/docs/asciidoc/integration.adoc
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
@@ -8,4 +8,4 @@ wiki page.

## Reporting a Vulnerability

Please see https://pivotal.io/security.
Please see https://spring.io/security-policy.
12 changes: 6 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -28,29 +28,29 @@ configure(allprojects) { project ->
imports {
mavenBom "com.fasterxml.jackson:jackson-bom:2.10.5"
mavenBom "io.netty:netty-bom:4.1.51.Final"
mavenBom "io.projectreactor:reactor-bom:Dysprosium-SR24"
mavenBom "io.projectreactor:reactor-bom:Dysprosium-SR25"
mavenBom "io.rsocket:rsocket-bom:1.0.4"
mavenBom "org.eclipse.jetty:jetty-bom:9.4.31.v20200723"
mavenBom "org.jetbrains.kotlin:kotlin-bom:1.3.72"
mavenBom "org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.3.5"
mavenBom "org.junit:junit-bom:5.6.3"
}
dependencies {
dependencySet(group: 'org.apache.logging.log4j', version: '2.13.3') {
dependencySet(group: 'org.apache.logging.log4j', version: '2.16.0') {
entry 'log4j-api'
entry 'log4j-core'
entry 'log4j-jul'
entry 'log4j-slf4j-impl'
}
dependency "org.slf4j:slf4j-api:1.7.30"
dependency "org.slf4j:slf4j-api:1.7.32"
dependency "com.google.code.findbugs:jsr305:3.0.2"

dependencySet(group: 'org.aspectj', version: '1.9.6') {
dependencySet(group: 'org.aspectj', version: '1.9.7') {
entry 'aspectjrt'
entry 'aspectjtools'
entry 'aspectjweaver'
}
dependencySet(group: 'org.codehaus.groovy', version: '2.5.13') {
dependencySet(group: 'org.codehaus.groovy', version: '2.5.15') {
entry 'groovy'
entry 'groovy-jsr223'
entry 'groovy-templates'
@@ -61,7 +61,7 @@ configure(allprojects) { project ->
dependency "io.reactivex:rxjava:1.3.8"
dependency "io.reactivex:rxjava-reactive-streams:1.2.1"
dependency "io.reactivex.rxjava2:rxjava:2.2.21"
dependency "io.projectreactor.tools:blockhound:1.0.4.RELEASE"
dependency "io.projectreactor.tools:blockhound:1.0.6.RELEASE"

dependency "com.caucho:hessian:4.0.63"
dependency "com.fasterxml:aalto-xml:1.2.2"
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version=5.2.18.BUILD-SNAPSHOT
version=5.2.19.RELEASE
org.gradle.jvmargs=-Xmx1536M
org.gradle.caching=true
org.gradle.parallel=true
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2015 the original author or authors.
* Copyright 2002-2021 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.
@@ -43,9 +43,11 @@
* @see AdvisedSupport#setProxyTargetClass
* @see AdvisedSupport#setInterfaces
*/
@SuppressWarnings("serial")
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

private static final long serialVersionUID = 7930414337282325166L;


@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2021 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.
@@ -421,11 +421,7 @@ private boolean isNamedBeanAnAdvisorOrAdvice(String beanName) {
* are unaffected by such changes.
*/
private synchronized void initializeAdvisorChain() throws AopConfigException, BeansException {
if (this.advisorChainInitialized) {
return;
}

if (!ObjectUtils.isEmpty(this.interceptorNames)) {
if (!this.advisorChainInitialized && !ObjectUtils.isEmpty(this.interceptorNames)) {
if (this.beanFactory == null) {
throw new IllegalStateException("No BeanFactory available anymore (probably due to serialization) " +
"- cannot resolve interceptor names " + Arrays.asList(this.interceptorNames));
@@ -464,9 +460,9 @@ private synchronized void initializeAdvisorChain() throws AopConfigException, Be
addAdvisorOnChainCreation(advice);
}
}
}

this.advisorChainInitialized = true;
this.advisorChainInitialized = true;
}
}


Original file line number Diff line number Diff line change
@@ -459,7 +459,7 @@ private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz
return metadata;
}

private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) {
private InjectionMetadata buildAutowiringMetadata(Class<?> clazz) {
if (!AnnotationUtils.isCandidateClass(clazz, this.autowiredAnnotationTypes)) {
return InjectionMetadata.EMPTY;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2021 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.
@@ -58,6 +58,8 @@
* @since 1.1
* @see SchedulerFactoryBean#setDataSource
* @see SchedulerFactoryBean#setNonTransactionalDataSource
* @see SchedulerFactoryBean#getConfigTimeDataSource()
* @see SchedulerFactoryBean#getConfigTimeNonTransactionalDataSource()
* @see org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection
* @see org.springframework.jdbc.datasource.DataSourceUtils#releaseConnection
*/
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2021 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.
@@ -313,6 +313,7 @@ public void setTaskExecutor(Executor taskExecutor) {
* If set, this will override corresponding settings in Quartz properties.
* <p>Note: If this is set, the Quartz settings should not define
* a job store "dataSource" to avoid meaningless double configuration.
* Also, do not define a "org.quartz.jobStore.class" property at all.
* <p>A Spring-specific subclass of Quartz' JobStoreCMT will be used.
* It is therefore strongly recommended to perform all operations on
* the Scheduler within Spring-managed (or plain JTA) transactions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2021 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.
@@ -332,7 +332,7 @@ public PropertyValues postProcessPropertyValues(
}


private InjectionMetadata findResourceMetadata(String beanName, final Class<?> clazz, @Nullable PropertyValues pvs) {
private InjectionMetadata findResourceMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) {
// Fall back to class name as cache key, for backwards compatibility with custom callers.
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
// Quick check on the concurrent map first, with minimal locking.
@@ -352,7 +352,7 @@ private InjectionMetadata findResourceMetadata(String beanName, final Class<?> c
return metadata;
}

private InjectionMetadata buildResourceMetadata(final Class<?> clazz) {
private InjectionMetadata buildResourceMetadata(Class<?> clazz) {
if (!AnnotationUtils.isCandidateClass(clazz, resourceAnnotationTypes)) {
return InjectionMetadata.EMPTY;
}
@@ -464,6 +464,7 @@ public Object getTarget() {
public void releaseTarget(Object target) {
}
};

ProxyFactory pf = new ProxyFactory();
pf.setTargetSource(ts);
if (element.lookupType.isInterface()) {
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2021 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.
@@ -73,7 +73,7 @@ public ComponentScanAnnotationParser(Environment environment, ResourceLoader res
}


public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, final String declaringClass) {
public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, String declaringClass) {
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this.registry,
componentScan.getBoolean("useDefaultFilters"), this.environment, this.resourceLoader);

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2021 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.
@@ -453,8 +453,8 @@ private boolean isCurrentlyInvokedFactoryMethod(Method method) {
* instance directly. If a FactoryBean instance is fetched through the container via &-dereferencing,
* it will not be proxied. This too is aligned with the way XML configuration works.
*/
private Object enhanceFactoryBean(final Object factoryBean, Class<?> exposedType,
final ConfigurableBeanFactory beanFactory, final String beanName) {
private Object enhanceFactoryBean(Object factoryBean, Class<?> exposedType,
ConfigurableBeanFactory beanFactory, String beanName) {

try {
Class<?> clazz = factoryBean.getClass();
@@ -489,8 +489,8 @@ private Object enhanceFactoryBean(final Object factoryBean, Class<?> exposedType
return createCglibProxyForFactoryBean(factoryBean, beanFactory, beanName);
}

private Object createInterfaceProxyForFactoryBean(final Object factoryBean, Class<?> interfaceType,
final ConfigurableBeanFactory beanFactory, final String beanName) {
private Object createInterfaceProxyForFactoryBean(Object factoryBean, Class<?> interfaceType,
ConfigurableBeanFactory beanFactory, String beanName) {

return Proxy.newProxyInstance(
factoryBean.getClass().getClassLoader(), new Class<?>[] {interfaceType},
@@ -502,8 +502,8 @@ private Object createInterfaceProxyForFactoryBean(final Object factoryBean, Clas
});
}

private Object createCglibProxyForFactoryBean(final Object factoryBean,
final ConfigurableBeanFactory beanFactory, final String beanName) {
private Object createCglibProxyForFactoryBean(Object factoryBean,
ConfigurableBeanFactory beanFactory, String beanName) {

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(factoryBean.getClass());
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2021 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.
@@ -47,6 +47,11 @@
* or {@link javax.inject.Inject}: In that context, it leads to the creation of a
* lazy-resolution proxy for all affected dependencies, as an alternative to using
* {@link org.springframework.beans.factory.ObjectFactory} or {@link javax.inject.Provider}.
* Please note that such a lazy-resolution proxy will always be injected; if the target
* dependency does not exist, you will only be able to find out through an exception on
* invocation. As a consequence, such an injection point results in unintuitive behavior
* for optional dependencies. For a programmatic equivalent, allowing for lazy references
* with more sophistication, consider {@link org.springframework.beans.factory.ObjectProvider}.
*
* @author Chris Beams
* @author Juergen Hoeller
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2021 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.
@@ -65,10 +65,10 @@
import static org.assertj.core.api.Assertions.assertThatIOException;

/**
* @since 13.03.2003
* @author Rod Johnson
* @author Juergen Hoeller
* @author Chris Beams
* @since 13.03.2003
*/
public class ProxyFactoryBeanTests {

@@ -631,20 +631,50 @@ public void testFrozenFactoryBean() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(new ClassPathResource(FROZEN_CONTEXT, CLASS));

Advised advised = (Advised)bf.getBean("frozen");
Advised advised = (Advised) bf.getBean("frozen");
assertThat(advised.isFrozen()).as("The proxy should be frozen").isTrue();
}

@Test
public void testDetectsInterfaces() throws Exception {
public void testDetectsInterfaces() {
ProxyFactoryBean fb = new ProxyFactoryBean();
fb.setTarget(new TestBean());
fb.addAdvice(new DebugInterceptor());
fb.setBeanFactory(new DefaultListableBeanFactory());

ITestBean proxy = (ITestBean) fb.getObject();
assertThat(AopUtils.isJdkDynamicProxy(proxy)).isTrue();
}

@Test
public void testWithInterceptorNames() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.registerSingleton("debug", new DebugInterceptor());

ProxyFactoryBean fb = new ProxyFactoryBean();
fb.setTarget(new TestBean());
fb.setInterceptorNames("debug");
fb.setBeanFactory(bf);

Advised proxy = (Advised) fb.getObject();
assertThat(proxy.getAdvisors().length).isEqualTo(1);
}

@Test
public void testWithLateInterceptorNames() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.registerSingleton("debug", new DebugInterceptor());

ProxyFactoryBean fb = new ProxyFactoryBean();
fb.setTarget(new TestBean());
fb.setBeanFactory(bf);
fb.getObject();

fb.setInterceptorNames("debug");
Advised proxy = (Advised) fb.getObject();
assertThat(proxy.getAdvisors().length).isEqualTo(1);
}


/**
* Fires only on void methods. Saves list of methods intercepted.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2021 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.
@@ -462,9 +462,9 @@ public String toString() {

private void checkIndex(int index, int length) {
assertIndex(index >= 0, "index %d must be >= 0", index);
assertIndex(length >= 0, "length %d must be >= 0", index);
assertIndex(length >= 0, "length %d must be >= 0", length);
assertIndex(index <= this.capacity, "index %d must be <= %d", index, this.capacity);
assertIndex(length <= this.capacity, "length %d must be <= %d", index, this.capacity);
assertIndex(length <= this.capacity, "length %d must be <= %d", length, this.capacity);
}

private void assertIndex(boolean expression, String format, Object... args) {
Loading