Loading histream-core/src/main/java/de/sekmi/histream/DateTimeAccuracy.java +7 −4 Original line number Diff line number Diff line package de.sekmi.histream; import java.text.ParseException; import java.time.DateTimeException; /* Loading Loading @@ -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)); Loading histream-core/src/main/java/de/sekmi/histream/io/FlatObservationSupplier.java +27 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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 ){ Loading Loading @@ -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, Loading @@ -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; Loading histream-core/src/main/java/de/sekmi/histream/io/GroupedXMLReader.java +28 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") ){ Loading @@ -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()); } } Loading Loading @@ -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; } Loading histream-core/src/main/java/de/sekmi/histream/io/XMLObservationParser.java +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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")); Loading histream-core/src/main/java/de/sekmi/histream/io/XMLObservationSupplier.java +11 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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 Loading
histream-core/src/main/java/de/sekmi/histream/DateTimeAccuracy.java +7 −4 Original line number Diff line number Diff line package de.sekmi.histream; import java.text.ParseException; import java.time.DateTimeException; /* Loading Loading @@ -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)); Loading
histream-core/src/main/java/de/sekmi/histream/io/FlatObservationSupplier.java +27 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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 ){ Loading Loading @@ -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, Loading @@ -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; Loading
histream-core/src/main/java/de/sekmi/histream/io/GroupedXMLReader.java +28 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") ){ Loading @@ -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()); } } Loading Loading @@ -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; } Loading
histream-core/src/main/java/de/sekmi/histream/io/XMLObservationParser.java +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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")); Loading
histream-core/src/main/java/de/sekmi/histream/io/XMLObservationSupplier.java +11 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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