Skip to content

Commit d2b1a15

Browse files
Define extended Options in OracleR2dbcOptions
1 parent 62c6d21 commit d2b1a15

File tree

3 files changed

+265
-71
lines changed

3 files changed

+265
-71
lines changed
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
/*
2+
Copyright (c) 2020, 2021, Oracle and/or its affiliates.
3+
4+
This software is dual-licensed to you under the Universal Permissive License
5+
(UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License
6+
2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
7+
either license.
8+
9+
Licensed under the Apache License, Version 2.0 (the "License");
10+
you may not use this file except in compliance with the License.
11+
You may obtain a copy of the License at
12+
13+
https://www.apache.org/licenses/LICENSE-2.0
14+
15+
Unless required by applicable law or agreed to in writing, software
16+
distributed under the License is distributed on an "AS IS" BASIS,
17+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
See the License for the specific language governing permissions and
19+
limitations under the License.
20+
*/
21+
package oracle.r2dbc;
22+
23+
import io.r2dbc.spi.Option;
24+
import oracle.jdbc.OracleConnection;
25+
26+
import java.util.concurrent.Executor;
27+
import java.util.concurrent.ForkJoinPool;
28+
29+
/**
30+
* Extended {@link Option}s supported by the Oracle R2DBC Driver.
31+
*/
32+
public final class OracleR2dbcOptions {
33+
34+
private OracleR2dbcOptions() {}
35+
36+
/**
37+
* Extended {@code Option} that specifies an Oracle Net Connect Descriptor
38+
* of the form "(DESCRIPTION=...)"
39+
*/
40+
public static final Option<CharSequence> DESCRIPTOR =
41+
Option.valueOf("oracle.r2dbc.descriptor");
42+
43+
/**
44+
* Extended {@code Option} that specifies an {@link Executor} for executing
45+
* asynchronous tasks. This {@code Option} can not be configured in the
46+
* query section of an R2DBC URL, it must be configured programmatically,
47+
* as in:
48+
* <pre>
49+
* Executor myExecutor = getMyExecutor();
50+
*
51+
* ConnectionFactoryOptions options = ConnectionFactoryOptions.builder()
52+
* .option(ConnectionFactoryOptions.DRIVER, "oracle")
53+
* .option(OracleR2dbcOptions.EXECUTOR, myExecutor)
54+
* ...
55+
* .build();
56+
* </pre>
57+
* If this option is not configured, then Oracle R2DBC will use
58+
* {@code ForkJoinPool}'s
59+
* {@linkplain ForkJoinPool#commonPool() common pool} by default.
60+
*/
61+
public static final Option<Executor> EXECUTOR =
62+
Option.valueOf("oracle.r2dbc.executor");
63+
64+
/**
65+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
66+
* {@link OracleConnection#CONNECTION_PROPERTY_TNS_ADMIN}
67+
*/
68+
public static final Option<CharSequence> TNS_ADMIN =
69+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_TNS_ADMIN);
70+
71+
/**
72+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
73+
* {@link OracleConnection#CONNECTION_PROPERTY_WALLET_LOCATION}
74+
*/
75+
public static final Option<CharSequence> TLS_WALLET_LOCATION =
76+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_WALLET_LOCATION);
77+
78+
/**
79+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
80+
* {@link OracleConnection#CONNECTION_PROPERTY_WALLET_PASSWORD}
81+
*/
82+
public static final Option<CharSequence> TLS_WALLET_PASSWORD =
83+
Option.sensitiveValueOf(OracleConnection.CONNECTION_PROPERTY_WALLET_PASSWORD);
84+
85+
/**
86+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
87+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTORE}
88+
*/
89+
public static final Option<CharSequence> TLS_KEYSTORE =
90+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTORE);
91+
92+
/**
93+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
94+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTORETYPE}
95+
*/
96+
public static final Option<CharSequence> TLS_KEYSTORE_TYPE =
97+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTORETYPE);
98+
99+
/**
100+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
101+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTOREPASSWORD}
102+
*/
103+
public static final Option<CharSequence> TLS_KEYSTORE_PASSWORD =
104+
Option.sensitiveValueOf(OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTOREPASSWORD);
105+
106+
/**
107+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
108+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTORE}
109+
*/
110+
public static final Option<CharSequence> TLS_TRUSTSTORE =
111+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTORE);
112+
113+
/**
114+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
115+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTORETYPE}
116+
*/
117+
public static final Option<CharSequence> TLS_TRUSTSTORE_TYPE =
118+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTORETYPE);
119+
120+
/**
121+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
122+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTOREPASSWORD}
123+
*/
124+
public static final Option<CharSequence> TLS_TRUSTSTORE_PASSWORD =
125+
Option.sensitiveValueOf(OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTOREPASSWORD);
126+
127+
/**
128+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
129+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES}
130+
*/
131+
public static final Option<CharSequence> AUTHENTICATION_SERVICES =
132+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES);
133+
134+
/**
135+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
136+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_SSL_CERTIFICATE_ALIAS}
137+
*/
138+
public static final Option<CharSequence> TLS_CERTIFICATE_ALIAS =
139+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_SSL_CERTIFICATE_ALIAS);
140+
141+
/**
142+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
143+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_SSL_SERVER_DN_MATCH}
144+
*/
145+
public static final Option<CharSequence> TLS_SERVER_DN_MATCH =
146+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_SSL_SERVER_DN_MATCH);
147+
148+
/**
149+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
150+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_SSL_SERVER_CERT_DN}
151+
*/
152+
public static final Option<CharSequence> TLS_SERVER_CERT_DN =
153+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_SSL_SERVER_CERT_DN);
154+
155+
/**
156+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
157+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_SSL_VERSION}
158+
*/
159+
public static final Option<CharSequence> TLS_VERSION =
160+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_SSL_VERSION);
161+
162+
/**
163+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
164+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_SSL_CIPHER_SUITES}
165+
*/
166+
public static final Option<CharSequence> TLS_CIPHER_SUITES =
167+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_SSL_CIPHER_SUITES);
168+
169+
/**
170+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
171+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_SSL_KEYMANAGERFACTORY_ALGORITHM}
172+
*/
173+
public static final Option<CharSequence> TLS_KEYMANAGERFACTORY_ALGORITHM =
174+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_SSL_KEYMANAGERFACTORY_ALGORITHM);
175+
176+
/**
177+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
178+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_SSL_TRUSTMANAGERFACTORY_ALGORITHM}
179+
*/
180+
public static final Option<CharSequence> TLS_TRUSTMANAGERFACTORY_ALGORITHM =
181+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_SSL_TRUSTMANAGERFACTORY_ALGORITHM);
182+
183+
/**
184+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
185+
* {@link OracleConnection#CONNECTION_PROPERTY_SSL_CONTEXT_PROTOCOL}
186+
*/
187+
public static final Option<CharSequence> SSL_CONTEXT_PROTOCOL =
188+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_SSL_CONTEXT_PROTOCOL);
189+
190+
/**
191+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
192+
* {@link OracleConnection#CONNECTION_PROPERTY_FAN_ENABLED}
193+
*/
194+
public static final Option<CharSequence> FAN_ENABLED =
195+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_FAN_ENABLED);
196+
197+
/**
198+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
199+
* {@link OracleConnection#CONNECTION_PROPERTY_IMPLICIT_STATEMENT_CACHE_SIZE}
200+
*/
201+
public static final Option<CharSequence> IMPLICIT_STATEMENT_CACHE_SIZE =
202+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_IMPLICIT_STATEMENT_CACHE_SIZE);
203+
204+
/**
205+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
206+
* {@link OracleConnection#CONNECTION_PROPERTY_DEFAULT_LOB_PREFETCH_SIZE}
207+
*/
208+
public static final Option<CharSequence> DEFAULT_LOB_PREFETCH_SIZE =
209+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_DEFAULT_LOB_PREFETCH_SIZE);
210+
211+
/**
212+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
213+
* {@link OracleConnection#CONNECTION_PROPERTY_THIN_NET_DISABLE_OUT_OF_BAND_BREAK}
214+
*/
215+
public static final Option<CharSequence> DISABLE_OUT_OF_BAND_BREAK =
216+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_THIN_NET_DISABLE_OUT_OF_BAND_BREAK);
217+
218+
/**
219+
* Configures the Oracle JDBC Connection used by Oracle R2DBC as specified by:
220+
* {@link OracleConnection#CONNECTION_PROPERTY_ENABLE_QUERY_RESULT_CACHE}
221+
*/
222+
public static final Option<CharSequence> ENABLE_QUERY_RESULT_CACHE =
223+
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_ENABLE_QUERY_RESULT_CACHE);
224+
}

