1 /*****************************************************************************/
2 /* Software Testing Automation Framework (STAF)                              */
3 /* (C) Copyright IBM Corp. 2002                                              */
4 /*                                                                           */
5 /* This software is licensed under the Eclipse Public License (EPL) V1.0.    */
6 /*****************************************************************************/
7 
8 package com.ibm.staf.service.stax;
9 import com.ibm.staf.*;
10 import java.util.HashMap;
11 
12 public class STAXMessageAction extends STAXActionDefaultImpl
13 {
STAXMessageAction()14     public STAXMessageAction()
15     { /* Do Nothing */ }
16 
STAXMessageAction(String messageValue)17     public STAXMessageAction(String messageValue)
18     {
19         fUnevalMessageValue = messageValue;
20         fMessageValue = messageValue;
21     }
22 
STAXMessageAction(String messageValue, String logAttr, String level, String ifAttr)23     public STAXMessageAction(String messageValue, String logAttr, String level,
24                              String ifAttr)
25     {
26         fUnevalMessageValue = messageValue;
27         fMessageValue = messageValue;
28         fUnevalLogAttr = logAttr;
29         fUnevalLevel = level;
30         fLevel = level;
31         fUnevalIf = ifAttr;
32     }
33 
getMessageValue()34     public String getMessageValue() { return fMessageValue; }
35 
setMessageValue(String messageValue)36     public void setMessageValue(String messageValue)
37     {
38         fUnevalMessageValue = messageValue;
39         fMessageValue = messageValue;
40     }
41 
getLogAttr()42     public boolean getLogAttr() { return fLogAttr; }
setLogAttr(String logAttr)43     public void setLogAttr(String logAttr)
44     {
45         fUnevalLogAttr = logAttr;
46     }
47 
getLevel()48     public String getLevel() { return fLevel; }
setLevel(String level)49     public void setLevel(String level)
50     {
51         fUnevalLevel = level;
52         fLevel = level;
53     }
54 
getIf()55     public boolean getIf() { return fIf; }
setIf(String ifValue)56     public void setIf(String ifValue)
57     {
58         fUnevalIf = ifValue;
59     }
60 
getXMLInfo()61     public String getXMLInfo()
62     {
63         StringBuffer info = new StringBuffer("<message");
64 
65         if (!fUnevalLogAttr.equals("STAXLogMessage"))
66             info.append(" log=\"").append(fUnevalLogAttr).append("\"");
67         if (!fUnevalLevel.equals("'info'"))
68             info.append(" level=\"").append(fUnevalLevel).append("\"");
69         if (!fUnevalIf.equals("1"))
70             info.append(" if=\"").append(fUnevalIf).append("\"");
71         info.append(">").append(STAFUtil.maskPrivateData(fUnevalMessageValue)).
72             append("</message>");
73 
74         return info.toString();
75     }
76 
getInfo()77     public String getInfo()
78     {
79         String info = STAFUtil.maskPrivateData(fMessageValue);
80 
81         int msgLength = info.length();
82 
83         if (msgLength > 40)
84             return info.substring(0, 40) + "...";
85         else
86             return info;
87     }
88 
getDetails()89     public String getDetails()
90     {
91         return "MessageValue:" + STAFUtil.maskPrivateData(fMessageValue) +
92                ";LogAttr:" + fLogAttr +
93                ";LogLevel:" + fLevel +
94                ";If: " + fIf;
95     }
96 
execute(STAXThread thread)97     public void execute(STAXThread thread)
98     {
99         fThread = thread;
100         String evalElem = getElement();
101         String evalAttr = "if";
102 
103         try
104         {
105             fIf = fThread.pyBoolEval(fUnevalIf);
106 
107             if (!fIf)
108             {   // Ignore message element if "if" attribute evaluates to FALSE
109                 fThread.popAction();
110                 return;
111             }
112 
113             evalAttr = STAXElementInfo.NO_ATTRIBUTE_NAME;
114             fMessageValue = fThread.pyStringEval(fUnevalMessageValue);
115 
116             evalAttr = "log";
117             fLogAttr = fThread.pyBoolEval(fUnevalLogAttr);
118 
119             evalAttr = "level";
120             fLevel = fThread.pyStringEval(fUnevalLevel);
121         }
122         catch (STAXPythonEvaluationException e)
123         {
124             fThread.popAction();
125 
126             setElementInfo(new STAXElementInfo(evalElem, evalAttr));
127 
128             fThread.setSignalMsgVar(
129                 "STAXPythonEvalMsg", STAXUtil.formatErrorMessage(this), e);
130 
131             fThread.raiseSignal("STAXPythonEvaluationError");
132             return;
133         }
134 
135         // Send a message to the STAXMonitor (via an event)
136 
137         STAXTimestamp timestamp = new STAXTimestamp();
138 
139         HashMap<String, String> messageMap = new HashMap<String, String>();
140         messageMap.put("messagetext", timestamp.getTimestampString() +
141             " " + STAFUtil.maskPrivateData(fMessageValue));
142 
143         fThread.getJob().generateEvent(
144             STAXMessageActionFactory.STAX_MESSAGE, messageMap);
145 
146         if (fLogAttr)
147         {
148             // Log the message in the STAX Job User log
149 
150             STAFResult result = fThread.getJob().log(
151                 STAXJob.USER_JOB_LOG, fLevel, fMessageValue);
152 
153             if ((result.rc == 4004) &&
154                 (fThread.getJob().getInvalidLogLevelAction() ==
155                  STAXLogAction.LOGINFO))
156             {
157                 // Invalid log level.  Log using "Info" for the log level.
158                 result = fThread.getJob().log(
159                     STAXJob.USER_JOB_LOG, "Info", fMessageValue);
160             }
161 
162             if ((result.rc != STAFResult.Ok) &&
163                 (result.rc != STAFResult.UnknownService))
164             {
165                 fThread.popAction();
166 
167                 String msg = "Request to LOG service to log to the STAX " +
168                     "Job User log failed with RC: " + result.rc +
169                     " Result: " + result.result;
170 
171                 if (result.rc == 4004)
172                     msg += "\n\nInvalid log level: " + fLevel;
173                 else
174                     msg += "\n\nLevel: " + fLevel +
175                         "  Message: " + fMessageValue;
176 
177                 setElementInfo(new STAXElementInfo(
178                     evalElem, STAXElementInfo.NO_ATTRIBUTE_NAME, msg));
179 
180                 fThread.setSignalMsgVar(
181                     "STAXLogMsg", STAXUtil.formatErrorMessage(this));
182 
183                 fThread.raiseSignal("STAXLogError");
184 
185                 return;
186             }
187         }
188 
189         fThread.popAction();
190     }
191 
handleCondition(STAXThread thread, STAXCondition cond)192     public void handleCondition(STAXThread thread, STAXCondition cond)
193     {
194         thread.popAction();
195     }
196 
cloneAction()197     public STAXAction cloneAction()
198     {
199         STAXMessageAction clone = new STAXMessageAction();
200 
201         clone.setElement(getElement());
202         clone.setLineNumberMap(getLineNumberMap());
203         clone.setXmlFile(getXmlFile());
204         clone.setXmlMachine(getXmlMachine());
205 
206         clone.fUnevalMessageValue = fUnevalMessageValue;
207         clone.fMessageValue = fMessageValue;
208         clone.fUnevalLogAttr = fUnevalLogAttr;
209         clone.fLogAttr = fLogAttr;
210         clone.fUnevalLevel = fUnevalLevel;
211         clone.fLevel = fLevel;
212         clone.fUnevalIf = fUnevalIf;
213         clone.fIf = fIf;
214 
215         return clone;
216     }
217 
218     private STAXThread fThread = null;
219     private String fUnevalMessageValue = new String();
220     private String fUnevalLogAttr = "STAXLogMessage";
221     private String fUnevalLevel = new String("'info'");
222     private String fUnevalIf = "1";
223 
224     private String fMessageValue = new String();
225     private boolean fLogAttr = false;
226     private String fLevel = new String();
227     private boolean fIf = true;
228   }
229