001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      https://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.pool2.impl;
018
019import java.time.Duration;
020
021import org.apache.commons.pool2.BaseObject;
022
023/**
024 * Provides the implementation for the common attributes shared by the sub-classes. New instances of this class will be created using the defaults defined by
025 * the public constants.
026 * <p>
027 * This class is not thread-safe.
028 * </p>
029 *
030 * @param <T> Type of element pooled.
031 * @since 2.0
032 */
033public abstract class BaseObjectPoolConfig<T> extends BaseObject implements Cloneable {
034
035    /**
036     * The default value for the {@code lifo} configuration attribute: {@value}.
037     *
038     * @see GenericObjectPool#getLifo()
039     * @see GenericKeyedObjectPool#getLifo()
040     */
041    public static final boolean DEFAULT_LIFO = true;
042
043    /**
044     * The default value for the {@code fairness} configuration attribute: {@value}.
045     *
046     * @see GenericObjectPool#getFairness()
047     * @see GenericKeyedObjectPool#getFairness()
048     */
049    public static final boolean DEFAULT_FAIRNESS = false;
050
051    /**
052     * The default value for the {@code maxWait} configuration attribute: {@value}.
053     *
054     * @see GenericObjectPool#getMaxWaitDuration()
055     * @see GenericKeyedObjectPool#getMaxWaitDuration()
056     * @deprecated Use {@link #DEFAULT_MAX_WAIT}.
057     */
058    @Deprecated
059    public static final long DEFAULT_MAX_WAIT_MILLIS = -1L;
060
061    /**
062     * The default value for the {@code maxWait} configuration attribute.
063     *
064     * @see GenericObjectPool#getMaxWaitDuration()
065     * @see GenericKeyedObjectPool#getMaxWaitDuration()
066     * @since 2.10.0
067     */
068    public static final Duration DEFAULT_MAX_WAIT = Duration.ofMillis(DEFAULT_MAX_WAIT_MILLIS);
069
070    /**
071     * The default value for the {@code minEvictableIdleDuration} configuration attribute: {@value}.
072     *
073     * @see GenericObjectPool#getMinEvictableIdleDuration()
074     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
075     * @deprecated Use {@link #DEFAULT_MIN_EVICTABLE_IDLE_TIME}.
076     */
077    @Deprecated
078    public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L;
079
080    /**
081     * The default value for the {@code minEvictableIdleDuration} configuration attribute.
082     *
083     * @see GenericObjectPool#getMinEvictableIdleDuration()
084     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
085     * @since 2.11.0
086     */
087    public static final Duration DEFAULT_MIN_EVICTABLE_IDLE_DURATION = Duration.ofMillis(DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS);
088
089    /**
090     * The default value for the {@code minEvictableIdleDuration} configuration attribute.
091     *
092     * @see GenericObjectPool#getMinEvictableIdleDuration()
093     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
094     * @since 2.10.0
095     * @deprecated Use {@link #DEFAULT_MIN_EVICTABLE_IDLE_DURATION}.
096     */
097    @Deprecated
098    public static final Duration DEFAULT_MIN_EVICTABLE_IDLE_TIME = Duration.ofMillis(DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS);
099
100    /**
101     * The default value for the {@code softMinEvictableIdleTime} configuration attribute: {@value}.
102     *
103     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
104     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
105     * @deprecated Use {@link #DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME}.
106     */
107    @Deprecated
108    public static final long DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS = -1;
109
110    /**
111     * The default value for the {@code softMinEvictableIdleTime} configuration attribute.
112     *
113     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
114     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
115     * @since 2.10.0
116     * @deprecated Use {@link #DEFAULT_SOFT_MIN_EVICTABLE_IDLE_DURATION}.
117     */
118    @Deprecated
119    public static final Duration DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME = Duration.ofMillis(DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS);
120
121    /**
122     * The default value for the {@code softMinEvictableIdleTime} configuration attribute.
123     *
124     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
125     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
126     * @since 2.11.0
127     */
128    public static final Duration DEFAULT_SOFT_MIN_EVICTABLE_IDLE_DURATION = Duration.ofMillis(DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS);
129
130    /**
131     * The default value for {@code evictorShutdownTimeout} configuration attribute: {@value}.
132     *
133     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
134     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
135     * @deprecated Use {@link #DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT}.
136     */
137    @Deprecated
138    public static final long DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS = 10L * 1000L;
139
140    /**
141     * The default value for {@code evictorShutdownTimeout} configuration attribute.
142     *
143     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
144     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
145     * @since 2.10.0
146     */
147    public static final Duration DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT = Duration.ofMillis(DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS);
148
149    /**
150     * The default value for the {@code numTestsPerEvictionRun} configuration attribute: {@value}.
151     *
152     * @see GenericObjectPool#getNumTestsPerEvictionRun()
153     * @see GenericKeyedObjectPool#getNumTestsPerEvictionRun()
154     */
155    public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 3;
156
157    /**
158     * The default value for the {@code testOnCreate} configuration attribute: {@value}.
159     *
160     * @see GenericObjectPool#getTestOnCreate()
161     * @see GenericKeyedObjectPool#getTestOnCreate()
162     * @since 2.2
163     */
164    public static final boolean DEFAULT_TEST_ON_CREATE = false;
165
166    /**
167     * The default value for the {@code testOnBorrow} configuration attribute: {@value}.
168     *
169     * @see GenericObjectPool#getTestOnBorrow()
170     * @see GenericKeyedObjectPool#getTestOnBorrow()
171     */
172    public static final boolean DEFAULT_TEST_ON_BORROW = false;
173
174    /**
175     * The default value for the {@code testOnReturn} configuration attribute: {@value}.
176     *
177     * @see GenericObjectPool#getTestOnReturn()
178     * @see GenericKeyedObjectPool#getTestOnReturn()
179     */
180    public static final boolean DEFAULT_TEST_ON_RETURN = false;
181
182    /**
183     * The default value for the {@code testWhileIdle} configuration attribute: {@value}.
184     *
185     * @see GenericObjectPool#getTestWhileIdle()
186     * @see GenericKeyedObjectPool#getTestWhileIdle()
187     */
188    public static final boolean DEFAULT_TEST_WHILE_IDLE = false;
189
190    /**
191     * The default value for the {@code timeBetweenEvictionRuns} configuration attribute: {@value}.
192     *
193     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
194     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
195     * @deprecated Use {@link #DEFAULT_TIME_BETWEEN_EVICTION_RUNS}.
196     */
197    @Deprecated
198    public static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = -1L;
199
200    /**
201     * The default value for the {@code timeBetweenEvictionRuns} configuration attribute.
202     *
203     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
204     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
205     * @since 2.12.0
206     */
207    public static final Duration DEFAULT_DURATION_BETWEEN_EVICTION_RUNS = Duration.ofMillis(DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS);
208
209    /**
210     * The default value for the {@code timeBetweenEvictionRuns} configuration attribute.
211     *
212     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
213     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
214     * @deprecated Use {@link #DEFAULT_DURATION_BETWEEN_EVICTION_RUNS}.
215     */
216    @Deprecated
217    public static final Duration DEFAULT_TIME_BETWEEN_EVICTION_RUNS = Duration.ofMillis(DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS);
218
219    /**
220     * The default value for the {@code blockWhenExhausted} configuration attribute: {@value}.
221     *
222     * @see GenericObjectPool#getBlockWhenExhausted()
223     * @see GenericKeyedObjectPool#getBlockWhenExhausted()
224     */
225    public static final boolean DEFAULT_BLOCK_WHEN_EXHAUSTED = true;
226
227    /**
228     * The default value for enabling JMX for pools created with a configuration instance: {@value}.
229     */
230    public static final boolean DEFAULT_JMX_ENABLE = true;
231
232    /**
233     * The default value for the prefix used to name JMX enabled pools created with a configuration instance: {@value}.
234     *
235     * @see GenericObjectPool#getJmxName()
236     * @see GenericKeyedObjectPool#getJmxName()
237     */
238    public static final String DEFAULT_JMX_NAME_PREFIX = "pool";
239
240    /**
241     * The default value for the base name to use to name JMX enabled pools created with a configuration instance. The default is {@code null} which means the
242     * pool will provide the base name to use.
243     *
244     * @see GenericObjectPool#getJmxName()
245     * @see GenericKeyedObjectPool#getJmxName()
246     */
247    public static final String DEFAULT_JMX_NAME_BASE = null;
248
249    /**
250     * The default value for the {@code evictionPolicyClassName} configuration attribute.
251     *
252     * @see GenericObjectPool#getEvictionPolicyClassName()
253     * @see GenericKeyedObjectPool#getEvictionPolicyClassName()
254     */
255    public static final String DEFAULT_EVICTION_POLICY_CLASS_NAME = DefaultEvictionPolicy.class.getName();
256
257    /**
258     * The default value for the {@code collectDetailedStatistics} configuration
259     * attribute. When {@code true}, the pool will collect detailed timing statistics
260     * for monitoring purposes. When {@code false}, detailed statistics collection
261     * is disabled, improving performance under high load.
262     * <p>
263     * This setting affects data collection for mean active time, mean idle time, and mean borrow wait time.
264     * </p>
265     *
266     * @since 2.13.0
267     */
268    public static final boolean DEFAULT_COLLECT_DETAILED_STATISTICS = true;
269
270    private boolean lifo = DEFAULT_LIFO;
271
272    private boolean fairness = DEFAULT_FAIRNESS;
273
274    private Duration maxWaitDuration = DEFAULT_MAX_WAIT;
275
276    private Duration minEvictableIdleDuration = DEFAULT_MIN_EVICTABLE_IDLE_TIME;
277
278    private Duration evictorShutdownTimeoutDuration = DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT;
279
280    private Duration softMinEvictableIdleDuration = DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME;
281
282    private int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
283
284    private EvictionPolicy<T> evictionPolicy; // Only 2.6.0 applications set this
285
286    private String evictionPolicyClassName = DEFAULT_EVICTION_POLICY_CLASS_NAME;
287
288    private boolean testOnCreate = DEFAULT_TEST_ON_CREATE;
289
290    private boolean testOnBorrow = DEFAULT_TEST_ON_BORROW;
291
292    private boolean testOnReturn = DEFAULT_TEST_ON_RETURN;
293
294    private boolean testWhileIdle = DEFAULT_TEST_WHILE_IDLE;
295
296    private Duration durationBetweenEvictionRuns = DEFAULT_DURATION_BETWEEN_EVICTION_RUNS;
297
298    private boolean blockWhenExhausted = DEFAULT_BLOCK_WHEN_EXHAUSTED;
299
300    private boolean jmxEnabled = DEFAULT_JMX_ENABLE;
301
302    // TODO Consider changing this to a single property for 3.x
303    private String jmxNamePrefix = DEFAULT_JMX_NAME_PREFIX;
304
305    private String jmxNameBase = DEFAULT_JMX_NAME_BASE;
306
307    private boolean collectDetailedStatistics = DEFAULT_COLLECT_DETAILED_STATISTICS;
308
309    /**
310     * Constructs a new instance.
311     */
312    public BaseObjectPoolConfig() {
313        // empty
314    }
315
316    /**
317     * Gets the value for the {@code blockWhenExhausted} configuration attribute for pools created with this configuration instance.
318     *
319     * @return The current setting of {@code blockWhenExhausted} for this configuration instance
320     * @see GenericObjectPool#getBlockWhenExhausted()
321     * @see GenericKeyedObjectPool#getBlockWhenExhausted()
322     */
323    public boolean getBlockWhenExhausted() {
324        return blockWhenExhausted;
325    }
326
327    /**
328     * Gets the value for the {@code collectDetailedStatistics} configuration attribute
329     * for pools created with this configuration instance.
330     * <p>
331     * This setting affects data collection for mean active time, mean idle time, and mean borrow wait time.
332     * </p>
333     *
334     * @return  {@code true} if detailed statistics collection is enabled,
335     *          {@code false} if disabled for improved performance.
336     * @see GenericObjectPool#getCollectDetailedStatistics()
337     * @see GenericKeyedObjectPool#getCollectDetailedStatistics()
338     * @since 2.13.0
339     */
340    public boolean getCollectDetailedStatistics() {
341        return collectDetailedStatistics;
342    }
343
344    /**
345     * Gets the value for the {@code timeBetweenEvictionRuns} configuration attribute for pools created with this configuration instance.
346     *
347     * @return The current setting of {@code timeBetweenEvictionRuns} for this configuration instance
348     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
349     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
350     * @since 2.11.0
351     */
352    public Duration getDurationBetweenEvictionRuns() {
353        return durationBetweenEvictionRuns;
354    }
355
356    /**
357     * Gets the value for the {@code evictionPolicyClass} configuration attribute for pools created with this configuration instance.
358     *
359     * @return The current setting of {@code evictionPolicyClass} for this configuration instance
360     * @see GenericObjectPool#getEvictionPolicy()
361     * @see GenericKeyedObjectPool#getEvictionPolicy()
362     * @since 2.6.0
363     */
364    public EvictionPolicy<T> getEvictionPolicy() {
365        return evictionPolicy;
366    }
367
368    /**
369     * Gets the value for the {@code evictionPolicyClassName} configuration attribute for pools created with this configuration instance.
370     *
371     * @return The current setting of {@code evictionPolicyClassName} for this configuration instance
372     * @see GenericObjectPool#getEvictionPolicyClassName()
373     * @see GenericKeyedObjectPool#getEvictionPolicyClassName()
374     */
375    public String getEvictionPolicyClassName() {
376        return evictionPolicyClassName;
377    }
378
379    /**
380     * Gets the value for the {@code evictorShutdownTimeout} configuration attribute for pools created with this configuration instance.
381     *
382     * @return The current setting of {@code evictorShutdownTimeout} for this configuration instance
383     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
384     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
385     * @since 2.10.0
386     * @deprecated Use {@link #getEvictorShutdownTimeoutDuration()}.
387     */
388    @Deprecated
389    public Duration getEvictorShutdownTimeout() {
390        return evictorShutdownTimeoutDuration;
391    }
392
393    /**
394     * Gets the value for the {@code evictorShutdownTimeout} configuration attribute for pools created with this configuration instance.
395     *
396     * @return The current setting of {@code evictorShutdownTimeout} for this configuration instance
397     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
398     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
399     * @since 2.11.0
400     */
401    public Duration getEvictorShutdownTimeoutDuration() {
402        return evictorShutdownTimeoutDuration;
403    }
404
405    /**
406     * Gets the value for the {@code evictorShutdownTimeout} configuration attribute for pools created with this configuration instance.
407     *
408     * @return The current setting of {@code evictorShutdownTimeout} for this configuration instance
409     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
410     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
411     * @deprecated Use {@link #getEvictorShutdownTimeout()}.
412     */
413    @Deprecated
414    public long getEvictorShutdownTimeoutMillis() {
415        return evictorShutdownTimeoutDuration.toMillis();
416    }
417
418    /**
419     * Gets the value for the {@code fairness} configuration attribute for pools created with this configuration instance.
420     *
421     * @return The current setting of {@code fairness} for this configuration instance
422     * @see GenericObjectPool#getFairness()
423     * @see GenericKeyedObjectPool#getFairness()
424     */
425    public boolean getFairness() {
426        return fairness;
427    }
428
429    /**
430     * Gets the value of the flag that determines if JMX will be enabled for pools created with this configuration instance.
431     *
432     * @return The current setting of {@code jmxEnabled} for this configuration instance
433     */
434    public boolean getJmxEnabled() {
435        return jmxEnabled;
436    }
437
438    /**
439     * Gets the value of the JMX name base that will be used as part of the name assigned to JMX enabled pools created with this configuration instance. A value
440     * of {@code null} means that the pool will define the JMX name base.
441     *
442     * @return The current setting of {@code jmxNameBase} for this configuration instance
443     */
444    public String getJmxNameBase() {
445        return jmxNameBase;
446    }
447
448    /**
449     * Gets the value of the JMX name prefix that will be used as part of the name assigned to JMX enabled pools created with this configuration instance.
450     *
451     * @return The current setting of {@code jmxNamePrefix} for this configuration instance
452     */
453    public String getJmxNamePrefix() {
454        return jmxNamePrefix;
455    }
456
457    /**
458     * Gets the value for the {@code lifo} configuration attribute for pools created with this configuration instance.
459     *
460     * @return The current setting of {@code lifo} for this configuration instance
461     * @see GenericObjectPool#getLifo()
462     * @see GenericKeyedObjectPool#getLifo()
463     */
464    public boolean getLifo() {
465        return lifo;
466    }
467
468    /**
469     * Gets the value for the {@code maxWait} configuration attribute for pools created with this configuration instance.
470     *
471     * @return The current setting of {@code maxWait} for this configuration instance
472     * @see GenericObjectPool#getMaxWaitDuration()
473     * @see GenericKeyedObjectPool#getMaxWaitDuration()
474     * @since 2.11.0
475     */
476    public Duration getMaxWaitDuration() {
477        return maxWaitDuration;
478    }
479
480    /**
481     * Gets the value for the {@code maxWait} configuration attribute for pools created with this configuration instance.
482     *
483     * @return The current setting of {@code maxWait} for this configuration instance
484     * @see GenericObjectPool#getMaxWaitDuration()
485     * @see GenericKeyedObjectPool#getMaxWaitDuration()
486     * @deprecated Use {@link #getMaxWaitDuration()}.
487     */
488    @Deprecated
489    public long getMaxWaitMillis() {
490        return maxWaitDuration.toMillis();
491    }
492
493    /**
494     * Gets the value for the {@code minEvictableIdleTime} configuration attribute for pools created with this configuration instance.
495     *
496     * @return The current setting of {@code minEvictableIdleTime} for this configuration instance
497     * @see GenericObjectPool#getMinEvictableIdleDuration()
498     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
499     * @since 2.11.0
500     */
501    public Duration getMinEvictableIdleDuration() {
502        return minEvictableIdleDuration;
503    }
504
505    /**
506     * Gets the value for the {@code minEvictableIdleTime} configuration attribute for pools created with this configuration instance.
507     *
508     * @return The current setting of {@code minEvictableIdleTime} for this configuration instance
509     * @see GenericObjectPool#getMinEvictableIdleDuration()
510     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
511     * @since 2.10.0
512     * @deprecated Use {@link #getMinEvictableIdleDuration()}.
513     */
514    @Deprecated
515    public Duration getMinEvictableIdleTime() {
516        return minEvictableIdleDuration;
517    }
518
519    /**
520     * Gets the value for the {@code minEvictableIdleTime} configuration attribute for pools created with this configuration instance.
521     *
522     * @return The current setting of {@code minEvictableIdleTime} for this configuration instance
523     * @see GenericObjectPool#getMinEvictableIdleDuration()
524     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
525     * @deprecated Use {@link #getMinEvictableIdleTime()}.
526     */
527    @Deprecated
528    public long getMinEvictableIdleTimeMillis() {
529        return minEvictableIdleDuration.toMillis();
530    }
531
532    /**
533     * Gets the value for the {@code numTestsPerEvictionRun} configuration attribute for pools created with this configuration instance.
534     *
535     * @return The current setting of {@code numTestsPerEvictionRun} for this configuration instance
536     * @see GenericObjectPool#getNumTestsPerEvictionRun()
537     * @see GenericKeyedObjectPool#getNumTestsPerEvictionRun()
538     */
539    public int getNumTestsPerEvictionRun() {
540        return numTestsPerEvictionRun;
541    }
542
543    /**
544     * Gets the value for the {@code softMinEvictableIdleTime} configuration attribute for pools created with this configuration instance.
545     *
546     * @return The current setting of {@code softMinEvictableIdleTime} for this configuration instance
547     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
548     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
549     * @since 2.11.0
550     */
551    public Duration getSoftMinEvictableIdleDuration() {
552        return softMinEvictableIdleDuration;
553    }
554
555    /**
556     * Gets the value for the {@code softMinEvictableIdleTime} configuration attribute for pools created with this configuration instance.
557     *
558     * @return The current setting of {@code softMinEvictableIdleTime} for this configuration instance
559     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
560     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
561     * @since 2.10.0
562     * @deprecated Use {@link #getSoftMinEvictableIdleDuration()}.
563     */
564    @Deprecated
565    public Duration getSoftMinEvictableIdleTime() {
566        return softMinEvictableIdleDuration;
567    }
568
569    /**
570     * Gets the value for the {@code softMinEvictableIdleTime} configuration attribute for pools created with this configuration instance.
571     *
572     * @return The current setting of {@code softMinEvictableIdleTime} for this configuration instance
573     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
574     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
575     * @deprecated Use {@link #getSoftMinEvictableIdleDuration()}.
576     */
577    @Deprecated
578    public long getSoftMinEvictableIdleTimeMillis() {
579        return softMinEvictableIdleDuration.toMillis();
580    }
581
582    /**
583     * Gets the value for the {@code testOnBorrow} configuration attribute for pools created with this configuration instance.
584     *
585     * @return The current setting of {@code testOnBorrow} for this configuration instance
586     * @see GenericObjectPool#getTestOnBorrow()
587     * @see GenericKeyedObjectPool#getTestOnBorrow()
588     */
589    public boolean getTestOnBorrow() {
590        return testOnBorrow;
591    }
592
593    /**
594     * Gets the value for the {@code testOnCreate} configuration attribute for pools created with this configuration instance.
595     *
596     * @return The current setting of {@code testOnCreate} for this configuration instance
597     * @see GenericObjectPool#getTestOnCreate()
598     * @see GenericKeyedObjectPool#getTestOnCreate()
599     * @since 2.2
600     */
601    public boolean getTestOnCreate() {
602        return testOnCreate;
603    }
604
605    /**
606     * Gets the value for the {@code testOnReturn} configuration attribute for pools created with this configuration instance.
607     *
608     * @return The current setting of {@code testOnReturn} for this configuration instance
609     * @see GenericObjectPool#getTestOnReturn()
610     * @see GenericKeyedObjectPool#getTestOnReturn()
611     */
612    public boolean getTestOnReturn() {
613        return testOnReturn;
614    }
615
616    /**
617     * Gets the value for the {@code testWhileIdle} configuration attribute for pools created with this configuration instance.
618     *
619     * @return The current setting of {@code testWhileIdle} for this configuration instance
620     * @see GenericObjectPool#getTestWhileIdle()
621     * @see GenericKeyedObjectPool#getTestWhileIdle()
622     */
623    public boolean getTestWhileIdle() {
624        return testWhileIdle;
625    }
626
627    /**
628     * Gets the value for the {@code timeBetweenEvictionRuns} configuration attribute for pools created with this configuration instance.
629     *
630     * @return The current setting of {@code timeBetweenEvictionRuns} for this configuration instance
631     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
632     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
633     * @since 2.10.0
634     * @deprecated Use {@link #getDurationBetweenEvictionRuns()}.
635     */
636    @Deprecated
637    public Duration getTimeBetweenEvictionRuns() {
638        return durationBetweenEvictionRuns;
639    }
640
641    /**
642     * Gets the value for the {@code timeBetweenEvictionRuns} configuration attribute for pools created with this configuration instance.
643     *
644     * @return The current setting of {@code timeBetweenEvictionRuns} for this configuration instance
645     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
646     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
647     * @deprecated Use {@link #getDurationBetweenEvictionRuns()}.
648     */
649    @Deprecated
650    public long getTimeBetweenEvictionRunsMillis() {
651        return durationBetweenEvictionRuns.toMillis();
652    }
653
654    /**
655     * Sets the value for the {@code blockWhenExhausted} configuration attribute for pools created with this configuration instance.
656     *
657     * @param blockWhenExhausted The new setting of {@code blockWhenExhausted} for this configuration instance
658     * @see GenericObjectPool#getBlockWhenExhausted()
659     * @see GenericKeyedObjectPool#getBlockWhenExhausted()
660     */
661    public void setBlockWhenExhausted(final boolean blockWhenExhausted) {
662        this.blockWhenExhausted = blockWhenExhausted;
663    }
664
665    /**
666     * Sets the value for the {@code collectDetailedStatistics} configuration attribute
667     * for pools created with this configuration instance. When {@code false}, the pool
668     * will not collect detailed timing statistics, improving performance under high load
669     * at the cost of reduced monitoring capabilities.
670     * <p>
671     * This setting affects data collection for mean active time, mean idle time, and mean borrow wait time.
672     * </p>
673     *
674     * @param collectDetailedStatistics The new setting of {@code collectDetailedStatistics}
675     *        for this configuration instance.
676     * @see GenericObjectPool#getCollectDetailedStatistics()
677     * @see GenericKeyedObjectPool#getCollectDetailedStatistics()
678     * @since 2.13.0
679     */
680    public void setCollectDetailedStatistics(final boolean collectDetailedStatistics) {
681        this.collectDetailedStatistics = collectDetailedStatistics;
682    }
683
684    /**
685     * Sets the value for the {@code evictionPolicyClass} configuration attribute for pools created with this configuration instance.
686     *
687     * @param evictionPolicy The new setting of {@code evictionPolicyClass} for this configuration instance
688     * @see GenericObjectPool#getEvictionPolicy()
689     * @see GenericKeyedObjectPool#getEvictionPolicy()
690     * @since 2.6.0
691     */
692    public void setEvictionPolicy(final EvictionPolicy<T> evictionPolicy) {
693        this.evictionPolicy = evictionPolicy;
694    }
695
696    /**
697     * Sets the value for the {@code evictionPolicyClassName} configuration attribute for pools created with this configuration instance.
698     *
699     * @param evictionPolicyClassName The new setting of {@code evictionPolicyClassName} for this configuration instance
700     * @see GenericObjectPool#getEvictionPolicyClassName()
701     * @see GenericKeyedObjectPool#getEvictionPolicyClassName()
702     */
703    public void setEvictionPolicyClassName(final String evictionPolicyClassName) {
704        this.evictionPolicyClassName = evictionPolicyClassName;
705    }
706
707    /**
708     * Sets the value for the {@code evictorShutdownTimeout} configuration attribute for pools created with this configuration instance.
709     *
710     * @param evictorShutdownTimeoutDuration The new setting of {@code evictorShutdownTimeout} for this configuration instance
711     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
712     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
713     * @since 2.11.0
714     */
715    public void setEvictorShutdownTimeout(final Duration evictorShutdownTimeoutDuration) {
716        this.evictorShutdownTimeoutDuration = PoolImplUtils.nonNull(evictorShutdownTimeoutDuration, DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT);
717    }
718
719    /**
720     * Sets the value for the {@code evictorShutdownTimeout} configuration attribute for pools created with this configuration instance.
721     *
722     * @param evictorShutdownTimeout The new setting of {@code evictorShutdownTimeout} for this configuration instance
723     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
724     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
725     * @since 2.10.0
726     * @deprecated Use {@link #setEvictorShutdownTimeout(Duration)}.
727     */
728    @Deprecated
729    public void setEvictorShutdownTimeoutMillis(final Duration evictorShutdownTimeout) {
730        setEvictorShutdownTimeout(evictorShutdownTimeout);
731    }
732
733    /**
734     * Sets the value for the {@code evictorShutdownTimeout} configuration attribute for pools created with this configuration instance.
735     *
736     * @param evictorShutdownTimeoutMillis The new setting of {@code evictorShutdownTimeout} for this configuration instance
737     * @see GenericObjectPool#getEvictorShutdownTimeoutDuration()
738     * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutDuration()
739     * @deprecated Use {@link #setEvictorShutdownTimeout(Duration)}.
740     */
741    @Deprecated
742    public void setEvictorShutdownTimeoutMillis(final long evictorShutdownTimeoutMillis) {
743        setEvictorShutdownTimeout(Duration.ofMillis(evictorShutdownTimeoutMillis));
744    }
745
746    /**
747     * Sets the value for the {@code fairness} configuration attribute for pools created with this configuration instance.
748     *
749     * @param fairness The new setting of {@code fairness} for this configuration instance
750     * @see GenericObjectPool#getFairness()
751     * @see GenericKeyedObjectPool#getFairness()
752     */
753    public void setFairness(final boolean fairness) {
754        this.fairness = fairness;
755    }
756
757    /**
758     * Sets the value of the flag that determines if JMX will be enabled for pools created with this configuration instance.
759     *
760     * @param jmxEnabled The new setting of {@code jmxEnabled} for this configuration instance
761     */
762    public void setJmxEnabled(final boolean jmxEnabled) {
763        this.jmxEnabled = jmxEnabled;
764    }
765
766    /**
767     * Sets the value of the JMX name base that will be used as part of the name assigned to JMX enabled pools created with this configuration instance. A value
768     * of {@code null} means that the pool will define the JMX name base.
769     *
770     * @param jmxNameBase The new setting of {@code jmxNameBase} for this configuration instance
771     */
772    public void setJmxNameBase(final String jmxNameBase) {
773        this.jmxNameBase = jmxNameBase;
774    }
775
776    /**
777     * Sets the value of the JMX name prefix that will be used as part of the name assigned to JMX enabled pools created with this configuration instance.
778     *
779     * @param jmxNamePrefix The new setting of {@code jmxNamePrefix} for this configuration instance
780     */
781    public void setJmxNamePrefix(final String jmxNamePrefix) {
782        this.jmxNamePrefix = jmxNamePrefix;
783    }
784
785    /**
786     * Sets the value for the {@code lifo} configuration attribute for pools created with this configuration instance.
787     *
788     * @param lifo The new setting of {@code lifo} for this configuration instance
789     * @see GenericObjectPool#getLifo()
790     * @see GenericKeyedObjectPool#getLifo()
791     */
792    public void setLifo(final boolean lifo) {
793        this.lifo = lifo;
794    }
795
796    /**
797     * Sets the value for the {@code maxWait} configuration attribute for pools created with this configuration instance.
798     *
799     * @param maxWaitDuration The new setting of {@code maxWaitDuration} for this configuration instance
800     * @see GenericObjectPool#getMaxWaitDuration()
801     * @see GenericKeyedObjectPool#getMaxWaitDuration()
802     * @since 2.11.0
803     */
804    public void setMaxWait(final Duration maxWaitDuration) {
805        this.maxWaitDuration = PoolImplUtils.nonNull(maxWaitDuration, DEFAULT_MAX_WAIT);
806    }
807
808    /**
809     * Sets the value for the {@code maxWait} configuration attribute for pools created with this configuration instance.
810     *
811     * @param maxWaitMillis The new setting of {@code maxWaitMillis} for this configuration instance
812     * @see GenericObjectPool#getMaxWaitDuration()
813     * @see GenericKeyedObjectPool#getMaxWaitDuration()
814     * @deprecated Use {@link #setMaxWait(Duration)}.
815     */
816    @Deprecated
817    public void setMaxWaitMillis(final long maxWaitMillis) {
818        setMaxWait(Duration.ofMillis(maxWaitMillis));
819    }
820
821    /**
822     * Sets the value for the {@code minEvictableIdleTime} configuration attribute for pools created with this configuration instance.
823     *
824     * @param minEvictableIdleTime The new setting of {@code minEvictableIdleTime} for this configuration instance
825     * @see GenericObjectPool#getMinEvictableIdleDuration()
826     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
827     * @since 2.12.0
828     */
829    public void setMinEvictableIdleDuration(final Duration minEvictableIdleTime) {
830        this.minEvictableIdleDuration = PoolImplUtils.nonNull(minEvictableIdleTime, DEFAULT_MIN_EVICTABLE_IDLE_TIME);
831    }
832
833    /**
834     * Sets the value for the {@code minEvictableIdleTime} configuration attribute for pools created with this configuration instance.
835     *
836     * @param minEvictableIdleTime The new setting of {@code minEvictableIdleTime} for this configuration instance
837     * @see GenericObjectPool#getMinEvictableIdleDuration()
838     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
839     * @since 2.10.0
840     * @deprecated Use {@link #setMinEvictableIdleDuration(Duration)}.
841     */
842    @Deprecated
843    public void setMinEvictableIdleTime(final Duration minEvictableIdleTime) {
844        this.minEvictableIdleDuration = PoolImplUtils.nonNull(minEvictableIdleTime, DEFAULT_MIN_EVICTABLE_IDLE_TIME);
845    }
846
847    /**
848     * Sets the value for the {@code minEvictableIdleTime} configuration attribute for pools created with this configuration instance.
849     *
850     * @param minEvictableIdleTimeMillis The new setting of {@code minEvictableIdleTime} for this configuration instance
851     * @see GenericObjectPool#getMinEvictableIdleDuration()
852     * @see GenericKeyedObjectPool#getMinEvictableIdleDuration()
853     * @deprecated Use {@link #setMinEvictableIdleDuration(Duration)}.
854     */
855    @Deprecated
856    public void setMinEvictableIdleTimeMillis(final long minEvictableIdleTimeMillis) {
857        this.minEvictableIdleDuration = Duration.ofMillis(minEvictableIdleTimeMillis);
858    }
859
860    /**
861     * Sets the value for the {@code numTestsPerEvictionRun} configuration attribute for pools created with this configuration instance.
862     *
863     * @param numTestsPerEvictionRun The new setting of {@code numTestsPerEvictionRun} for this configuration instance
864     * @see GenericObjectPool#getNumTestsPerEvictionRun()
865     * @see GenericKeyedObjectPool#getNumTestsPerEvictionRun()
866     */
867    public void setNumTestsPerEvictionRun(final int numTestsPerEvictionRun) {
868        this.numTestsPerEvictionRun = numTestsPerEvictionRun;
869    }
870
871    /**
872     * Sets the value for the {@code softMinEvictableIdleTime} configuration attribute for pools created with this configuration instance.
873     *
874     * @param softMinEvictableIdleTime The new setting of {@code softMinEvictableIdleTime} for this configuration instance
875     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
876     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
877     * @since 2.12.0
878     */
879    public void setSoftMinEvictableIdleDuration(final Duration softMinEvictableIdleTime) {
880        this.softMinEvictableIdleDuration = PoolImplUtils.nonNull(softMinEvictableIdleTime, DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME);
881    }
882
883    /**
884     * Sets the value for the {@code softMinEvictableIdleTime} configuration attribute for pools created with this configuration instance.
885     *
886     * @param softMinEvictableIdleTime The new setting of {@code softMinEvictableIdleTime} for this configuration instance
887     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
888     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
889     * @since 2.10.0
890     * @deprecated Use {@link #setSoftMinEvictableIdleDuration(Duration)}.
891     */
892    @Deprecated
893    public void setSoftMinEvictableIdleTime(final Duration softMinEvictableIdleTime) {
894        this.softMinEvictableIdleDuration = PoolImplUtils.nonNull(softMinEvictableIdleTime, DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME);
895    }
896
897    /**
898     * Sets the value for the {@code softMinEvictableIdleTime} configuration attribute for pools created with this configuration instance.
899     *
900     * @param softMinEvictableIdleTimeMillis The new setting of {@code softMinEvictableIdleTime} for this configuration instance
901     * @see GenericObjectPool#getSoftMinEvictableIdleDuration()
902     * @see GenericKeyedObjectPool#getSoftMinEvictableIdleDuration()
903     * @deprecated Use {@link #setSoftMinEvictableIdleDuration(Duration)}.
904     */
905    @Deprecated
906    public void setSoftMinEvictableIdleTimeMillis(final long softMinEvictableIdleTimeMillis) {
907        setSoftMinEvictableIdleTime(Duration.ofMillis(softMinEvictableIdleTimeMillis));
908    }
909
910    /**
911     * Sets the value for the {@code testOnBorrow} configuration attribute for pools created with this configuration instance.
912     *
913     * @param testOnBorrow The new setting of {@code testOnBorrow} for this configuration instance
914     * @see GenericObjectPool#getTestOnBorrow()
915     * @see GenericKeyedObjectPool#getTestOnBorrow()
916     */
917    public void setTestOnBorrow(final boolean testOnBorrow) {
918        this.testOnBorrow = testOnBorrow;
919    }
920
921    /**
922     * Sets the value for the {@code testOnCreate} configuration attribute for pools created with this configuration instance.
923     *
924     * @param testOnCreate The new setting of {@code testOnCreate} for this configuration instance
925     * @see GenericObjectPool#getTestOnCreate()
926     * @see GenericKeyedObjectPool#getTestOnCreate()
927     * @since 2.2
928     */
929    public void setTestOnCreate(final boolean testOnCreate) {
930        this.testOnCreate = testOnCreate;
931    }
932
933    /**
934     * Sets the value for the {@code testOnReturn} configuration attribute for pools created with this configuration instance.
935     *
936     * @param testOnReturn The new setting of {@code testOnReturn} for this configuration instance
937     * @see GenericObjectPool#getTestOnReturn()
938     * @see GenericKeyedObjectPool#getTestOnReturn()
939     */
940    public void setTestOnReturn(final boolean testOnReturn) {
941        this.testOnReturn = testOnReturn;
942    }
943
944    /**
945     * Sets the value for the {@code testWhileIdle} configuration attribute for pools created with this configuration instance.
946     *
947     * @param testWhileIdle The new setting of {@code testWhileIdle} for this configuration instance
948     * @see GenericObjectPool#getTestWhileIdle()
949     * @see GenericKeyedObjectPool#getTestWhileIdle()
950     */
951    public void setTestWhileIdle(final boolean testWhileIdle) {
952        this.testWhileIdle = testWhileIdle;
953    }
954
955    /**
956     * Sets the value for the {@code timeBetweenEvictionRuns} configuration attribute for pools created with this configuration instance.
957     *
958     * @param timeBetweenEvictionRuns The new setting of {@code timeBetweenEvictionRuns} for this configuration instance
959     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
960     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
961     * @since 2.10.0
962     */
963    public void setTimeBetweenEvictionRuns(final Duration timeBetweenEvictionRuns) {
964        this.durationBetweenEvictionRuns = PoolImplUtils.nonNull(timeBetweenEvictionRuns, DEFAULT_DURATION_BETWEEN_EVICTION_RUNS);
965    }
966
967    /**
968     * Sets the value for the {@code timeBetweenEvictionRuns} configuration attribute for pools created with this configuration instance.
969     *
970     * @param timeBetweenEvictionRunsMillis The new setting of {@code timeBetweenEvictionRuns} for this configuration instance
971     * @see GenericObjectPool#getDurationBetweenEvictionRuns()
972     * @see GenericKeyedObjectPool#getDurationBetweenEvictionRuns()
973     * @deprecated Use {@link #setTimeBetweenEvictionRuns(Duration)}.
974     */
975    @Deprecated
976    public void setTimeBetweenEvictionRunsMillis(final long timeBetweenEvictionRunsMillis) {
977        setTimeBetweenEvictionRuns(Duration.ofMillis(timeBetweenEvictionRunsMillis));
978    }
979
980    @Override
981    protected void toStringAppendFields(final StringBuilder builder) {
982        builder.append("lifo=");
983        builder.append(lifo);
984        builder.append(", fairness=");
985        builder.append(fairness);
986        builder.append(", maxWaitDuration=");
987        builder.append(maxWaitDuration);
988        builder.append(", minEvictableIdleTime=");
989        builder.append(minEvictableIdleDuration);
990        builder.append(", softMinEvictableIdleTime=");
991        builder.append(softMinEvictableIdleDuration);
992        builder.append(", numTestsPerEvictionRun=");
993        builder.append(numTestsPerEvictionRun);
994        builder.append(", evictionPolicyClassName=");
995        builder.append(evictionPolicyClassName);
996        builder.append(", testOnCreate=");
997        builder.append(testOnCreate);
998        builder.append(", testOnBorrow=");
999        builder.append(testOnBorrow);
1000        builder.append(", testOnReturn=");
1001        builder.append(testOnReturn);
1002        builder.append(", testWhileIdle=");
1003        builder.append(testWhileIdle);
1004        builder.append(", timeBetweenEvictionRuns=");
1005        builder.append(durationBetweenEvictionRuns);
1006        builder.append(", blockWhenExhausted=");
1007        builder.append(blockWhenExhausted);
1008        builder.append(", jmxEnabled=");
1009        builder.append(jmxEnabled);
1010        builder.append(", jmxNamePrefix=");
1011        builder.append(jmxNamePrefix);
1012        builder.append(", jmxNameBase=");
1013        builder.append(jmxNameBase);
1014        builder.append(", collectDetailedStatistics=");
1015        builder.append(collectDetailedStatistics);
1016    }
1017}