Using and Testing Application Engine Programs

This is an example of a Application Engine program that reads an ASCII text file and posts a Quality EIP message. The following sample displays an input file for the Application Engine program:

/* Read source file and publish messages into EIP message queue. */

Local File &TestDataIn, &LogFileOut;
Local string &LineIn, &LogMsg, &FilenameIn, &LogFilename;
Local number &iRowSet, &WriteStatus, &nLinesIn, &nSessionGroups, &nSessions;
Local number &nSubgroups, &nDefects, &nTraceSets, &iValue;
Local number &iSession, &iSubgroup, &iDefect, &iTrace;

/* record keys */

Local number &SessionGroupId, &SessionId, &StreamId;
Local string &DataSource;

/* record fields */

Local string &Fieldname, &Fieldvalue;

Local Message &Message;
Local Rowset &SessionGroupRs, &SessionRs, &SubgroupRs, &DefectRs, &TraceRs;
Local Row &SessionGroupRow, &SessionRow, &SubgroupRow, &DefectRow, &TraceRow;
Local Record &SessionGroupRec, &SessionRec, &SubgroupRec, &DefectRec, &TraceRec;

Local datetime &SessionCreateDttm;

/* end of declarations *****************************************************/

&nLinesIn = 0;
&nSessionGroups = 0;
&nSessions = 0;
&nSubgroups = 0;
&nDefects = 0;
&nTraceSets = 0;

&FilenameIn = "EIPTestDataIn.txt";
&LogFilename = "EIPTestDataIn.log";

&LogFileOut = GetFile(&LogFilename, "W", "A", %FilePath_Absolute);

If (&LogFileOut.IsOpen = False) Then
   Return;
End-If;

&LogFileOut.WriteLine("Processing started " | %Datetime | ", [" | &FilenameIn |⇒
 "]");
&LogFileOut.WriteLine("");

&TestDataIn = GetFile(&FilenameIn, "E", "A", %FilePath_Absolute);

If (&TestDataIn.IsOpen = False) Then
   &LogMsg = "Unable to open input file [" | &FilenameIn | "]";
   &LogFileOut.WriteLine(&LogMsg);
   &LogFileOut.Close();
   Return;
End-If;

&Message = CreateMessage(Message.QUALITY_DATA_SUBMIT);

If (&Message = Null) Then
   &LogMsg = "Unable to create message";
   &LogFileOut.WriteLine(&LogMsg);
   &LogFileOut.Close();
   Return;
End-If;

If (&Message.IsActive = False) Then
   &LogMsg = "Message is inactive";
   &LogFileOut.WriteLine(&LogMsg);
   &LogFileOut.Close();
   Return;
End-If;

&SessionGroupRs = &Message.GetRowset();

