public void startElement()

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;
    }