source: branches/work_304/doc/DocActionSetFieldsHelper.cpp @ 383

Revision 383, 14.1 KB checked in by jls17, 6 years ago (diff)
  • fixed setfields SAMPLE DATA and SERVER output
Line 
1//Copyright (C) 2009 John Luthgers | jls17
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside is distributed in the hope that it will be useful,
10//    but WITHOUT ANY WARRANTY; without even the implied warranty of
11//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12//    GNU General Public License for more details.
13//
14//    You should have received a copy of the GNU General Public License
15//    along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "DocActionSetFieldsHelper.h"
19#include "DocAllMatchingIdsTable.h"
20#include "../core/ARAssignHelper.h"
21
22CDocActionSetFieldsHelper::CDocActionSetFieldsHelper(CARInside &arInside, CARServerObject &arServerObject, const string& objAttachedToSchemaName, const ARSetFieldsActionStruct& sFieldStruct, int structItemType, IfElseState ifElseMode, int numAction, int rootLevel)
23: arIn(arInside), obj(arServerObject), attachedSchemaName(objAttachedToSchemaName), setFieldsStruct(sFieldStruct), ifElse(ifElseMode), rootLevel(rootLevel)
24{
25        arStructItemType = structItemType;
26        nAction = numAction;
27        showServerNameInOutput = false;
28        showFormNameInOutput = false;
29}
30
31CDocActionSetFieldsHelper::~CDocActionSetFieldsHelper(void)
32{
33}
34
35void CDocActionSetFieldsHelper::ShowActionWithServerName(bool showIt)
36{
37        showServerNameInOutput = showIt;
38}
39
40ostream& CDocActionSetFieldsHelper::ToStream(std::ostream &writer)
41{
42        stringstream strmSchemaDisplay;
43        stringstream strmServer;
44        stringstream strmQual;
45
46        bool useDefaultFieldMappingTable = true;
47        showFormNameInOutput = true;
48
49        CARSchema wfSchema(attachedSchemaName);
50        if (wfSchema.Exists())
51        {
52                CARSetFieldHelper sfh(*CARInside::GetInstance(), wfSchema, setFieldsStruct, ifElse, nAction);
53
54                writer << "Data Source: " << this->GetSetFieldsTypeName(sfh.GetType()) << "<br/>";
55
56                switch (sfh.GetType())
57                {
58                case SFT_CURRENT:
59                        strmServer << arIn.LinkToServerInfo(arIn.appConfig.serverName, rootLevel);
60                        schemaNameActionIsReadingFrom = sfh.GetSchemaName();
61                        showFormNameInOutput = false;
62                        break;
63                case SFT_SERVER:
64                case SFT_SAMPLEDATA:
65                        {
66                                int pFormId = arIn.SchemaGetInsideId(attachedSchemaName);
67                                int sFormId = -1;
68                                string readServer = sfh.GetServerName();
69                                string readSchema = sfh.GetSchemaName();
70
71                                if (readSchema.compare("@") == 0)
72                                {
73                                        readSchema = attachedSchemaName;
74                                }
75
76                                if (sfh.GetType() == SFT_SAMPLEDATA)
77                                {
78                                        int fieldId = sfh.GetServerFieldId();
79                                        strmServer << "$" << (fieldId < 0 ? CAREnum::Keyword(abs(fieldId)) : arIn.LinkToField(attachedSchemaName, fieldId, rootLevel)) << "$ (Sample Server: " << arIn.LinkToServerInfo(readServer, rootLevel) << ")";
80
81                                        CRefItem refItemServer(obj, ifElse, nAction, REFM_SETFIELDS_SERVER);
82                                        arIn.AddFieldReference(pFormId, fieldId, refItemServer);
83
84                                        fieldId = sfh.GetSchemaFieldId();
85                                        strmSchemaDisplay << "$" << (fieldId < 0 ? CAREnum::Keyword(abs(fieldId)) : arIn.LinkToField(attachedSchemaName, fieldId, rootLevel)) << "$ (Sample Form: " << arIn.LinkToSchema(readSchema, rootLevel) << ")";
86                                        schemaNameActionIsReadingFrom = readSchema;
87
88                                        CRefItem refItemForm(obj, ifElse, nAction, REFM_SETFIELDS_FORM);
89                                        arIn.AddFieldReference(pFormId, fieldId, refItemForm);
90                                }
91                                else
92                                {
93                                        strmServer << arIn.LinkToServerInfo(readServer, rootLevel);
94
95                                        strmSchemaDisplay << readSchema;
96                                        schemaNameActionIsReadingFrom = readSchema;
97                                }
98
99                                // *************************************************************************
100
101                                sFormId = arIn.SchemaGetInsideId(readSchema);
102
103                                strmQual << "<br/>Set Field If<br/>" << endl;
104                                stringstream strmTmpQual;
105                                CRefItem refItem(obj, ifElse, nAction, REFM_SETFIELDS_QUALIFICATION);
106
107                                CARQualification arQual(arIn);
108                                arQual.arsStructItemType = arStructItemType;
109                                arQual.CheckQuery(sfh.GetQualifier(), refItem, 0, pFormId, sFormId, strmTmpQual, rootLevel);
110
111                                if(strmTmpQual.str().length() > 0)
112                                {
113                                        strmQual << strmTmpQual.str() << "<br/><br/>" << endl;
114                                }
115                                else
116                                {
117                                        strmQual << EmptyValue << "<br/><br/>" << endl;
118                                }
119
120                                strmQual << "If No Requests Match: " << CAREnum::NoMatchRequest(sfh.GetNoMatchOption()) << "<br/>" << endl;
121                                strmQual << "If Multiple Requests Match: " << CAREnum::MultiMatchRequest(sfh.GetMultiMatchOption()) << "<br/><br/>" << endl;
122                        }
123                        break;
124                case SFT_SQL:
125                        {
126                                strmServer << arIn.LinkToServerInfo(sfh.GetServerName(), rootLevel);
127                                strmQual << "<br/>Query:<br/>" << endl;
128
129                                if(!sfh.GetSqlCommand().empty())
130                                {
131                                        CRefItem refItem(obj, ifElse, nAction, REFM_SETFIELDS_SQL_QUALIFICATION);
132                                        strmQual << arIn.TextFindFields(sfh.GetSqlCommand(), "$", arIn.SchemaGetInsideId(attachedSchemaName), rootLevel, true, &refItem) << "<br/><br/>" << endl;
133                                }
134                                else
135                                        strmQual << EmptyValue << "<br/><br/>" << endl;
136
137                                strmQual << "If No Requests Match: " << CAREnum::NoMatchRequest(sfh.GetNoMatchOption()) << "<br/>" << endl;
138                                strmQual << "If Multiple Requests Match: " << CAREnum::MultiMatchRequest(sfh.GetMultiMatchOption()) << "<br/><br/>" << endl;   
139
140                                showFormNameInOutput = false;
141                        }
142                        break;
143                case SFT_FILTERAPI:
144                        {
145                                string schemaName = sfh.GetSchemaName();
146                                schemaNameActionIsReadingFrom = sfh.GetSchemaName();
147
148                                if (schemaName.substr(0, 1) == "$")
149                                {
150                                        CRefItem refItem(obj, ifElse, nAction, REFM_SETFIELDS_FILTERAPI_PLUGINNAME);
151                                        schemaName = arIn.TextFindFields(sfh.GetSchemaName(), "$", arIn.SchemaGetInsideId(attachedSchemaName), rootLevel, true, &refItem);
152                                }
153
154                                // the html-documtation for this action is generated directly here
155                                writer << "Plugin-Name: " << schemaName << "<br/><br/>" << endl;
156
157                                writer << "Input-Mapping: " << "<br/>";
158                                CARAssignHelper docInput(arIn, rootLevel, obj, attachedSchemaName, attachedSchemaName);
159                                writer << docInput.FilterApiInputAssignment(sfh.GetFilterAPIInputs(), sfh.GetFilterAPINumItems(), nAction, ifElse);
160
161                                writer << "Output-Mapping: " << "<br/>";
162                                CARAssignHelper assignHelper(arIn, rootLevel, obj, attachedSchemaName, attachedSchemaName);
163                                writer << assignHelper.SetFieldsAssignment(setFieldsStruct, nAction, ifElse);
164                       
165                                // we've generated our own html-table with input/output mapping. So avoid default table.
166                                useDefaultFieldMappingTable = false;
167                        }
168                        break;
169                case SFT_WEBSERVICE:
170                        {
171                                //NumItems = action.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems;
172                                //action.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[X].u.value
173                                //0 = Unknown
174                                //1 = Unknown
175                                //2 = Unknown
176                                //3 = Unknown
177                                //4 = WSDL Location
178                                //5 = Web Service
179                                //6 = Operation
180                                //7 = URI
181                                //8 = URN
182                                //9 = Input Mappings
183                                //10 = Output Mappings
184                                //11 = Port
185
186                                //populate operation string from input #6
187                                string operation = "";
188                                string form = "";
189
190                                TiXmlDocument operationXML;
191                                operationXML.Parse(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[6].u.value.u.charVal, 0, TIXML_DEFAULT_ENCODING);
192                                TiXmlHandle opHandle(&operationXML);
193                                TiXmlElement *opElement = opHandle.FirstChild("operation").FirstChild("inputMapping").ToElement();
194                                if (opElement)
195                                        operation = opElement->Attribute("name");
196
197                                writer << "WSDL Location: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 4 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[4].u.value) : "") << "<br/>"; 
198                                writer << "Web Service: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 5 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[5].u.value) : "") << "<br/>"; 
199                                writer << "Port: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 11 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[11].u.value) : "") << "<br/>"; 
200                                writer << "Operation: " << operation << "<br/>";
201                                writer << "URI: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 7 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[7].u.value) : "") << "<br/>"; 
202                                writer << "URN: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 8 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[8].u.value) : "") << "<br/>"; 
203
204                                //process input mapping
205                                if (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 9)
206                                {
207                                        stringstream input;
208                                        input.str("");
209
210                                        TiXmlDocument inputXML;
211                                        inputXML.Parse(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[9].u.value.u.charVal, 0, TIXML_DEFAULT_ENCODING);
212                                        TiXmlHandle inputHandle(&inputXML);
213                                        TiXmlNode *element = inputHandle.FirstChild("arDocMapping").FirstChild("formMapping").ToNode();
214
215                                        CTable tblInputMappingList("pushFieldsList", "TblObjectList");
216                                        tblInputMappingList.AddColumn(30, "Element");
217                                        tblInputMappingList.AddColumn(70, "Field");
218                                        input << processMappingXML(element, "", tblInputMappingList, "", WMM_INPUT);
219                                        input << tblInputMappingList;
220                                        writer << "<BR/>";
221                                        writer << "Input Mapping: " << input.str() << "<BR/>";
222                                }
223
224                                //process output mapping
225                                if (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 10)
226                                {
227                                        stringstream output;
228                                        output.str("");
229
230                                        TiXmlDocument outputXML;
231                                        outputXML.Parse(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[10].u.value.u.charVal, 0, TIXML_DEFAULT_ENCODING);
232                                        TiXmlHandle outputHandle(&outputXML);
233                                        TiXmlNode *element = outputHandle.FirstChild("arDocMapping").FirstChild("formMapping").ToNode();
234
235                                        CTable tblOutputMappingList("pushFieldsList", "TblObjectList");
236                                        tblOutputMappingList.AddColumn(30, "Element");
237                                        tblOutputMappingList.AddColumn(70, "Field");
238
239                                        output << processMappingXML(element, "", tblOutputMappingList, "", WMM_OUTPUT);
240                                        output << tblOutputMappingList;
241                                        writer << "Output Mapping: " << output.str();
242                                }
243
244                                // we've generated our own html-table with input/output mapping. So avoid default table.
245                                useDefaultFieldMappingTable = false;
246                        }
247                        break;
248                case SFT_ATRIUM_ORCHESTRATOR:
249                        {
250                                // TODO: implement Atrium Orchestrator actions correctly
251                                strmServer << arIn.LinkToServerInfo(AR_CURRENT_SERVER_TAG, rootLevel);
252                                schemaNameActionIsReadingFrom = sfh.GetSchemaName();
253                                strmSchemaDisplay << sfh.GetSchemaName();
254
255                                useDefaultFieldMappingTable = false;
256                        }
257                        break;
258                }
259        }
260
261        if (useDefaultFieldMappingTable)
262        {
263                GenerateDefaultMappingTable(writer, strmSchemaDisplay, strmServer, strmQual);
264        }
265
266        return writer;
267}
268
269void CDocActionSetFieldsHelper::GenerateDefaultMappingTable(ostream &writer, stringstream &strmSchemaDisplay, stringstream &strmServer, stringstream &strmQual)
270{
271        string tmpDisplayName = strmSchemaDisplay.str();
272        if(tmpDisplayName.size()==0)
273                tmpDisplayName = schemaNameActionIsReadingFrom;
274
275        if (this->showServerNameInOutput)
276                writer << "Server: " << strmServer.str() << "<br/>" << endl;
277
278        if (this->showFormNameInOutput)
279                writer << "From: " << arIn.LinkToSchema(tmpDisplayName, rootLevel) << "<br/>" << endl;
280
281        //Qualification
282        writer << strmQual.str() << endl;
283
284        // set field mapping
285        writer << "Field Mapping:";
286        if (setFieldsStruct.fieldList.fieldAssignList[0].fieldId == AR_LIKE_ID)
287        {
288                writer << " All Matching Ids<br/>";
289                CDocAllMatchingIdsTable allMatchingFieldsTable(attachedSchemaName, schemaNameActionIsReadingFrom, obj, CDocAllMatchingIdsTable::AMM_SETFIELDS, nAction, ifElse, rootLevel);
290                allMatchingFieldsTable.ToStream(writer);
291        }
292        else
293        {
294                writer << "<br/>" << endl;
295                CARAssignHelper assignHelper(arIn, rootLevel, obj, attachedSchemaName, schemaNameActionIsReadingFrom);
296                writer << assignHelper.SetFieldsAssignment(setFieldsStruct, nAction, ifElse);
297        }
298}
299
300string CDocActionSetFieldsHelper::processMappingXML( TiXmlNode* pParent, string sParent, CTable &tblFieldList, string form, WebserviceMappingMode type)
301{
302        if ( !pParent )
303                return "";
304
305        stringstream strm;
306
307        TiXmlNode* pChild;
308        int t = pParent->Type();
309
310        switch ( t )
311        {
312        case TiXmlNode::ELEMENT:
313                if (strcmp("element",pParent->Value()) == 0)
314                {
315                        sParent = pParent->ToElement()->Attribute("name");
316                }
317                else if (strcmp("formMapping",pParent->Value()) == 0)
318                {
319                        form = pParent->FirstChild("form")->ToElement()->Attribute("formName");
320                }
321                else if (strcmp("fieldMapping",pParent->Value()) == 0)
322                {
323                        int fieldID = atoi(pParent->ToElement()->Attribute("arFieldId"));
324
325                        CTableRow row("cssStdRow");
326                        row.AddCell(CTableCell(sParent));
327                        row.AddCell(CTableCell(arIn.LinkToField(form, fieldID, rootLevel)));
328                        //row.AddCell(CTableCell(form + " - "+arIn->LinkToField(form, fieldID, rootLevel)));
329                        tblFieldList.AddRow(row);       
330
331                        int msgId = 0;
332                        switch (type)
333                        {
334                        case WMM_INPUT: msgId = REFM_SETFIELDS_WS_INPUT; break;
335                        case WMM_OUTPUT: msgId = REFM_SETFIELDS_WS_OUTPUT; break;
336                        }
337                        CRefItem refItem(this->obj, ifElse, 0, msgId);
338                        arIn.AddFieldReference(arIn.SchemaGetInsideId(form), fieldID, refItem);
339                }
340                break;
341        }
342        for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 
343        {
344                strm << processMappingXML( pChild, sParent, tblFieldList, form, type);
345        }
346
347        return strm.str();
348}
349
350const char* CDocActionSetFieldsHelper::GetSetFieldsTypeName(SetFieldType type)
351{
352        switch (type)
353        {
354        case SFT_CURRENT: return "CURRENT SCREEN";
355        case SFT_SERVER: return "SERVER";
356        case SFT_SAMPLEDATA: return "SAMPLE DATA";
357        case SFT_SQL: return "SQL";
358        case SFT_FILTERAPI: return "FILTER API";
359        case SFT_WEBSERVICE: return "WEBSERVICE";
360        case SFT_ATRIUM_ORCHESTRATOR: return "BMC ATRIUM ORCHESTRATOR";
361        default: return EmptyValue;
362        }
363}
Note: See TracBrowser for help on using the repository browser.