1818import org .slf4j .LoggerFactory ;
1919
2020import javax .vecmath .Matrix4d ;
21- import java .text .ParseException ;
22- import java .text .SimpleDateFormat ;
21+ import java .time .LocalDate ;
22+ import java .time .LocalDateTime ;
23+ import java .time .ZoneId ;
24+ import java .time .format .DateTimeFormatter ;
25+ import java .time .format .DateTimeFormatterBuilder ;
2326import java .util .*;
2427import java .util .stream .Collectors ;
2528import java .util .stream .IntStream ;
3740 */
3841class CifFileConsumerImpl implements CifFileConsumer <Structure > {
3942 private static final Logger logger = LoggerFactory .getLogger (CifFileConsumerImpl .class );
40- private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat ("yyyy-MM-dd" , Locale .US );
43+ private static final DateTimeFormatter DATE_FORMAT = new DateTimeFormatterBuilder ()
44+ .parseCaseInsensitive ()
45+ .appendPattern ("yyyy-MM-dd" )
46+ .toFormatter (Locale .US );
4147
4248 private Structure structure ;
4349 private Chain currentChain ;
@@ -524,36 +530,24 @@ public void consumeDatabasePDBremark(DatabasePDBRemark databasePDBremark) {
524530 }
525531 }
526532
533+ private Date convert (LocalDate localDate ) {
534+ return Date .from (localDate .atStartOfDay ().atZone (ZoneId .systemDefault ()).toInstant ());
535+ }
536+
527537 @ Override
528538 public void consumeDatabasePDBrev (DatabasePDBRev databasePDBrev ) {
529539 logger .debug ("got a database revision:" + databasePDBrev );
530540
531541 for (int rowIndex = 0 ; rowIndex < databasePDBrev .getRowCount (); rowIndex ++) {
532542 if (databasePDBrev .getNum ().get (rowIndex ) == 1 ) {
533543 String dateOriginal = databasePDBrev .getDateOriginal ().get (rowIndex );
534- try {
535- Date dep = DATE_FORMAT .parse (dateOriginal );
536- pdbHeader .setDepDate (dep );
537- } catch (ParseException e ){
538- logger .warn ("Could not parse date string '{}', deposition date will be unavailable" ,
539- dateOriginal );
540- }
544+ pdbHeader .setDepDate (convert (LocalDate .parse (dateOriginal , DATE_FORMAT )));
541545
542546 String date = databasePDBrev .getDate ().get (rowIndex );
543- try {
544- Date rel = DATE_FORMAT .parse (date );
545- pdbHeader .setRelDate (rel );
546- } catch (ParseException e ){
547- logger .warn ("Could not parse date string '{}', modification date will be unavailable" , date );
548- }
547+ pdbHeader .setRelDate (convert (LocalDate .parse (date , DATE_FORMAT )));
549548 } else {
550549 String dbrev = databasePDBrev .getDate ().get (rowIndex );
551- try {
552- Date mod = DATE_FORMAT .parse (dbrev );
553- pdbHeader .setModDate (mod );
554- } catch (ParseException e ){
555- logger .warn ("Could not parse date string '{}', modification date will be unavailable" , dbrev );
556- }
550+ pdbHeader .setModDate (convert (LocalDate .parse (dbrev , DATE_FORMAT )));
557551 }
558552 }
559553 }
@@ -677,23 +671,13 @@ public void consumePdbxAuditRevisionHistory(PdbxAuditRevisionHistory pdbxAuditRe
677671 // first entry in revision history is the release date
678672 if (pdbxAuditRevisionHistory .getOrdinal ().get (rowIndex ) == 1 ) {
679673 String release = pdbxAuditRevisionHistory .getRevisionDate ().get (rowIndex );
680- try {
681- Date releaseDate = DATE_FORMAT .parse (release );
682- pdbHeader .setRelDate (releaseDate );
683- } catch (ParseException e ) {
684- logger .warn ("Could not parse date string '{}', release date will be unavailable" , release );
685- }
674+ pdbHeader .setRelDate (convert (LocalDate .parse (release , DATE_FORMAT )));
686675 } else {
687676 // all other dates are revision dates;
688677 // since this method may be called multiple times,
689678 // the last revision date will "stick"
690679 String revision = pdbxAuditRevisionHistory .getRevisionDate ().get (rowIndex );
691- try {
692- Date revisionDate = DATE_FORMAT .parse (revision );
693- pdbHeader .setModDate (revisionDate );
694- } catch (ParseException e ) {
695- logger .warn ("Could not parse date string '{}', revision date will be unavailable" , revision );
696- }
680+ pdbHeader .setModDate (convert (LocalDate .parse (revision , DATE_FORMAT )));
697681 }
698682 }
699683 }
@@ -710,13 +694,7 @@ public void consumePdbxDatabaseStatus(PdbxDatabaseStatus pdbxDatabaseStatus) {
710694 StrColumn recvdInitialDepositionDate = pdbxDatabaseStatus .getRecvdInitialDepositionDate ();
711695 if (recvdInitialDepositionDate .isDefined ()) {
712696 String deposition = recvdInitialDepositionDate .get (rowIndex );
713-
714- try {
715- Date depositionDate = DATE_FORMAT .parse (deposition );
716- pdbHeader .setDepDate (depositionDate );
717- } catch (ParseException e ) {
718- logger .warn ("Could not parse date string '{}', deposition date will be unavailable" , deposition );
719- }
697+ pdbHeader .setDepDate (convert (LocalDate .parse (deposition , DATE_FORMAT )));
720698 }
721699 }
722700 }
@@ -784,6 +762,7 @@ public void consumeRefine(Refine refine) {
784762 // there are 2 resolution values, one for each method
785763 // we take the last one found so that behaviour is like in PDB file parsing
786764 double lsDResHigh = refine .getLsDResHigh ().get (rowIndex );
765+ // TODO this could use a check to keep reasonable values - 1.5 may be overwritten by 0.0
787766 if (pdbHeader .getResolution () != PDBHeader .DEFAULT_RESOLUTION ) {
788767 logger .warn ("More than 1 resolution value present, will use last one {} and discard previous {}" ,
789768 lsDResHigh , String .format ("%4.2f" ,pdbHeader .getResolution ()));
0 commit comments