Skip to content

Commit 152160e

Browse files
committed
allow yyyy-MM or yyyy as well
1 parent fb1fab5 commit 152160e

1 file changed

Lines changed: 45 additions & 27 deletions

File tree

src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import java.net.URI;
88
import java.net.URISyntaxException;
99
import java.net.URL;
10-
import java.text.ParseException;
11-
import java.text.SimpleDateFormat;
10+
import java.time.LocalDate;
11+
import java.time.Year;
12+
import java.time.YearMonth;
13+
import java.time.format.DateTimeParseException;
1214
import java.util.ArrayList;
1315
import java.util.Arrays;
1416
import java.util.Date;
@@ -751,17 +753,17 @@ private void writeDates(XMLStreamWriter xmlw, DvObject dvObject) throws XMLStrea
751753
for (DatasetField subField : collectionDateFieldValue.getChildDatasetFields()) {
752754
switch (subField.getDatasetFieldType().getName()) {
753755
case DatasetFieldConstant.dateOfCollectionStart:
754-
startDate = subField.getValue();
756+
startDate = subField.getValue().trim();
755757
break;
756758
case DatasetFieldConstant.dateOfCollectionEnd:
757-
endDate = subField.getValue();
759+
endDate = subField.getValue().trim();
758760
break;
759761
}
760762
}
761-
// Minimal clean-up - useful? Parse/format would remove unused chars, and an
762-
// exception would clear the date so we don't send nonsense
763-
startDate = cleanUpDate(startDate);
764-
endDate = cleanUpDate(endDate);
763+
// Verify valid date format
764+
765+
startDate = isValidYearMonthOrDay(startDate) ? startDate:"";
766+
endDate = isValidYearMonthOrDay(endDate) ? endDate:"";
765767
if (StringUtils.isNotBlank(startDate) || StringUtils.isNotBlank(endDate)) {
766768
datesWritten = XmlWriterUtil.writeOpenTagIfNeeded(xmlw, "dates", datesWritten);
767769
attributes.put("dateType", "Collected");
@@ -777,17 +779,16 @@ private void writeDates(XMLStreamWriter xmlw, DvObject dvObject) throws XMLStrea
777779
for (DatasetField subField : timePeriodFieldValue.getChildDatasetFields()) {
778780
switch (subField.getDatasetFieldType().getName()) {
779781
case DatasetFieldConstant.timePeriodCoveredStart:
780-
startDate = subField.getValue();
782+
startDate = subField.getValue().trim();
781783
break;
782784
case DatasetFieldConstant.timePeriodCoveredEnd:
783-
endDate = subField.getValue();
785+
endDate = subField.getValue().trim();
784786
break;
785787
}
786788
}
787-
// Minimal clean-up - useful? Parse/format would remove unused chars, and an
788-
// exception would clear the date so we don't send nonsense
789-
startDate = cleanUpDate(startDate);
790-
endDate = cleanUpDate(endDate);
789+
// Verify valid date format
790+
startDate = isValidYearMonthOrDay(startDate) ? startDate:"";
791+
endDate = isValidYearMonthOrDay(endDate) ? endDate:"";
791792
if (StringUtils.isNotBlank(startDate) || StringUtils.isNotBlank(endDate)) {
792793
datesWritten = XmlWriterUtil.writeOpenTagIfNeeded(xmlw, "dates", datesWritten);
793794
attributes.put("dateType", "Other");
@@ -801,18 +802,35 @@ private void writeDates(XMLStreamWriter xmlw, DvObject dvObject) throws XMLStrea
801802
}
802803
}
803804

804-
private String cleanUpDate(String date) {
805-
String newDate = null;
806-
if (!StringUtils.isBlank(date)) {
807-
try {
808-
SimpleDateFormat sdf = Util.getDateFormat();
809-
Date start = sdf.parse(date);
810-
newDate = sdf.format(start);
811-
} catch (ParseException e) {
812-
logger.warning("Could not parse date: " + date);
805+
/** Checks for yyyy, yyyy-MM, or yyyy-MM-dd format
806+
* @param value
807+
* @return true if valid date format, false otherwise
808+
*/
809+
private boolean isValidYearMonthOrDay(String value) {
810+
if (StringUtils.isBlank(value)) {
811+
return false;
812+
}
813+
814+
try {
815+
if (value.matches("\\d{4}")) {
816+
Year.parse(value);
817+
return true;
818+
}
819+
820+
if (value.matches("\\d{4}-\\d{2}")) {
821+
YearMonth.parse(value);
822+
return true;
813823
}
824+
825+
if (value.matches("\\d{4}-\\d{2}-\\d{2}")) {
826+
LocalDate.parse(value);
827+
return true;
828+
}
829+
} catch (DateTimeParseException e) {
830+
return false;
814831
}
815-
return newDate;
832+
833+
return false;
816834
}
817835

818836
// 9, Language (MA), language
@@ -1346,7 +1364,7 @@ private void writeAccessRights(XMLStreamWriter xmlw, DvObject dvObject) throws X
13461364
}
13471365
}
13481366
} else {
1349-
1367+
13501368
// No label or notice info - we'll still add a pointer to the project
13511369
xmlw.writeStartElement("rights"); // <rights>
13521370
xmlw.writeAttribute("rightsURI", projectUrl); // repeated in @id in evv
@@ -1397,7 +1415,7 @@ private void writeLocalContextNoticeRightsElement(XMLStreamWriter xmlw, String p
13971415
}
13981416
xmlw.writeEndElement(); // </rights>
13991417
}
1400-
1418+
14011419
private void writeLocalContextLabelRightsElement(XMLStreamWriter xmlw, String projectUrl, JsonObject labelObject) throws XMLStreamException {
14021420
xmlw.writeStartElement("rights"); // <rights>
14031421
xmlw.writeAttribute("rightsURI", projectUrl); // repeated in @id in evv
@@ -1712,7 +1730,7 @@ private void writeFundingReferences(XMLStreamWriter xmlw, DvObject dvObject) thr
17121730
}
17131731
}
17141732
}
1715-
1733+
17161734
xmlw.writeStartElement("fundingReference"); // <fundingReference>
17171735
XmlWriterUtil.writeFullElement(xmlw, "funderName", StringEscapeUtils.escapeXml10(funder));
17181736
if (isROR) {

0 commit comments

Comments
 (0)