Skip to content

Commit e332893

Browse files
committed
allow yyyy-MM or yyyy as well
1 parent 4250298 commit e332893

1 file changed

Lines changed: 43 additions & 26 deletions

File tree

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

Lines changed: 43 additions & 26 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;
@@ -34,7 +36,6 @@
3436
import edu.harvard.iq.dataverse.dataset.DatasetUtil;
3537
import edu.harvard.iq.dataverse.license.License;
3638
import edu.harvard.iq.dataverse.pidproviders.AbstractPidProvider;
37-
import edu.harvard.iq.dataverse.pidproviders.PidProvider;
3839
import edu.harvard.iq.dataverse.pidproviders.PidUtil;
3940
import edu.harvard.iq.dataverse.pidproviders.handle.HandlePidProvider;
4041
import edu.harvard.iq.dataverse.pidproviders.perma.PermaLinkPidProvider;
@@ -752,17 +753,17 @@ private void writeDates(XMLStreamWriter xmlw, DvObject dvObject) throws XMLStrea
752753
for (DatasetField subField : collectionDateFieldValue.getChildDatasetFields()) {
753754
switch (subField.getDatasetFieldType().getName()) {
754755
case DatasetFieldConstant.dateOfCollectionStart:
755-
startDate = subField.getValue();
756+
startDate = subField.getValue().trim();
756757
break;
757758
case DatasetFieldConstant.dateOfCollectionEnd:
758-
endDate = subField.getValue();
759+
endDate = subField.getValue().trim();
759760
break;
760761
}
761762
}
762-
// Minimal clean-up - useful? Parse/format would remove unused chars, and an
763-
// exception would clear the date so we don't send nonsense
764-
startDate = cleanUpDate(startDate);
765-
endDate = cleanUpDate(endDate);
763+
// Verify valid date format
764+
765+
startDate = isValidYearMonthOrDay(startDate) ? startDate:"";
766+
endDate = isValidYearMonthOrDay(endDate) ? endDate:"";
766767
if (StringUtils.isNotBlank(startDate) || StringUtils.isNotBlank(endDate)) {
767768
datesWritten = XmlWriterUtil.writeOpenTagIfNeeded(xmlw, "dates", datesWritten);
768769
attributes.put("dateType", "Collected");
@@ -778,17 +779,16 @@ private void writeDates(XMLStreamWriter xmlw, DvObject dvObject) throws XMLStrea
778779
for (DatasetField subField : timePeriodFieldValue.getChildDatasetFields()) {
779780
switch (subField.getDatasetFieldType().getName()) {
780781
case DatasetFieldConstant.timePeriodCoveredStart:
781-
startDate = subField.getValue();
782+
startDate = subField.getValue().trim();
782783
break;
783784
case DatasetFieldConstant.timePeriodCoveredEnd:
784-
endDate = subField.getValue();
785+
endDate = subField.getValue().trim();
785786
break;
786787
}
787788
}
788-
// Minimal clean-up - useful? Parse/format would remove unused chars, and an
789-
// exception would clear the date so we don't send nonsense
790-
startDate = cleanUpDate(startDate);
791-
endDate = cleanUpDate(endDate);
789+
// Verify valid date format
790+
startDate = isValidYearMonthOrDay(startDate) ? startDate:"";
791+
endDate = isValidYearMonthOrDay(endDate) ? endDate:"";
792792
if (StringUtils.isNotBlank(startDate) || StringUtils.isNotBlank(endDate)) {
793793
datesWritten = XmlWriterUtil.writeOpenTagIfNeeded(xmlw, "dates", datesWritten);
794794
attributes.put("dateType", "Other");
@@ -802,18 +802,35 @@ private void writeDates(XMLStreamWriter xmlw, DvObject dvObject) throws XMLStrea
802802
}
803803
}
804804

805-
private String cleanUpDate(String date) {
806-
String newDate = null;
807-
if (!StringUtils.isBlank(date)) {
808-
try {
809-
SimpleDateFormat sdf = Util.getDateFormat();
810-
Date start = sdf.parse(date);
811-
newDate = sdf.format(start);
812-
} catch (ParseException e) {
813-
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;
814818
}
819+
820+
if (value.matches("\\d{4}-\\d{2}")) {
821+
YearMonth.parse(value);
822+
return true;
823+
}
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;
815831
}
816-
return newDate;
832+
833+
return false;
817834
}
818835

819836
// 9, Language (MA), language
@@ -1587,7 +1604,7 @@ private void writeFundingReferences(XMLStreamWriter xmlw, DvObject dvObject) thr
15871604
funder = jo.getString("termName");
15881605
}
15891606
}
1590-
1607+
15911608
xmlw.writeStartElement("fundingReference"); // <fundingReference>
15921609
XmlWriterUtil.writeFullElement(xmlw, "funderName", StringEscapeUtils.escapeXml10(funder));
15931610
if (isROR) {

0 commit comments

Comments
 (0)