src/main/java/oracle/r2dbc/impl/OracleReactiveJdbcAdapter.java

Lines changed: 29 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import oracle.jdbc.OracleResultSet;
3434
import oracle.jdbc.OracleRow;
3535
import oracle.jdbc.datasource.OracleDataSource;
36+
import oracle.r2dbc.OracleR2dbcOptions;
3637
import oracle.r2dbc.impl.OracleR2dbcExceptions.ThrowingSupplier;
3738
import org.reactivestreams.Publisher;
3839
import org.reactivestreams.Subscriber;
@@ -139,96 +140,65 @@ final class OracleReactiveJdbcAdapter implements ReactiveJdbcAdapter {
139140
SUPPORTED_CONNECTION_PROPERTY_OPTIONS = Set.of(
140141

141142
// Support TNS_ADMIN (tnsnames.ora, ojdbc.properties).
142-
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_TNS_ADMIN),
143+
OracleR2dbcOptions.TNS_ADMIN,
143144

144145
// Support wallet properties for TCPS/SSL/TLS
145-
Option.valueOf(OracleConnection.CONNECTION_PROPERTY_WALLET_LOCATION),
146-
Option.sensitiveValueOf(
147-
OracleConnection.CONNECTION_PROPERTY_WALLET_PASSWORD),
146+
OracleR2dbcOptions.TLS_WALLET_LOCATION,
147+
OracleR2dbcOptions.TLS_WALLET_PASSWORD,
148148

149149
// Support keystore properties for TCPS/SSL/TLS
150-
Option.valueOf(
151-
OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTORE),
152-
Option.valueOf(
153-
OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTORETYPE),
150+
OracleR2dbcOptions.TLS_KEYSTORE,
151+
OracleR2dbcOptions.TLS_KEYSTORE_TYPE,
154152
Option.sensitiveValueOf(
155153
OracleConnection
156154
.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_KEYSTOREPASSWORD),
157155

158156
// Support truststore properties for TCPS/SSL/TLS
159-
Option.valueOf(
160-
OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTORE),
161-
Option.valueOf(
162-
OracleConnection.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTORETYPE),
163-
Option.sensitiveValueOf(
164-
OracleConnection
165-
.CONNECTION_PROPERTY_THIN_JAVAX_NET_SSL_TRUSTSTOREPASSWORD),
157+
OracleR2dbcOptions.TLS_TRUSTSTORE,
158+
OracleR2dbcOptions.TLS_TRUSTSTORE_TYPE,
159+
OracleR2dbcOptions.TLS_TRUSTSTORE_PASSWORD,
166160

167161
// Support authentication services (RADIUS, KERBEROS, and TCPS)
168-
Option.valueOf(
169-
OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES),
162+
OracleR2dbcOptions.AUTHENTICATION_SERVICES,
170163

171164
// Support fine grained configuration for TCPS/SSL/TLS
172-
Option.valueOf(
173-
OracleConnection.CONNECTION_PROPERTY_THIN_SSL_CERTIFICATE_ALIAS),
174-
Option.valueOf(
175-
OracleConnection.CONNECTION_PROPERTY_THIN_SSL_SERVER_DN_MATCH),
176-
Option.valueOf(
177-
OracleConnection.CONNECTION_PROPERTY_THIN_SSL_SERVER_CERT_DN),
178-
Option.valueOf(
179-
OracleConnection.CONNECTION_PROPERTY_THIN_SSL_VERSION),
180-
Option.valueOf(
181-
OracleConnection.CONNECTION_PROPERTY_THIN_SSL_CIPHER_SUITES),
182-
Option.valueOf(
183-
OracleConnection
184-
.CONNECTION_PROPERTY_THIN_SSL_KEYMANAGERFACTORY_ALGORITHM),
185-
Option.valueOf(
186-
OracleConnection
187-
.CONNECTION_PROPERTY_THIN_SSL_TRUSTMANAGERFACTORY_ALGORITHM),
188-
Option.valueOf(
189-
OracleConnection.CONNECTION_PROPERTY_SSL_CONTEXT_PROTOCOL),
165+
OracleR2dbcOptions.TLS_CERTIFICATE_ALIAS,
166+
OracleR2dbcOptions.TLS_SERVER_DN_MATCH,
167+
OracleR2dbcOptions.TLS_SERVER_CERT_DN,
168+
OracleR2dbcOptions.TLS_VERSION,
169+
OracleR2dbcOptions.TLS_CIPHER_SUITES,
170+
OracleR2dbcOptions.TLS_KEYMANAGERFACTORY_ALGORITHM,
171+
OracleR2dbcOptions.TLS_TRUSTMANAGERFACTORY_ALGORITHM,
172+
OracleR2dbcOptions.SSL_CONTEXT_PROTOCOL,
190173

191174
// Because of bug 32378754, the FAN support in the driver may cause a 10s
192175
// delay to connect. As a workaround the following property can be set
193176
// to false to disable FAN support in the driver.
194-
Option.valueOf(
195-
OracleConnection.CONNECTION_PROPERTY_FAN_ENABLED),
177+
OracleR2dbcOptions.FAN_ENABLED,
196178

197179
// Support statement cache configuration
198-
Option.valueOf(
199-
OracleConnection.CONNECTION_PROPERTY_IMPLICIT_STATEMENT_CACHE_SIZE),
180+
OracleR2dbcOptions.IMPLICIT_STATEMENT_CACHE_SIZE,
200181

201182
// Support LOB prefetch size configuration. A large size is configured
202183
// by default to support cases where memory is available to store entire
203184
// LOB values. A non-default size may be configured when LOB values are
204185
// too large to be prefetched and must be streamed from Blob/Clob objects.
205-
Option.valueOf(
206-
OracleConnection.CONNECTION_PROPERTY_DEFAULT_LOB_PREFETCH_SIZE),
186+
OracleR2dbcOptions.DEFAULT_LOB_PREFETCH_SIZE,
207187

208188
// Allow out-of-band (OOB) breaks to be disabled. Oracle JDBC uses OOB
209189
// breaks to interrupt a SQL call after a timeout expires. This option
210190
// may need to be disabled when connecting to an 18.x database. Starting
211191
// in 19.x, the database can detect when it's running on a system where
212192
// OOB is not supported and automatically disable OOB. This automated
213193
// detection is not impleneted in 18.x.
214-
Option.valueOf(
215-
OracleConnection
216-
.CONNECTION_PROPERTY_THIN_NET_DISABLE_OUT_OF_BAND_BREAK),
194+
OracleR2dbcOptions.DISABLE_OUT_OF_BAND_BREAK,
217195

218196
// Allow the client-side ResultSet cache to be disabled. It is
219197
// necessary to do so when using the serializable transaction isolation
220198
// level in order to prevent phantom reads.
221-
Option.valueOf(
222-
OracleConnection.CONNECTION_PROPERTY_ENABLE_QUERY_RESULT_CACHE)
199+
OracleR2dbcOptions.ENABLE_QUERY_RESULT_CACHE
223200
);
224201

