Skip to content

Commit ce08c4f

Browse files
authored
Merge pull request #1316 from jjones287/feature/enhance-export
Add all keywords to metadata export
2 parents 0f04a53 + 0922cab commit ce08c4f

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

src/main/java/org/ecocean/export/EncounterAnnotationExportFile.java

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class EncounterAnnotationExportFile {
3636
private int numNameCols = 0;
3737
private int numSubmitters = 0;
3838
private int numSocialUnits = 1;
39+
private int numKeywords;
3940

4041
private List<String> measurementColTitles = new ArrayList<String>();
4142

@@ -64,11 +65,9 @@ public void writeToStream(OutputStream fileOut)
6465
throws NoSuchMethodException, ClassNotFoundException, InvocationTargetException,
6566
IllegalAccessException, IOException {
6667
String context = ServletUtilities.getContext(request);
67-
Vector rEncounters;
6868
EncounterQueryResult queryResult = EncounterQueryProcessor.processQuery(myShepherd, request,
6969
"year descending, month descending, day descending");
70-
71-
rEncounters = queryResult.getResult();
70+
Vector rEncounters = queryResult.getResult();
7271
int numMatchingEncounters = rEncounters.size();
7372

7473
// Security: categorize hidden encounters with the initializer
@@ -188,10 +187,10 @@ public void writeToStream(OutputStream fileOut)
188187

189188
newEasyColumn("Encounter.state", columns);
190189

191-
ExportColumn keywordCol = new ExportColumn(Keyword.class, "Reference keyword",
190+
ExportColumn refKeywordCol = new ExportColumn(Keyword.class, "Reference keyword",
192191
keywordGetName, columns);
193-
keywordCol.setKwNum(0);
194-
keywordCol.setMaNum(0);
192+
refKeywordCol.setKwNum(0);
193+
refKeywordCol.setMaNum(0);
195194

196195
// ExportColumn maPathK = new ExportColumn(User.class, submitterAffiliationName, submitterAffiliation, columns);
197196

@@ -204,7 +203,21 @@ public void writeToStream(OutputStream fileOut)
204203
ExportColumn maimageUrlK = new ExportColumn(MediaAsset.class, imageUrl, maImgUrl,
205204
columns);
206205
maimageUrlK.setMaNum(maNum);
207-
206+
for (int kwNum = 0; kwNum < numKeywords; kwNum++) {
207+
String keywordColName = "Encounter.mediaAsset" + maNum + ".keyword" + kwNum;
208+
ExportColumn keywordCol = new ExportColumn(Keyword.class, keywordColName,
209+
keywordGetName, columns);
210+
keywordCol.setMaNum(maNum);
211+
keywordCol.setKwNum(kwNum);
212+
}
213+
List<String> labels = myShepherd.getAllKeywordLabels();
214+
for (String label : labels) {
215+
String keywordColName = "Encounter.mediaAsset" + maNum + "." + label;
216+
ExportColumn keywordCol = new ExportColumn(LabeledKeyword.class, keywordColName,
217+
labeledKeywordGetValue, columns);
218+
keywordCol.setMaNum(maNum);
219+
keywordCol.setLabeledKwName(label);
220+
}
208221
ExportColumn aanBboxK = new ExportColumn(Annotation.class, bBox, annBbox, columns);
209222
aanBboxK.setMaNum(maNum);
210223

@@ -329,16 +342,28 @@ else if (exportCol.isFor(LabeledKeyword.class)) {
329342
}
330343
// end add labeled keywords
331344
else if (exportCol.isFor(Keyword.class)) {
332-
boolean keywordFound = false;
333-
for (MediaAsset ma : mas) {
334-
for (Keyword kw : ma.getKeywordsStrict()) {
335-
if (kw != null && kw.getReadableName().equals(REFERENCE_KEYWORD)) {
336-
exportCol.writeLabel(kw, row, sheet);
337-
keywordFound = true;
338-
break;
345+
if (Objects.equals(exportCol.header, "Reference keyword")) {
346+
boolean keywordFound = false;
347+
for (MediaAsset ma : mas) {
348+
for (Keyword kw : ma.getKeywordsStrict()) {
349+
if (kw != null && kw.getReadableName().equals(REFERENCE_KEYWORD)) {
350+
exportCol.writeLabel(kw, row, sheet);
351+
keywordFound = true;
352+
break;
353+
}
339354
}
355+
if (keywordFound) break;
340356
}
341-
if (keywordFound) break;
357+
} else {
358+
int maNum = exportCol.getMaNum();
359+
if (maNum >= mas.size()) continue;
360+
MediaAsset ma = mas.get(maNum);
361+
if (ma == null) continue; // on to next column
362+
int kwNum = exportCol.getKwNum();
363+
if (kwNum >= ma.numKeywordsStrict() || kwNum == -1) continue;
364+
Keyword kw = ma.getKeywordStrict(kwNum);
365+
if (kw == null) continue;
366+
exportCol.writeLabel(kw, row, sheet);
342367
}
343368
} else if (exportCol.isFor(Measurement.class)) {
344369
int measurementNumber = exportCol.getMeasurementNum();
@@ -427,6 +452,7 @@ void setMediaAssetCounts(Vector rEncounters, Shepherd myShepherd) {
427452
numNameCols = maxNumNames;
428453
numSubmitters = maxSubmitters;
429454
numSocialUnits = maxSocialUnits;
455+
numKeywords = maxNumKeywords;
430456
System.out.println(
431457
"EncounterAnnotationExportExcelFile: environment vars numMediaAssetCols = " +
432458
numMediaAssetCols + "; maxNumKeywords = " + maxNumKeywords + " and maxNumNames = " +

src/test/java/org/ecocean/api/EncounterExportImagesTest.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,8 +463,10 @@ private void assertExcelFileEquals(InputStream fis, List<String[]> expectedRows)
463463
String[] expectedRow = expectedRows.get(rowIndex);
464464

465465
assertNotNull(actualRow, "Row " + rowIndex + " should not be null");
466+
int actualCellCount = actualRow.getLastCellNum();
466467
// Compare each cell
467-
for (int cellIndex = 0; cellIndex < expectedRow.length; cellIndex++) {
468+
for (int cellIndex = 0; cellIndex < Math.min(expectedRow.length, actualCellCount);
469+
cellIndex++) {
468470
Cell actualCell = actualRow.getCell(cellIndex);
469471
String expectedValue = expectedRow[cellIndex];
470472
String actualValue = getCellValueAsString(actualCell);
@@ -500,7 +502,6 @@ private void assertExcelFileEquals(InputStream fis, List<String[]> expectedRows)
500502
}
501503
}
502504
// check there aren't extra cells in the Excel that we didn't compare
503-
int actualCellCount = actualRow.getLastCellNum();
504505
assertTrue(expectedRow.length >= actualCellCount,
505506
"Row " + rowIndex + " should have " + expectedRow.length + " cells");
506507
}
@@ -736,6 +737,23 @@ private static void initializeTestData() {
736737
MediaAsset asset2 = ((LocalAssetStore)localStore).create(testImage);
737738
MediaAsset asset3 = ((LocalAssetStore)localStore).create(testImage);
738739

740+
// Create keywords and add them to media assets
741+
org.ecocean.Keyword refKeyword = new org.ecocean.Keyword("Reference");
742+
org.ecocean.Keyword laboratoryKeyword = new org.ecocean.Keyword("Laboratory Study");
743+
org.ecocean.Keyword fieldKeyword = new org.ecocean.Keyword("Field Study");
744+
myShepherd.getPM().makePersistent(refKeyword);
745+
myShepherd.getPM().makePersistent(laboratoryKeyword);
746+
myShepherd.getPM().makePersistent(fieldKeyword);
747+
748+
// asset1 has Reference and Scientific keywords
749+
asset1.addKeyword(refKeyword);
750+
asset1.addKeyword(laboratoryKeyword);
751+
752+
// asset2 has only Field Study keyword
753+
asset2.addKeyword(fieldKeyword);
754+
755+
// asset3 has no keywords (to test that case)
756+
739757
// Create test encounters
740758
org.ecocean.Encounter enc1 = new org.ecocean.Encounter();
741759
enc1.setGenus("lynx");
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Occurrence.occurrenceID,Encounter.sourceUrl,Encounter.mediaAsset0,Encounter.mediaAsset1,Annotation0.ViewPoint,Annotation1.ViewPoint,Name0.label,Name0.value,IndividualSummary.sex,IndividualSummary.lifeStage,Encounter.genus,Encounter.specificEpithet,Encounter.verbatimLocality,Encounter.decimalLatitude,Encounter.decimalLongitude,Encounter.country,Encounter.locationID,Encounter.year,Encounter.month,Encounter.day,Encounter.hour,Encounter.minutes,Encounter.sex,Encounter.lifeStage,Encounter.occurrenceRemarks,Occurrence.comments,SocialUnit.socialUnitName0,Encounter.photographer0.Email,Encounter.photographer0.fullName,Encounter.state,Reference keyword,Encounter.alternateID,Encounter.mediaAsset0.imageUrl,Annotation0.bbox,Annotation0.MatchAgainst,Encounter.mediaAsset1.imageUrl,Annotation1.bbox,Annotation1.MatchAgainst
2-
c2dbf187-ac3b-450f-9886-aa4e49073844,http://localhost/wildbook/encounters/encounter.jsp?number=31439998-358a-4a02-8bf4-aa3b82f911c4,test_image.jpg,,right,,Default,Individual_1,unknown,cub,lynx,pardinus,iberia,37.15414445923345,-6.730740044168456,,,2025,5,3,0,00,,adult,,,,,,,,,file:/tmp/test_image.jpg,"[500, 0, 500, 500]",true,,,
3-
9cf5a4e7-4c81-466e-a788-8d976f869086,http://localhost/wildbook/encounters/encounter.jsp?number=302e0fed-a77a-4b6c-ab80-16f0ded0723b,test_image.jpg,test_image.jpg,left,,Default,Individual_1,unknown,cub,lynx,pardinus,iberia,37.15414445923345,-6.730740044168456,,,2024,6,1,0,00,,cub,,,,,,,,,file:/tmp/test_image.jpg,"[0, 0, 500, 500]",true,file:/tmp/test_image.jpg,,
4-
f981b20f-330a-4e52-bb0f-dd8d13f1e76a,http://localhost/wildbook/encounters/encounter.jsp?number=66b5ad21-c051-43fd-ba18-c8e9dbe646c2,test_image.jpg,,front,,Default,Individual_2,unknown,senior,lynx,pardinus,iberia,37.15414445923345,-6.730740044168456,,,0,-1,0,0,00,,senior,,,,,,,,,file:/tmp/test_image.jpg,"[0, 500, 500, 500]",true,,,
1+
Occurrence.occurrenceID,Encounter.sourceUrl,Encounter.mediaAsset0,Encounter.mediaAsset1,Annotation0.ViewPoint,Annotation1.ViewPoint,Name0.label,Name0.value,IndividualSummary.sex,IndividualSummary.lifeStage,Encounter.genus,Encounter.specificEpithet,Encounter.verbatimLocality,Encounter.decimalLatitude,Encounter.decimalLongitude,Encounter.country,Encounter.locationID,Encounter.year,Encounter.month,Encounter.day,Encounter.hour,Encounter.minutes,Encounter.sex,Encounter.lifeStage,Encounter.occurrenceRemarks,Occurrence.comments,SocialUnit.socialUnitName0,Encounter.photographer0.Email,Encounter.photographer0.fullName,Encounter.state,Reference keyword,Encounter.alternateID,Encounter.mediaAsset0.imageUrl,Encounter.mediaAsset0.keyword0,Encounter.mediaAsset0.keyword1,Annotation0.bbox,Annotation0.MatchAgainst,Encounter.mediaAsset1.imageUrl,Encounter.mediaAsset1.keyword0,Encounter.mediaAsset1.keyword1,Annotation1.bbox,Annotation1.MatchAgainst
2+
c2dbf187-ac3b-450f-9886-aa4e49073844,http://localhost/wildbook/encounters/encounter.jsp?number=9bf3de8a-3df5-4e31-85ef-004bd64150b2,test_image.jpg,,right,,Default,Individual_1,unknown,cub,lynx,pardinus,iberia,37.15414445923345,-6.730740044168456,,,2025,5,3,0,00,,adult,,,,,,,,,file:/tmp/test_image.jpg,Field Study,,"[500, 0, 500, 500]",true,,,,,
3+
9cf5a4e7-4c81-466e-a788-8d976f869086,http://localhost/wildbook/encounters/encounter.jsp?number=63021e3f-6b73-4b5c-a33a-6f8aa32255d7,test_image.jpg,test_image.jpg,left,,Default,Individual_1,unknown,cub,lynx,pardinus,iberia,37.15414445923345,-6.730740044168456,,,2024,6,1,0,00,,cub,,,,,,,Reference,,file:/tmp/test_image.jpg,Reference,Laboratory Study,"[0, 0, 500, 500]",true,file:/tmp/test_image.jpg,Field Study,,,
4+
f981b20f-330a-4e52-bb0f-dd8d13f1e76a,http://localhost/wildbook/encounters/encounter.jsp?number=214684bf-3ab1-46d7-83c1-fdd8205f653d,test_image.jpg,,front,,Default,Individual_2,unknown,senior,lynx,pardinus,iberia,37.15414445923345,-6.730740044168456,,,0,-1,0,0,00,,senior,,,,,,,,,file:/tmp/test_image.jpg,,,"[0, 500, 500, 500]",true,,,,,

0 commit comments

Comments
 (0)