While &TestDataIn.ReadLine(&LineIn)
   &nLinesIn = &nLinesIn + 1;
   &LogMsg = "Processing line " | &nLinesIn | ", [" | &LineIn | "]";
   &LogFileOut.WriteLine(&LogMsg);
   /* We need to do publish messages here... */
   /* identify the record type */
   If (Substring(&LineIn, 1, 13) = "session group") Then
      /* check to make sure that we don't overrun our output message buffer */
      If ((&Message.Size + 100000) > %MaxMessageSize) Then
         &Message.Publish();
         &Message = CreateMessage(Message.QUALITY_DATA_SUBMIT);
         If (&Message = Null) Then
            &LogFileOut.WriteLine("Unable to create message");
            &LogFileOut.Close();
            Return;
         End-If;
         &SessionGroupRs = &Message.GetRowset();
      End-If;
      &nSessionGroups = &nSessionGroups + 1;
      &SessionGroupId = Value(LTrim(Substring(&LineIn, 15, 4)));
      &DataSource = Substring(&LineIn, 22, 12);
      If (&nSessionGroups > 1) Then
         &SessionGroupRs.InsertRow(&nSessionGroups - 1);
      End-If;
      &SessionGroupRow = &SessionGroupRs.GetRow(&nSessionGroups);
      &SessionGroupRec = &SessionGroupRow.GetRecord(Record.QS_EIP_SESS_GRP);
      /* set keys */
      &SessionGroupRec.QS_EIP_SESSION_GRP.Value = &SessionGroupId;
      &SessionGroupRec.QS_EIP_DATASOURCE.Value = &DataSource;
      &iSession = 0;
   Else
      If (Substring(&LineIn, 1, 9) = "  session") Then
         /* stop the last timer and start a new one */
         &nSessions = &nSessions + 1;
         &iSession = &iSession + 1;
         &SessionRs = &SessionGroupRow.GetRowset(1);
         /* original -> &SessionId = Value(LTrim(Substring(&LineIn, 14, 5))); */
         /* using statement below to autonumber */
         &SessionId = &iSession;
         If (&iSession > 1) Then
            &SessionRs.InsertRow(&iSession - 1);
         End-If;
         &SessionRow = &SessionRs.GetRow(&iSession);
         &SessionRec = &SessionRow.GetRecord(Record.QS_EIP_SESSION);
         /* set keys */
         &SessionRec.QS_EIP_SESSION_GRP.Value = &SessionGroupId;
         &SessionRec.QS_EIP_DATASOURCE.Value = &DataSource;
         &SessionRec.QS_EIP_SESSN_ID.Value = &SessionId;
         /* set fields */
         &SessionRec.BUSINESS_UNIT.Value = LTrim(Substring(&LineIn, 22, 10));
         &SessionCreateDttm = %Datetime;
         &SessionRec.SESSN_CRE_DTTM.Value = &SessionCreateDttm;
         /* Set session status to saved = 1, move = 2 */
         &SessionRec.QS_SESSION_STATUS.Value = 1;
         /* set traceset to locked = 2, not locked = 1 */
         &SessionRec.QS_EIP_TRACELOCK.Value = 2;
         &iSubgroup = 0;
         &iTrace = 0;
      Else
         If (Substring(&LineIn, 1, 12) = "    subgroup") Then
            &nSubgroups = &nSubgroups + 1;
            &iSubgroup = &iSubgroup + 1;
            For &iRowSet = 1 To &SessionRow.ChildCount
               If (&SessionRow.GetRowset(&iRowSet).DBRecordName = 
                  "QS_EIP_SGRP_SUB") Then Break;
               End-If;
            End-For;
            &SubgroupRs = &SessionRow.GetRowset(&iRowSet);
            &StreamId = Value(LTrim(Substring(&LineIn, 14, 5)));
            If (&iSubgroup > 1) Then
               &SubgroupRs.InsertRow(&iSubgroup - 1);
            End-If;
            &SubgroupRow = &SubgroupRs.GetRow(&iSubgroup);
            &SubgroupRec = &SubgroupRow.GetRecord(Record.QS_EIP_SGRP_SUB);
            /* set keys */
            &SubgroupRec.QS_EIP_SESSION_GRP.Value = &SessionGroupId;
            &SubgroupRec.QS_EIP_DATASOURCE.Value = &DataSource;
            &SubgroupRec.QS_EIP_SESSN_ID.Value = &SessionId;
            &SubgroupRec.STREAM_ID.Value = &StreamId;
            /* set fields */
            /* set subgroup status to submitted = 2, saved = 1 */
            &SubgroupRec.QS_SUBGROUP_STATUS.Value = 2;
            &SubgroupRec.SESSN_CRE_DTTM.Value = &SessionCreateDttm;
            &SubgroupRec.SESSN_SUBMIT_DTTM.Value = %Datetime;
            &SubgroupRec.OPERATOR.Value = %OperatorId;
            &SubgroupRec.SESSN_SGRP_SIZE.Value = 
                 Value(LTrim(Substring(&LineIn, 20, 8)));
            &SubgroupRec.QS_NVALUES.Value = Value(LTrim(Substring(&LineIn, 29,⇒
 8)));
            For &iValue = 1 To &SubgroupRec.QS_NVALUES.Value
               &Fieldname = "FIELD.QS_VALUEREADING_" | &iValue;
               &SubgroupRec.GetField(@&Fieldname).Value = 
                    Value(RTrim(LTrim(Substring(&LineIn, 38 +                     ⇒
((&iValue - 1) * 9), 8))));
            End-For;
            &iDefect = 0;
         Else
            If (Substring(&LineIn, 1, 12) = "      defect") Then
               &nDefects = &nDefects + 1;
               &iDefect = &iDefect + 1;
               For &iRowSet = 1 To &SubgroupRow.ChildCount
                  If (&SubgroupRow.GetRowset(&iRowSet).
                     DBRecordName = "QS_EIP_DEFECTS") Then
                     Break;
                  End-If;
               End-For;
               &DefectRs = &SubgroupRow.GetRowset(&iRowSet);
               If (&iDefect > 1) Then
                  &DefectRs.InsertRow(&iDefect - 1);
               End-If;
               &DefectRow = &DefectRs.GetRow(&iDefect);
               &DefectRec = &DefectRow.GetRecord(Record.QS_EIP_DEFECTS);
               /* set keys */
               &DefectRec.QS_EIP_SESSION_GRP.Value = &SessionGroupId;
               &DefectRec.QS_EIP_DATASOURCE.Value = &DataSource;
               &DefectRec.QS_EIP_SESSN_ID.Value = &SessionId;
               &DefectRec.STREAM_ID.Value = &StreamId;
               &DefectRec.SAMPLE.Value = Value(LTrim(Substring(&LineIn, 16, 5)));
               &DefectRec.DFCT_SEQ.Value = Value(LTrim(Substring(&LineIn, 22, 3)));
               /* set fields */
               &DefectRec.DFCT_L1_DEFN.Value = RTrim(Substring(&LineIn, 28, 10));
               &DefectRec.DFCT_L2_DEFN.Value = RTrim(Substring(&LineIn, 39, 10));
               &DefectRec.DFCT_L3_DEFN.Value = RTrim(Substring(&LineIn, 50, 10));
               &DefectRec.DFCT_CNT.Value = Value(LTrim(Substring(&LineIn, 61, 5)));
            Else
               If (Substring(&LineIn, 1, 12) = "    traceset") Then
                  &nTraceSets = &nTraceSets + 1;
                  &iTrace = &iTrace + 1;

                  For &iRowSet = 1 To &SessionRow.ChildCount
                     If (&SessionRow.GetRowset(&iRowSet).DBRecordName =           ⇒
              "QS_EIP_TRACE") Then
                        Break;
                     End-If;
                  End-For;
                  &TraceRs = &SessionRow.GetRowset(&iRowSet);
                  If (&iTrace > 1) Then
                     &TraceRs.InsertRow(&iTrace - 1);
                  End-If;
                  &TraceRow = &TraceRs.GetRow(&iTrace);
                  &TraceRec = &TraceRow.GetRecord(Record.QS_EIP_TRACE);
                  /* set keys */
                  &TraceRec.QS_EIP_SESSION_GRP.Value = &SessionGroupId;
                  &TraceRec.QS_EIP_DATASOURCE.Value = &DataSource;
                  &TraceRec.QS_EIP_SESSN_ID.Value = &SessionId;
                  &TraceRec.SAMPLE.Value = &iTrace;
                  /* set operator and date/time stamp trace field defaults */
                  &TraceRec.OPERATOR.Value = %OperatorId;
                  &TraceRec.STAMP_DTTM.Value = %Datetime;
               Else
                  /* set trace fields */
                  If (Substring(&LineIn, 1, 11) = "      field") Then
                     &Fieldname = "FIELD." | RTrim(Substring(&LineIn, 16, 14));
                     &Fieldvalue = RTrim(LTrim(Substring(&LineIn, 30, 20)));
                     &TraceRec.GetField(@&Fieldname).Value = &Fieldvalue;
                  Else
                     /* ignore comment lines */
                     If ( Not ((Substring(&LineIn, 1, 2) = "//") Or
                           (&LineIn = ""))) Then
                        &LogMsg = "Invalid line [" | &LineIn | "]";
                        &LogFileOut.WriteLine(&LogMsg);
                     End-If;
                  End-If;
               End-If;
            End-If;
         End-If;
      End-If;
   End-If;
