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 ;
@@ -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