source: branches/work_311/doc/DocSchemaDetails.cpp @ 606

Revision 606, 76.3 KB checked in by jls17, 5 years ago (diff)
  • changed the parsing of the open window sample data from calling a static-method to using a class instance, so the caller can just use getServer and getSchema of the OpenWindowSampleData? class (makes the use more clear)
Line 
1//Copyright (C) 2009 Stefan Nerlich | stefan.nerlich@hotmail.com
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 "DocSchemaDetails.h"
19#include "DocFieldDetails.h"
20#include "../output/CsvPage.h"
21#include "../output/ImageTag.h"
22#include "../output/TabControl.h"
23#include "../output/URLLink.h"
24#include "../output/WorkflowReferenceTable.h"
25#include "../core/ARDayStructHelper.h"
26#include "../core/ARHandle.h"
27#include "../core/OpenWindowReportData.h"
28#include "../core/OpenWindowSampleData.h"
29#include "../util/Context.h"
30#include "DocOverlayHelper.h"
31#include "DocMain.h"
32
33#include "rapidjson/document.h"
34#include "rapidjson/genericwritestream.h"
35#include "rapidjson/writer.h"
36
37using namespace rapidjson;
38
39CDocSchemaDetails::CDocSchemaDetails(unsigned int schemaInsideId, int rootLevel)
40: schema(schemaInsideId)
41{
42        this->uniqueAlList.clear();
43        this->uniqueEscalList.clear();
44        this->uniqueFilterList.clear();
45        this->overlayType = 0;
46}
47
48CDocSchemaDetails::~CDocSchemaDetails(void)
49{
50}
51
52void CDocSchemaDetails::Documentation()
53{
54        try
55        {
56                CPageParams file(PAGE_DETAILS, &this->schema);
57                rootLevel = file->GetRootLevel();
58                string path = file->GetPath();
59
60                FileSystemUtil fsUtil(this->pInside->appConfig);
61                if(fsUtil.CreateSubDirectory(path)>=0)
62                {
63                        //stringstream pgStrm; 
64                        CWebPage webPage(file->GetFileName(), this->schema.GetName(), rootLevel, this->pInside->appConfig);
65                        CDocOverlayHelper overlayHelper(schema, rootLevel);
66                       
67                        const ARCompoundSchema& compSchema = this->schema.GetCompound();
68                        overlayType = schema.GetOverlayType();
69
70                        //ContentHead informations
71                        stringstream contHeadStrm;
72                        contHeadStrm << CWebUtil::LinkToSchemaIndex(rootLevel, false) << endl;
73                        contHeadStrm << MenuSeparator << this->pInside->LinkToSchemaTypeList(compSchema.schemaType, rootLevel) << endl;
74                        contHeadStrm << MenuSeparator << ImageTag(schema, rootLevel) << CWebUtil::ObjName(this->schema.GetName());
75                        contHeadStrm << CAREnum::GetOverlayTypeString(overlayType);
76
77                        if(!this->schema.GetAppRefName().empty())
78                                contHeadStrm << MenuSeparator << " Application " << this->pInside->LinkToContainer(this->schema.GetAppRefName(), rootLevel);
79
80                        webPage.AddContentHead(contHeadStrm.str(), overlayHelper.PlaceOverlayLink());
81                        webPage.AddContent(overlayHelper.PlaceOverlaidNotice());
82
83                        // add the javascript we need for this page to display correctly
84                        webPage.GetReferenceManager()
85                                .AddScriptReference("img/object_list.js")
86                                .AddScriptReference("img/schema_page.js")
87                                .AddScriptReference("img/jquery.timers.js")
88                                .AddScriptReference("img/jquery.address.min.js");
89
90                        // now the content
91                        CTabControl tabControl;
92
93                        // Add general schema informations to the page
94                        tabControl.AddTab("General", ShowGeneralInfo());
95
96                        // Add list of all fields to the page
97                        tabControl.AddTab("Fields", (IsJoinViewOrVendorForm() ? this->AllFieldsSpecial() : this->AllFields()) );
98
99                        // Add list of all views to the page
100                        tabControl.AddTab("Views", this->ShowVuiList());
101
102                        // Add a section which lists workflow thats reading data from this form
103                        tabControl.AddTab("Workflow", WorkflowDoc());
104
105                        // Add table with all references to the page
106                        tabControl.AddTab("References", GenerateReferencesTable(compSchema));
107
108                        webPage.AddContent(tabControl.ToXHtml());
109                        webPage.SaveInFolder(path);
110                }
111        }
112        catch(exception& e)
113        {
114                cout << "EXCEPTION schema details documentation of '"<< this->schema.GetName() << "': " << e.what() << endl;
115        }
116}
117
118//Create a page with all fields of this form
119string CDocSchemaDetails::AllFields()
120{               
121        CTable tbl("fieldListAll", "TblObjectList");
122        tbl.AddColumn(40, "Field Name");
123        tbl.AddColumn(10, "Field ID"); 
124        tbl.AddColumn(10, "Datatype");
125        tbl.AddColumn(10, "In Views");
126        tbl.AddColumn(10, "Modified");
127        tbl.AddColumn(20, "By");
128
129        try
130        {
131                CARFieldList* fields = schema.GetFields();
132                unsigned int fieldCount = fields->GetCount();
133                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
134                {
135                        CARField field(schema.GetInsideId(), 0, fieldIndex);
136
137                        CTableRow row("");
138
139                        CTableCell cellName(URLLink(field, rootLevel), "");
140                        CTableCell cellFieldId(field.GetFieldId(), "");
141                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
142
143                        stringstream strmTmp;
144                        if(field.GetDisplayInstances().numItems == 0 && field.GetFieldId() != 15)                               
145                                strmTmp << "<span class=\"fieldInNoView\">" << field.GetDisplayInstances().numItems << "</span>" << endl;
146                        else
147                                strmTmp << field.GetDisplayInstances().numItems;                       
148                        CTableCell cellNumViews(strmTmp.str(), "");                     
149
150                        CTableCell cellTimestamp(CUtil::DateTimeToHTMLString(field.GetTimestamp()), "");
151                        CTableCell cellLastChanged(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel), "");
152
153                        row.AddCell(cellName);
154                        row.AddCell(cellFieldId);
155                        row.AddCell(cellDataType);
156                        row.AddCell(cellNumViews);
157                        row.AddCell(cellTimestamp);
158                        row.AddCell(cellLastChanged);
159
160                        tbl.AddRow(row);
161                }
162
163                tbl.description = GenerateFieldTableDescription(tbl);
164
165                AllFieldsCsv();
166        }
167        catch(exception& e)
168        {
169                cout << "EXCEPTION schema all fields of '"<< this->schema.GetName() << "': " << e.what() << endl;
170        }
171
172        return tbl.ToXHtml();   
173}
174
175void CDocSchemaDetails::AllFieldsCsv()
176{               
177        CTable tbl("fieldListAll", "TblObjectList");
178        tbl.AddColumn(40, "Field Name");
179        tbl.AddColumn(10, "Field ID"); 
180        tbl.AddColumn(10, "Datatype");
181        tbl.AddColumn(10, "In Views");
182        tbl.AddColumn(10, "Modified");
183        tbl.AddColumn(20, "By");
184
185        try
186        {
187                CARFieldList* fields = schema.GetFields();
188                unsigned int fieldCount = fields->GetCount();
189                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
190                {
191                        CARField field(schema.GetInsideId(), 0, fieldIndex);
192
193                        CTableRow row("");
194                        CTableCell cellName(field.GetName(), "");
195                        CTableCell cellFieldId(field.GetFieldId(), "");
196                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");                   
197                        CTableCell cellNumViews(field.GetDisplayInstances().numItems, "");     
198                        CTableCell cellTimestamp(CUtil::DateTimeToString(field.GetTimestamp()), "");
199                        CTableCell cellLastChanged(field.GetLastChanged(), "");
200
201                        row.AddCell(cellName);         
202                        row.AddCell(cellFieldId);
203                        row.AddCell(cellDataType);
204                        row.AddCell(cellNumViews);
205                        row.AddCell(cellTimestamp);
206                        row.AddCell(cellLastChanged);
207
208                        tbl.AddRow(row);
209                }
210
211                //Save field information to ccs
212                CPageParams file(PAGE_SCHEMA_FIELDS_CSV, &this->schema);
213                CCsvPage csvPage(file->GetFileName(), this->pInside->appConfig);
214                csvPage.SaveInFolder(file->GetPath(), tbl.ToCsv());
215        }
216        catch(exception& e)
217        {
218                cout << "EXCEPTION schema all fields csv of '" << this->schema.GetName() << "': " << e.what() << endl;
219        }
220}
221
222void CDocSchemaDetails::AllFieldsJson(std::ostream &out)
223{
224        try
225        {
226                Document document;
227                Document::AllocatorType &alloc = document.GetAllocator();
228                document.SetArray();
229
230                CARFieldList* fields = schema.GetFields();
231                unsigned int fieldCount = fields->GetCount();
232                bool isSpecialForm = IsJoinViewOrVendorForm();
233
234                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
235                {
236                        CARField field(schema.GetInsideId(), 0, fieldIndex);
237                        CPageParams fieldLink(PAGE_DETAILS, &field);
238
239                        Value item;
240                        item.SetArray();
241
242                        string strName = field.GetName();
243                        string strDate = CUtil::DateTimeToString(field.GetTimestamp());
244                        string strLink = CWebUtil::DocName(fieldLink->GetFileName());
245
246                        Value name(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
247                        Value modified(strDate.c_str(), static_cast<SizeType>(strDate.size()), alloc);
248                        Value link(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
249
250                        item.PushBack(static_cast<int>(field.GetFieldId()), alloc);
251                        item.PushBack(name, alloc);
252                        item.PushBack(field.GetDataType(), alloc);
253                        item.PushBack(field.GetDisplayInstances().numItems, alloc);
254                        item.PushBack(modified, alloc);
255                        item.PushBack(field.GetLastChanged(), alloc);
256                        item.PushBack(link, alloc);
257                       
258                        // for special forms, we need some more details for the real-field column
259                        if (isSpecialForm)
260                        {
261                                switch (field.GetMapping().fieldType)
262                                {
263                                case AR_FIELD_JOIN:
264                                        {
265                                                if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
266                                                {
267                                                        const ARCompoundSchema& compSchema = this->schema.GetCompound();
268                                                        CARSchema schemaLeft(compSchema.u.join.memberA);
269                                                        CARSchema schemaRight(compSchema.u.join.memberB);
270
271                                                        CARField fldLeft(schemaLeft.GetInsideId(), 1);
272                                                        CARField fldRight(schemaRight.GetInsideId(), 1);
273
274                                                        CPageParams schemaLeftLink(PAGE_DETAILS, &schemaLeft);
275                                                        CPageParams schemaRightLink(PAGE_DETAILS, &schemaRight);
276                                                        CPageParams fldLeftLink(PAGE_DETAILS, &fldLeft);
277                                                        CPageParams fldRightLink(PAGE_DETAILS, &fldRight);
278
279                                                        string leftFieldName = fldLeft.GetName();
280                                                        string leftFieldLink = CWebUtil::GetRelativeURL(rootLevel, fldLeftLink);
281                                                        string leftSchemaName = schemaLeft.GetName();
282                                                        string leftSchemaLink = CWebUtil::GetRelativeURL(rootLevel, schemaLeftLink);
283                                                       
284                                                        string rightFieldName = fldRight.GetName();
285                                                        string rightFieldLink = CWebUtil::GetRelativeURL(rootLevel, fldRightLink);
286                                                        string rightSchemaName = schemaRight.GetName();
287                                                        string rightSchemaLink = CWebUtil::GetRelativeURL(rootLevel, schemaRightLink);
288
289                                                        Value leftNameVal(leftFieldName.c_str(), static_cast<SizeType>(leftFieldName.size()), alloc);
290                                                        Value leftLinkVal(leftFieldLink.c_str(), static_cast<SizeType>(leftFieldLink.size()), alloc);
291                                                        Value leftSchemaVal(leftSchemaName.c_str(), static_cast<SizeType>(leftSchemaName.size()), alloc);
292                                                        Value leftSchemaLinkVal(leftSchemaLink.c_str(), static_cast<SizeType>(leftSchemaLink.size()), alloc);
293
294                                                        Value rightNameVal(rightFieldName.c_str(), static_cast<SizeType>(rightFieldName.size()), alloc);
295                                                        Value rightLinkVal(rightFieldLink.c_str(), static_cast<SizeType>(rightFieldLink.size()), alloc);
296                                                        Value rightSchemaVal(rightSchemaName.c_str(), static_cast<SizeType>(rightSchemaName.size()), alloc);
297                                                        Value rightSchemaLinkVal(rightSchemaLink.c_str(), static_cast<SizeType>(rightSchemaLink.size()), alloc);
298
299                                                        item.PushBack(leftNameVal, alloc);
300                                                        item.PushBack(leftLinkVal, alloc);
301                                                        item.PushBack(leftSchemaVal, alloc);
302                                                        item.PushBack(leftSchemaLinkVal, alloc);
303
304                                                        item.PushBack(rightNameVal, alloc);
305                                                        item.PushBack(rightLinkVal, alloc);
306                                                        item.PushBack(rightSchemaVal, alloc);
307                                                        item.PushBack(rightSchemaLinkVal, alloc);
308                                                }
309                                                else
310                                                {
311                                                        if(field.GetMapping().u.join.realId > 0)
312                                                        {
313                                                                const ARCompoundSchema& compSchema = this->schema.GetCompound();
314
315                                                                string baseSchemaName = (field.GetMapping().u.join.schemaIndex == 0 ? compSchema.u.join.memberA : compSchema.u.join.memberB);
316                                                               
317                                                                CARSchema baseSchema(baseSchemaName);
318                                                                CPageParams baseSchemaPage(PAGE_DETAILS, &baseSchema);
319
320                                                                CARField baseField(baseSchema.GetInsideId(), field.GetMapping().u.join.realId);
321                                                                CPageParams baseFieldPage(PAGE_DETAILS, &baseField);
322
323                                                                string baseFieldName = baseField.GetName();
324                                                                string baseFieldLink = CWebUtil::GetRelativeURL(rootLevel, baseFieldPage);
325                                                                string baseSchemaLink = CWebUtil::GetRelativeURL(rootLevel, baseSchemaPage);
326                                                               
327                                                                Value baseFileNameVal(baseFieldName.c_str(), static_cast<SizeType>(baseFieldName.size()), alloc);
328                                                                Value baseFileLinkVal(baseFieldLink.c_str(), static_cast<SizeType>(baseFieldLink.size()), alloc);
329                                                                Value baseSchemaNameVal(baseSchemaName.c_str(), static_cast<SizeType>(baseSchemaName.size()), alloc);
330                                                                Value baseSchemaLinkVal(baseSchemaLink.c_str(), static_cast<SizeType>(baseSchemaLink.size()), alloc);
331
332                                                                item.PushBack(baseFileNameVal, alloc);
333                                                                item.PushBack(baseFileLinkVal, alloc);
334                                                                item.PushBack(baseSchemaNameVal, alloc);
335                                                                item.PushBack(baseSchemaLinkVal, alloc);
336
337                                                                //strmTmp << this->pInside->LinkToField(tmpBaseSchema, field.GetMapping().u.join.realId, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(tmpBaseSchema, rootLevel);
338                                                        }
339                                                        //else
340                                                        //      strmTmp << "&nbsp;";
341                                                }
342                                        }
343                                        break;
344                                case AR_FIELD_VIEW:
345                                        {
346                                                string val = field.GetMapping().u.view.fieldName;
347                                                Value itemVal(val.c_str(), static_cast<SizeType>(val.size()), alloc);
348                                                item.PushBack(itemVal, alloc);
349                                        }
350                                        break;
351                                case AR_FIELD_VENDOR:
352                                        {
353                                                string val = field.GetMapping().u.vendor.fieldName;
354                                                Value itemVal(val.c_str(), static_cast<SizeType>(val.size()), alloc);
355                                                item.PushBack(itemVal, alloc);
356                                        }
357                                        break;
358                                }
359
360                        }
361
362                        document.PushBack(item, alloc);
363                }
364
365                GenericWriteStream output(out);
366                Writer<GenericWriteStream> writer(output);
367
368                out << endl << "<script type=\"text/javascript\">" << endl;
369                out << "var schemaFieldList = "; document.Accept(writer); out << ";";
370                if (isSpecialForm)
371                {
372                        string type;
373                        switch (this->schema.GetCompound().schemaType)
374                        {
375                        case AR_SCHEMA_VIEW:
376                                type = "view";
377                                break;
378                        case AR_SCHEMA_VENDOR:
379                                type = "vendor";
380                                break;
381                        case AR_SCHEMA_JOIN:
382                                type = "join";
383                                break;
384                        }
385                        if (!type.empty())
386                        {
387                                out << "schemaFieldManager.setRenderer(\"" << type << "\");";
388                        }
389                }
390                out << endl;
391                out << "</script>" << endl;
392        }
393        catch(exception& e)
394        {
395                cout << "EXCEPTION schema all fields json of '" << this->schema.GetName() << "': " << e.what() << endl;
396        }
397}
398
399//Create a page with all fields of a joinform
400string CDocSchemaDetails::AllFieldsSpecial()
401{               
402        CTable tbl("fieldListAll", "TblObjectList");
403        tbl.AddColumn(20, "Field Name");
404        tbl.AddColumn(5, "Field ID");
405        tbl.AddColumn(5, "Datatype");
406        tbl.AddColumn(30, "Real Field");
407        tbl.AddColumn(10, "In Views");
408        tbl.AddColumn(10, "Modified");
409        tbl.AddColumn(20, "By");
410
411        try
412        {
413                CARFieldList* fields = schema.GetFields();
414                unsigned int fieldCount = fields->GetCount();
415                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
416                {
417                        CARField field(schema.GetInsideId(), 0, fieldIndex);
418
419                        CTableRow row("");
420                        CTableCell cellName(URLLink(field, rootLevel), "");
421                        CTableCell cellFieldId(field.GetFieldId(), "");
422
423                        stringstream strmTmp;
424                        if(field.GetDisplayInstances().numItems == 0 && field.GetFieldId() != 15)                               
425                                strmTmp << "<span class=\"fieldInNoView\">" << field.GetDisplayInstances().numItems << "</span" << endl;
426                        else
427                                strmTmp << field.GetDisplayInstances().numItems;                       
428                       
429                        CTableCell cellNumViews(strmTmp.str(), "");     
430                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
431
432                        strmTmp.str("");                       
433                        switch (field.GetMapping().fieldType)
434                        {
435                        case AR_FIELD_JOIN:
436                                {
437                                        if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
438                                        {
439                                                const ARCompoundSchema& compSchema = this->schema.GetCompound();
440                                                strmTmp << this->pInside->LinkToField(compSchema.u.join.memberA, 1, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(compSchema.u.join.memberA, rootLevel);
441                                                strmTmp << "<br/>" << endl;
442                                                strmTmp << this->pInside->LinkToField(compSchema.u.join.memberB, 1, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(compSchema.u.join.memberB, rootLevel);
443                                        }
444                                        else
445                                        {
446                                                if(field.GetMapping().u.join.realId > 0)
447                                                {
448                                                        string tmpBaseSchema = this->schema.GetCompound().u.join.memberA;
449                                                        if(field.GetMapping().u.join.schemaIndex > 0)
450                                                                tmpBaseSchema = this->schema.GetCompound().u.join.memberB;
451
452                                                        strmTmp << this->pInside->LinkToField(tmpBaseSchema, field.GetMapping().u.join.realId, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(tmpBaseSchema, rootLevel);
453                                                }
454                                                else
455                                                        strmTmp << "&nbsp;";
456                                        }
457                                }
458                                break;
459                        case AR_FIELD_VIEW:
460                                strmTmp << field.GetMapping().u.view.fieldName;
461                                break;
462                        case AR_FIELD_VENDOR:
463                                strmTmp << field.GetMapping().u.vendor.fieldName;
464                                break;
465                        }
466
467                        CTableCell cellFieldRealId(strmTmp.str(), "");
468                        CTableCell cellTimestamp(CUtil::DateTimeToHTMLString(field.GetTimestamp()), "");
469                        CTableCell cellLastChanged(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel), "");
470
471                        row.AddCell(cellName);
472                        row.AddCell(cellFieldId);
473                        row.AddCell(cellDataType);
474                        row.AddCell(cellFieldRealId);
475                        row.AddCell(cellNumViews);
476                        row.AddCell(cellTimestamp);
477                        row.AddCell(cellLastChanged);
478
479                        tbl.AddRow(row);
480                }
481
482                tbl.description = GenerateFieldTableDescription(tbl);
483
484                AllFieldsSpecialCsv();
485        }
486        catch(exception& e)
487        {
488                cout << "EXCEPTION schema all fields join of '"<< this->schema.GetName() << "': " << e.what() << endl;
489        }
490
491        return tbl.ToXHtml();   
492}
493
494void CDocSchemaDetails::AllFieldsSpecialCsv()
495{               
496        CTable tbl("fieldListAll", "TblObjectList");
497        tbl.AddColumn(20, "Field Name");
498        tbl.AddColumn(5, "Field ID");
499        tbl.AddColumn(5, "Datatype");
500        tbl.AddColumn(30, "Real Field");
501        tbl.AddColumn(10, "In Views");
502        tbl.AddColumn(10, "Modified");
503        tbl.AddColumn(20, "By");
504
505        try
506        {
507                CARFieldList* fields = schema.GetFields();
508                unsigned int fieldCount = fields->GetCount();
509                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
510                {
511                        CARField field(schema.GetInsideId(), 0, fieldIndex);
512
513                        CTableRow row("");
514                        CTableCell cellName(field.GetName(), "");
515                        CTableCell cellFieldId(field.GetFieldId(), "");
516                        CTableCell cellNumViews(field.GetDisplayInstances().numItems, "");
517                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
518
519                        stringstream strmTmp;
520                        switch (field.GetMapping().fieldType)
521                        {
522                        case AR_FIELD_JOIN:
523                                {
524                                        if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
525                                        {
526                                                strmTmp << 1;
527                                        }
528                                        else
529                                        {
530                                                if(field.GetMapping().u.join.realId > 0)
531                                                {
532                                                        strmTmp << field.GetMapping().u.join.realId;
533                                                }
534                                        }
535                                }
536                                break;
537                        case AR_FIELD_VIEW:
538                                {
539                                        strmTmp << field.GetMapping().u.view.fieldName;
540                                }
541                                break;
542                        case AR_FIELD_VENDOR:
543                                {
544                                        strmTmp << field.GetMapping().u.vendor.fieldName;
545                                }
546                                break;                 
547                        }
548
549                        CTableCell cellFieldRealId(strmTmp.str());
550                        CTableCell cellTimestamp(CUtil::DateTimeToString(field.GetTimestamp()), "");
551                        CTableCell cellLastChanged(field.GetLastChanged(), "");
552
553                        row.AddCell(cellName);
554                        row.AddCell(cellFieldId);
555                        row.AddCell(cellDataType);
556                        row.AddCell(cellFieldRealId);
557                        row.AddCell(cellNumViews);
558                        row.AddCell(cellTimestamp);
559                        row.AddCell(cellLastChanged);
560
561                        tbl.AddRow(row);
562                }
563
564                //Save field information to csv
565                CPageParams file(PAGE_SCHEMA_FIELDS_CSV, &this->schema);
566                CCsvPage csvPage(file->GetFileName(), this->pInside->appConfig);
567                csvPage.SaveInFolder(file->GetPath(), tbl.ToCsv());
568        }
569        catch(exception& e)
570        {
571                cout << "EXCEPTION schema all fields join csv of '" << this->schema.GetName() << "': " << e.what() << endl;
572        }
573}
574
575string CDocSchemaDetails::GenerateFieldTableDescription(CTable &tbl)
576{
577        stringstream outputStrm;
578        AllFieldsJson(outputStrm);
579        outputStrm << "<div><span class='clearable'><input type=\"text\" class='data_field' id=\"fieldNameFilter\" placeholder=\"search by name or id\"/></span><button id=\"execFieldFilter\">Filter</button></div>" << endl;
580        outputStrm << ImageTag(ImageTag::Document, rootLevel) << "<span id='fieldListFilterResultCount'></span>" << tbl.NumRows() << " fields (" << URLLink("data", CPageParams(PAGE_SCHEMA_FIELDS_CSV, &this->schema), rootLevel) << ")" << endl;
581        outputStrm << "<div id=\"result\"></div>";
582        return outputStrm.str();
583}
584
585bool CDocSchemaDetails::InAlList(string objName)
586{
587        list<string>::iterator listIter;               
588        for ( listIter = this->uniqueAlList.begin(); listIter != this->uniqueAlList.end(); listIter++ )
589        {
590                string *listItemName = &(*listIter);
591                if(strcmp(objName.c_str(), listItemName->c_str())==0)
592                {
593                        return true;
594                }
595        }
596        return false;
597}
598
599bool CDocSchemaDetails::InFilterList(string objName)
600{
601        list<string>::iterator listIter;               
602        for ( listIter = this->uniqueFilterList.begin(); listIter != this->uniqueFilterList.end(); listIter++ )
603        {
604                string *listItemName = &(*listIter);
605                if(strcmp(objName.c_str(), listItemName->c_str())==0)
606                {
607                        return true;
608                }
609        }
610        return false;
611}
612
613bool CDocSchemaDetails::InEscalList(string objName)
614{
615        list<string>::iterator listIter;               
616        for ( listIter = this->uniqueEscalList.begin(); listIter != this->uniqueEscalList.end(); listIter++ )
617        {
618                string *listItemName = &(*listIter);
619                if(strcmp(objName.c_str(), listItemName->c_str())==0)
620                {
621                        return true;
622                }
623        }
624        return false;
625}
626
627bool CDocSchemaDetails::IsSchemaInWFConnectStruct(const ARWorkflowConnectStruct& wfCS)
628{
629        if (wfCS.type == AR_WORKFLOW_CONN_SCHEMA_LIST && wfCS.u.schemaList != NULL)
630        {
631                for (unsigned int connectIndex = 0; connectIndex < wfCS.u.schemaList->numItems; ++connectIndex)
632                {
633                        if (schema.GetName() == wfCS.u.schemaList->nameList[connectIndex])
634                        {
635                                return true;
636                        }
637                }
638        }
639        return false;
640}
641
642void AddJsonRow(Document &doc, CARActiveLink &al, int rootLevel)
643{
644        CPageParams alDetailPage(PAGE_DETAILS, &al);
645        Document::AllocatorType &alloc = doc.GetAllocator();
646        Value item;
647        item.SetArray();
648
649        string strModDate, strActlinkName, strLink;
650        strModDate = CUtil::DateTimeToString(al.GetTimestamp());
651        strActlinkName = al.GetName();
652        strLink = CWebUtil::GetRelativeURL(rootLevel, alDetailPage);
653
654        Value modDate, alName, alLink;
655        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
656        alName.SetString(strActlinkName.c_str(), static_cast<SizeType>(strActlinkName.length()), alloc);
657        alLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
658
659        item.PushBack((al.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
660        item.PushBack(alName, alloc);
661        item.PushBack((al.GetEnabled() ? true : false), alloc);
662        item.PushBack(al.GetOrder(), alloc);
663        item.PushBack(al.GetExecuteMask(), alloc);
664        item.PushBack(al.GetIfActions().numItems, alloc);
665        item.PushBack(al.GetElseActions().numItems, alloc);
666        item.PushBack(modDate, alloc);
667        item.PushBack(al.GetLastChanged(), alloc);
668        item.PushBack(alLink, alloc);
669       
670        doc.PushBack(item, alloc);
671}
672
673void AddJsonRow(Document &doc, CARFilter &flt, int rootLevel)
674{
675        CPageParams fltDetailPage(PAGE_DETAILS, &flt);
676        Document::AllocatorType &alloc = doc.GetAllocator();
677        Value item;
678        item.SetArray();
679
680        string strModDate, strName, strLink;
681        strModDate = CUtil::DateTimeToString(flt.GetTimestamp());
682        strName = flt.GetName();
683        strLink = CWebUtil::GetRelativeURL(rootLevel, fltDetailPage);
684
685        Value modDate, objName, objLink;
686        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
687        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
688        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
689
690        item.PushBack((flt.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
691        item.PushBack(objName, alloc);
692        item.PushBack((flt.GetEnabled() ? true : false), alloc);
693        item.PushBack(flt.GetOrder(), alloc);
694        item.PushBack(flt.GetOperation(), alloc);
695        item.PushBack(flt.GetIfActions().numItems, alloc);
696        item.PushBack(flt.GetElseActions().numItems, alloc);
697        item.PushBack(modDate, alloc);
698        item.PushBack(flt.GetLastChanged(), alloc);
699        item.PushBack(objLink, alloc);
700       
701        doc.PushBack(item, alloc);
702}
703
704void AddJsonRow(Document &doc, CAREscalation &esc, int rootLevel)
705{
706        CPageParams escDetailPage(PAGE_DETAILS, &esc);
707        Document::AllocatorType &alloc = doc.GetAllocator();
708        Value item;
709        item.SetArray();
710
711        string strModDate, strName, strLink;
712        strModDate = CUtil::DateTimeToString(esc.GetTimestamp());
713        strName = esc.GetName();
714        strLink = CWebUtil::GetRelativeURL(rootLevel, escDetailPage);
715
716        Value modDate, objName, objLink;
717        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
718        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
719        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
720
721        item.PushBack((esc.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
722        item.PushBack(objName, alloc);
723        item.PushBack((esc.GetEnabled() ? true : false), alloc);
724        item.PushBack("", alloc);
725        item.PushBack(esc.GetTimeStruct().escalationTmType, alloc);
726        item.PushBack(esc.GetIfActions().numItems, alloc);
727        item.PushBack(esc.GetElseActions().numItems, alloc);
728        item.PushBack(modDate, alloc);
729        item.PushBack(esc.GetLastChanged(), alloc);
730        item.PushBack(objLink, alloc);
731       
732        doc.PushBack(item, alloc);
733}
734
735void AddJsonRow(Document &doc, CARContainer &cnt, int rootLevel)
736{
737        CPageParams cntDetailPage(PAGE_DETAILS, &cnt);
738        Document::AllocatorType &alloc = doc.GetAllocator();
739        Value item;
740        item.SetArray();
741
742        string strModDate, strName, strLink;
743        strModDate = CUtil::DateTimeToString(cnt.GetTimestamp());
744        strName = cnt.GetName();
745        strLink = CWebUtil::GetRelativeURL(rootLevel, cntDetailPage);
746
747        Value modDate, objName, objLink;
748        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
749        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
750        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
751
752        item.PushBack((cnt.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
753        item.PushBack(objName, alloc);
754        item.PushBack(cnt.GetType(), alloc);
755        item.PushBack("", alloc);
756        item.PushBack("", alloc);
757        item.PushBack("", alloc);
758        item.PushBack("", alloc);
759        item.PushBack(modDate, alloc);
760        item.PushBack(cnt.GetLastChanged(), alloc);
761        item.PushBack(objLink, alloc);
762       
763        doc.PushBack(item, alloc);
764}
765
766string CDocSchemaDetails::WorkflowDoc()
767{
768        try
769        {
770                //CPageParams file(PAGE_SCHEMA_WORKFLOW, &this->schema);
771
772                Document document;
773                document.SetArray();
774
775                //Field references
776                CTable tblRef("referenceList", "TblObjectList");
777                tblRef.AddColumn(35, "Server object");
778                tblRef.AddColumn(05, "Enabled");
779                tblRef.AddColumn(05, "Order");
780                tblRef.AddColumn(15, "Execute On");
781                tblRef.AddColumn(05, "If");
782                tblRef.AddColumn(05, "Else");
783                tblRef.AddColumn(15, "Changed");
784                tblRef.AddColumn(15, "By");
785
786                const CARSchemaList::ObjectRefList& alList = this->schema.GetActiveLinks();
787                const CARSchemaList::ObjectRefList& fltList = this->schema.GetFilters();
788                const CARSchemaList::ObjectRefList& escList = this->schema.GetEscalations();
789                const CARSchemaList::ObjectRefList& algList = this->schema.GetActLinkGuides();
790                const CARSchemaList::ObjectRefList& flgList = this->schema.GetFilterGuides();
791                const CARSchemaList::ObjectRefList& wbsList = this->schema.GetWebservices();
792
793                // Add all active links
794                CARSchemaList::ObjectRefList::const_iterator curIt = alList.begin();
795                CARSchemaList::ObjectRefList::const_iterator endIt = alList.end();
796                for (; curIt != endIt; ++curIt)
797                {
798                        CARActiveLink al(*curIt);
799                        AddJsonRow(document, al, rootLevel);
800                }
801
802                // Add all filters
803                curIt = fltList.begin();
804                endIt = fltList.end();
805                for (; curIt != endIt; ++curIt)
806                {
807                        CARFilter flt(*curIt);
808                        AddJsonRow(document, flt, rootLevel);
809                }
810
811                // Add all escalations
812                curIt = escList.begin();
813                endIt = escList.end();
814                for (; curIt != endIt; ++curIt)
815                {
816                        CAREscalation esc(*curIt);
817                        AddJsonRow(document, esc, rootLevel);
818                }
819
820                // add all active link guides
821                curIt = algList.begin();
822                endIt = algList.end();
823                for (; curIt != endIt; ++curIt)
824                {
825                        CARContainer alg(*curIt);
826                        AddJsonRow(document, alg, rootLevel);
827                }
828
829                // add all filter guides
830                curIt = flgList.begin();
831                endIt = flgList.end();
832                for (; curIt != endIt; ++curIt)
833                {
834                        CARContainer flg(*curIt);
835                        AddJsonRow(document, flg, rootLevel);
836                }
837
838                // add all webservices
839                curIt = wbsList.begin();
840                endIt = wbsList.end();
841                for (; curIt != endIt; ++curIt)
842                {
843                        CARContainer ws(*curIt);
844                        AddJsonRow(document, ws, rootLevel);
845                }
846
847                // generate json output struct
848                stringstream strm;
849                GenericWriteStream genericStream(strm);
850                Writer<GenericWriteStream> genericWriter(genericStream);
851
852                strm << "<script type=\"text/javascript\">" << "var schemaWFLInit = false;" << endl;
853                strm << "var referenceList = "; document.Accept(genericWriter); strm << ";" << endl
854                     << "var rootLevel = " << rootLevel << endl
855                     << "</script>" << endl
856                                 << CDocMain::CreateSchemaReferenceFilterControl() << endl
857                     << tblRef;
858                return strm.str();
859        }
860        catch(exception& e)
861        {
862                cout << "EXCEPTION schema workflow doc of '" << this->schema.GetName() << "': " << e.what() << endl;
863                return "";
864        }
865}
866
867//list of groups with access rights
868void CDocSchemaDetails::ShowPermissionProperties(std::ostream &strm, CARProplistHelper *propIndex)
869{
870        try
871        {
872                //CPageParams file(PAGE_SCHEMA_PERMISSIONS, &this->schema);
873
874                CTable tbl("permissionList", "TblObjectList");
875                tbl.AddColumn(60, "Group Name");
876                tbl.AddColumn(20, "Group Id");
877                tbl.AddColumn(20, "Permission");
878
879                const ARPermissionList& perms = this->schema.GetPermissions();
880                for(unsigned int i = 0; i < perms.numItems; ++i)
881                {
882                        if(this->pInside->ValidateGroup(this->schema.GetAppRefName(), perms.permissionList[i].groupId))
883                        {
884                                CTableRow row("");
885                                stringstream perm;
886
887                                if(perms.permissionList[i].permissions == AR_PERMISSIONS_HIDDEN)
888                                        perm << ImageTag(ImageTag::Hidden, rootLevel);
889                                else
890                                        perm << ImageTag(ImageTag::Visible, rootLevel);
891
892                                perm << CAREnum::ObjectPermission(perms.permissionList[i].permissions);
893
894                                row.AddCell(CTableCell(this->pInside->LinkToGroup(this->schema.GetAppRefName(), perms.permissionList[i].groupId, rootLevel)));
895                                row.AddCell(CTableCell(perms.permissionList[i].groupId));
896                                row.AddCell(perm.str());
897                                tbl.AddRow(row);
898                        }
899                }
900
901                //CPageParams file(PAGE_SCHEMA_SUBADMINS, &this->schema); //////////////////////////////////
902                CTable tblSubAdm("subadminPerms", "TblObjectList");
903                tblSubAdm.AddColumn(90, "Group Name");
904                tblSubAdm.AddColumn(10, "Group Id");
905
906                const ARInternalIdList& subAdmins = schema.GetSubadmins();
907                for(unsigned int i = 0; i < subAdmins.numItems; ++i)
908                {
909                        CTableRow row("");
910                        row.AddCell(this->pInside->LinkToGroup(this->schema.GetAppRefName(), subAdmins.internalIdList[i], rootLevel));
911                        row.AddCell(subAdmins.internalIdList[i]);
912                        tblSubAdm.AddRow(row);
913                }
914
915                //Show all fields with all group permissions
916                CTable tblFieldPerm("fieldPerms", "TblObjectList");
917
918                tblFieldPerm.AddColumn(40, "Field Name");
919                tblFieldPerm.AddColumn(10, "Field ID"); 
920                tblFieldPerm.AddColumn(10, "Datatype");         
921                tblFieldPerm.AddColumn(40, "Permissions");
922
923
924                CARFieldList* fields = schema.GetFields();
925                unsigned int fieldCount = fields->GetCount();
926                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
927                {
928                        CARField field(schema.GetInsideId(), 0, fieldIndex);
929
930                        //Field Permissions
931                        stringstream strmFieldPermissions;
932                        strmFieldPermissions.str("");
933
934                        const ARPermissionList& fldPerms = field.GetPermissions();
935                        if(fldPerms.numItems > 0)
936                        {
937                                CTable tblFieldPermissionDetails("PermissionFieldList", "TblHidden");
938                                tblFieldPermissionDetails.AddColumn(50, "Group Name");
939                                tblFieldPermissionDetails.AddColumn(50, "Permission");
940                                tblFieldPermissionDetails.DisableHeader();
941
942                                for(unsigned int i = 0; i < fldPerms.numItems; ++i)
943                                {
944                                        stringstream perm;
945                                       
946                                        if(fldPerms.permissionList[i].permissions == AR_PERMISSIONS_CHANGE)
947                                                perm << ImageTag(ImageTag::Edit, rootLevel);
948                                        else
949                                                perm << ImageTag(ImageTag::Visible, rootLevel);
950
951                                        perm << CAREnum::FieldPermission(fldPerms.permissionList[i].permissions);
952
953                                        CTableRow row("");
954                                        row.AddCell(this->pInside->LinkToGroup(schema.GetAppRefName(), fldPerms.permissionList[i].groupId, rootLevel));
955                                        row.AddCell(perm.str());
956                                        tblFieldPermissionDetails.AddRow(row);
957                                }
958
959                                strmFieldPermissions << tblFieldPermissionDetails;
960                        }
961                        else
962                        {
963                                strmFieldPermissions << EmptyValue << endl;
964                        }
965
966
967                        CTableRow row("");                     
968                        row.AddCell(CTableCell(URLLink(field, rootLevel)));
969                        row.AddCell(CTableCell(field.GetFieldId()));
970                        row.AddCell(CTableCell(CAREnum::DataType(field.GetDataType())));
971                        row.AddCell(CTableCell(strmFieldPermissions.str()));
972                        tblFieldPerm.AddRow(row);
973                }
974
975                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Permissions" << "</h2>";
976                strm << "<div id='schemaPermissions'>" 
977                         << "<h2>" << "Group Permissions" << "</h2>" << "<div>" << tbl << "</div>"
978             << "<h2>" << "Subadministrator Permissions" << "</h2>" << "<div>" << tblSubAdm << "</div>"
979             << "<h2>" << "Field Permissions" << "</h2>" << "<div>" << tblFieldPerm << "</div>"
980                     << "</div>";
981        }
982        catch(exception& e)
983        {
984                cout << "EXCEPTION schema permission doc of '" << this->schema.GetName() << "': " << e.what() << endl;
985        }
986}
987
988//Create a page that shows a list of all indexes
989void CDocSchemaDetails::ShowIndexProperties(std::ostream &strm, CARProplistHelper *propIndex)
990{
991        try
992        {
993                //CPageParams file(PAGE_SCHEMA_INDEXES, &this->schema);
994
995                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Indexes" << "</h2>";
996                strm << "<div>";
997
998                const ARIndexList& indexList = this->schema.GetIndexList();
999                for(unsigned int nIndex=0; nIndex < indexList.numItems; ++nIndex)
1000                {               
1001                        CTable tbl("indexTbl", "TblObjectList");
1002                        tbl.AddColumn(0, "Field Name");
1003                        tbl.AddColumn(0, "Field ID");
1004                        tbl.AddColumn(0, "Datatype");
1005                        tbl.AddColumn(0, "Modified");
1006                        tbl.AddColumn(0, "By");
1007
1008                        stringstream tblDesc;
1009                        if(indexList.indexList[nIndex].unique)
1010                                tblDesc << "Unique Index :" << CWebUtil::ObjName(indexList.indexList[nIndex].indexName);
1011                        else
1012                                tblDesc << "Index: " << CWebUtil::ObjName(indexList.indexList[nIndex].indexName);
1013
1014                        tbl.description = tblDesc.str();
1015
1016                        for(unsigned int nField=0; nField < indexList.indexList[nIndex].numFields; ++nField)
1017                        {
1018                                CARField field(schema.GetInsideId(), indexList.indexList[nIndex].fieldIds[nField]);
1019
1020                                if (field.Exists())
1021                                {
1022                                        CTableRow row("");
1023                                        row.AddCell( CTableCell(URLLink(field, rootLevel)));
1024                                        row.AddCell( CTableCell(field.GetFieldId()));
1025                                        row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));
1026                                        row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetDataType())));
1027                                        row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1028                                        tbl.AddRow(row);
1029
1030                                        //Add a reference
1031                                        CRefItem refItem(this->schema, 0, nIndex, REFM_SCHEMA_INDEX);
1032                                        pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1033                                }
1034                        }
1035
1036                        strm << tbl;
1037                }
1038
1039                strm << "</div>";
1040        }
1041        catch(exception& e)
1042        {
1043                cout << "EXCEPTION creating schema index doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1044        }
1045}
1046
1047//Create a page that shows the form resultlist
1048void CDocSchemaDetails::ShowResultListProperties(std::ostream &strm, CARProplistHelper *propIndex)
1049{
1050        try
1051        {
1052                CTable tbl("fieldListIndex", "TblObjectList");
1053                tbl.AddColumn(25, "Field Name");
1054                tbl.AddColumn(10, "Field Id");
1055                tbl.AddColumn(10, "Datatype");
1056                tbl.AddColumn(5, "Width");
1057                tbl.AddColumn(10, "Separator");
1058                tbl.AddColumn(20, "Modified");
1059                tbl.AddColumn(20, "By");
1060
1061                const AREntryListFieldList& resultFields = schema.GetResultFields();
1062                for(unsigned int i = 0; i < resultFields.numItems; ++i)
1063                {
1064                        CARField field(schema.GetInsideId(), resultFields.fieldsList[i].fieldId);
1065
1066                        if (field.Exists())
1067                        {
1068                                CTableRow row("");
1069                                row.AddCell( CTableCell(URLLink(field, rootLevel)));
1070                                row.AddCell( CTableCell(field.GetFieldId()));
1071                                row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));
1072                                row.AddCell( CTableCell(resultFields.fieldsList[i].columnWidth));
1073                                row.AddCell( CTableCell(resultFields.fieldsList[i].separator));
1074                                row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetTimestamp())));
1075                                row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1076                                tbl.AddRow(row);
1077
1078                                //Add a reference
1079                                CRefItem refItem(this->schema, REFM_SCHEMA_RESULTLIST);
1080                                pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1081                        }
1082                }
1083
1084                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Result List Fields" << "</h2>";
1085                strm << "<div>" << tbl << "</div>";
1086        }
1087        catch(exception& e)
1088        {
1089                cout << "EXCEPTION creating schema resultlist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1090        }
1091}
1092
1093//Create a page that shows the page sortslist
1094void CDocSchemaDetails::ShowSortListProperties(std::ostream &strm, CARProplistHelper *propIndex)
1095{
1096        try
1097        {
1098                //CPageParams file(PAGE_SCHEMA_SORTLIST, &this->schema);
1099
1100                CTable tbl("fieldListIndex", "TblObjectList");
1101                tbl.AddColumn(10, "Sort Order");
1102                tbl.AddColumn(30, "Field Name");
1103                tbl.AddColumn(10, "Field Id");
1104                tbl.AddColumn(10, "Datatype");
1105                tbl.AddColumn(20, "Modified");
1106                tbl.AddColumn(20, "By");
1107
1108
1109                const ARSortList& sorting = schema.GetSortList();
1110                for(unsigned int i = 0; i < sorting.numItems; ++i)
1111                {
1112                        CARField field(schema.GetInsideId(), sorting.sortList[i].fieldId);
1113
1114                        if (field.Exists())
1115                        {
1116                                CTableRow row("");
1117
1118                                string sortImage;
1119                                if(sorting.sortList[i].sortOrder == AR_SORT_DESCENDING)
1120                                        sortImage = ImageTag(ImageTag::SortDesc, rootLevel);
1121                                else
1122                                        sortImage = ImageTag(ImageTag::SortAsc, rootLevel);
1123
1124                                row.AddCell( CTableCell(sortImage));
1125                                row.AddCell( CTableCell(URLLink(field, rootLevel)));
1126                                row.AddCell( CTableCell(field.GetFieldId()));
1127                                row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));                               
1128                                row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetTimestamp())));
1129                                row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1130
1131                                tbl.AddRow(row);
1132
1133                                //Add a reference
1134                                CRefItem refItem(this->schema, REFM_SCHEMA_SORTLIST);
1135                                pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1136                        }
1137                }
1138
1139                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Sort" << "</h2>";
1140                strm << "<div>" << tbl << "</div>";
1141        }
1142        catch(exception& e)
1143        {
1144                cout << "EXCEPTION creating schema sortlist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1145        }
1146}
1147
1148//Create a page with a list of all views
1149string CDocSchemaDetails::ShowVuiList()
1150{       
1151        try
1152        {
1153                //CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_VUI, &this->schema);
1154
1155                CTable tbl("vuiList", "TblObjectList");
1156                tbl.AddColumn(30, "Vui Name");
1157                tbl.AddColumn(20, "Label");
1158                tbl.AddColumn(10, "Web Alias");
1159                tbl.AddColumn(10, "Type");
1160                tbl.AddColumn(15, "Modified");
1161                tbl.AddColumn(15, "By");
1162
1163                unsigned int vuiCount = schema.GetVUIs()->GetCount();
1164                for (unsigned int vuiIndex = 0; vuiIndex < vuiCount; ++vuiIndex)
1165                {
1166                        CARVui vui(schema.GetInsideId(), 0, vuiIndex);
1167
1168                        CTableRow row("");                     
1169                        row.AddCell( CTableCell(URLLink(vui, rootLevel)));
1170                        row.AddCell( CTableCell(vui.Label()));
1171                        row.AddCell( CTableCell(vui.webAlias()));
1172                        row.AddCell( CTableCell(CAREnum::VuiType(vui.GetType())));
1173                        row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(vui.GetTimestamp())));
1174                        row.AddCell( CTableCell(this->pInside->LinkToUser(vui.GetLastChanged(), rootLevel)));
1175                        tbl.AddRow(row);
1176                }
1177
1178                stringstream strm;
1179                strm << tbl;
1180                return strm.str();
1181        }
1182        catch(exception& e)
1183        {
1184                cout << "EXCEPTION creating schema vuilist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1185                return "";
1186        }
1187}
1188
1189string CDocSchemaDetails::TypeDetails()
1190{
1191        stringstream strm;
1192        strm.str("");
1193
1194        try
1195        {
1196                const ARCompoundSchema& compSchema = schema.GetCompound();
1197                switch(compSchema.schemaType)
1198                {
1199                case AR_SCHEMA_JOIN:
1200                        {
1201                                strm << "(" << this->pInside->LinkToSchema(compSchema.u.join.memberA, rootLevel) << " <-> " << this->pInside->LinkToSchema(compSchema.u.join.memberB, rootLevel) << ")" << "<br/>";
1202
1203                                if(compSchema.u.join.joinQual.operation != AR_COND_OP_NONE)
1204                                {
1205                                        stringstream strmQuery;
1206                                        CARSchema memberA(compSchema.u.join.memberA);
1207                                        CARSchema memberB(compSchema.u.join.memberB);
1208                                        CRefItem refItem(this->schema, REFM_SCHEMA_JOIN_QUALIFICATION);
1209
1210                                        CARQualification arQual(*this->pInside, refItem, memberA.GetInsideId(), memberB.GetInsideId(), rootLevel);
1211                                        arQual.CheckQuery(&compSchema.u.join.joinQual, strmQuery);
1212
1213                                        strm << "Qualification: " << strmQuery.str();
1214                                }
1215                        }
1216                        break;
1217                case AR_SCHEMA_VIEW:
1218                        {
1219                                strm << "<span class='additionalInfo'>" << "(" << "Table&nbsp;Name: " << compSchema.u.view.tableName << " &nbsp;&nbsp;&nbsp; "
1220                                     << "Key&nbsp;Field: " << compSchema.u.view.keyField << ")" << "</span>";
1221                        }
1222                        break;                 
1223                case AR_SCHEMA_VENDOR:
1224                        {
1225                                strm << "<span class='additionalInfo'>" << "(" << "Plugin:&nbsp;" << compSchema.u.vendor.vendorName << " &nbsp;&nbsp;&nbsp; ";
1226                                strm << "Table: " << compSchema.u.vendor.tableName << ")" << "</span>";
1227                        }
1228                        break;
1229                default:
1230                        {
1231                                strm << EmptyValue;
1232                        }
1233                        break;
1234                }
1235        }
1236        catch(exception& e)
1237        {
1238                cout << "EXCEPTION enumerating regular schema type information of '" << this->schema.GetName() << "': " << e.what() << endl;
1239        }
1240        return strm.str();
1241}
1242
1243string CDocSchemaDetails::ContainerReferences()
1244{
1245        stringstream strm;
1246        strm.str("");
1247        try
1248        {
1249                //// Active Link Guides ////
1250                const CARSchemaList::ObjectRefList& alg = schema.GetActLinkGuides();
1251                CARSchemaList::ObjectRefList::const_iterator curIt = alg.begin();
1252                CARSchemaList::ObjectRefList::const_iterator endIt = alg.end();
1253
1254                CContainerTable *contTable = new CContainerTable(*this->pInside);
1255
1256                for (; curIt != endIt; ++curIt)
1257                {
1258                        CARContainer cont(*curIt);
1259                        contTable->AddRow(cont, rootLevel);
1260                }
1261
1262                //// Filter Guides ////
1263                const CARSchemaList::ObjectRefList& flg = schema.GetFilterGuides();
1264                curIt = flg.begin();
1265                endIt = flg.end();
1266
1267                for (; curIt != endIt; ++curIt)
1268                {
1269                        CARContainer cont(*curIt);
1270                        contTable->AddRow(cont, rootLevel);
1271                }
1272
1273                //// Packing Lists ////
1274                const CARSchemaList::ObjectRefList& pkl = schema.GetPackingLists();
1275                curIt = pkl.begin();
1276                endIt = pkl.end();
1277
1278                for (; curIt != endIt; ++curIt)
1279                {
1280                        CARContainer cont(*curIt);
1281                        contTable->AddRow(cont, rootLevel);
1282                }
1283
1284                const CARSchemaList::ObjectRefList& ws = schema.GetWebservices();
1285                curIt = ws.begin();
1286                endIt = ws.end();
1287
1288                for (; curIt != endIt; ++curIt)
1289                {
1290                        CARContainer cont(*curIt);
1291                        contTable->AddRow(cont, rootLevel);
1292                }
1293
1294                //// create output ////
1295                if(contTable->NumRows() > 0)
1296                        strm << *contTable;
1297                else
1298                        strm << EmptyValue;
1299
1300                delete contTable;
1301        }
1302        catch(exception& e)
1303        {
1304                cout << "EXCEPTION enumerating container references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1305        }
1306
1307        return strm.str();
1308}
1309
1310string CDocSchemaDetails::JoinFormReferences()
1311{
1312        stringstream strm;
1313        strm.str("");
1314        try
1315        {
1316                const ARNameType& schemaName = this->schema.GetARName();
1317                unsigned int schemaCount = this->pInside->schemaList.GetCount();
1318                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1319                {
1320                        CARSchema schema(schemaIndex);
1321
1322                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(schema))
1323                                continue;
1324
1325                        const ARCompoundSchema& compSchema = schema.GetCompound();
1326
1327                        if(compSchema.schemaType == AR_SCHEMA_JOIN)
1328                        {
1329                                if(strcmp(schemaName, compSchema.u.join.memberA) == 0)
1330                                {
1331                                        strm << "Primary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1332                                }
1333
1334                                if(strcmp(schemaName, compSchema.u.join.memberB)==0)                                   
1335                                {
1336                                        strm << "Secondary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1337                                }
1338                        }
1339                }
1340
1341                if(strm.str().size() == 0)
1342                        strm << EmptyValue;
1343        }
1344        catch(exception& e)
1345        {
1346                cout << "EXCEPTION enumerating join form references of '" << this->schema.GetName() << "': " << e.what() << endl;
1347        }
1348
1349        return strm.str();
1350}
1351
1352
1353string CDocSchemaDetails::TableFieldReferences()
1354{
1355        stringstream strm;
1356        strm.str("");
1357        try
1358        {
1359                // TODO: there is a function that checks for field references between table-field and column-field
1360                // before the documentation starts. Move this function over to this scanning routing and store
1361                // "table field to form" references in a list within the CARSchemaList
1362                // ===> move scaning over to CARInside::CustomFieldReferences
1363                bool bFound = false;
1364
1365                unsigned int schemaCount = pInside->schemaList.GetCount();
1366                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1367                {                       
1368                        CARSchema searchSchema(schemaIndex);
1369                       
1370                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(searchSchema))
1371                                continue;
1372
1373                        unsigned int fieldCount = searchSchema.GetFields()->GetCount();
1374                        for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
1375                        {
1376                                CARField field(schemaIndex, 0, fieldIndex);
1377                               
1378                                if(field.GetDataType() == AR_DATA_TYPE_TABLE && field.GetLimits().dataType == AR_DATA_TYPE_TABLE)
1379                                {
1380                                        const ARTableLimitsStruct &limit = field.GetLimits().u.tableLimits;                                     
1381                                        const char *tableSchema = limit.schema;
1382
1383                                        if (limit.schema[0] == '$')
1384                                                tableSchema = limit.sampleSchema;
1385
1386                                        if(schema.GetName().compare(tableSchema) == 0)
1387                                        {
1388                                                strm << "Table: " << URLLink(field, rootLevel);
1389                                                strm << " in form: " << URLLink(searchSchema, rootLevel) << "<br/>" << endl;
1390
1391                                                bFound = true;
1392                                        }
1393                                }
1394                        }
1395                }
1396
1397                if(!bFound)
1398                        strm << EmptyValue;
1399        }
1400        catch(exception& e)
1401        {
1402                cout << "EXCEPTION enumerating table references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1403        }
1404
1405        return strm.str();
1406}
1407
1408string CDocSchemaDetails::SearchMenuReferences()
1409{
1410        stringstream strm;
1411        strm.str("");
1412        try
1413        {
1414                CMenuTable *menuTable = new CMenuTable(*this->pInside);
1415
1416                const CARSchema::ReferenceList &refList = schema.GetReferences();
1417                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
1418                CARSchema::ReferenceList::const_iterator endIt = refList.end();
1419
1420                for (; curIt != endIt; ++curIt)
1421                {
1422                        if (curIt->GetMessageId() == REFM_CHARMENU_FORM && curIt->GetObjectType() == AR_STRUCT_ITEM_XML_CHAR_MENU)
1423                        {
1424                                CARHandle<CARCharMenu> hMenu(*curIt);
1425                                menuTable->AddRow(*hMenu, rootLevel);
1426                        }
1427                }
1428
1429                if(menuTable->NumRows() > 0)
1430                        strm << *menuTable;
1431                else
1432                        strm << EmptyValue;
1433
1434                delete menuTable;
1435        }
1436        catch(exception& e)
1437        {
1438                cout << "EXCEPTION enumerating search menu references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1439        }
1440
1441        return strm.str();
1442}
1443
1444string CDocSchemaDetails::AlWindowOpenReferences()
1445{
1446        stringstream strm;
1447        strm.str("");
1448        try
1449        {
1450                CAlTable *alTable = new CAlTable(*this->pInside);
1451
1452                unsigned int alCount = pInside->alList.GetCount();
1453                for (unsigned int alIndex = 0; alIndex < alCount; ++alIndex)
1454                {
1455                        CARActiveLink al(alIndex);
1456
1457                        // skip this object in case it's overlaid (hidden)
1458                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
1459                                continue;
1460
1461                        bool bPushToForm = false;
1462
1463                        //If-Actions
1464                        for(unsigned int i = 0; i < al.GetIfActions().numItems; i++)
1465                        {
1466                                if(al.GetIfActions().actionList[i].action == AR_ACTIVE_LINK_ACTION_OPENDLG)
1467                                {
1468                                        AROpenDlgStruct &action = al.GetIfActions().actionList[i].u.openDlg;                   
1469                                        Context context(al, IES_IF, i, -1, 0);
1470                                        OpenWindowSampleData sampleData(context);
1471                                       
1472                                        string openWindowSchema;
1473                                        if (action.schemaName[0] == '$' )
1474                                        {
1475                                                openWindowSchema = sampleData.getSchema();
1476                                        }
1477                                        else
1478                                                openWindowSchema = action.schemaName;
1479
1480                                        if ((openWindowSchema.compare(AR_CURRENT_SCHEMA_TAG) == 0 && IsSchemaInWFConnectStruct(al.GetSchemaList())) ||
1481                                                openWindowSchema.compare(schema.GetARName()) == 0)
1482                                        {
1483                                                bPushToForm = true;
1484                                                break;
1485                                        }
1486
1487                                }
1488                        }       
1489
1490                        //Else Actions
1491                        if(bPushToForm == false) // Only search the else actions if the al is still false
1492                        {
1493                                for(unsigned int i = 0; i < al.GetElseActions().numItems; i++)
1494                                {
1495                                        if(al.GetElseActions().actionList[i].action == AR_ACTIVE_LINK_ACTION_OPENDLG)
1496                                        {
1497                                                AROpenDlgStruct &action = al.GetElseActions().actionList[i].u.openDlg;
1498                                                Context context(al, IES_ELSE, i, -1, 0);
1499                                                OpenWindowSampleData sampleData(context);
1500
1501                                                string openWindowSchema;
1502                                                if (action.schemaName[0] == '$' )
1503                                                {
1504                                                        openWindowSchema = sampleData.getSchema();
1505                                                }
1506                                                else
1507                                                        openWindowSchema = action.schemaName;
1508
1509                                                if ((openWindowSchema.compare(AR_CURRENT_SCHEMA_TAG) == 0 && IsSchemaInWFConnectStruct(al.GetSchemaList())) ||
1510                                                openWindowSchema.compare(schema.GetARName()) == 0)
1511                                                {
1512                                                        bPushToForm = true;
1513                                                        break;
1514                                                }
1515
1516                                        }
1517                                }
1518                        }
1519
1520                        if(bPushToForm == true)
1521                        {
1522                                alTable->AddRow(alIndex, rootLevel);
1523                        }
1524                }
1525
1526                if(alTable->NumRows() > 0)
1527                        strm << *alTable;
1528                else
1529                        strm << EmptyValue;
1530
1531                delete alTable;
1532        }
1533        catch(exception& e)
1534        {
1535                cout << "EXCEPTION enumerating window open references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1536        }
1537
1538        return strm.str();
1539}
1540
1541string CDocSchemaDetails::ShowProperties()
1542{
1543        stringstream strm;
1544        strm.str("");
1545        int schemaType = this->schema.GetCompound().schemaType;
1546       
1547        try
1548        {
1549                const ARPropList& propList = this->schema.GetPropList();
1550                CARProplistHelper propIdx(&propList);
1551
1552                strm << "<div id='schemaProperties'>";
1553
1554                // doc basic properties
1555                ShowBasicProperties(strm, &propIdx);
1556                ShowEntryPointProperties(strm, &propIdx);
1557
1558                if (schemaType != AR_SCHEMA_DIALOG)
1559                {
1560                        ShowResultListProperties(strm, &propIdx);
1561                        ShowSortListProperties(strm, &propIdx);
1562                        ShowArchiveProperties(strm);
1563
1564                        if (pInside->CompareServerVersion(7,0) >= 0) 
1565                        {
1566                                ShowAuditProperties(strm);
1567                        }
1568                       
1569                        if (schemaType != AR_SCHEMA_VENDOR && schemaType != AR_SCHEMA_VIEW)
1570                                ShowIndexProperties(strm, &propIdx);
1571
1572                        ShowFTSMTSProperties(strm, &propIdx);
1573                }
1574
1575                ShowPermissionProperties(strm, &propIdx);
1576
1577                propIdx.UnusedPropertiesToHTML(strm, rootLevel);
1578
1579                ShowChangeHistory(strm, &propIdx);
1580
1581                strm << "</div>";
1582        }
1583        catch(exception& e)
1584        {
1585                cerr << "EXCEPTION enumerating properties: " << e.what() << endl;
1586        }
1587        return strm.str();
1588}
1589
1590void CDocSchemaDetails::ShowBasicProperties(std::ostream& strm, CARProplistHelper* propIndex)
1591{
1592        ARValueStruct* propVal;
1593
1594        try
1595        {
1596                stringstream tmpStrm;
1597                CTable tbl("basicProps", "TblNoBorder");
1598                tbl.AddColumn(20, "Description");
1599                tbl.AddColumn(80, "Value");
1600                tbl.DisableHeader();
1601
1602                // entry id block size
1603                ARLong32 nextIDBlockSize = -1;
1604
1605                propVal = propIndex->GetAndUseValue(AR_OPROP_NEXT_ID_BLOCK_SIZE);
1606                if (propVal != NULL)
1607                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1608                                nextIDBlockSize = propVal->u.intVal;
1609
1610                tmpStrm.str("");
1611                tmpStrm << (nextIDBlockSize>0?"Enabled":"Disabled") << "<br/>";
1612                if (nextIDBlockSize>0)
1613                        tmpStrm << "Size: " << nextIDBlockSize;
1614
1615                CTableRow rowBS("");
1616                rowBS.AddCell("Next Request ID Block");
1617                rowBS.AddCell(tmpStrm.str());
1618                tbl.AddRow(rowBS);
1619
1620#if AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1621                // cache properties
1622                ARLong32 cacheDisplayProps = -1;
1623
1624                propVal = propIndex->GetAndUseValue(AR_OPROP_CACHE_DISP_PROP);
1625                if (propVal != NULL) 
1626                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1627                                cacheDisplayProps = propVal->u.intVal;
1628
1629                tmpStrm.str("");
1630                tmpStrm << "Override Server Settings: " << (cacheDisplayProps>=0?"Enabled":"Disabled");
1631                if (cacheDisplayProps>=0)
1632                {
1633                        tmpStrm << "<br/>";
1634                        tmpStrm << CWebUtil::ChkBoxInput("disableVUICaching",(cacheDisplayProps & AR_CACHE_DPROP_VUI) > 0) << "Disable VUI Display Property Caching<br/>" ;
1635                        tmpStrm << CWebUtil::ChkBoxInput("disableFieldCaching",(cacheDisplayProps & AR_CACHE_DPROP_FIELD) > 0) << "Disable Field Display Property Caching" ;
1636                }
1637
1638                CTableRow rowOC("");
1639                rowOC.AddCell("Display Property Caching");
1640                rowOC.AddCell(tmpStrm.str());
1641                tbl.AddRow(rowOC);
1642
1643                /////////////////////////////////////////////////////////////////////////////////////
1644
1645                ARLong32 disableStatusHistory = 0;
1646                propVal = propIndex->GetAndUseValue(AR_OPROP_CORE_FIELDS_OPTION_MASK);
1647                if (propVal != NULL)
1648                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1649                                disableStatusHistory = propVal->u.intVal;
1650
1651                CTableRow disSH("");
1652                disSH.AddCell("Disable Status History");
1653                disSH.AddCell((disableStatusHistory & AR_CORE_FIELDS_OPTION_DISABLE_STATUS_HISTORY ? "Yes" : "No"));
1654                tbl.AddRow(disSH);
1655
1656#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1657                ARLong32 allowDelete = 0;
1658                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1659                if (propVal != NULL)
1660                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1661                                allowDelete = propVal->u.intVal;
1662
1663                CTableRow row("");
1664                row.AddCell("Allow Delete");
1665                row.AddCell((allowDelete == 1 ? "Yes" : "No"));
1666                tbl.AddRow(row);
1667
1668                /////////////////////////////////////////////////////////////////////////////////////
1669
1670                ARLong32 allowDrillDownWebReports = 0;
1671                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1672                if (propVal != NULL)
1673                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1674                                allowDrillDownWebReports = propVal->u.intVal;
1675
1676                row.ClearCells();
1677                row.AddCell("Allow Drill Down in Web Reports");
1678                row.AddCell((allowDrillDownWebReports == 1 ? "Yes" : "No"));
1679                tbl.AddRow(row);
1680
1681                /////////////////////////////////////////////////////////////////////////////////////
1682
1683                ARLong32 value = 0;
1684                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_VIEWS);
1685                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1686                {
1687                        value = propVal->u.intVal;
1688                }
1689                else
1690                        value = AR_LOCALIZE_FORM_VIEWS_ALL;     // default, if property isn't present
1691
1692                const char* strState = "Disabled";
1693                if (value == AR_LOCALIZE_FORM_VIEWS_ALL) strState = "All";
1694                if (value == AR_LOCALIZE_FORM_VIEWS_ALIASES) strState = "Only for selection field aliases";
1695
1696                row.ClearCells();
1697                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_VIEWS));
1698                row.AddCell(strState);
1699                tbl.AddRow(row);
1700
1701                /////////////////////////////////////////////////////////////////////////////////////
1702
1703                value = 0;
1704                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_DATA);
1705                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1706                {
1707                        value = propVal->u.intVal;
1708                }
1709                else
1710                        value = AR_LOCALIZE_FORM_DATA_ALL; // default, if property isn't present
1711
1712                row.ClearCells();
1713                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_DATA));
1714                row.AddCell((value == 1 ? "Yes" : "No"));
1715                tbl.AddRow(row);
1716
1717#if AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1718               
1719                const char* strValue = "";
1720                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_TAG_NAME);
1721                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
1722                {
1723                        strValue = propVal->u.charVal;
1724                }
1725
1726                row.ClearCells();
1727                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_FORM_TAG_NAME));
1728                row.AddCell(strValue);
1729                tbl.AddRow(row);
1730
1731#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1732#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1733#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1734
1735                // now write the table
1736                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Basic" << "</h2>";
1737                strm << "<div>" << tbl << "</div>";
1738        }
1739        catch(exception& e)
1740        {
1741                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1742        }
1743}
1744
1745void CDocSchemaDetails::ShowEntryPointProperties(std::ostream &strm, CARProplistHelper *propIndex)
1746{
1747        ARValueStruct* propVal;
1748
1749        try
1750        {
1751                stringstream tmpStrm;
1752                CTable tbl("entryPoints", "TblNoBorder");
1753                tbl.AddColumn(20, "Description");
1754                tbl.AddColumn(80, "Value");
1755                tbl.DisableHeader();
1756
1757                // entry points
1758                ARLong32 entryPointNewOrder = -1;
1759                ARLong32 entryPointSearchOrder = -1;
1760
1761                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_NEW_ORDER);
1762                if (propVal != NULL) 
1763                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1764                                entryPointNewOrder = propVal->u.intVal;
1765
1766                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_SEARCH_ORDER);
1767                if (propVal != NULL) 
1768                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1769                                entryPointSearchOrder = propVal->u.intVal;
1770
1771
1772                tmpStrm << CWebUtil::ChkBoxInput("" ,(entryPointNewOrder >= 0)) << "Enable Entry Point" << "<br/>";
1773                tmpStrm << "Application List Display Order: "; if (entryPointNewOrder >=0) tmpStrm << entryPointNewOrder; tmpStrm << "<br/>" << "<br/>";
1774
1775                CTableRow row;
1776                row.AddCell("New Mode");
1777                row.AddCell(tmpStrm.str());
1778                tbl.AddRow(row);
1779               
1780                tmpStrm.str("");
1781                tmpStrm << CWebUtil::ChkBoxInput("", (entryPointSearchOrder >= 0)) << "Enable Entry Point" << "<br/>";
1782                tmpStrm << "Application List Display Order: "; if (entryPointSearchOrder >= 0) tmpStrm << entryPointSearchOrder; tmpStrm << endl;
1783
1784                row.ClearCells();
1785                row.AddCell("Search Mode");
1786                row.AddCell(tmpStrm.str());
1787                tbl.AddRow(row);
1788               
1789                // now write the table
1790                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "EntryPoints" << "</h2>";
1791                strm << "<div>" << tbl << "</div>";
1792        }
1793        catch(exception& e)
1794        {
1795                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1796        }
1797}
1798
1799void CDocSchemaDetails::ShowAuditProperties(std::ostream& strm)
1800{
1801        try
1802        {
1803                const ARAuditInfoStruct& audit = this->schema.GetAuditInfo();
1804                CTable tbl("displayPropList", "TblObjectList");
1805                tbl.AddColumn(20, "Description");
1806                tbl.AddColumn(80, "Values");
1807
1808                CTableRow row("");
1809                row.AddCell("Audit Style");
1810                row.AddCell(CAREnum::AuditStyle(audit.style));
1811                tbl.AddRow(row);
1812
1813                row.ClearCells();
1814                row.AddCell("Audit Enabled");
1815                row.AddCell((audit.enable==0?"No":"Yes"));
1816                tbl.AddRow(row);
1817
1818#if AR_CURRENT_API_VERSION > 13 // Version 7.5 and higher
1819                row.ClearCells();
1820                row.AddCell("Audit Only Changed Fields");
1821                row.AddCell(CAREnum::AuditChangedFields(audit.auditMask));
1822                tbl.AddRow(row);
1823#endif
1824
1825                row.ClearCells();
1826                switch (audit.style)
1827                {
1828                        case AR_AUDIT_NONE:
1829                                {
1830                                        if (audit.formName[0] != 0)
1831                                        {
1832                                                row.AddCell("Audited From Form");
1833                                                row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1834                                                tbl.AddRow(row);
1835                                        }
1836                                }
1837                                break;
1838                        case AR_AUDIT_COPY:
1839                                {
1840                                        row.AddCell("Audit Form");
1841                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1842                                        tbl.AddRow(row);
1843                                }
1844                                break;
1845                        case AR_AUDIT_LOG:
1846                                {
1847                                        row.AddCell("Audit Log Form");
1848                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1849                                        tbl.AddRow(row);
1850                                }
1851                                break;
1852                }
1853
1854                // audit qualification
1855                stringstream qualStrm; qualStrm.str("");
1856                int pFormId = schema.GetInsideId();
1857
1858                if (audit.query.operation != AR_COND_OP_NONE)
1859                {
1860                        CRefItem refItem(this->schema, REFM_SCHEMA_AUDIT_QUALIFICATION);
1861                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1862                        arQual.CheckQuery(&audit.query, qualStrm);
1863                }
1864                else
1865                {
1866                        qualStrm << EmptyRunIf << endl;
1867                }
1868
1869                row.ClearCells();
1870                row.AddCell("Qualification");
1871                row.AddCell(qualStrm.str());
1872                tbl.AddRow(row);
1873
1874                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Audit Settings" << "</h2>";
1875                strm << "<div>" << tbl << "</div>";
1876        }
1877        catch (...)
1878        {
1879                cerr << "EXCEPTION audit properties" << endl;
1880        }
1881}
1882
1883void CDocSchemaDetails::ShowArchiveProperties(std::ostream& strm)
1884{
1885        try
1886        {
1887                const ARArchiveInfoStruct& archive = this->schema.GetArchiveInfo();
1888                bool archiveToForm = (archive.archiveType & AR_ARCHIVE_FORM)>0;
1889                bool deleteSource = (archive.archiveType & AR_ARCHIVE_DELETE)>0;
1890                bool archiveToFile = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML))>0;
1891                unsigned int fileFormat = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML)) << 2;
1892                bool noAttachments = (archive.archiveType & AR_ARCHIVE_NO_ATTACHMENTS)>0;
1893                bool noDiary = (archive.archiveType & AR_ARCHIVE_NO_DIARY)>0;
1894
1895                CTable tbl("displayPropList", "TblObjectList");
1896                tbl.AddColumn(20, "Description");
1897                tbl.AddColumn(80, "Values");
1898
1899                // archive type
1900                stringstream typeStrm; typeStrm.str("");
1901                if (!archiveToForm && !archiveToFile)
1902                {
1903                        typeStrm << "None";
1904                }
1905                else if (archiveToForm || deleteSource)
1906                {
1907                        if (archiveToForm) typeStrm << "Copy to Archive";
1908                        if (deleteSource && archiveToForm) typeStrm << " and ";
1909                        if (deleteSource) typeStrm << "Delete From Source";
1910                }
1911
1912                CTableRow row("");
1913                row.AddCell("Archive Type");
1914                row.AddCell(typeStrm.str());
1915                tbl.AddRow(row);
1916
1917                row.ClearCells();
1918                row.AddCell("Archive State");
1919                row.AddCell((archive.enable==0?"Disabled":"Enabled"));
1920                tbl.AddRow(row);
1921
1922                row.ClearCells();
1923                if (archiveToFile)
1924                {
1925                        // archive to file is not supported by admin/developer tool; but maybe some day...
1926                        row.AddCell("Archive to File");
1927                        row.AddCell(archive.u.dirPath);
1928                        tbl.AddRow(row);
1929                }
1930                else if (archiveToForm)
1931                {
1932                        stringstream tmpStrm; tmpStrm.str("");
1933                        tmpStrm << this->pInside->LinkToSchema(archive.u.formName,rootLevel) << "<br/>" << endl;
1934                        tmpStrm << CWebUtil::ChkBoxInput("noAttachments",noAttachments) << "No Attachments&nbsp;&nbsp;";
1935                        tmpStrm << CWebUtil::ChkBoxInput("noDiary",noDiary) << "No Diary" << endl;
1936
1937                        row.AddCell("Archive to Form");
1938                        row.AddCell(tmpStrm.str());
1939                        tbl.AddRow(row);
1940                }
1941
1942                if (archive.archiveFrom[0] != 0)
1943                {
1944                        row.ClearCells();
1945                        row.AddCell("Archive From Form");
1946                        row.AddCell(this->pInside->LinkToSchema(archive.archiveFrom, rootLevel));
1947                        tbl.AddRow(row);
1948                }
1949
1950                stringstream qualStrm; qualStrm.str("");
1951                int pFormId = this->schema.GetInsideId(); //this->pInside->SchemaGetInsideId(this->schema.GetARName());
1952
1953                if (archive.query.operation != AR_COND_OP_NONE)
1954                {
1955                        CRefItem refItem(this->schema, REFM_SCHEMA_ARCHIVE_QUALIFICATION);
1956                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1957                        arQual.CheckQuery(&archive.query, qualStrm);
1958                }
1959                else
1960                {
1961                        qualStrm << EmptyRunIf << endl;
1962                }
1963
1964                row.ClearCells();
1965                row.AddCell("Times");
1966                row.AddCell(CARDayStructHelper::DayStructToHTMLString(archive.archiveTime));
1967                tbl.AddRow(row);
1968
1969                row.ClearCells();
1970                row.AddCell("Qualification");
1971                row.AddCell(qualStrm.str());
1972                tbl.AddRow(row);
1973
1974                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Archive Settings" << "</h2>";
1975                strm << "<div>" << tbl << "</div>";
1976        }
1977        catch (...)
1978        {
1979                cerr << "EXCEPTION archive properties" << endl;
1980        }
1981}
1982
1983void CDocSchemaDetails::WorkflowReferences(std::ostream &strm)
1984{
1985        try
1986        {
1987                CTable tabSet("setFieldReferences", "TblObjectList");
1988                tabSet.AddColumn(50, "Object Name");
1989                tabSet.AddColumn(10, "Enabled");
1990                tabSet.AddColumn(20, "Execute On");
1991                tabSet.AddColumn(20, "Description");
1992
1993                CTable tabPush("pushReferences", "TblObjectList");
1994                tabPush.AddColumn(50, "Object Name");
1995                tabPush.AddColumn(10, "Enabled");
1996                tabPush.AddColumn(20, "Execute On");
1997                tabPush.AddColumn(20, "Description");
1998
1999                CTable delAction("deleteReferences", "TblObjectList");
2000                delAction.AddColumn(50, "Object Name");
2001                delAction.AddColumn(10, "Enabled");
2002                delAction.AddColumn(20, "Execute On");
2003                delAction.AddColumn(20, "Description");
2004
2005                CTable tabService("serviceReferences", "TblObjectList");
2006                tabService.AddColumn(50, "Object Name");
2007                tabService.AddColumn(10, "Enabled");
2008                tabService.AddColumn(20, "Execute On");
2009                tabService.AddColumn(20, "Description");
2010
2011
2012                const CARSchema::ReferenceList &refList = schema.GetReferences();
2013                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
2014                CARSchema::ReferenceList::const_iterator endIt = refList.end();
2015
2016                for (; curIt != endIt; ++curIt)
2017                {
2018                        int messageId = curIt->GetMessageId();
2019                        if (messageId == REFM_SETFIELDS_FORM)
2020                        {
2021                                bool hasEnabledFlag;
2022                                string tmpEnabled = "";
2023                                string tmpCssEnabled = "";
2024
2025                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2026
2027                                if (hasEnabledFlag)
2028                                {
2029                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2030                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2031                                }
2032
2033                                CTableRow row;
2034                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2035                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2036                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2037                                row.AddCell(curIt->GetDescription(rootLevel));
2038                                tabSet.AddRow(row);
2039                        }
2040                        if (messageId == REFM_SERVICE_CALL)
2041                        {
2042                                bool hasEnabledFlag;
2043                                string tmpEnabled = "";
2044                                string tmpCssEnabled = "";
2045
2046                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2047
2048                                if (hasEnabledFlag)
2049                                {
2050                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2051                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2052                                }
2053
2054                                CTableRow row;
2055                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2056                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2057                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2058                                row.AddCell(curIt->GetDescription(rootLevel));
2059                                tabService.AddRow(row);
2060                        }
2061                        if (messageId == REFM_PUSHFIELD_TARGET)
2062                        {
2063                                bool hasEnabledFlag;
2064                                string tmpEnabled = "";
2065                                string tmpCssEnabled = "";
2066
2067                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2068
2069                                if (hasEnabledFlag)
2070                                {
2071                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2072                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2073                                }
2074
2075                                CTableRow row;
2076                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2077                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2078                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2079                                row.AddCell(curIt->GetDescription(rootLevel));
2080                                tabPush.AddRow(row);
2081                        }
2082                        if (messageId == REFM_DELETE_ENTRY_ACTION)
2083                        {
2084                                bool hasEnabledFlag;
2085                                string tmpEnabled = "";
2086                                string tmpCssEnabled = "";
2087
2088                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2089
2090                                if (hasEnabledFlag)
2091                                {
2092                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2093                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2094                                }
2095
2096                                CTableRow row;
2097                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2098                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2099                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2100                                row.AddCell(curIt->GetDescription(rootLevel));
2101                                delAction.AddRow(row);
2102                        }
2103                }
2104
2105                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow reading data from this form" << endl;
2106                tabSet.ToXHtml(strm);
2107
2108                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow writing data to this form" << endl;
2109                tabPush.ToXHtml(strm);
2110
2111                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow deleting data on this form" << endl;
2112                delAction.ToXHtml(strm);
2113
2114                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow executing services on this form" << endl;
2115                tabService.ToXHtml(strm);
2116        }
2117        catch(exception& e)
2118        {
2119                cout << "EXCEPTION enumerating filter push fields references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
2120        }
2121}
2122
2123string CDocSchemaDetails::GenerateReferencesTable(const ARCompoundSchema &compSchema)
2124{
2125        stringstream strmTmp;
2126        WorkflowReferences(strmTmp);
2127
2128        //Schema Properties
2129        CTable tblObjProp("objProperties", "TblObjectList");
2130        tblObjProp.AddColumn(0, "Property");
2131        tblObjProp.AddColumn(0, "Value");
2132
2133        //Schema type informations
2134        CTableRow row("cssStdRow");     
2135        CTableCell cellProp("");                               
2136        CTableCell cellPropValue("");   
2137
2138        //Container References
2139        row.ClearCells();
2140        cellProp.content = "Container References";
2141        cellPropValue.content = this->ContainerReferences();
2142        row.AddCell(cellProp);
2143        row.AddCell(cellPropValue);
2144        tblObjProp.AddRow(row);                 
2145
2146        //TableField References
2147        row.ClearCells();
2148        cellProp.content = "Table Fields datasource form";
2149        cellPropValue.content = this->TableFieldReferences();
2150        row.AddCell(cellProp);
2151        row.AddCell(cellPropValue);
2152        tblObjProp.AddRow(row); 
2153
2154        //AL window open references
2155        row.ClearCells();
2156        cellProp.content = "Active Link \"Open Window Action\"";
2157        cellPropValue.content = this->AlWindowOpenReferences();
2158        row.AddCell(cellProp);
2159        row.AddCell(cellPropValue);
2160        tblObjProp.AddRow(row);
2161
2162        //Join References
2163        row.ClearCells();
2164        cellProp.content = "Join Form References";
2165        cellPropValue.content = this->JoinFormReferences();
2166        row.AddCell(cellProp);
2167        row.AddCell(cellPropValue);
2168        tblObjProp.AddRow(row);
2169
2170        //Menu References
2171        row.ClearCells();
2172        cellProp.content = "Search Menu References";
2173        cellPropValue.content = this->SearchMenuReferences();
2174        row.AddCell(cellProp);
2175        row.AddCell(cellPropValue);
2176        tblObjProp.AddRow(row);
2177
2178        strmTmp << tblObjProp;
2179        return strmTmp.str();
2180}
2181
2182bool CDocSchemaDetails::IsJoinViewOrVendorForm()
2183{
2184        switch(this->schema.GetCompound().schemaType)
2185        {
2186        case AR_SCHEMA_JOIN:
2187        case AR_SCHEMA_VIEW:
2188        case AR_SCHEMA_VENDOR:
2189                return true;
2190        default:       
2191                return false;
2192        }
2193}
2194
2195string CDocSchemaDetails::ShowGeneralInfo()
2196{
2197        const ARCompoundSchema &compSchema = this->schema.GetCompound();
2198        stringstream strm;
2199
2200        CTable tbl("general", "TblNoBorder");
2201        tbl.AddColumn(20, "");
2202        tbl.AddColumn(80, "");
2203        tbl.DisableHeader();
2204
2205        CTableRow row;
2206        row.AddCell("Name");
2207        row.AddCell(this->schema.GetName());
2208        tbl.AddRow(row);       
2209        row.ClearCells();
2210
2211        // generate the schema type row (and with additional details for special form types like join, view and vendor)
2212        if (compSchema.schemaType == AR_SCHEMA_JOIN)
2213        {
2214                strm << CAREnum::JoinType(compSchema.u.join.option) << "-";
2215        }
2216        strm << CAREnum::SchemaType(compSchema.schemaType);
2217
2218        if(compSchema.schemaType == AR_SCHEMA_JOIN
2219                || compSchema.schemaType == AR_SCHEMA_VIEW
2220                || compSchema.schemaType == AR_SCHEMA_VENDOR)
2221        {
2222                strm << " " << this->TypeDetails();
2223        }
2224
2225        row.AddCell("Type");
2226        row.AddCell(strm.str());
2227        tbl.AddRow(row);
2228        row.ClearCells();
2229        strm.str("");
2230
2231        // search for the default vui
2232        CARVui defaultVUI(this->schema.GetInsideId(), this->schema.GetDefaultVUI());
2233
2234        row.AddCell("Default View");
2235        row.AddCell(CheckedURLLink(defaultVUI, schema.GetDefaultVUI(), rootLevel));
2236        tbl.AddRow(row);
2237        row.ClearCells();
2238
2239        strm << tbl.ToXHtml();
2240        tbl.ClearRows();
2241
2242        if (pInside->CompareServerVersion(7,1) >= 0)
2243        {
2244                stringstream numberConverter;
2245                if (schema.GetDbTableId() > 0)
2246                        numberConverter << schema.GetDbTableId();
2247
2248                row.AddCell("DB Table ID");
2249                row.AddCell(numberConverter.str());
2250                tbl.AddRow(row);
2251                row.ClearCells();
2252
2253                if (compSchema.schemaType != AR_SCHEMA_DIALOG && compSchema.schemaType != AR_SCHEMA_VENDOR)
2254                {
2255                        row.AddCell("DB Table View");
2256                        row.AddCell(schema.GetDbViewName());
2257                        tbl.AddRow(row);
2258                        row.ClearCells();
2259
2260                        row.AddCell("DB Table SH Views");
2261                        row.AddCell(schema.GetDbShViewName());
2262                        tbl.AddRow(row);
2263                        row.ClearCells();
2264                }
2265
2266                strm << tbl.ToXHtml();
2267        }
2268
2269        strm << "<hr/>" << endl;
2270
2271        strm << ShowProperties();
2272
2273        strm << "<hr/>" << endl;
2274
2275        return strm.str();
2276}
2277
2278void CDocSchemaDetails::ShowFTSMTSProperties(std::ostream& strm, CARProplistHelper *propIndex)
2279{
2280#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
2281        if (pInside->CompareServerVersion(7,6,3) < 0)
2282                return;
2283
2284        ARValueStruct* propVal;
2285        int iValue;
2286
2287        try
2288        {
2289                stringstream tmpStrm;
2290                CTable tbl("ftsProps", "TblNoBorder");
2291                tbl.AddColumn(20, "Description");
2292                tbl.AddColumn(80, "Value");
2293                tbl.DisableHeader();
2294
2295                ///////////////////////////////////////////////////////////////////////////////////////
2296
2297                CTableRow       row("");
2298                iValue = 0;
2299                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_OPTION_MASK);
2300                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2301                        iValue = propVal->u.intVal;
2302               
2303                row.AddCell("Exclude from multi-form search");
2304                row.AddCell((iValue & AR_MULTI_FORM_SEARCH_OPTION_EXCLUDE ? "Yes" : "No"));             
2305                tbl.AddRow(row);
2306
2307                ///////////////////////////////////////////////////////////////////////////////////////
2308
2309                row.ClearCells();
2310                char* strValue = NULL;
2311                vector<int> weightedRelevancyFields; weightedRelevancyFields.resize(4);
2312
2313                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_WEIGHTED_RELEVANCY_FIELDS);
2314                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
2315                        strValue = propVal->u.charVal;
2316
2317
2318                if (strValue != NULL && strValue[0] != 0)
2319                {
2320                        int numFields = atoi(strValue);
2321                        char* newPos = strchr(strValue, ';');
2322                        if (newPos)
2323                        {
2324                                strValue = newPos + 1;
2325                                for (int fieldPos = 0; fieldPos < numFields; fieldPos++)
2326                                {
2327                                        int fieldTag = atoi(strValue);
2328                                       
2329                                        newPos = strchr(strValue, ';');
2330                                        if (newPos)
2331                                        {
2332                                                strValue = newPos + 1;
2333                                                int fieldId = atoi(strValue);
2334                                               
2335                                                if (fieldTag > 0 && fieldTag <= AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG)
2336                                                {
2337                                                        weightedRelevancyFields[fieldTag-1] = fieldId;
2338                                                }
2339                                        }
2340                                }
2341                        }
2342                }
2343
2344                CTable weightedRelFields("WRFields", "TblNoBorder");
2345                weightedRelFields.AddColumn(0, "");
2346                weightedRelFields.AddColumn(80, "");
2347                weightedRelFields.DisableHeader();
2348
2349                for (unsigned int wrfPos = 0; wrfPos < AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG; wrfPos++)
2350                {
2351                        int fieldId = weightedRelevancyFields[wrfPos];
2352
2353                        CTableRow wrfRow("");
2354                        wrfRow.AddCell(CAREnum::WeightedRelevancyFieldType(wrfPos+1));
2355                        wrfRow.AddCell((fieldId > 0 ? pInside->LinkToField(this->schema.GetInsideId(), fieldId, rootLevel) : ""));
2356                        weightedRelFields.AddRow(wrfRow);
2357
2358                        if (fieldId > 0 && (!pInside->appConfig.bOverlaySupport || IsVisibleObject(schema)))
2359                        {
2360                                CRefItem ref(schema, REFM_SCHEMA_FTS_WEIGHTED_RELEVANCY_FIELD);
2361                                pInside->AddFieldReference(schema.GetInsideId(), fieldId, ref);
2362                        }
2363                }
2364
2365                row.AddCell("Weighted relevancy fields");
2366                row.AddCell(weightedRelFields.ToXHtml());
2367                tbl.AddRow(row);
2368
2369                ///////////////////////////////////////////////////////////////////////////////////////
2370
2371                row.ClearCells();
2372                ARDayStruct timeValue;
2373                unsigned int intervalValue = 0;
2374
2375                ARZeroMemory(&timeValue);
2376
2377                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MONTH_MASK);
2378                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2379                        timeValue.monthday = propVal->u.intVal;
2380
2381                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_WEEKDAY_MASK);
2382                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2383                        timeValue.weekday = propVal->u.intVal;
2384
2385                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_HOUR_MASK);
2386                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2387                        timeValue.hourmask = propVal->u.intVal;
2388               
2389                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MINUTE);
2390                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2391                        timeValue.minute = propVal->u.intVal;
2392
2393                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_INTERVAL);
2394                if (propVal != NULL && (propVal->dataType == AR_DATA_TYPE_INTEGER || propVal->dataType == AR_DATA_TYPE_ULONG))
2395                        intervalValue = propVal->u.ulongVal;
2396               
2397                row.AddCell("FT-indexed field updates");
2398                if (timeValue.monthday != 0 || timeValue.weekday != 0 || timeValue.hourmask != 0 || timeValue.minute != 0)
2399                {
2400                        row.AddCell(CARDayStructHelper::DayStructToHTMLString(timeValue));
2401                }
2402                else if (intervalValue != 0)
2403                {
2404                        unsigned int days, hours, minutes, seconds;
2405                        CARDayStructHelper::SplitInterval(intervalValue, days, hours, minutes, seconds);
2406
2407                        tmpStrm.str("");
2408                        tmpStrm << days << " Days " << hours << " Hours " << minutes << " Minutes";
2409                        row.AddCell(tmpStrm.str());
2410                }
2411                else
2412                {
2413                        row.AddCell("No Time specified");
2414                }
2415                tbl.AddRow(row);
2416
2417                ///////////////////////////////////////////////////////////////////////////////////////
2418
2419                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Full Text Search" << "</h2>";
2420                strm << "<div>" << tbl << "</div>";
2421        }
2422        catch (exception &e)
2423        {
2424                cerr << "EXCEPTION in ShowFTSMTSProperties: " << e.what() << endl;
2425        }
2426#endif
2427}
2428
2429void CDocSchemaDetails::ShowChangeHistory(std::ostream &strm, CARProplistHelper *propIndex)
2430{
2431        strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Change History &amp; Helptext" << "</h2>"
2432             << "<div>" << this->pInside->ServerObjectHistory(&this->schema, rootLevel, true) << "</div>" << endl;
2433}
Note: See TracBrowser for help on using the repository browser.