End-While;

&LogFileOut.WriteLine("");
&LogMsg = "Message size = " | &Message.Size | ", 
     maximum message size = " | %MaxMessageSize;
&LogFileOut.WriteLine(&LogMsg);

&Message.Publish();

/* cleanup */

&TestDataIn.Close();

&LogFileOut.WriteLine("");
&LogMsg = &nSessions | " sessions, " | &nSubgroups | " subgroups, " | 
     &nDefects | " defects, " | &nTraceSets | " tracesets.";
&LogFileOut.WriteLine(&LogMsg);

&LogMsg = "Processing completed " | %Datetime | ", " | &nLinesIn | 
     " lines processed, closing log file.";
&LogFileOut.WriteLine(&LogMsg);
&LogFileOut.Close();

Application Engine Sample Input Test File

This test file is only an example. For the file to be useful, you must change the information in the example to reflect the information in the configuration.

// Test set
//
session group    2   EIP-AE
  session        1   M04
    subgroup   140        3        3     13       11       12
    subgroup   141        3        3     24       23       23
    subgroup   142        3        3     34       33       33
  session        2   M04
    subgroup   140        3        3     12       12       13
    subgroup   141        3        3     22       22       22
    subgroup   142        3        3     32       32       32
  session        3   M04
    subgroup   140        3        3     11       12       13
    subgroup   141        3        3     21       22       23
    subgroup   142        3        3     31       32       33
  session        4   M04
    subgroup   140        3        3     13       11       13
    subgroup   141        3        3     13       11       13
    subgroup   142        3        3     13       11       13
  session        5   M04
    subgroup   140        3        3     12       11       13
    subgroup   141        3        3     12       11       13
    subgroup   142        3        3     12       11       13
  session        6   M04
    subgroup   140        3        3     14       11       13
    subgroup   141        3        3     14       11       13
    subgroup   142        3        3     14       11       13
  session        7   M04
    subgroup   140        3        3     12       12       12
    subgroup   141        3        3     22       22       22
    subgroup   142        3        3     22       22       22
  session        8   M04
    subgroup   140        3        3     13       12       13
    subgroup   141        3        3     13       12       13
    subgroup   142        3        3     13       12       13
  session        9   M04
    subgroup   140        3        3     14       13       11
    subgroup   141        3        3     14       13       11
    subgroup   142        3        3     14       13       11
  session       10   M04
    subgroup   140        3        3     14       13       12
    subgroup   141        3        3     13       11       11
    subgroup   142        3        3     13       11       11
  session       11   M04
    subgroup   140        3        3     13       11       11
    subgroup   141        3        3     12       11       12
    subgroup   142        3        3     12       11       12
  session       12   M04
    subgroup   140        3        3     12       11       12
    subgroup   141        3        3     13       11       13
    subgroup   142        3        3     13       11       13
  session       13   M04
    subgroup   140        3        3     13       11       13
    subgroup   141        3        3     12       12       13
    subgroup   142        3        3     12       12       13
  session       14   M04
    subgroup   140        3        3     12       12       13
    subgroup   141        3        3     13       12       11
    subgroup   142        3        3     13       12       11
  session       15   M04
    subgroup   140        3        3     13       12       11
    subgroup   141        3        3     11       13       13
    subgroup   142        3        3     11       13       13
  session       16   M04
    subgroup   140        3        3     11       13       13
    subgroup   141        3        3     22       22       22
    subgroup   142        3        3     22       22       22
  session       17   M04
    subgroup   140        3        3     12       12       12
    subgroup   141        3        3     13       12       11
    subgroup   142        3        3     13       12       11
  session       18   M04
    subgroup   140        3        3     13       12       11
    subgroup   141        3        3     14       11       12
    subgroup   142        3        3     11       12       14
  session       19   M04
    subgroup   140        3        3     14       11       12
    subgroup   141        3        3     11       12       14
    subgroup   142        3        3     12       12       14
  session       20   M04
    subgroup   140        3        3     11       12       14
    subgroup   141        3        3     12       12       14
    subgroup   142        3        3     14       11       12
  session       21   M04
    subgroup   140        3        3     12       12       14
    subgroup   141        3        3     13       11       11
    subgroup   142        3        3     13       11       11
  session       22   M04
    subgroup   140        3        3     13       11       11
    subgroup   141        3        3     12       11       12
    subgroup   142        3        3     12       11       12
  session       23   M04
    subgroup   140        3        3     12       11       12
    subgroup   141        3        3     12       11       11
    subgroup   142        3        3     12       11       11
  session       24   M04
    subgroup   140        3        3     11       12       11
    subgroup   141        3        3     11       14       13
    subgroup   142        3        3     11       14       13
  session       25   M04
    subgroup   140        3        3     11       14       13
    subgroup   141        3        3     13       11       12
    subgroup   142        3        3     13       11       12