Commit 9e987b20 authored by R.W.Majeed's avatar R.W.Majeed
Browse files

date parsing will throw checked ParseException

parent 4fa410e4
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
package de.sekmi.histream;

import java.text.ParseException;
import java.time.DateTimeException;

/*
@@ -194,14 +195,16 @@ public class DateTimeAccuracy implements Temporal, Comparable<DateTimeAccuracy>
	 * @return date time with accuracy as derived from parse
	 * @throws IllegalArgumentException for unparsable string
	 */
	public static DateTimeAccuracy parsePartialIso8601(String str)throws IllegalArgumentException{
		if( str.length() < 4 )throw new IllegalArgumentException("Need at least 4 characters for year: "+str);
	public static DateTimeAccuracy parsePartialIso8601(String str)throws ParseException{
		if( str.length() < 4 )throw new ParseException("Need at least 4 characters for year: "+str, str.length());
		// parse year
		int year = Integer.parseInt(str.substring(0, 4));
		if( str.length() == 4 ){ // specified to accuracy of years
			return new DateTimeAccuracy(year);
		}else if( str.length() < 7 || str.charAt(4) != '-' ){
			throw new IllegalArgumentException("Expected YYYY-MM");
		}else if( str.length() < 7 ){
			throw new ParseException("Expected YYYY-MM", str.length());
		}else if( str.charAt(4) != '-' ){
			throw new ParseException("Expected YYYY-MM", 4);
		}
		// parse month
		int month = Integer.parseInt(str.substring(5, 7));
+27 −21
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Hashtable;
@@ -253,7 +254,7 @@ public class FlatObservationSupplier extends AbstractObservationParser implement
			currentVisit = visitAccessor.accessStatic(visitId,currentPatient,(ExternalSourceType)this);
		}
	}
	private void specialFields(SpecialConcept special, Record record){		
	private void specialFields(SpecialConcept special, Record record) throws ParseException{		
		// make sure current patient is valid
		lazyCreatePatient(record.getPatID());
		
@@ -325,7 +326,7 @@ public class FlatObservationSupplier extends AbstractObservationParser implement
		return value;
	}
	
	private void newObservation(Record record){
	private void newObservation(Record record) throws ParseException{
		DateTimeAccuracy ts;
		DateTimeAccuracy sourceTs = getSourceDateTime();
		if( record.getStartDate() == null ){
@@ -413,6 +414,7 @@ public class FlatObservationSupplier extends AbstractObservationParser implement
				// continue;
			}else{
				// parse observation
				try{
					Record fields = new Record(fieldSeparatorPattern.split(line, maxFields));
					// fields: 0 patid, 1 encounter, 2 concept, 3: type, 4: value, 5: starttime, 
					
@@ -435,6 +437,10 @@ public class FlatObservationSupplier extends AbstractObservationParser implement
						newObservation(fields);
						break;
					}
				} catch (ParseException e) {
					throw new UncheckedIOException(new IOException(e));
				}

			}
		}while( true );
		Observation ret = fact;
+28 −7
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ package de.sekmi.histream.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;

@@ -146,16 +147,29 @@ public class GroupedXMLReader implements ObservationSupplier {
		
		// register with extension
		currentPatient = patientAccessor.accessStatic(patientId, (ExternalSourceType)es);
		// immediately set source timestamp
		if( es != null ){
			currentPatient.setSourceTimestamp(es.getSourceTimestamp());
		}
		// TODO set patient data
		if( patientData.containsKey("birthdate") ){
			currentPatient.setBirthDate(DateTimeAccuracy.parsePartialIso8601(patientData.get("birthdate")));
			String dob = patientData.get("birthdate");
			try {
				currentPatient.setBirthDate(DateTimeAccuracy.parsePartialIso8601(dob));
			} catch (ParseException e) {
				throw new XMLStreamException("Unable to parse birthdate: "+dob, reader.getLocation(), e);
			}
		}
		if( patientData.containsKey("deceased") ){
			// patient known to be deceased
			currentPatient.setDeceased(true);
			String date = patientData.get("deceased");
			if( date != null ){
				try {
					currentPatient.setDeathDate(DateTimeAccuracy.parsePartialIso8601(date));
				} catch (ParseException e) {
					throw new XMLStreamException("Unable to parse deceased date: "+date, reader.getLocation(), e);
				}
			}
		}
		if( patientData.containsKey("gender") ){
@@ -167,9 +181,6 @@ public class GroupedXMLReader implements ObservationSupplier {
		if( patientData.containsKey("given-name") ){
			currentPatient.setGivenName(patientData.get("given-name"));
		}
		if( es != null ){
			currentPatient.setSourceTimestamp(es.getSourceTimestamp());
		}
		
	}
	
@@ -224,12 +235,22 @@ public class GroupedXMLReader implements ObservationSupplier {
			reader.nextTag();
		}
		if( visitData.containsKey("start") ){
			encounterStart = DateTimeAccuracy.parsePartialIso8601(visitData.get("start"));
			String date = visitData.get("start");
			try {
				encounterStart = DateTimeAccuracy.parsePartialIso8601(date);
			} catch (ParseException e) {
				throw new XMLStreamException("Unable to parse encounter/start: "+date, reader.getLocation(), e);
			}
		}else{
			encounterStart = null;
		}
		if( visitData.containsKey("end") ){
			encounterEnd = DateTimeAccuracy.parsePartialIso8601(visitData.get("end"));
			String date = visitData.get("end");
			try {
				encounterEnd = DateTimeAccuracy.parsePartialIso8601(date);
			} catch (ParseException e) {
				throw new XMLStreamException("Unable to parse encounter/end: "+date, reader.getLocation(), e);
			}
		}else{
			encounterEnd = null;
		}
+3 −2
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ package de.sekmi.histream.io;


import java.math.BigDecimal;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
@@ -104,7 +105,7 @@ class XMLObservationParser extends AbstractObservationParser{
			// TODO: log error
		}				
	}
	protected void newObservation(AttributeAccessor atts){
	protected void newObservation(AttributeAccessor atts) throws ParseException{
		// determine start time
		DateTimeAccuracy start;
		String ts = atts.getValue("start");
@@ -213,7 +214,7 @@ class XMLObservationParser extends AbstractObservationParser{
		setMeta(ObservationSupplier.META_SOURCE_TIMESTAMP, atts.getValue("timestamp"));
		setMeta(ObservationSupplier.META_SOURCE_ID, atts.getValue("id"));
	}
	protected void parseEncounter(AttributeAccessor atts){
	protected void parseEncounter(AttributeAccessor atts) throws ParseException{
		encounterStart = DateTimeAccuracy.parsePartialIso8601(atts.getValue("start"));
		if( atts.getValue("end") != null ){
			encounterEnd = DateTimeAccuracy.parsePartialIso8601(atts.getValue("end"));
+11 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ package de.sekmi.histream.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.text.ParseException;

import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLInputFactory;
@@ -118,7 +119,11 @@ public class XMLObservationSupplier extends XMLObservationParser implements Obse
			// read visit attributes

			if( reader.getLocalName().equals("encounter") ){
				try {
					parseEncounter(atts);
				} catch (ParseException e) {
					throw new XMLStreamException("Unable to parse encounter", reader.getLocation(), e);
				}
			}

			String text = reader.getElementText();
@@ -158,7 +163,11 @@ public class XMLObservationSupplier extends XMLObservationParser implements Obse
				|| reader.getLocalName().equals("eav-group")) ){
			throw new XMLStreamException("Element eav-item or eav-group expected instead of "+reader.getLocalName(), reader.getLocation());
		}
		try {
			newObservation(atts);
		} catch (ParseException e) {
			throw new XMLStreamException("Unable to parse observation", reader.getLocation(), e);
		}
		if( reader.getLocalName().equals("eav-group") ){
			// group item can have value
			parseValueAttributes(atts);
Loading