Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions sql/create_ALLERGYINTOLERANCE_table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CREATE TABLE `HealthPort`.`ALLERGYINTOLERANCE` (
`ID` VARCHAR(255) NOT NULL,
`DISPLAY` TEXT NULL,
`SUBSTANCE` VARCHAR(255) NULL,
`SUBJECT` TEXT NULL,
`SENSITIVITY_TYPE` TEXT NULL,
`RECORDED_DATE` DATE NULL,
`REACTION` TEXT NULL,
`CRITICALITY` TEXT NULL,
`STATUS` TEXT NULL,
PRIMARY KEY (`ID`));
10 changes: 10 additions & 0 deletions sql/create_SUBSTANCE_table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CREATE TABLE `HealthPort`.`SUBSTANCE` (
`ID` VARCHAR(255) NOT NULL,
`NAME` TEXT NULL,
`TYPE_SYSTEM` TEXT NULL,
`TYPE_CODE` TEXT NULL,
`TYPE_DISPLAY` TEXT NULL,
`EXTENSION_SYSTEM` TEXT NULL,
`EXTENSION_CODE` TEXT NULL,
`EXTENSION_DISPLAY` TEXT NULL,
PRIMARY KEY (`ID`));
36 changes: 36 additions & 0 deletions src/edu/gatech/i3l/HealthPort/AllergyIntoleranceSerializable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package edu.gatech.i3l.HealthPort;

import java.io.Serializable;

/**
* Bean for AllergyIntolerance data.
* @author Eric Wallace <ewall@gatech.edu>
*/
public class AllergyIntoleranceSerializable implements Serializable {
private static final long serialVersionUID = 1L;

public String ID;
public String DISPLAY;
public String SUBSTANCE;
public String SUBJECT;
public String SENSITIVITY_TYPE;
public java.util.Date RECORDED_DATE;
public String REACTION;
public String CRITICALITY;
public String STATUS;

public AllergyIntoleranceSerializable() {};

public AllergyIntoleranceSerializable(String id, String display, String substId, String subj,
String sensitivity, java.util.Date recDate, String reaction, String criticality, String status) {
this.ID = id;
this.DISPLAY = display;
this.SUBSTANCE = substId;
this.SUBJECT = subj;
this.SENSITIVITY_TYPE = sensitivity;
this.RECORDED_DATE = recDate;
this.REACTION = reaction;
this.CRITICALITY = criticality;
this.STATUS = status;
}
}
204 changes: 204 additions & 0 deletions src/edu/gatech/i3l/HealthPort/HealthPortInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,36 @@

import org.apache.commons.lang3.StringEscapeUtils;

import ca.uhn.fhir.model.api.ExtensionDt;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu.composite.CodeableConceptDt;
import ca.uhn.fhir.model.dstu.composite.CodingDt;
import ca.uhn.fhir.model.dstu.composite.ContainedDt;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt;
import ca.uhn.fhir.model.dstu.composite.QuantityDt;
import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu.resource.AdverseReaction;
import ca.uhn.fhir.model.dstu.resource.AdverseReaction.Symptom;
import ca.uhn.fhir.model.dstu.resource.AllergyIntolerance;
import ca.uhn.fhir.model.dstu.resource.Condition;
import ca.uhn.fhir.model.dstu.resource.Medication;
import ca.uhn.fhir.model.dstu.resource.MedicationPrescription;
import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.MedicationPrescription.Dispense;
import ca.uhn.fhir.model.dstu.resource.MedicationPrescription.DosageInstruction;
import ca.uhn.fhir.model.dstu.resource.Substance;
import ca.uhn.fhir.model.dstu.valueset.ConditionStatusEnum;
import ca.uhn.fhir.model.dstu.valueset.CriticalityEnum;
import ca.uhn.fhir.model.dstu.valueset.MedicationPrescriptionStatusEnum;
import ca.uhn.fhir.model.dstu.valueset.NarrativeStatusEnum;
import ca.uhn.fhir.model.dstu.valueset.ObservationReliabilityEnum;
import ca.uhn.fhir.model.dstu.valueset.ObservationStatusEnum;
import ca.uhn.fhir.model.dstu.valueset.SensitivityStatusEnum;
import ca.uhn.fhir.model.dstu.valueset.SensitivityTypeEnum;
import ca.uhn.fhir.model.primitive.DateDt;
import ca.uhn.fhir.model.primitive.DateTimeDt;
import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.StringDt;

