Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
4f4d18e
fix for local issue in date test
qqmyers Jan 27, 2021
992407e
Merge remote-tracking branch 'IQSS/develop' into develop
qqmyers Jan 29, 2021
d480e98
Merge remote-tracking branch 'IQSS/develop' into develop
qqmyers Mar 27, 2021
b3d3d2b
Merge remote-tracking branch 'IQSS/develop' into develop
qqmyers May 14, 2021
f78e711
#6751 - use i18n CVV values
qqmyers Jun 21, 2021
ca5f3e4
remove original write for anlyUnit
qqmyers Jun 21, 2021
b9177b2
fix old formatting
qqmyers Jun 21, 2021
1c1fa3b
match metadataLanguage in example data
qqmyers Jun 21, 2021
8b42465
update test data with metadataLanguage value
qqmyers Jun 21, 2021
120f0b1
use default locale language if no metadata lang is set
qqmyers Jun 22, 2021
c95199a
add name in toString (for debug)
qqmyers Jun 22, 2021
0731df3
update tests
qqmyers Jun 22, 2021
e775f87
remove unnecessary constructors
qqmyers Jun 22, 2021
63ada6c
Merge remote-tracking branch 'IQSS/develop' into SPO/6751-cvv-i18n
qqmyers Jul 2, 2021
ca02625
Merge remote-tracking branch 'IQSS/develop' into SPO/6751-cvv-i18n
qqmyers Jul 19, 2021
a0b2c76
Merge remote-tracking branch 'IQSS/develop' into develop
qqmyers Jul 20, 2021
8c77f05
Merge branch 'SPO/7388-lang_attributes_in_DDI_export' into
qqmyers Jul 20, 2021
ff7f7e4
remove unused imports
qqmyers Jul 20, 2021
d230d7d
remove lang tags from fields that aren't cvv in standard social block
qqmyers Jul 20, 2021
385e67f
Merge remote-tracking branch 'IQSS/develop' into SPO/6751-cvv-i18n
qqmyers Jul 20, 2021
2f76745
update logic to not add a lang tag when there are no translations
qqmyers Jul 22, 2021
6e26292
handle Sword N/A controoled vocab value
qqmyers Jul 23, 2021
7cdb2dd
Merge remote-tracking branch 'IQSS/develop' into SPO/6751-cvv-i18n
qqmyers Jul 23, 2021
402b84c
fix script name
qqmyers Jul 23, 2021
771191f
add same column in dataset
qqmyers Jul 23, 2021
66dcaca
Merge remote-tracking branch 'IQSS/develop' into SPO/6751-cvv-i18n
qqmyers Jul 28, 2021
7479112
starting docs
qqmyers Jul 29, 2021
005341a
doc update
qqmyers Aug 6, 2021
e7eefca
Merge branch 'SPO/7388-lang_attributes_in_DDI_export' into
qqmyers Aug 6, 2021
fce1218
Merge branch 'SPO/7388-lang_attributes_in_DDI_export' into SPO/6751-c…
qqmyers Aug 6, 2021
f374f2c
typo
qqmyers Aug 6, 2021
289d0bb
missing setting entry in docs
qqmyers Aug 6, 2021
e0f0335
fix default with effect md lang
qqmyers Aug 6, 2021
224d1f9
fix default label in dv selection
qqmyers Aug 6, 2021
fc09fd5
CVV functionlity update
qqmyers Aug 6, 2021
4a1dea8
Merge branch 'SPO/7388-lang_attributes_in_DDI_export' into
qqmyers Aug 10, 2021
c304322
Merge remote-tracking branch 'IQSS/develop' into develop
qqmyers Aug 10, 2021
887a967
Merge branch 'SPO/7388-lang_attributes_in_DDI_export' into SPO/6751-c…
qqmyers Aug 11, 2021
7b9c004
Merge remote-tracking branch 'IQSS/develop' into SPO/6751-cvv-i18n
qqmyers Aug 11, 2021
0c1e8e0
post-merge cleanup
qqmyers Aug 11, 2021
3b0f91a
Merge remote-tracking branch 'origin/develop' into SPO/6751-cvv-i18n
qqmyers Aug 20, 2021
ef9abf9
Merge remote-tracking branch 'IQSS/develop' into SPO/6751-cvv-i18n
qqmyers Aug 20, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion doc/sphinx-guides/source/installation/config.rst
Original file line number Diff line number Diff line change
Expand Up @@ -688,7 +688,7 @@ When creating or editing a dataset, users will be asked to enter the metadata in

