Skip to content

Commit 72ded5c

Browse files
committed
added whitespace trimming to dataset-field loading + null check for header IQSS#10688
1 parent 93e7197 commit 72ded5c

File tree

3 files changed

+100
-5
lines changed

3 files changed

+100
-5
lines changed

src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public Response getByName(@PathParam("name") String name) {
126126
String solrFieldSearchable = dsf.getSolrField().getNameSearchable();
127127
String solrFieldFacetable = dsf.getSolrField().getNameFacetable();
128128
String metadataBlock = dsf.getMetadataBlock().getName();
129-
String uri=dsf.getUri();
129+
String uri = dsf.getUri();
130130
boolean hasParent = dsf.isHasParent();
131131
boolean allowsMultiples = dsf.isAllowMultiples();
132132
boolean isRequired = dsf.isRequired();
@@ -243,7 +243,9 @@ public Response loadDatasetFields(File file) {
243243
br = new BufferedReader(new FileReader("/" + file));
244244
while ((line = br.readLine()) != null) {
245245
lineNumber++;
246-
values = line.split(splitBy);
246+
values = Arrays.stream(line.split(splitBy))
247+
.map(String::trim)
248+
.toArray(String[]::new);
247249
if (values[0].startsWith("#")) { // Header row
248250
switch (values[0]) {
249251
case "#metadataBlock":
@@ -326,17 +328,17 @@ public Response loadDatasetFields(File file) {
326328
*/
327329
public String getGeneralErrorMessage(HeaderType header, int lineNumber, String message) {
328330
List<String> arguments = new ArrayList<>();
329-
arguments.add(header.name());
331+
arguments.add(header != null ? header.name() : "unknown");
330332
arguments.add(String.valueOf(lineNumber));
331333
arguments.add(message);
332334
return BundleUtil.getStringFromBundle("api.admin.datasetfield.load.GeneralErrorMessage", arguments);
333335
}
334336

335337
/**
336338
* Turn ArrayIndexOutOfBoundsException into an informative error message
337-
* @param lineNumber
338339
* @param header
339-
* @param e
340+
* @param lineNumber
341+
* @param wrongIndex
340342
* @return
341343
*/
342344
public String getArrayIndexOutOfBoundMessage(HeaderType header,

src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApiTest.java

+83
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,61 @@
11
package edu.harvard.iq.dataverse.api;
22

3+
import edu.harvard.iq.dataverse.ControlledVocabularyValueServiceBean;
4+
import edu.harvard.iq.dataverse.DatasetFieldServiceBean;
5+
import edu.harvard.iq.dataverse.DataverseServiceBean;
6+
import edu.harvard.iq.dataverse.MetadataBlockServiceBean;
7+
import edu.harvard.iq.dataverse.actionlogging.ActionLogServiceBean;
38
import edu.harvard.iq.dataverse.util.BundleUtil;
9+
import jakarta.json.Json;
10+
import jakarta.json.JsonObject;
11+
import jakarta.json.JsonReader;
12+
import jakarta.ws.rs.core.Response;
13+
import org.junit.jupiter.api.BeforeEach;
414
import org.junit.jupiter.api.Test;
15+
import org.junit.jupiter.api.extension.ExtendWith;
16+
import org.mockito.Mock;
17+
import org.mockito.junit.jupiter.MockitoExtension;
518

19+
import java.io.File;
20+
import java.io.StringReader;
21+
import java.nio.file.Path;
22+
import java.nio.file.Paths;
623
import java.util.ArrayList;
724
import java.util.List;
825

26+
import static org.assertj.core.api.Assertions.assertThat;
927
import static org.junit.jupiter.api.Assertions.assertEquals;
1028

29+
@ExtendWith(MockitoExtension.class)
1130
public class DatasetFieldServiceApiTest {
1231

32+
@Mock
33+
private ActionLogServiceBean actionLogSvc;
34+
35+
@Mock
36+
private MetadataBlockServiceBean metadataBlockService;
37+
38+
@Mock
39+
private DataverseServiceBean dataverseService;
40+
41+
@Mock
42+
private DatasetFieldServiceBean datasetFieldService;
43+
44+
@Mock
45+
private ControlledVocabularyValueServiceBean controlledVocabularyValueService;
46+
47+
private DatasetFieldServiceApi api;
48+
49+
@BeforeEach
50+
public void setup(){
51+
api = new DatasetFieldServiceApi();
52+
api.actionLogSvc = actionLogSvc;
53+
api.metadataBlockService = metadataBlockService;
54+
api.dataverseService = dataverseService;
55+
api.datasetFieldService = datasetFieldService;
56+
api.controlledVocabularyValueService = controlledVocabularyValueService;
57+
}
58+
1359
@Test
1460
public void testArrayIndexOutOfBoundMessageBundle() {
1561
List<String> arguments = new ArrayList<>();
@@ -59,4 +105,41 @@ public void testGetGeneralErrorMessage() {
59105
message
60106
);
61107
}
108+
109+
@Test
110+
public void testGetGeneralErrorMessageEmptyHeader() {
111+
DatasetFieldServiceApi api = new DatasetFieldServiceApi();
112+
String message = api.getGeneralErrorMessage(null, 5, "some error");
113+
assertEquals(
114+
"Error parsing metadata block in unknown part, line #5: some error",
115+
message
116+
);
117+
}
118+
119+
@Test
120+
public void testLoadDatasetFieldsWhitespaceTrimming() {
121+
122+
Path resourceDirectory = Paths.get("src/test/resources/tsv/whitespace-test.tsv");
123+
File testfile = new File(resourceDirectory.toFile().getAbsolutePath());
124+
JsonReader jsonReader;
125+
try (Response response = api.loadDatasetFields(testfile)) {
126+
assertEquals(200, response.getStatus());
127+
jsonReader = Json.createReader(new StringReader(response.getEntity().toString()));
128+
}
129+
JsonObject jsonObject = jsonReader.readObject();
130+
131+
final List<String> metadataNames = jsonObject.getJsonObject("data").getJsonArray("added")
132+
.getValuesAs(e -> e.asJsonObject().getString("name"));
133+
assertThat(metadataNames).contains("whitespaceDemo")
134+
.contains("whitespaceDemoOne")
135+
.contains("whitespaceDemoTwo")
136+
.contains("whitespaceDemoThree")
137+
.contains("CV1")
138+
.contains("CV2")
139+
.contains("CV3");
140+
assertThat(metadataNames).doesNotContain(" whitespaceDemo")
141+
.doesNotContain("whitespaceDemoOne ")
142+
.doesNotContain("CV1 ")
143+
.doesNotContain(" CV2");
144+
}
62145
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#metadataBlock name dataverseAlias displayName
2+
whitespaceDemo Whitespace Demo
3+
#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id
4+
whitespaceDemoOne One Trailing Space text 0 TRUE TRUE TRUE FALSE TRUE FALSE whitespaceDemo
5+
whitespaceDemoTwo Two Leading Space text 1 TRUE TRUE TRUE FALSE TRUE FALSE whitespaceDemo
6+
whitespaceDemoThree Three CV with errors text 2 TRUE TRUE TRUE FALSE TRUE FALSE whitespaceDemo
7+
#controlledVocabulary DatasetField Value identifier displayOrder
8+
whitespaceDemoThree CV1 0
9+
whitespaceDemoThree CV2 1
10+
whitespaceDemoThree CV3 2

0 commit comments

Comments
 (0)