in ctakes-preprocessor/src/main/java/org/apache/ctakes/preprocessor/ClinicalNotePreProcessor.java [187:684]
public void startElement(
String uri,
String localName,
String qName,
Attributes attributes) throws SAXException
{
// must be first statement of method to properly capture contiguous text
// nodes
if (iv_contiguousTextBuffer.length() > 0)
{
newTextNode();
}
if (!iv_insideHeader && localName.equals("clinical_document_header"))
{
iv_insideHeader = true;
}
else if (localName.equals("is_known_by"))
{
iv_insideKnownBy = true;
}
else if (iv_insideHeader && localName.equals("origination_dttm"))
{
String revDate = attributes.getValue("V");
if (revDate.length() > 0)
{
try
{
long timeInMillis = convertTime(revDate);
iv_docMetaData.addMetaData(MD_KEY_REV_DATE, String
.valueOf(timeInMillis));
}
catch (Exception e)
{
LOGGER.warn(MD_KEY_REV_DATE+" invalid:"+revDate);
}
}
}
else if (localName.equals("section"))
{
iv_sectionNestingLevel++;
if (!iv_insideSection)
{
iv_insideSection = true;
iv_sectionText = new StringBuffer();
iv_sectionStartOffset = iv_text.length();
}
}
else if (iv_insideSection && localName.equals("caption"))
{
iv_insideCaption = true;
}
else if (iv_insideSection && localName.equals("caption_cd"))
{
// if (iv_insideTable && iv_previousElement.equals("caption")) {
// processing a table, trace why type of table this is
// String tableType = attributes.getValue("V");
// if(tableType == null || tableType.length() == 0)
// iv_tableType = UNKNOWN_TABLE_TYPE;
// else
// iv_tableType = Integer.parseInt(tableType);
// }
if (iv_sectionIdentifier == null)
{
iv_sectionIdentifier = attributes.getValue("V");
}
if (iv_insideTableHeader)
{
// There are cases where the cnote will embed structured
// key-value
// pairs inside a table row. The signal that is is the case is
// finding
// a caption_cd element embedded inside a table header. If we
// run into
// this, record the ID of the caption_cd
iv_tableHeaderKeyID = attributes.getValue("V");
}
}
else if (iv_insideSection && localName.equals("table"))
{
iv_insideTable = true;
}
else if (iv_insideTable && localName.equals("tr"))
{
iv_insideTableRow = true;
iv_tdCounter = 0;
}
else if (iv_insideTableRow && localName.equals("th"))
{
iv_insideTableHeader = true;
}
else if (iv_insideTableRow && localName.equals("td"))
{
iv_insideTableData = true;
compress(iv_sectionText);
iv_tdStartOffset = iv_text.length() + iv_sectionText.length();
// } else if (iv_insideTableHeader && localName.equals("activity_tmr")) {
// } else if (iv_insideTableData && localName.equals("coded_entry.value")) {
}
else if (iv_insideTableData && localName.equals("value"))
{
// check to see if we're at a key-value pair
if (iv_tableHeaderKeyID != null)
{
String value = attributes.getValue("V");
if (iv_sectionIdentifier.equals("20114"))
{
// processing for Administrative section
switch ( iv_tableHeaderKeyID ) {
case "30004":
// margin code
iv_docMetaData.addMetaData(
MD_KEY_PT_BILLING_CODE,
value );
break;
case "30005":
// total time
iv_docMetaData.addMetaData( MD_KEY_TOTAL_TIME, value );
break;
case "30006":
// counseling time
iv_docMetaData.addMetaData(
MD_KEY_MINUTES_COUNSELING,
value );
break;
}
}
}
}
else if (iv_insideHeader)
{
// extract data from header
if (localName.equals("cn1_admin_data"))
{
iv_insideAdminData = true;
}
else if (localName.equals("transcriptionist"))
{
iv_insideTranscriptionist = true;
}
else if (localName.equals("patient"))
{
iv_insidePatient = true;
}
else if (localName.equals("patient_encounter"))
{
iv_insidePatientEncounter = true;
}
else if (localName.equals("legal_authenticator"))
{
iv_insideLegalAuth = true;
}
else if (localName.equals("provider"))
{
iv_insideProvider = true;
}
else if (localName.equals("service_location"))
{
iv_insideServiceLoc = true;
}
else if (localName.equals("document_type_cd"))
{
if (attributes.getValue("V").equals("2025539"))
{
iv_isHospitalSummary = true;
}
}
else if ((iv_previousElement != null)
&& (iv_previousElement.equals("clinical_document_header"))
&& localName.equals("id"))
{
// Handle older version notes
String docID = attributes.getValue("EX");
if ((docID != null)
&& (docID.length() > 0)
&& (docID.indexOf('#') == -1))
{
iv_docMetaData.addMetaData(MD_KEY_DOC_ID, docID);
}
}
else if (localName.equals("set_id"))
{
// Handle older version notes
String docLinkID = attributes.getValue("EX");
if ((docLinkID != null)
&& (docLinkID.length() > 0)
&& (docLinkID.indexOf('#') == -1))
{
iv_docMetaData.addMetaData(MD_KEY_DOC_LINK_ID, docLinkID);
}
}
else if (localName.equals("version_nbr"))
{
// Handle older version notes
String revisionID = attributes.getValue("V");
if ((revisionID != null)
&& (revisionID.length() > 0)
&& (revisionID.indexOf('#') == -1))
{
iv_docMetaData.addMetaData(
MD_KEY_DOC_REVISION_ID,
revisionID);
}
}
else if (iv_insideAdminData && localName.equals("cn1_discharge_date"))
{
String dischargeDate = attributes.getValue("V");
if (dischargeDate!= null &&
(dischargeDate.length() == 8 ||
dischargeDate.length() == 15))
{
try
{
// only admission date entered
long admitTimeInMillis = convertTime(dischargeDate);
iv_docMetaData.addMetaData(MD_KEY_DISCHARGE_DATE, String.valueOf(admitTimeInMillis));
}
catch (Exception e)
{
LOGGER.warn(MD_KEY_DISCHARGE_DATE+" invalid:"+dischargeDate);
}
}
}
else if (iv_insideAdminData && localName.equals("cn1_status_cd"))
{
String statusCode = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_DOC_STATUS_CODE, statusCode);
}
else if (iv_insideAdminData && localName.equals("cn1_service_cd"))
{
String serviceCode = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_SERVICE_CODE, serviceCode);
}
else if (iv_insideAdminData && localName.equals("cn1_event_cd"))
{
String eventCode = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_EVENT_TYPE_CODE, eventCode);
}
else if (iv_insideAdminData && localName.equals("cn1_document_id"))
{
String docID = attributes.getValue("EX");
iv_docMetaData.addMetaData(MD_KEY_DOC_ID, docID);
// DOC ID and DOC LINK ID are identical
iv_docMetaData.addMetaData(MD_KEY_DOC_LINK_ID, docID);
}
else if (iv_insideAdminData && localName.equals("cn1_revision_nbr"))
{
String revisionID = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_DOC_REVISION_ID, revisionID);
}
else if (iv_insideAdminData && localName.equals("cn1_site_cd"))
{
String siteCode = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_SITE_CODE, siteCode);
}
else if (iv_insideTranscriptionist)
{
if (localName.equals("id"))
{
String transcriberID = attributes.getValue("EX");
iv_docMetaData.addMetaData(
MD_KEY_TRANSCRIBER_ID,
transcriberID);
}
else if (localName.equals("participation_tmr"))
{
String transcriptionDate = attributes.getValue("V");
if (transcriptionDate.length() > 0)
{
try
{
long timeInMillis = convertTime(transcriptionDate);
iv_docMetaData.addMetaData(
MD_KEY_TRANSCRIPTION_DATE,
String.valueOf(timeInMillis));
}
catch (Exception e)
{
LOGGER.warn(MD_KEY_TRANSCRIPTION_DATE+" invalid:"+transcriptionDate);
}
}
}
}
else if (iv_insidePatient)
{
if(localName.equals("LIT")) //addr->lit, addr->cty, etc
{
String streetAddr = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_PATIENT_STREET_ADDR, streetAddr);
}
else if(localName.equals("CTY")) //addr->lit, addr->cty, etc
{
String city = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_PATIENT_CITY, city);
}
else if(localName.equals("STA")) //addr->lit, addr->cty, etc
{
String state = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_PATIENT_STATE, state);
}
else if(localName.equals("ZIP")) //addr->lit, addr->cty, etc
{
String zip = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_PATIENT_ZIP, zip);
}
else if(localName.equals("CNT")) //addr->lit, addr->cty, etc
{
String cnt = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_PATIENT_CNT, cnt);
}
else if (localName.equals("administrative_gender_cd"))
{
String ptGender = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_PT_GENDER, ptGender);
}
else if (localName.equals("birth_dttm"))
{
String birthDttm = attributes.getValue("V");
try
{
long birthTimeInMillis = convertTime(birthDttm);
iv_docMetaData.addMetaData(MD_KEY_PT_BIRTH_DATE, String
.valueOf(birthTimeInMillis));
}
catch (Exception e)
{
LOGGER.warn(MD_KEY_PT_BIRTH_DATE+" invalid:"+birthDttm);
}
}
else if (iv_insideKnownBy)
{
if (localName.equals("id") && (iv_previousElement.compareTo("is_known_by") == 0)){
// SPM add clinical id retrieval
String clinicalNumber = attributes.getValue("EX");
iv_docMetaData.addMetaData(MD_KEY_CUSTOMER_ID, clinicalNumber.replaceAll("-", ""));
}
}
}
else if (iv_insideLegalAuth)
{
if (localName.equals("id"))
{
String signatureID = attributes.getValue("EX");
iv_docMetaData
.addMetaData(MD_KEY_SIGNATURE_ID, signatureID);
}
else if (localName.equals("participation_tmr"))
{
String signatureDate = attributes.getValue("V");
if (signatureDate.length() > 0)
{
try
{
long timeInMillis = convertTime(signatureDate);
iv_docMetaData.addMetaData(
MD_KEY_SIGNATURE_DATE,
String.valueOf(timeInMillis));
}
catch (Exception e)
{
LOGGER.warn(MD_KEY_SIGNATURE_DATE+" invalid:"+signatureDate);
}
}
}
}
else if (iv_insideProvider)
{
if (localName.equals("id"))
{
if ( !iv_foundProvider1 )
{
String providerID = attributes.getValue("EX");
iv_docMetaData.addMetaData(
MD_KEY_PROVIDER_ID,
providerID);
iv_foundProvider1 = true;
}
else
{
String provider2ID = attributes.getValue("EX");
iv_docMetaData.addMetaData(
MD_KEY_PROVIDER2_ID,
provider2ID);
}
}
}
else if (iv_insidePatientEncounter)
{
if (localName.equals("organization.nm"))
{
String facilityCode = attributes.getValue("V");
iv_docMetaData.addMetaData(
MD_KEY_FACILITY_CODE,
facilityCode);
}
else if (localName.equals("encounter_tmr"))
{
String noteDate = attributes.getValue("V");
if (noteDate.length() > 0)
{
try
{
if (iv_isHospitalSummary)
{
/*
* Note: 07/23/07
* Formats that we need to handel:YYYYMMDDTHHMMSS, YYYYMMDD or YYYYMMDD<separator>YYYYMMDD
*/
if (noteDate.length() == 8 || noteDate.length() == 15)
{
// only admission date entered
long admitTimeInMillis = convertTime(noteDate);
iv_docMetaData.addMetaData(
MD_KEY_ADMIT_DATE,
String.valueOf(admitTimeInMillis));
iv_docMetaData.addMetaData(
MD_KEY_NOTE_DATE,
String.valueOf(admitTimeInMillis));
}
else if (noteDate.length() == 17)
{
// admission date and dismissal date
// entered separated by semi colon
String admitDate = noteDate.substring(0, 8);
String dischargeDate = noteDate.substring(
9,
17);
long admitTimeInMillis = convertTime(admitDate);
long dischargeTimeInMillis = convertTime(dischargeDate);
iv_docMetaData.addMetaData(
MD_KEY_ADMIT_DATE,
String.valueOf(admitTimeInMillis));
iv_docMetaData
.addMetaData(
MD_KEY_DISCHARGE_DATE,
String
.valueOf(dischargeTimeInMillis));
iv_docMetaData.addMetaData(
MD_KEY_NOTE_DATE,
String.valueOf(admitTimeInMillis));
}
}
else
{
long timeInMillis = convertTime(noteDate);
iv_docMetaData.addMetaData(
MD_KEY_NOTE_DATE,
String.valueOf(timeInMillis));
}
}
catch (Exception e)
{
throw new SAXException(e);
}
}
}
}
else if (iv_insideServiceLoc && localName.equals("id"))
{
String location = attributes.getValue("EX");
iv_docMetaData.addMetaData(MD_KEY_LOCATION, location);
}
else if (localName.equals("confidentiality_cd"))
{
String confidentialCode = attributes.getValue("V");
iv_docMetaData.addMetaData(
MD_KEY_DOC_CONFIDENTIAL_IND,
confidentialCode);
}
else if (localName.equals("administrative_gender_cd"))
{
String ptGender = attributes.getValue("V");
iv_docMetaData.addMetaData(MD_KEY_PT_GENDER, ptGender);
}
else if (localName.equals("birth_dttm"))
{
String birthDttm = attributes.getValue("V");
try
{
long birthTimeInMillis = convertTime(birthDttm);
iv_docMetaData.addMetaData(MD_KEY_PT_BIRTH_DATE, String
.valueOf(birthTimeInMillis));
}
catch (Exception e)
{
LOGGER.warn(MD_KEY_PT_BIRTH_DATE+" invalid:"+birthDttm);
}
}
}
iv_previousElement = localName;
}