Skip to content

Commit d49bcb4

Browse files
committed
Modified QueryRequest to implement AutoClosable interface. Updated most of the tests and examples to use the try-with-resources statement.
1 parent b383297 commit d49bcb4

File tree

15 files changed

+571
-522
lines changed

15 files changed

+571
-522
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
99
query in an iterable/iterator format. The returned QueryIterableResult should
1010
be used in a try-with-resources statement to ensure proper closing of
1111
resources.
12-
- updated NoSQLHandle interface to extend AutoClosable
12+
- updated NoSQLHandle and QueryRequest interfaces to extend AutoClosable
1313

1414
## [5.3.2] 2022-03-21
1515

driver/src/main/java/oracle/nosql/driver/iam/FederationRequestHelper.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,21 +96,22 @@ static String getFederationRequestBody(String publicKey,
9696

9797
try {
9898
StringWriter sw = new StringWriter();
99-
JsonGenerator gen = createGenerator(sw);
100-
gen.writeStartObject();
101-
gen.writeStringField("publicKey", publicKey);
102-
gen.writeStringField("certificate", certificate);
103-
gen.writeStringField("purpose", purpose);
104-
gen.writeStringField("fingerprintAlgorithm", DEFAULT_FINGERPRINT);
105-
106-
gen.writeFieldName("intermediateCertificates");
107-
gen.writeStartArray();
108-
for (String interCert : interCerts) {
109-
gen.writeString(interCert);
99+
try (JsonGenerator gen = createGenerator(sw)) {
100+
gen.writeStartObject();
101+
gen.writeStringField("publicKey", publicKey);
102+
gen.writeStringField("certificate", certificate);
103+
gen.writeStringField("purpose", purpose);
104+
gen.writeStringField("fingerprintAlgorithm",
105+
DEFAULT_FINGERPRINT);
106+
107+
gen.writeFieldName("intermediateCertificates");
108+
gen.writeStartArray();
109+
for (String interCert : interCerts) {
110+
gen.writeString(interCert);
111+
}
112+
gen.writeEndArray();
113+
gen.writeEndObject();
110114
}
111-
gen.writeEndArray();
112-
gen.writeEndObject();
113-
gen.close();
114115

115116
return sw.toString();
116117
} catch (IOException ioe) {

driver/src/main/java/oracle/nosql/driver/ops/QueryRequest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@
4040
*
4141
* QueryRequest qreq = new QueryRequest().setStatement("select * from foo");
4242
*
43-
* for (MapValue row : handle.queryIterable(qreq) ) {
44-
* // do something with row
43+
* try (QueryIterableResult qir = handle.queryIterable(qreq)) {
44+
* for( MapValue row : qir) {
45+
* // do something with row
46+
* }
4547
* }
4648
* </pre>
4749
* <p>
@@ -67,7 +69,7 @@
6769
* may be empty. This is because during each execution the query is allowed to
6870
* read or write a maximum number of bytes. If this maximum is reached, execution
6971
* stops. This can happen before any result was generated (for example, if none
70-
* of the rows read satified the query conditions).
72+
* of the rows read satisfied the query conditions).
7173
* <p>
7274
* If an application wishes to terminate query execution before retrieving all
7375
* of the query results, it should call {@link #close} in order to release any
@@ -83,7 +85,8 @@
8385
* @see NoSQLHandle#query(QueryRequest)
8486
* @see NoSQLHandle#prepare(PrepareRequest)
8587
*/
86-
public class QueryRequest extends Request {
88+
public class QueryRequest
89+
extends Request implements AutoCloseable {
8790

8891
private int traceLevel;
8992

driver/src/main/java/oracle/nosql/driver/ops/QueryResult.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@
3434
* <pre>
3535
* NoSQLHandle handle = ...;
3636
*
37-
* QueryRequest qreq = new QueryRequest().setStatement("select * from foo");
37+
* try (QueryRequest qreq = new QueryRequest()
38+
* .setStatement("select * from * foo")) {
3839
*
39-
* do {
40-
* QueryResult qres = handle.query(qreq);
41-
* List&lt;MapValue&gt; results = qres.getResults();
42-
* // do something with the results
43-
* } while (!qreq.isDone())
40+
* do {
41+
* QueryResult qres = handle.query(qreq);
42+
* List&lt;MapValue&gt; results = qres.getResults();
43+
* // do something with the results
44+
* } while (!qreq.isDone());
45+
* }
4446
* </pre>
4547
*
4648
* @see NoSQLHandle#query

driver/src/test/java/oracle/nosql/driver/BasicTest.java

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@
3030
import java.util.concurrent.Executors;
3131
import java.util.concurrent.Future;
3232

33-
import org.junit.Test;
34-
35-
import oracle.nosql.driver.Durability;
3633
import oracle.nosql.driver.http.NoSQLHandleImpl;
3734
import oracle.nosql.driver.ops.DeleteRequest;
3835
import oracle.nosql.driver.ops.DeleteResult;
@@ -71,6 +68,8 @@
7168
import oracle.nosql.driver.values.StringValue;
7269
import oracle.nosql.driver.values.TimestampValue;
7370

71+
import org.junit.Test;
72+
7473
public class BasicTest extends ProxyTestBase {
7574

7675
@Test
@@ -1219,15 +1218,16 @@ public void testNullJsonNull() {
12191218
PreparedStatement prepStmt = prepRet.getPreparedStatement();
12201219

12211220
prepStmt.setVariable("$name", JsonNullValue.getInstance());
1222-
QueryRequest queryReq = new QueryRequest()
1223-
.setPreparedStatement(prepStmt);
1224-
QueryResult queryRet = handle.query(queryReq);
1225-
assertEquals(1, queryRet.getResults().size());
1226-
assertEquals(rowJsonNull, queryRet.getResults().get(0));
1227-
1228-
prepStmt.setVariable("$name", NullValue.getInstance());
1229-
queryRet = handle.query(queryReq);
1230-
assertEquals(0, queryRet.getResults().size());
1221+
try (QueryRequest queryReq = new QueryRequest()
1222+
.setPreparedStatement(prepStmt)) {
1223+
QueryResult queryRet = handle.query(queryReq);
1224+
assertEquals(1, queryRet.getResults().size());
1225+
assertEquals(rowJsonNull, queryRet.getResults().get(0));
1226+
1227+
prepStmt.setVariable("$name", NullValue.getInstance());
1228+
queryRet = handle.query(queryReq);
1229+
assertEquals(0, queryRet.getResults().size());
1230+
}
12311231
}
12321232

12331233
@Test
@@ -1264,10 +1264,11 @@ public void testExactMatch() {
12641264
/* test via query insert */
12651265
String insertQ =
12661266
"insert into tMatch(id, name, age) values(5, 'fred', 6)";
1267-
QueryRequest qReq = new QueryRequest().setStatement(insertQ);
1268-
QueryResult qRes = handle.query(qReq);
1269-
for (MapValue res : qRes.getResults()) {
1270-
assertEquals(1, res.get("NumRowsInserted").getInt());
1267+
try (QueryRequest qReq = new QueryRequest().setStatement(insertQ)) {
1268+
QueryResult qRes = handle.query(qReq);
1269+
for (MapValue res : qRes.getResults()) {
1270+
assertEquals(1, res.get("NumRowsInserted").getInt());
1271+
}
12711272
}
12721273

12731274
/* try using prepared query */
@@ -1276,11 +1277,12 @@ public void testExactMatch() {
12761277
PrepareRequest prepReq = new PrepareRequest().setStatement(insertQ);
12771278
PrepareResult prepRet = handle.prepare(prepReq);
12781279
PreparedStatement prepStmt = prepRet.getPreparedStatement();
1279-
qReq = new QueryRequest()
1280-
.setPreparedStatement(prepStmt);
1281-
qRes = handle.query(qReq);
1282-
for (MapValue res : qRes.getResults()) {
1283-
assertEquals(1, res.get("NumRowsInserted").getInt());
1280+
try (QueryRequest qReq = new QueryRequest()
1281+
.setPreparedStatement(prepStmt)) {
1282+
QueryResult qRes = handle.query(qReq);
1283+
for (MapValue res : qRes.getResults()) {
1284+
assertEquals(1, res.get("NumRowsInserted").getInt());
1285+
}
12841286
}
12851287
}
12861288

@@ -1352,22 +1354,24 @@ public void testIdentityColumn() {
13521354

13531355
/* try an insert query */
13541356
String insertQ = "insert into tIdentity(id, name) values(5, 'fred')";
1355-
QueryRequest qReq = new QueryRequest().setStatement(insertQ);
1356-
QueryResult qRes = handle.query(qReq);
1357-
for (MapValue res : qRes.getResults()) {
1358-
assertEquals(1, res.get("NumRowsInserted").getInt());
1357+
try (QueryRequest qReq = new QueryRequest().setStatement(insertQ)) {
1358+
QueryResult qRes = handle.query(qReq);
1359+
for (MapValue res : qRes.getResults()) {
1360+
assertEquals(1, res.get("NumRowsInserted").getInt());
1361+
}
13591362
}
13601363

13611364
insertQ = "insert into tIdentity(id, name) values(5, 'jack')";
13621365

13631366
PrepareRequest prepReq = new PrepareRequest().setStatement(insertQ);
13641367
PrepareResult prepRet = handle.prepare(prepReq);
13651368
PreparedStatement prepStmt = prepRet.getPreparedStatement();
1366-
qReq = new QueryRequest()
1367-
.setPreparedStatement(prepStmt);
1368-
qRes = handle.query(qReq);
1369-
for (MapValue res : qRes.getResults()) {
1370-
assertEquals(1, res.get("NumRowsInserted").getInt());
1369+
try (QueryRequest qReq = new QueryRequest()
1370+
.setPreparedStatement(prepStmt)) {
1371+
QueryResult qRes = handle.query(qReq);
1372+
for (MapValue res : qRes.getResults()) {
1373+
assertEquals(1, res.get("NumRowsInserted").getInt());
1374+
}
13711375
}
13721376
}
13731377

driver/src/test/java/oracle/nosql/driver/DriverTestBase.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.util.Base64.Encoder;
2929
import java.util.Date;
3030

31+
import com.sun.net.httpserver.HttpExchange;
32+
3133
import org.bouncycastle.asn1.x500.X500Name;
3234
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
3335
import org.bouncycastle.cert.X509CertificateHolder;
@@ -41,8 +43,6 @@
4143
import org.bouncycastle.operator.ContentSigner;
4244
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
4345

44-
import com.sun.net.httpserver.HttpExchange;
45-
4646
/**
4747
* A common base for driver tests. It is empty at this point but may
4848
* eventually contain common utilities.
@@ -106,9 +106,9 @@ public static void writeResponse(HttpExchange exchange,
106106
exchange.getResponseHeaders().set("Content-Type",
107107
"application/json");
108108
exchange.sendResponseHeaders(status, msg.length());
109-
OutputStream os = exchange.getResponseBody();
110-
os.write(msg.getBytes());
111-
os.close();
109+
try (OutputStream os = exchange.getResponseBody()) {
110+
os.write(msg.getBytes());
111+
}
112112
}
113113

114114
protected static String securityToken(String payload, PublicKey publicKey) {
@@ -164,17 +164,17 @@ protected static String generatePrivateKeyFile(String name,
164164
}
165165

166166
File keyFile = new File(getTestDir(), name);
167-
FileWriter privateWrite = new FileWriter(keyFile);
168-
JcaPEMWriter privatePemWriter = new JcaPEMWriter(privateWrite);
169-
if (pemEncryptor != null) {
170-
privatePemWriter.writeObject(keypair.getPrivate(), pemEncryptor);
171-
} else {
172-
privatePemWriter.writeObject(keypair.getPrivate());
173-
}
174-
175-
privatePemWriter.close();
176-
privateWrite.close();
167+
try (FileWriter privateWrite = new FileWriter(keyFile);
168+
JcaPEMWriter privatePemWriter = new JcaPEMWriter(privateWrite); ) {
177169

170+
if (pemEncryptor != null) {
171+
privatePemWriter
172+
.writeObject(keypair.getPrivate(), pemEncryptor);
173+
}
174+
else {
175+
privatePemWriter.writeObject(keypair.getPrivate());
176+
}
177+
}
178178
return keyFile.getAbsolutePath();
179179
}
180180

driver/src/test/java/oracle/nosql/driver/I18NTest.java

Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import java.io.OutputStreamWriter;
3030
import java.util.UUID;
3131

32-
import oracle.nosql.driver.NoSQLException;
3332
import oracle.nosql.driver.ops.DeleteRequest;
3433
import oracle.nosql.driver.ops.GetRequest;
3534
import oracle.nosql.driver.ops.GetResult;
@@ -69,13 +68,14 @@ public class I18NTest extends ProxyTestBase {
6968
public void createJsonTest(){
7069
try {
7170
for (String element : jsonFileNames) {
72-
InputStream is =
73-
getClass().getClassLoader().getResourceAsStream(element);
74-
MapValue mv =
75-
FieldValue.createFromJson(is, new JsonOptions()).asMap();
76-
expstr = readexpfile("fr",1);
77-
assertEquals(expstr, mv.getString("name"));
78-
is.close();
71+
try (InputStream is =
72+
getClass().getClassLoader().getResourceAsStream(element)) {
73+
MapValue mv =
74+
FieldValue.createFromJson(is, new JsonOptions())
75+
.asMap();
76+
expstr = readexpfile("fr", 1);
77+
assertEquals(expstr, mv.getString("name"));
78+
}
7979
}
8080
} catch (Exception e) {
8181
fail("Exception: " + e);
@@ -271,39 +271,42 @@ public void jsontableTest(){
271271
//" r.restaurantJSON.name < \"" + idxname + "\"";
272272

273273
//Create the Query Request
274-
QueryRequest queryRequest = new QueryRequest().
275-
setStatement(predQuery);
276-
277-
//Execute the query and get the response
278-
QueryResult queryRes = handle.query(queryRequest);
279-
if (queryRes.getResults().size() >0) {
280-
String name;
281-
String address;
282-
String phonenumber;
283-
String mobile_reserve_url;
284-
285-
for (MapValue record : queryRes.getResults()) {
286-
MapValue jsonValue = record.get("restaurantJSON").asMap();
287-
288-
name = jsonValue.getString("name");
289-
address = jsonValue.getString("address");
290-
phonenumber = jsonValue.getString("phone");
291-
mobile_reserve_url =
292-
jsonValue.getString("mobile_reserve_url");
293-
294-
// write the result data to an outputfile
295-
String oputrespath = basePath + outputres;
296-
OutputStreamWriter pw = null;
297-
FileOutputStream fs =
298-
new FileOutputStream(oputrespath,true);
299-
pw = new OutputStreamWriter(fs,"UTF8");
300-
pw.write(name + "\t");
301-
pw.write(address + "\t");
302-
pw.write(phonenumber + "\t");
303-
pw.write(mobile_reserve_url + "\n");
304-
pw.close();
305-
/* delete output file */
306-
new File(oputrespath).delete();
274+
try (QueryRequest queryRequest = new QueryRequest().
275+
setStatement(predQuery)) {
276+
277+
//Execute the query and get the response
278+
QueryResult queryRes = handle.query(queryRequest);
279+
if (queryRes.getResults().size() > 0) {
280+
String name;
281+
String address;
282+
String phonenumber;
283+
String mobile_reserve_url;
284+
285+
for (MapValue record : queryRes.getResults()) {
286+
MapValue jsonValue =
287+
record.get("restaurantJSON").asMap();
288+
289+
name = jsonValue.getString("name");
290+
address = jsonValue.getString("address");
291+
phonenumber = jsonValue.getString("phone");
292+
mobile_reserve_url =
293+
jsonValue.getString("mobile_reserve_url");
294+
295+
// write the result data to an outputfile
296+
String oputrespath = basePath + outputres;
297+
298+
FileOutputStream fs =
299+
new FileOutputStream(oputrespath, true);
300+
try (OutputStreamWriter pw =
301+
new OutputStreamWriter(fs, "UTF8")) {
302+
pw.write(name + "\t");
303+
pw.write(address + "\t");
304+
pw.write(phonenumber + "\t");
305+
pw.write(mobile_reserve_url + "\n");
306+
}
307+
/* delete output file */
308+
new File(oputrespath).delete();
309+
}
307310
}
308311
}
309312
} catch (FileNotFoundException fnfe) {

0 commit comments

Comments
 (0)