/**
* @author Myung Choi Constructor requires UserID. - Connects to SQL database to
Expand All @@ -64,6 +74,8 @@ public class HealthPortInfo {
public static String OBSERVATION = "OBSERVATION";
public static String CONDITION = "CONDITIONS";
public static String MEDICATIONPRESCRIPTION = "MEDICATIONPRESCRIPTION";
public static String ALLERGYINTOLERANCE = "ALLERGYINTOLERANCE";
public static String SUBSTANCE = "SUBSTANCE";

private DataSource dataSource;

Expand Down Expand Up @@ -202,6 +214,39 @@ public List<String> getResourceIdsByCodeSystem(String tableName,
return retVal;
}

public List<String> getResourceIdsBySubstance (String tableName, String substanceId) {
List<String> retVal = new ArrayList<String>();

Connection connection = null;
Statement statement = null;

String SQL_STATEMENT = "SELECT ID FROM " + tableName
+ " WHERE SUBSTANCE = 'Substance/" + substanceId + "'";

System.out.println ("HealthPortInfo: getResourceIdsBySubstance: "+tableName+" for Substance "+substanceId);
connection = getConnection();
try {
statement = connection.createStatement();
ResultSet rs = statement.executeQuery(SQL_STATEMENT);

while (rs.next()) {
retVal.add(rs.getString("ID"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace(); // TODO Auto-generated catch block
}
}

System.out.println ("HealthPortInfo: getResourceIdsBySubstance: Done");

return retVal;
}

public List<String> getAllResourceIds(String tableName) {
List<String> retVal = new ArrayList<String>();

Expand Down Expand Up @@ -349,7 +394,54 @@ public static void storeResource(String tableName, Object obj0)
pstmt.executeUpdate();
pstmt.clearParameters();
pstmt.close();
} else if (tableName.equals(ALLERGYINTOLERANCE)) {
AllergyIntoleranceSerializable obj = (AllergyIntoleranceSerializable) obj0;
SQL_STATEMENT = "REPLACE INTO " + tableName
+ " (ID, DISPLAY, SUBSTANCE, SUBJECT, SENSITIVITY_TYPE,"
+ " RECORDED_DATE, REACTION, CRITICALITY, STATUS) VALUES"
+ " (?, ?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = connection.prepareStatement(SQL_STATEMENT);

// set input parameters
pstmt.setString(1, obj.ID);
pstmt.setString(2, obj.DISPLAY);
pstmt.setString(3, obj.SUBSTANCE);
pstmt.setString(4, "Patient/" + obj.SUBJECT);
pstmt.setString(5, obj.SENSITIVITY_TYPE);
if (obj.RECORDED_DATE != null) {
Timestamp ts = new Timestamp(obj.RECORDED_DATE.getTime());
pstmt.setTimestamp(6, ts);
} else {
pstmt.setTimestamp(6, null);
}
pstmt.setString(7, obj.REACTION);
pstmt.setString(8, obj.CRITICALITY);
pstmt.setString(9, obj.STATUS);

pstmt.executeUpdate();
pstmt.clearParameters();
pstmt.close();
} else if (tableName.equals(SUBSTANCE)) {
SubstanceSerializable obj = (SubstanceSerializable) obj0;
SQL_STATEMENT = "REPLACE INTO " + tableName
+ " (ID, NAME, TYPE_SYSTEM, TYPE_CODE, TYPE_DISPLAY,"
+ " EXTENSION_SYSTEM, EXTENSION_CODE, EXTENSION_DISPLAY) VALUES"
+ " (?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = connection.prepareStatement(SQL_STATEMENT);

// set input parameters
pstmt.setString(1, obj.ID);
pstmt.setString(2, obj.NAME);
pstmt.setString(3, obj.TYPE_SYSTEM);
pstmt.setString(4, obj.TYPE_CODE);
pstmt.setString(5, obj.TYPE_DISPLAY);
pstmt.setString(6, obj.EXTENSION_SYSTEM);
pstmt.setString(7, obj.EXTENSION_CODE);
pstmt.setString(8, obj.EXTENSION_DISPLAY);

pstmt.executeUpdate();
pstmt.clearParameters();
pstmt.close();
}
} catch (NamingException | SQLException e) {
e.printStackTrace();
Expand Down Expand Up @@ -703,6 +795,118 @@ else if (textStatus.equalsIgnoreCase("EXTENSIONS"))
NarrativeStatusEnum.EXTENSIONS);
}
retVal.add(medicationPrescript);
} else if (tableName.equals(ALLERGYINTOLERANCE)) {
String id = rs.getString("ID");
String display = rs.getString("DISPLAY");
String substId = rs.getString("SUBSTANCE");
String subject = rs.getString("SUBJECT");
String sensitivity = rs.getString("SENSITIVITY_TYPE");
Timestamp rdateTS = rs.getTimestamp("RECORDED_DATE");
String reactionText = rs.getString("REACTION");
String criticality = rs.getString("CRITICALITY");
String status = rs.getString("STATUS");

AllergyIntolerance allergy = new AllergyIntolerance();

// set ID
allergy.setId(id);

// set Text
NarrativeDt text = new NarrativeDt();
text.setDiv(display);
allergy.setText(text);

// set Subject as reference to Patient
ResourceReferenceDt subj = new ResourceReferenceDt(subject);
allergy.setSubject(subj);

// set Substance - reference
allergy.setSubstance(new ResourceReferenceDt(substId));

// set Type - valueset http://www.hl7.org/implement/standards/fhir/sensitivitytype.html
if (sensitivity.matches("(?i:allergy|drug|immunization)"))
allergy.setSensitivityType(SensitivityTypeEnum.ALLERGY);
else if (sensitivity.matches("(?i:intolerance|sensitivity"))
allergy.setSensitivityType(SensitivityTypeEnum.INTOLERANCE);
else
allergy.setSensitivityType(SensitivityTypeEnum.UNKNOWN);

// set Recoded Date
java.util.Date rDate = null;
if (rdateTS != null)
rDate = new Date(rdateTS.getTime());
if (rDate != null)
allergy.setRecordedDate(new DateTimeDt(rDate));

// set Reaction - resource AdverseReaction.symptom
AdverseReaction reactionObj = new AdverseReaction();
reactionObj.setSubject(subj);
Symptom symptom = new Symptom();
CodeableConceptDt sympCode = new CodeableConceptDt();
sympCode.setText(reactionText); // not enough info to fill out code
symptom.setCode(sympCode);
ArrayList<Symptom> sympList = new ArrayList<Symptom>();
sympList.add(symptom);
reactionObj.setSymptom(sympList);

// set Criticality - valueset http://www.hl7.org/implement/standards/fhir/criticality.html
if (criticality.matches("(?i:mild|low)"))
allergy.setCriticality(CriticalityEnum.LOW);
else if (criticality.matches("(?i:moderate|medium)"))
allergy.setCriticality(CriticalityEnum.MEDIUM);
else if (criticality.matches("(?i:severe|high)"))
allergy.setCriticality(CriticalityEnum.HIGH);
else if (criticality.matches("(?i:critical|fatal)"))
allergy.setCriticality(CriticalityEnum.FATAL);

// set Status - valueset http://www.hl7.org/implement/standards/fhir/sensitivitystatus.html
if (status.matches("(?i:suspected)"))
allergy.setStatus(SensitivityStatusEnum.SUSPECTED);
else if (status.matches("(?i:confirmed)"))
allergy.setStatus(SensitivityStatusEnum.CONFIRMED);
else if (status.matches("(?i:refuted)"))
allergy.setStatus(SensitivityStatusEnum.REFUTED);
else if (status.matches("(?i:resolved)"))
allergy.setStatus(SensitivityStatusEnum.RESOLVED);

retVal.add(allergy);
} else if (tableName.equals(SUBSTANCE)) {
String id = rs.getString("ID");
String name = rs.getString("NAME");
String typeSystem = rs.getString("TYPE_SYSTEM");
String typeCode = rs.getString("TYPE_CODE");
String typeDisp = rs.getString("TYPE_DISPLAY");
String extSystem = rs.getString("EXTENSION_SYSTEM");
String extCode = rs.getString("EXTENSION_CODE");
String extDisp = rs.getString("EXTENSION_DISPLAY");

Substance subst = new Substance();

// set ID
subst.setId(id);

// set Name
name = StringEscapeUtils.escapeHtml4(name);
subst.setDescription(name);

// set Type
//subst.setType(SubstanceTypeEnum.VALUESET_BINDER.fromCodeString(typeCode, typeSystem));
CodingDt typeCoding = new CodingDt();
typeCoding.setValueSet(new ResourceReferenceDt("http://hl7.org/fhir/vs/substance-type"));
typeCoding.setSystem(typeSystem);
typeCoding.setCode(typeCode);
typeCoding.setDisplay(typeDisp);
ArrayList<CodingDt> codingList = new ArrayList<CodingDt>();
codingList.add(typeCoding);
subst.getType().setCoding(codingList);

// add Extension
if (!extSystem.equals("") && !extCode.equals("")) {
ExtensionDt ext = new ExtensionDt(false, extSystem, new StringDt(extCode));
subst.addUndeclaredExtension(ext);
}

retVal.add(subst);
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/edu/gatech/i3l/HealthPort/RestfulServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
import ca.uhn.fhir.rest.server.FifoMemoryPagingProvider;
import ca.uhn.fhir.rest.server.IResourceProvider;
import ca.uhn.fhir.rest.server.RestfulServer;
import edu.gatech.i3l.HealthPort.providers.AllergyIntoleranceResourceProvider;
import edu.gatech.i3l.HealthPort.providers.ConditionResourceProvider;
import edu.gatech.i3l.HealthPort.providers.MedicationPrescrResource;
import edu.gatech.i3l.HealthPort.providers.ObservationResourceProvider;
import edu.gatech.i3l.HealthPort.providers.PatientResourceProvider;
import edu.gatech.i3l.HealthPort.providers.SubstanceResourceProvider;

import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -63,6 +65,8 @@ protected void initialize() throws ServletException {
resourceProviders.add(new ObservationResourceProvider());
resourceProviders.add(new ConditionResourceProvider());
resourceProviders.add(new MedicationPrescrResource());
resourceProviders.add(new AllergyIntoleranceResourceProvider());
resourceProviders.add(new SubstanceResourceProvider());
setResourceProviders(resourceProviders);

// /*
Expand Down
35 changes: 35 additions & 0 deletions src/edu/gatech/i3l/HealthPort/SubstanceSerializable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package edu.gatech.i3l.HealthPort;

import java.io.Serializable;

/**
* Bean for Substance data.
* @author Eric Wallace <ewall@gatech.edu>
*/
public class SubstanceSerializable implements Serializable {
private static final long serialVersionUID = 1L;

public String ID;
public String NAME;
public String TYPE_SYSTEM;
public String TYPE_CODE;
public String TYPE_DISPLAY;
public String EXTENSION_SYSTEM;
public String EXTENSION_CODE;
public String EXTENSION_DISPLAY;

public SubstanceSerializable() {};

public SubstanceSerializable(String id, String name,
String typeSystem, String typeCode, String typeDisp,
String extSystem, String extCode, String extDisp) {
this.ID = id;
this.NAME = name;
this.TYPE_SYSTEM = typeSystem;
this.TYPE_CODE = typeCode;
this.TYPE_DISPLAY = typeDisp;
this.EXTENSION_SYSTEM = extSystem;
this.EXTENSION_CODE = extCode;
this.EXTENSION_DISPLAY = extDisp;
}
}
4 changes: 4 additions & 0 deletions src/edu/gatech/i3l/HealthPort/UpdateFHIRdB.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,10 @@ protected void doGet(HttpServletRequest request,
e.printStackTrace();
}
}
} else if (res.equalsIgnoreCase(HealthPortInfo.ALLERGYINTOLERANCE)) {
// only ExactDataPort implemented at this time
syntheticEHRPort.getAllergyIntolerances();
syntheticCancerPort.getAllergyIntolerances();
}
}

Expand Down
Loading