225-
/**
226-
* Extended {@code Option} that specifies an Oracle Net Connect Descriptor
227-
* of the form "(DESCRIPTION=...)"
228-
*/
229-
private static final Option<CharSequence> DESCRIPTOR =
230-
Option.valueOf("oracleNetDescriptor");
231-
232202
/** Guards access to a JDBC {@code Connection} created by this adapter */
233203
private final AsyncLock asyncLock = new AsyncLock();
234204

@@ -432,7 +402,7 @@ public DataSource createDataSource(ConnectionFactoryOptions options) {
432402
* conflicting values, such as {@link ConnectionFactoryOptions#HOST}.
433403
*/
434404
private static String composeJdbcUrl(ConnectionFactoryOptions options) {
435-
Object descriptor = options.getValue(DESCRIPTOR);
405+
Object descriptor = options.getValue(OracleR2dbcOptions.DESCRIPTOR);
436406

437407
if (descriptor != null) {
438408
validateDescriptorOptions(options);
@@ -455,10 +425,10 @@ private static String composeJdbcUrl(ConnectionFactoryOptions options) {
455425
}
456426

457427
/**
458-
* Validates {@code options} when the {@link #DESCRIPTOR} {@code Option} is
459-
* present. It is invalid to specify any other options having information
460-
* that potentially conflicts with information in the descriptor, such as
461-
* {@link ConnectionFactoryOptions#HOST}.
428+
* Validates {@code options} when the {@link OracleR2dbcOptions#DESCRIPTOR}
429+
* {@code Option} is present. It is invalid to specify any other options
430+
* having information that potentially conflicts with information in the
431+
* descriptor, such as {@link ConnectionFactoryOptions#HOST}.
462432
* @param options Options to validate
463433
* @throws IllegalArgumentException If {@code options} are invalid
464434
*/
@@ -477,7 +447,7 @@ private static void validateDescriptorOptions(
477447
.toArray(Option[]::new);
478448

479449
if (conflictingOptions.length != 0) {
480-
throw new IllegalArgumentException(DESCRIPTOR.name()
450+
throw new IllegalArgumentException(OracleR2dbcOptions.DESCRIPTOR.name()
481451
+ " Option has been specified with potentially conflicting Options: "
482452
+ Arrays.toString(conflictingOptions));
483453
}

0 commit comments

Comments
 (0)