Skip to content

Commit 21bc2f9

Browse files
authored
Merge pull request #61 from IQSS/develop
Update
2 parents b9b2efe + c5d1df2 commit 21bc2f9

4 files changed

Lines changed: 90 additions & 43 deletions

File tree

src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -331,37 +331,20 @@ public Boolean isHasDropBoxKey() {
331331

332332
public boolean isLocalesConfigured() {
333333
if (configuredLocales == null) {
334-
initLocaleSettings();
334+
configuredLocales = new LinkedHashMap<>();
335+
settingsService.initLocaleSettings(configuredLocales);
335336
}
336337
return configuredLocales.size() > 1;
337338
}
338339

339340
public Map<String, String> getConfiguredLocales() {
340341
if (configuredLocales == null) {
341-
initLocaleSettings();
342+
configuredLocales = new LinkedHashMap<>();
343+
settingsService.initLocaleSettings(configuredLocales);
342344
}
343345
return configuredLocales;
344346
}
345347

346-
private void initLocaleSettings() {
347-
348-
configuredLocales = new LinkedHashMap<>();
349-
350-
try {
351-
JSONArray entries = new JSONArray(getValueForKey(SettingsServiceBean.Key.Languages, "[]"));
352-
for (Object obj : entries) {
353-
JSONObject entry = (JSONObject) obj;
354-
String locale = entry.getString("locale");
355-
String title = entry.getString("title");
356-
357-
configuredLocales.put(locale, title);
358-
}
359-
} catch (JSONException e) {
360-
//e.printStackTrace();
361-
// do we want to know? - probably not
362-
}
363-
}
364-
365348
public boolean isDoiInstallation() {
366349
String protocol = getValueForKey(SettingsServiceBean.Key.Protocol);
367350
if ("doi".equals(protocol)) {
@@ -490,31 +473,16 @@ public void validateEmbargoDate(FacesContext context, UIComponent component, Obj
490473

491474
public Map<String, String> getBaseMetadataLanguageMap(boolean refresh) {
492475
if (languageMap == null || refresh) {
493-
languageMap = new HashMap<String, String>();
494-
495-
/* If MetadataLanaguages is set, use it.
496-
* If not, we can't assume anything and should avoid assuming a metadata language
497-
*/
498-
String mlString = getValueForKey(SettingsServiceBean.Key.MetadataLanguages,"");
499-
500-
if(mlString.isEmpty()) {
501-
mlString="[]";
502-
}
503-
JsonReader jsonReader = Json.createReader(new StringReader(mlString));
504-
JsonArray languages = jsonReader.readArray();
505-
for(JsonValue jv: languages) {
506-
JsonObject lang = (JsonObject) jv;
507-
languageMap.put(lang.getString("locale"), lang.getString("title"));
508-
}
476+
languageMap = settingsService.getBaseMetadataLanguageMap(languageMap, true);
509477
}
510478
return languageMap;
511479
}
512480

513481
public Map<String, String> getMetadataLanguages(DvObjectContainer target) {
514482
Map<String,String> currentMap = new HashMap<String,String>();
515-
currentMap.putAll(getBaseMetadataLanguageMap(true));
516-
languageMap.put(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE, getDefaultMetadataLanguageLabel(target));
517-
return languageMap;
483+
currentMap.putAll(getBaseMetadataLanguageMap(false));
484+
currentMap.put(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE, getDefaultMetadataLanguageLabel(target));
485+
return currentMap;
518486
}
519487

520488
private String getDefaultMetadataLanguageLabel(DvObjectContainer target) {

src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,14 @@ public Future<String> indexDataverse(Dataverse dataverse, boolean processPaths)
247247
solrInputDocument.addField(SearchFields.AFFILIATION, dataverse.getAffiliation());
248248
solrInputDocument.addField(SearchFields.DATAVERSE_AFFILIATION, dataverse.getAffiliation());
249249
}
250+
Set<String> langs = settingsService.getConfiguredLanguages();
250251
for (ControlledVocabularyValue dataverseSubject : dataverse.getDataverseSubjects()) {
251252
String subject = dataverseSubject.getStrValue();
252253
if (!subject.equals(DatasetField.NA_VALUE)) {
253-
solrInputDocument.addField(SearchFields.DATAVERSE_SUBJECT, subject);
254+
// Index in all used languages (display and metadata languages
255+
for(String locale: langs) {
256+
solrInputDocument.addField(SearchFields.DATAVERSE_SUBJECT, dataverseSubject.getLocaleStrValue(locale));
257+
}
254258
// collapse into shared "subject" field used as a facet
255259
solrInputDocument.addField(SearchFields.SUBJECT, subject);
256260
}
@@ -805,6 +809,7 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset, Set<Long> d
805809
solrInputDocument.addField(SearchFields.EXTERNAL_STATUS, datasetVersion.getExternalStatusLabel());
806810
}
807811

812+
Set<String> langs = settingsService.getConfiguredLanguages();
808813
Map<Long, JsonObject> cvocMap = datasetFieldService.getCVocConf(false);
809814
for (DatasetField dsf : datasetVersion.getFlatDatasetFields()) {
810815

@@ -892,7 +897,10 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset, Set<Long> d
892897
if (controlledVocabularyValue.getStrValue().equals(DatasetField.NA_VALUE)) {
893898
continue;
894899
}
895-
solrInputDocument.addField(solrFieldSearchable, controlledVocabularyValue.getStrValue());
900+
// Index in all used languages (display and metadata languages
901+
for(String locale: langs) {
902+
solrInputDocument.addField(solrFieldSearchable, controlledVocabularyValue.getLocaleStrValue(locale));
903+
}
896904
if (dsfType.getSolrField().isFacetable()) {
897905
solrInputDocument.addField(solrFieldFacetable, controlledVocabularyValue.getStrValue());
898906
}

src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,23 @@
99
import javax.ejb.Stateless;
1010
import javax.inject.Named;
1111
import javax.json.Json;
12+
import javax.json.JsonArray;
1213
import javax.json.JsonObject;
14+
import javax.json.JsonReader;
15+
import javax.json.JsonValue;
1316
import javax.persistence.EntityManager;
1417
import javax.persistence.PersistenceContext;
18+
19+
import org.json.JSONArray;
20+
import org.json.JSONException;
21+
import org.json.JSONObject;
22+
1523
import java.io.StringReader;
24+
import java.util.HashMap;
1625
import java.util.HashSet;
26+
import java.util.LinkedHashMap;
1727
import java.util.List;
28+
import java.util.Map;
1829
import java.util.Set;
1930
import java.util.logging.Level;
2031
import java.util.logging.Logger;
@@ -730,5 +741,53 @@ public Set<Setting> listAll() {
730741
return new HashSet<>(em.createNamedQuery("Setting.findAll", Setting.class).getResultList());
731742
}
732743

744+
public Map<String, String> getBaseMetadataLanguageMap(Map<String,String> languageMap, boolean refresh) {
745+
if (languageMap == null || refresh) {
746+
languageMap = new HashMap<String, String>();
747+
748+
/* If MetadataLanaguages is set, use it.
749+
* If not, we can't assume anything and should avoid assuming a metadata language
750+
*/
751+
String mlString = getValueForKey(SettingsServiceBean.Key.MetadataLanguages,"");
752+
753+
if(mlString.isEmpty()) {
754+
mlString="[]";
755+
}
756+
JsonReader jsonReader = Json.createReader(new StringReader(mlString));
757+
JsonArray languages = jsonReader.readArray();
758+
for(JsonValue jv: languages) {
759+
JsonObject lang = (JsonObject) jv;
760+
languageMap.put(lang.getString("locale"), lang.getString("title"));
761+
}
762+
}
763+
return languageMap;
764+
}
733765

766+
public void initLocaleSettings(Map<String, String> configuredLocales) {
767+
768+
try {
769+
JSONArray entries = new JSONArray(getValueForKey(SettingsServiceBean.Key.Languages, "[]"));
770+
for (Object obj : entries) {
771+
JSONObject entry = (JSONObject) obj;
772+
String locale = entry.getString("locale");
773+
String title = entry.getString("title");
774+
775+
configuredLocales.put(locale, title);
776+
}
777+
} catch (JSONException e) {
778+
//e.printStackTrace();
779+
// do we want to know? - probably not
780+
}
781+
}
782+
783+
784+
public Set<String> getConfiguredLanguages() {
785+
Set<String> langs = new HashSet<String>();
786+
langs.addAll(getBaseMetadataLanguageMap(new HashMap<String, String>(), true).keySet());
787+
Map<String, String> configuredLocales = new LinkedHashMap<>();
788+
initLocaleSettings(configuredLocales);
789+
langs.addAll(configuredLocales.keySet());
790+
return langs;
791+
}
792+
734793
}

src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package edu.harvard.iq.dataverse.export;
22

33
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import com.google.gson.JsonDeserializationContext;
6+
import com.google.gson.JsonDeserializer;
7+
import com.google.gson.JsonElement;
48
import edu.harvard.iq.dataverse.ControlledVocabularyValue;
59
import edu.harvard.iq.dataverse.DatasetFieldType;
610
import edu.harvard.iq.dataverse.DatasetFieldType.FieldType;
@@ -17,10 +21,15 @@
1721
import java.io.File;
1822
import java.io.IOException;
1923
import java.io.StringReader;
24+
import java.lang.reflect.Type;
2025
import java.nio.charset.StandardCharsets;
2126
import java.nio.file.Files;
2227
import java.nio.file.Path;
2328
import java.nio.file.Paths;
29+
import java.time.Instant;
30+
import java.time.LocalDate;
31+
import java.time.LocalDateTime;
32+
import java.time.ZoneId;
2433
import java.util.Arrays;
2534
import java.util.HashSet;
2635
import java.util.Set;
@@ -42,7 +51,10 @@ public class DDIExporterTest {
4251
private static final SettingsServiceBean settingsService = Mockito.mock(SettingsServiceBean.class);
4352
private static final LicenseServiceBean licenseService = Mockito.mock(LicenseServiceBean.class);
4453
private static final MockDatasetFieldSvc datasetFieldTypeSvc = new MockDatasetFieldSvc();
45-
private static final Gson gson = new Gson();
54+
private static final Gson gson = new GsonBuilder().registerTypeAdapter(LocalDate.class, (JsonDeserializer<LocalDateTime>) (JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) -> {
55+
Instant instant = Instant.ofEpochMilli(json.getAsJsonPrimitive().getAsLong());
56+
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
57+
}).create();
4658

4759
/*
4860
* Setup and teardown mocks for BrandingUtil for atomicity.

0 commit comments

Comments
 (0)