Skip to content

Commit ab2f413

Browse files
author
Tibor Dumitriu
committed
🐛 create or update a document from an InputStream and optionally specify a filename
Fixes #672
1 parent 9a7654b commit ab2f413

File tree

3 files changed

+172
-5
lines changed

3 files changed

+172
-5
lines changed

discovery/src/main/java/com/ibm/watson/developer_cloud/discovery/v1/Discovery.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,6 @@ public ServiceCall<CreateDocumentResponse> createDocument(CreateDocumentRequest
356356
}
357357
Validator.notNull(createRequest.getFile(), "Document " + FILE + " cannot be null");
358358
MediaType mediaType = supportedMediaTypes.get(createRequest.getMediaType());
359-
Validator.notNull(mediaType, String.format("Media Type '%s' not supported", createRequest.getMediaType()));
360359
RequestBody file = InputStreamRequestBody.create(mediaType, createRequest.getFile());
361360
MultipartBody.Builder multipartBuilder = new MultipartBody.Builder();
362361
multipartBuilder.setType(MultipartBody.FORM);

discovery/src/main/java/com/ibm/watson/developer_cloud/discovery/v1/model/document/CreateDocumentRequest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class CreateDocumentRequest extends GenericModel {
3131
private JsonObject metadata;
3232
private InputStream file;
3333
private String mediaType;
34+
private String fileName;
3435
//TODO add configuration
3536

3637
protected CreateDocumentRequest(Builder builder) {
@@ -40,6 +41,7 @@ protected CreateDocumentRequest(Builder builder) {
4041
this.metadata = builder.metadata;
4142
this.file = builder.file;
4243
this.mediaType = builder.mediaType;
44+
this.fileName = builder.fileName;
4345
}
4446

4547
public String getEnvironmentId() {
@@ -66,17 +68,23 @@ public String getMediaType() {
6668
return mediaType;
6769
}
6870

71+
public String getFileName() {
72+
return fileName;
73+
}
74+
6975
public static class Builder {
7076
private final String environmentId;
7177
private final String collectionId;
7278
private String configurationId;
7379
private JsonObject metadata;
7480
private InputStream file;
7581
private String mediaType;
82+
private String fileName;
7683

7784
public Builder(String environmentId, String collectionId) {
7885
this.environmentId = environmentId;
7986
this.collectionId = collectionId;
87+
this.fileName = this.fileName == null || this.fileName.isEmpty() ? "file_name_not_provided" : this.fileName;
8088
}
8189

8290
public Builder configurationId(String configurationId) {
@@ -89,17 +97,65 @@ public Builder metadata(JsonObject metadata) {
8997
return this;
9098
}
9199

100+
/**
101+
* @deprecated
102+
* Use instead file(InputStream content, String mediaType)
103+
*
104+
* @param file An input stream of bytes
105+
* @param mediaType The media type
106+
* @return A document builder
107+
*/
108+
@Deprecated
92109
public Builder inputStream(InputStream file, String mediaType) {
93110
this.file = file;
94111
this.mediaType = mediaType;
95112
return this;
96113
}
97114

115+
public Builder file(InputStream content) {
116+
this.file = content;
117+
return this;
118+
}
119+
120+
public Builder file(InputStream content, String mediaType) {
121+
this.file = content;
122+
this.mediaType = mediaType;
123+
return this;
124+
}
125+
126+
/**
127+
* Create a document builder with an input stream, file name, and media type.
128+
*
129+
* @param content An input stream of bytes
130+
* @param fileName The file name
131+
* @param mediaType The media type. If the media type is unknown then use null or empty string.
132+
* @return A document builder
133+
*/
134+
public Builder file(InputStream content, String fileName, String mediaType) {
135+
this.file = content;
136+
this.mediaType = mediaType;
137+
this.fileName = fileName;
138+
return this;
139+
}
140+
98141
public Builder file(File inputFile, String mediaType) {
99142
InputStream file;
100143
try {
101144
file = new FileInputStream(inputFile);
102145
this.mediaType = mediaType;
146+
this.fileName = inputFile.getName();
147+
} catch (FileNotFoundException e) {
148+
file = null;
149+
}
150+
this.file = file;
151+
return this;
152+
}
153+
154+
public Builder file(File inputFile) {
155+
InputStream file;
156+
try {
157+
file = new FileInputStream(inputFile);
158+
this.fileName = inputFile.getName();
103159
} catch (FileNotFoundException e) {
104160
file = null;
105161
}

discovery/src/test/java/com/ibm/watson/developer_cloud/discovery/v1/DiscoveryServiceTest.java

Lines changed: 116 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,7 @@
7373

7474
import static org.junit.Assert.assertEquals;
7575

76-
import java.io.ByteArrayInputStream;
77-
import java.io.FileNotFoundException;
78-
import java.io.FileReader;
79-
import java.io.InputStream;
76+
import java.io.*;
8077
import java.util.HashSet;
8178
import java.util.Set;
8279

@@ -440,6 +437,121 @@ public void createDocumentIsSuccessful() throws InterruptedException {
440437
assertEquals(createDocResp, response);
441438
}
442439

440+
@Test
441+
public void createDocumentFromInputStreamIsSuccessful() throws InterruptedException {
442+
server.enqueue(jsonResponse(createDocResp));
443+
String myDocumentJson = "{\"field\":\"value\"}";
444+
JsonObject myMetadata = new JsonObject();
445+
myMetadata.add("foo", new JsonPrimitive("bar"));
446+
InputStream documentStream = new ByteArrayInputStream(myDocumentJson.getBytes());
447+
448+
CreateDocumentRequest.Builder builder = new CreateDocumentRequest.Builder(environmentId, collectionId);
449+
builder.file(documentStream);
450+
builder.metadata(myMetadata);
451+
CreateDocumentResponse response = discoveryService.createDocument(builder.build()).execute();
452+
RecordedRequest request = server.takeRequest();
453+
454+
assertEquals(DOCS1_PATH, request.getPath());
455+
assertEquals(POST, request.getMethod());
456+
assertEquals(createDocResp, response);
457+
}
458+
459+
@Test
460+
public void createDocumentFromInputStreamWithMediaTypeIsSuccessful() throws InterruptedException {
461+
server.enqueue(jsonResponse(createDocResp));
462+
String myDocumentJson = "{\"field\":\"value\"}";
463+
JsonObject myMetadata = new JsonObject();
464+
myMetadata.add("foo", new JsonPrimitive("bar"));
465+
InputStream documentStream = new ByteArrayInputStream(myDocumentJson.getBytes());
466+
467+
CreateDocumentRequest.Builder builder = new CreateDocumentRequest.Builder(environmentId, collectionId);
468+
builder.file(documentStream, HttpMediaType.APPLICATION_JSON);
469+
builder.metadata(myMetadata);
470+
CreateDocumentResponse response = discoveryService.createDocument(builder.build()).execute();
471+
RecordedRequest request = server.takeRequest();
472+
473+
assertEquals(DOCS1_PATH, request.getPath());
474+
assertEquals(POST, request.getMethod());
475+
assertEquals(createDocResp, response);
476+
}
477+
478+
@Test
479+
public void createDocumentFromInputStreamWithFileNameAndMediaTypeIsSuccessful() throws InterruptedException {
480+
server.enqueue(jsonResponse(createDocResp));
481+
String fileName = "MyFileName";
482+
String myDocumentJson = "{\"field\":\"value\"}";
483+
JsonObject myMetadata = new JsonObject();
484+
myMetadata.add("foo", new JsonPrimitive("bar"));
485+
InputStream documentStream = new ByteArrayInputStream(myDocumentJson.getBytes());
486+
487+
CreateDocumentRequest.Builder builder = new CreateDocumentRequest.Builder(environmentId, collectionId);
488+
builder.file(documentStream, fileName, HttpMediaType.APPLICATION_JSON);
489+
builder.metadata(myMetadata);
490+
CreateDocumentResponse response = discoveryService.createDocument(builder.build()).execute();
491+
RecordedRequest request = server.takeRequest();
492+
493+
assertEquals(DOCS1_PATH, request.getPath());
494+
assertEquals(POST, request.getMethod());
495+
assertEquals(createDocResp, response);
496+
}
497+
498+
@Test
499+
public void createDocumentFromFileWithMediaTypeIsSuccessful() throws InterruptedException {
500+
server.enqueue(jsonResponse(createDocResp));
501+
String myDocumentJson = "{\"field\":\"value\"}";
502+
JsonObject myMetadata = new JsonObject();
503+
myMetadata.add("foo", new JsonPrimitive("bar"));
504+
505+
CreateDocumentRequest.Builder builder = new CreateDocumentRequest.Builder(environmentId, collectionId);
506+
507+
try {
508+
File tempFile = File.createTempFile("CreateDocTest1", ".json");
509+
tempFile.deleteOnExit();
510+
BufferedWriter out = new BufferedWriter(new FileWriter(tempFile));
511+
out.write(myDocumentJson);
512+
out.close();
513+
514+
builder.file(tempFile, HttpMediaType.APPLICATION_JSON);
515+
builder.metadata(myMetadata);
516+
CreateDocumentResponse response = discoveryService.createDocument(builder.build()).execute();
517+
RecordedRequest request = server.takeRequest();
518+
519+
assertEquals(DOCS1_PATH, request.getPath());
520+
assertEquals(POST, request.getMethod());
521+
assertEquals(createDocResp, response);
522+
} catch (final IOException e) {
523+
e.printStackTrace();
524+
}
525+
}
526+
527+
@Test
528+
public void createDocumentFromFileIsSuccessful() throws InterruptedException {
529+
server.enqueue(jsonResponse(createDocResp));
530+
String myDocumentJson = "{\"field\":\"value\"}";
531+
JsonObject myMetadata = new JsonObject();
532+
myMetadata.add("foo", new JsonPrimitive("bar"));
533+
534+
CreateDocumentRequest.Builder builder = new CreateDocumentRequest.Builder(environmentId, collectionId);
535+
try {
536+
File tempFile = File.createTempFile("CreateDocTest2", ".json");
537+
tempFile.deleteOnExit();
538+
BufferedWriter out = new BufferedWriter(new FileWriter(tempFile));
539+
out.write(myDocumentJson);
540+
out.close();
541+
542+
builder.file(tempFile);
543+
builder.metadata(myMetadata);
544+
CreateDocumentResponse response = discoveryService.createDocument(builder.build()).execute();
545+
RecordedRequest request = server.takeRequest();
546+
547+
assertEquals(DOCS1_PATH, request.getPath());
548+
assertEquals(POST, request.getMethod());
549+
assertEquals(createDocResp, response);
550+
} catch (final IOException e) {
551+
e.printStackTrace();
552+
}
553+
}
554+
443555
@Test
444556
public void updateDocumentIsSuccessful() throws InterruptedException {
445557
server.enqueue(jsonResponse(updateDocResp));

0 commit comments

Comments
 (0)