View Javadoc
1   /*
2    *    Copyright 2009-2025 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.guice.datasource.dbcp;
17  
18  import jakarta.inject.Named;
19  import jakarta.inject.Provider;
20  
21  import java.time.Duration;
22  
23  import javax.sql.ConnectionPoolDataSource;
24  import javax.sql.DataSource;
25  
26  import org.apache.commons.dbcp2.datasources.SharedPoolDataSource;
27  
28  /**
29   * Provides the Apache commons-dbcp2 {@code SharedPoolDataSource}.
30   */
31  public final class SharedPoolDataSourceProvider implements Provider<DataSource> {
32  
33    private final SharedPoolDataSource dataSource = new SharedPoolDataSource();
34  
35    @com.google.inject.Inject(optional = true)
36    public void setConnectionPoolDataSource(ConnectionPoolDataSource cpds) {
37      dataSource.setConnectionPoolDataSource(cpds);
38    }
39  
40    @com.google.inject.Inject(optional = true)
41    public void setDataSourceName(@Named("DBCP.name") String name) {
42      dataSource.setDataSourceName(name);
43    }
44  
45    @com.google.inject.Inject(optional = true)
46    public void setDefaultAutoCommit(@Named("JDBC.autoCommit") boolean autoCommit) {
47      dataSource.setDefaultAutoCommit(autoCommit);
48    }
49  
50    @com.google.inject.Inject(optional = true)
51    public void setDefaultReadOnly(@Named("DBCP.defaultReadOnly") boolean defaultReadOnly) {
52      dataSource.setDefaultReadOnly(defaultReadOnly);
53    }
54  
55    @com.google.inject.Inject(optional = true)
56    public void setDefaultTransactionIsolation(
57        @Named("DBCP.defaultTransactionIsolation") int defaultTransactionIsolation) {
58      dataSource.setDefaultTransactionIsolation(defaultTransactionIsolation);
59    }
60  
61    @com.google.inject.Inject(optional = true)
62    public void setDescription(@Named("DBCP.description") String description) {
63      dataSource.setDescription(description);
64    }
65  
66    @com.google.inject.Inject(optional = true)
67    public void setJndiEnvironment(@Named("DBCP.jndi.key") String key, @Named("DBCP.jndi.value") String value) {
68      dataSource.setJndiEnvironment(key, value);
69    }
70  
71    @com.google.inject.Inject(optional = true)
72    public void setLoginTimeout(@Named("JDBC.loginTimeout") int loginTimeout) {
73      dataSource.setLoginTimeout(Duration.ofSeconds(loginTimeout));
74    }
75  
76    @com.google.inject.Inject(optional = true)
77    public void setDefaultMinEvictableIdleTimeMillis(
78        @Named("DBCP.defaultMinEvictableIdleTimeMillis") int defaultMinEvictableIdleTimeMillis) {
79      dataSource.setDefaultMinEvictableIdle(Duration.ofMillis(defaultMinEvictableIdleTimeMillis));
80    }
81  
82    @com.google.inject.Inject(optional = true)
83    public void setDefaultNumTestsPerEvictionRun(
84        @Named("DBCP.defaultNumTestsPerEvictionRun") int defaultNumTestsPerEvictionRun) {
85      dataSource.setDefaultNumTestsPerEvictionRun(defaultNumTestsPerEvictionRun);
86    }
87  
88    @com.google.inject.Inject(optional = true)
89    public void setRollbackAfterValidation(@Named("DBCP.rollbackAfterValidation") boolean rollbackAfterValidation) {
90      dataSource.setRollbackAfterValidation(rollbackAfterValidation);
91    }
92  
93    @com.google.inject.Inject(optional = true)
94    public void setDefaultTestOnBorrow(@Named("DBCP.defaultTestOnBorrow") boolean defaultTestOnBorrow) {
95      dataSource.setDefaultTestOnBorrow(defaultTestOnBorrow);
96    }
97  
98    @com.google.inject.Inject(optional = true)
99    public void setDefaultTestOnReturn(@Named("DBCP.defaultTestOnReturn") boolean defaultTestOnReturn) {
100     dataSource.setDefaultTestOnReturn(defaultTestOnReturn);
101   }
102 
103   @com.google.inject.Inject(optional = true)
104   public void setDefaultTestWhileIdle(@Named("DBCP.defaultTestWhileIdle") boolean defaultTestWhileIdle) {
105     dataSource.setDefaultTestWhileIdle(defaultTestWhileIdle);
106   }
107 
108   @com.google.inject.Inject(optional = true)
109   public void setDefaultTimeBetweenEvictionRunsMillis(
110       @Named("DBCP.defaultTimeBetweenEvictionRunsMillis") int defaultTimeBetweenEvictionRunsMillis) {
111     dataSource.setDefaultDurationBetweenEvictionRuns(Duration.ofMillis((defaultTimeBetweenEvictionRunsMillis)));
112   }
113 
114   @com.google.inject.Inject(optional = true)
115   public void setValidationQuery(@Named("DBCP.validationQuery") String validationQuery) {
116     dataSource.setValidationQuery(validationQuery);
117   }
118 
119   /**
120    * Sets the default max total.
121    *
122    * @param defaultMaxTotal
123    *          the new default max total
124    */
125   @com.google.inject.Inject(optional = true)
126   public void setDefaultMaxTotal(@Named("DBCP.defaultMaxTotal") final int defaultMaxTotal) {
127     dataSource.setDefaultMaxTotal(defaultMaxTotal);
128   }
129 
130   /**
131    * Sets the default max idle.
132    *
133    * @param defaultMaxIdle
134    *          the new default max idle
135    */
136   @com.google.inject.Inject(optional = true)
137   public void setDefaultMaxIdle(@Named("DBCP.defaultMaxIdle") final int defaultMaxIdle) {
138     dataSource.setDefaultMaxIdle(defaultMaxIdle);
139   }
140 
141   /**
142    * Sets the default max wait in milliseconds.
143    *
144    * @param defaultMaxWaitMillis
145    *          the new default max wait in milliseconds
146    */
147   @com.google.inject.Inject(optional = true)
148   public void setDefaultMaxWaitMillis(@Named("DBCP.defaultMaxWaitMillis") final int defaultMaxWaitMillis) {
149     dataSource.setDefaultMaxWait(Duration.ofMillis(defaultMaxWaitMillis));
150   }
151 
152   @Override
153   public DataSource get() {
154     return dataSource;
155   }
156 
157 }