``curl http://localhost:8080/api/admin/settings/:MetadataLanguages -X PUT -d '[{"locale":"en","title":"English"},{"locale":"fr","title":"Français"}]'``

Note that metadata selected from Controlled Vocabularies will also display in the metadata language of the dataset, but only if translations have been configured, i.e. you configure the "lang" directory and populate it with translations as described below).
Note that metadata selected from Controlled Vocabularies will also display in the metadata language of the dataset, but only if translations have been configured, i.e. you configure the "lang" directory and populate it with translations as described below). In metadata export files, controlled vocabulary values will be included in the Dataverse installations default language and in the metadata language of the dataset (if specified).

Configuring the "lang" Directory
++++++++++++++++++++++++++++++++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ public void setOptionSelectItems(List<SelectItem> optionSelectItems) {

public DatasetFieldType() {}

//For use in tests
public DatasetFieldType(String name, FieldType fieldType, boolean allowMultiples) {
// use the name for both default name and title
this.name = name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public void setFields(List<FieldDTO> fields) {

@Override
public String toString() {
return "MetadataBlockDTO{" + "displayName=" + displayName + ", fields=" + fields + '}';
return "MetadataBlockDTO{" + "displayName=" + displayName + ", name=" + name + ", fields=" + fields + '}';
}

public String getName() {
Expand Down
111 changes: 95 additions & 16 deletions src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package edu.harvard.iq.dataverse.export.ddi;

import com.google.gson.Gson;

import edu.harvard.iq.dataverse.ControlledVocabularyValue;
import edu.harvard.iq.dataverse.DataFile;
import edu.harvard.iq.dataverse.DataTable;
import edu.harvard.iq.dataverse.DatasetFieldConstant;
Expand Down Expand Up @@ -260,14 +262,14 @@ private static void createStdyDscr(XMLStreamWriter xmlw, DatasetDTO datasetDto)
// Study Info
xmlw.writeStartElement("stdyInfo");

writeSubjectElement(xmlw, version); //Subject and Keywords
writeSubjectElement(xmlw, version, datasetDto.getMetadataLanguage()); //Subject and Keywords
writeAbstractElement(xmlw, version, datasetDto.getMetadataLanguage()); // Description
writeSummaryDescriptionElement(xmlw, version);
writeSummaryDescriptionElement(xmlw, version, datasetDto.getMetadataLanguage());
writeFullElement(xmlw, "notes", dto2Primitive(version, DatasetFieldConstant.notesText));
////////
xmlw.writeEndElement(); // stdyInfo

writeMethodElement(xmlw, version);
writeMethodElement(xmlw, version, datasetDto.getMetadataLanguage());
writeDataAccess(xmlw , version);
writeOtherStudyMaterial(xmlw , version);

Expand Down Expand Up @@ -380,7 +382,7 @@ private static void writeVersionStatement(XMLStreamWriter xmlw, DatasetVersionDT
xmlw.writeEndElement(); // verStmt
}

private static void writeSummaryDescriptionElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO) throws XMLStreamException {
private static void writeSummaryDescriptionElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO, String lang) throws XMLStreamException {
xmlw.writeStartElement("sumDscr");
for (Map.Entry<String, MetadataBlockDTO> entry : datasetVersionDTO.getMetadataBlocks().entrySet()) {
String key = entry.getKey();
Expand Down Expand Up @@ -510,7 +512,7 @@ private static void writeSummaryDescriptionElement(XMLStreamWriter xmlw, Dataset
writeMultipleElement(xmlw, "universe", fieldDTO);
}
if (DatasetFieldConstant.unitOfAnalysis.equals(fieldDTO.getTypeName())) {
writeMultipleElement(xmlw, "anlyUnit", fieldDTO);
writeI18NElementList(xmlw, "anlyUnit", fieldDTO.getMultipleVocab(), "unitOfAnalysis", fieldDTO.getTypeClass(), "socialscience", lang);
}
}
}
Expand All @@ -535,14 +537,14 @@ private static void writeDateElement(XMLStreamWriter xmlw, String element, Strin

}

private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO version) throws XMLStreamException{
private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO version, String lang) throws XMLStreamException{
xmlw.writeStartElement("method");
xmlw.writeStartElement("dataColl");
writeFullElement(xmlw, "timeMeth", dto2Primitive(version, DatasetFieldConstant.timeMethod));
writeI18NElement(xmlw, "timeMeth", version, DatasetFieldConstant.timeMethod,lang);
writeFullElement(xmlw, "dataCollector", dto2Primitive(version, DatasetFieldConstant.dataCollector));
writeFullElement(xmlw, "collectorTraining", dto2Primitive(version, DatasetFieldConstant.collectorTraining));
writeFullElement(xmlw, "frequenc", dto2Primitive(version, DatasetFieldConstant.frequencyOfDataCollection));
writeFullElement(xmlw, "sampProc", dto2Primitive(version, DatasetFieldConstant.samplingProcedure));
writeI18NElement(xmlw, "sampProc", version, DatasetFieldConstant.samplingProcedure, lang);

writeTargetSampleElement(xmlw, version);

Expand All @@ -555,8 +557,8 @@ private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO
writeFullElement(xmlw, "srcDocu", dto2Primitive(version, DatasetFieldConstant.accessToSources));
xmlw.writeEndElement(); //sources

writeFullElement(xmlw, "collMode", dto2Primitive(version, DatasetFieldConstant.collectionMode));
writeFullElement(xmlw, "resInstru", dto2Primitive(version, DatasetFieldConstant.researchInstrument));
writeI18NElement(xmlw, "collMode", version, DatasetFieldConstant.collectionMode, lang);
writeI18NElement(xmlw, "resInstru", version, DatasetFieldConstant.researchInstrument, lang);
writeFullElement(xmlw, "collSitu", dto2Primitive(version, DatasetFieldConstant.dataCollectionSituation));
writeFullElement(xmlw, "actMin", dto2Primitive(version, DatasetFieldConstant.actionsToMinimizeLoss));
writeFullElement(xmlw, "conOps", dto2Primitive(version, DatasetFieldConstant.controlOperations));
Expand All @@ -575,7 +577,7 @@ private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO
xmlw.writeEndElement();//method
}

private static void writeSubjectElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO) throws XMLStreamException{
private static void writeSubjectElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO, String lang) throws XMLStreamException{

//Key Words and Topic Classification

Expand All @@ -586,11 +588,7 @@ private static void writeSubjectElement(XMLStreamWriter xmlw, DatasetVersionDTO
if ("citation".equals(key)) {
for (FieldDTO fieldDTO : value.getFields()) {
if (DatasetFieldConstant.subject.equals(fieldDTO.getTypeName())){
for ( String subject : fieldDTO.getMultipleVocab()){
xmlw.writeStartElement("keyword");
xmlw.writeCharacters(subject);
xmlw.writeEndElement(); //Keyword
}
writeI18NElementList(xmlw, "keyword", fieldDTO.getMultipleVocab(), "subject", fieldDTO.getTypeClass(), "citation", lang);
}

if (DatasetFieldConstant.keyword.equals(fieldDTO.getTypeName())) {
Expand Down Expand Up @@ -1333,6 +1331,22 @@ private static String dto2Primitive(DatasetVersionDTO datasetVersionDTO, String
return null;
}

private static String dto2Primitive(DatasetVersionDTO datasetVersionDTO, String datasetFieldTypeName, Locale locale) {
for (Map.Entry<String, MetadataBlockDTO> entry : datasetVersionDTO.getMetadataBlocks().entrySet()) {
MetadataBlockDTO value = entry.getValue();
for (FieldDTO fieldDTO : value.getFields()) {
if (datasetFieldTypeName.equals(fieldDTO.getTypeName())) {
String rawVal = fieldDTO.getSinglePrimitive();
if (fieldDTO.getTypeClass().equals("controlledVocabulary")) {
return ControlledVocabularyValue.getLocaleStrValue(rawVal, datasetFieldTypeName, value.getName(),
locale, false);
}
}
}
}
return null;
}

private static List<String> dto2PrimitiveList(DatasetVersionDTO datasetVersionDTO, String datasetFieldTypeName) {
for (Map.Entry<String, MetadataBlockDTO> entry : datasetVersionDTO.getMetadataBlocks().entrySet()) {
MetadataBlockDTO value = entry.getValue();
Expand All @@ -1355,6 +1369,71 @@ private static void writeFullElementList(XMLStreamWriter xmlw, String name, List
}
}
}

private static void writeI18NElementList(XMLStreamWriter xmlw, String name, List<String> values,
String fieldTypeName, String fieldTypeClass, String metadataBlockName, String lang)
throws XMLStreamException {

if (values != null && !values.isEmpty()) {
Locale defaultLocale = Locale.getDefault();
for (String value : values) {
if (fieldTypeClass.equals("controlledVocabulary")) {
String localeVal = ControlledVocabularyValue.getLocaleStrValue(value, fieldTypeName, metadataBlockName, defaultLocale, false);
if (localeVal != null) {

value = localeVal;
writeFullElement(xmlw, name, value, defaultLocale.getLanguage());
} else {
writeFullElement(xmlw, name, value);
}
} else {
writeFullElement(xmlw, name, value);
}
}
if (lang != null && !defaultLocale.getLanguage().equals(lang)) {
// Get values in dataset metadata language
// Loop before testing fieldTypeClass to be ready for external CVV
for (String value : values) {
if (fieldTypeClass.equals("controlledVocabulary")) {
String localeVal = ControlledVocabularyValue.getLocaleStrValue(value, fieldTypeName, metadataBlockName, new Locale(lang), false);
if (localeVal != null) {
writeFullElement(xmlw, name, localeVal, lang);
}
}
}
}
}
}

private static void writeI18NElement(XMLStreamWriter xmlw, String name, DatasetVersionDTO version,
String fieldTypeName, String lang) throws XMLStreamException {
// Get the default value
String val = dto2Primitive(version, fieldTypeName);
Locale defaultLocale = Locale.getDefault();
// Get the language-specific value for the default language
String localeVal = dto2Primitive(version, fieldTypeName, defaultLocale);
String requestedLocaleVal = null;
if (lang != null && !defaultLocale.getLanguage().equals(lang)) {
// Also get the value in the requested locale/lang if that's not the default
// lang.
requestedLocaleVal = dto2Primitive(version, fieldTypeName, new Locale(lang));
}
// FWIW locale-specific vals will only be non-null for CVV values (at present)
if (localeVal == null && requestedLocaleVal == null) {
// Not CVV/no translations so print without lang tag
writeFullElement(xmlw, name, val);
} else {
// Print in either/both languages if we have values
if (localeVal != null) {
// Print the value for the default locale with it's own lang tag
writeFullElement(xmlw, name, localeVal, defaultLocale.getLanguage());
}
// Also print in the request lang (i.e. the metadata language for the dataset) if a value exists, print it with a lang tag
if (requestedLocaleVal != null) {
writeFullElement(xmlw, name, requestedLocaleVal, lang);
}
}
}

private static void writeFullElement(XMLStreamWriter xmlw, String name, String value) throws XMLStreamException {
writeFullElement(xmlw, name, value, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,5 +181,7 @@ private static void mockDatasetFieldSvc() {
t.setParentDatasetFieldType(compoundSingleType);
}
compoundSingleType.setChildDatasetFieldTypes(childTypes);

datasetFieldTypeSvc.setMetadataBlock("citation");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"metadataBlocks": {
"citation": {
"displayName": "Citation Metadata",
"name":"citation",
"fields": [
{
"typeName": "title",
Expand Down Expand Up @@ -307,6 +308,7 @@
},
"geospatial": {
"displayName": "Geospatial",
"name":"geospatial",
"fields": [
{
"typeName": "geographicCoverage",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
</citation>
<stdyInfo>
<subject>
<keyword>Medicine, Health and Life Sciences</keyword>
<keyword xml:lang="en">Medicine, Health and Life Sciences</keyword>
<keyword vocab="Keyword Vocabulary" vocabURI="http://www.keyword.com/one">Keyword Value 1</keyword>
<keyword vocab="Keyword Vocabulary" vocabURI="http://www.keyword.com/one">Keyword Value Two</keyword>
<topcClas vocab="TC Vocabulary" vocabURI="http://www.topicClass.com/one">TC Value 1</topcClas>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@
</citation>
<stdyInfo>
<subject>
<keyword>Agricultural Sciences</keyword>
<keyword>Business and Management</keyword>
<keyword>Engineering</keyword>
<keyword>Law</keyword>
<keyword xml:lang="en">Agricultural Sciences</keyword>
<keyword xml:lang="en">Business and Management</keyword>
<keyword xml:lang="en">Engineering</keyword>
<keyword xml:lang="en">Law</keyword>
<keyword vocab="KeywordVocabulary1" vocabURI="http://KeywordVocabularyURL1.org">KeywordTerm1</keyword>
<keyword vocab="KeywordVocabulary2" vocabURI="http://KeywordVocabularyURL2.org">KeywordTerm2</keyword>
</subject>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ public static void setUpClass() throws IOException, JsonParseException, AddressE
systemAddress = new InternetAddress(systemEmail, supportTeamName);

datasetFieldTypeSvc = new MockDatasetFieldSvc();
datasetFieldTypeSvc.setMetadataBlock("citation");
DatasetFieldType titleType = datasetFieldTypeSvc.add(new DatasetFieldType("title", DatasetFieldType.FieldType.TEXTBOX, false));
DatasetFieldType authorType = datasetFieldTypeSvc.add(new DatasetFieldType("author", DatasetFieldType.FieldType.TEXT, true));
Set<DatasetFieldType> authorChildTypes = new HashSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ public static void tearDownClass() {
@Before
public void setUp() {
datasetFieldTypeSvc = new MockDatasetFieldSvc();
datasetFieldTypeSvc.setMetadataBlock("citation");

keywordType = datasetFieldTypeSvc.add(new DatasetFieldType("keyword", FieldType.TEXT, true));
descriptionType = datasetFieldTypeSvc.add( new DatasetFieldType("description", FieldType.TEXTBOX, false) );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public class JsonPrinterTest {
@Before
public void setUp() {
datasetFieldTypeSvc = new MockDatasetFieldSvc();
datasetFieldTypeSvc.setMetadataBlock("citation");

DatasetFieldType titleType = datasetFieldTypeSvc.add(new DatasetFieldType("title", FieldType.TEXTBOX, false));
DatasetFieldType authorType = datasetFieldTypeSvc.add(new DatasetFieldType("author", FieldType.TEXT, true));
Expand Down
3 changes: 2 additions & 1 deletion src/test/resources/json/dataset-finch1.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@
"typeName": "subject"
}
],
"displayName": "Citation Metadata"
"displayName": "Citation Metadata",
"name":"citation"
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/test/resources/json/dataset-finch2.json
Original file line number Diff line number Diff line change
Expand Up @@ -309,10 +309,12 @@
]
}
],
"displayName": "Citation Metadata"
"displayName": "Citation Metadata",
"name": "citation"
},
"geospatial": {
"displayName": "Geospatial Metadata",
"name": "geospatial",
"fields": [
{
"typeName": "geographicCoverage",
Expand Down