77import java .net .URI ;
88import java .net .URISyntaxException ;
99import 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 ;
1214import java .util .ArrayList ;
1315import java .util .Arrays ;
1416import java .util .Date ;
3436import edu .harvard .iq .dataverse .dataset .DatasetUtil ;
3537import edu .harvard .iq .dataverse .license .License ;
3638import edu .harvard .iq .dataverse .pidproviders .AbstractPidProvider ;
37- import edu .harvard .iq .dataverse .pidproviders .PidProvider ;
3839import edu .harvard .iq .dataverse .pidproviders .PidUtil ;
3940import edu .harvard .iq .dataverse .pidproviders .handle .HandlePidProvider ;
4041import 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