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

Revision 615, 75.6 KB checked in by jls17, 5 years ago (diff)
  • added audit schema detection
  • audit schema is now documented as "Audit" on the schema detail page
  • now audit log target form does show references to the audit source forms
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                CContainerTable *contTable = new CContainerTable(*this->pInside);
1250
1251                //// Add Packing Lists ////
1252                const CARSchemaList::ObjectRefList& pkl = schema.GetPackingLists();
1253                CARSchemaList::ObjectRefList::const_iterator curIt = pkl.begin();
1254                CARSchemaList::ObjectRefList::const_iterator endIt = pkl.end();
1255
1256                for (; curIt != endIt; ++curIt)
1257                {
1258                        CARContainer cont(*curIt);
1259                        contTable->AddRow(cont, rootLevel);
1260                }
1261
1262                //// create output ////
1263                if(contTable->NumRows() > 0)
1264                        strm << *contTable;
1265                else
1266                        strm << EmptyValue;
1267
1268                delete contTable;
1269        }
1270        catch(exception& e)
1271        {
1272                cout << "EXCEPTION enumerating container references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1273        }
1274
1275        return strm.str();
1276}
1277
1278string CDocSchemaDetails::JoinFormReferences()
1279{
1280        stringstream strm;
1281        strm.str("");
1282        try
1283        {
1284                const ARNameType& schemaName = this->schema.GetARName();
1285                unsigned int schemaCount = this->pInside->schemaList.GetCount();
1286                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1287                {
1288                        CARSchema schema(schemaIndex);
1289
1290                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(schema))
1291                                continue;
1292
1293                        const ARCompoundSchema& compSchema = schema.GetCompound();
1294
1295                        if(compSchema.schemaType == AR_SCHEMA_JOIN)
1296                        {
1297                                if(strcmp(schemaName, compSchema.u.join.memberA) == 0)
1298                                {
1299                                        strm << "Primary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1300                                }
1301
1302                                if(strcmp(schemaName, compSchema.u.join.memberB)==0)                                   
1303                                {
1304                                        strm << "Secondary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1305                                }
1306                        }
1307                }
1308
1309                if(strm.str().size() == 0)
1310                        strm << EmptyValue;
1311        }
1312        catch(exception& e)
1313        {
1314                cout << "EXCEPTION enumerating join form references of '" << this->schema.GetName() << "': " << e.what() << endl;
1315        }
1316
1317        return strm.str();
1318}
1319
1320
1321string CDocSchemaDetails::TableFieldReferences()
1322{
1323        stringstream strm;
1324        strm.str("");
1325        try
1326        {
1327                // TODO: there is a function that checks for field references between table-field and column-field
1328                // before the documentation starts. Move this function over to this scanning routing and store
1329                // "table field to form" references in a list within the CARSchemaList
1330                // ===> move scaning over to CARInside::CustomFieldReferences
1331                bool bFound = false;
1332
1333                unsigned int schemaCount = pInside->schemaList.GetCount();
1334                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1335                {                       
1336                        CARSchema searchSchema(schemaIndex);
1337                       
1338                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(searchSchema))
1339                                continue;
1340
1341                        unsigned int fieldCount = searchSchema.GetFields()->GetCount();
1342                        for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
1343                        {
1344                                CARField field(schemaIndex, 0, fieldIndex);
1345                               
1346                                if(field.GetDataType() == AR_DATA_TYPE_TABLE && field.GetLimits().dataType == AR_DATA_TYPE_TABLE)
1347                                {
1348                                        const ARTableLimitsStruct &limit = field.GetLimits().u.tableLimits;                                     
1349                                        const char *tableSchema = limit.schema;
1350
1351                                        if (limit.schema[0] == '$')
1352                                                tableSchema = limit.sampleSchema;
1353
1354                                        if(schema.GetName().compare(tableSchema) == 0)
1355                                        {
1356                                                strm << "Table: " << URLLink(field, rootLevel);
1357                                                strm << " in form: " << URLLink(searchSchema, rootLevel) << "<br/>" << endl;
1358
1359                                                bFound = true;
1360                                        }
1361                                }
1362                        }
1363                }
1364
1365                if(!bFound)
1366                        strm << EmptyValue;
1367        }
1368        catch(exception& e)
1369        {
1370                cout << "EXCEPTION enumerating table references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1371        }
1372
1373        return strm.str();
1374}
1375
1376string CDocSchemaDetails::SearchMenuReferences()
1377{
1378        stringstream strm;
1379        strm.str("");
1380        try
1381        {
1382                CMenuTable *menuTable = new CMenuTable(*this->pInside);
1383
1384                const CARSchema::ReferenceList &refList = schema.GetReferences();
1385                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
1386                CARSchema::ReferenceList::const_iterator endIt = refList.end();
1387
1388                for (; curIt != endIt; ++curIt)
1389                {
1390                        if (curIt->GetMessageId() == REFM_CHARMENU_FORM && curIt->GetObjectType() == AR_STRUCT_ITEM_XML_CHAR_MENU)
1391                        {
1392                                CARHandle<CARCharMenu> hMenu(*curIt);
1393                                menuTable->AddRow(*hMenu, rootLevel);
1394                        }
1395                }
1396
1397                if(menuTable->NumRows() > 0)
1398                        strm << *menuTable;
1399                else
1400                        strm << EmptyValue;
1401
1402                delete menuTable;
1403        }
1404        catch(exception& e)
1405        {
1406                cout << "EXCEPTION enumerating search menu references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1407        }
1408
1409        return strm.str();
1410}
1411
1412string CDocSchemaDetails::AlWindowOpenReferences()
1413{
1414        stringstream strm;
1415        strm.str("");
1416        try
1417        {
1418                CAlTable *alTable = new CAlTable(*this->pInside);
1419
1420                const CARSchema::ReferenceList &references = schema.GetReferences();
1421                CARSchema::ReferenceList::const_iterator curIt = references.begin();
1422                CARSchema::ReferenceList::const_iterator endIt = references.end();
1423
1424                for (; curIt != endIt; ++curIt)
1425                {
1426                        if (curIt->GetMessageId() != REFM_OPENWINDOW_FORM && curIt->GetObjectType() != AR_STRUCT_ITEM_XML_ACTIVE_LINK)
1427                                continue;
1428
1429                        CARActiveLink al(curIt->GetObjectId());
1430
1431                        if (!al.Exists())
1432                                continue;
1433
1434                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
1435                                continue;
1436
1437                        alTable->AddRow(curIt->GetObjectId(), rootLevel);
1438                }
1439
1440                if(alTable->NumRows() > 0)
1441                        strm << *alTable;
1442                else
1443                        strm << EmptyValue;
1444
1445                delete alTable;
1446        }
1447        catch(exception& e)
1448        {
1449                cout << "EXCEPTION enumerating window open references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1450        }
1451
1452        return strm.str();
1453}
1454
1455string CDocSchemaDetails::ShowProperties()
1456{
1457        stringstream strm;
1458        strm.str("");
1459        int schemaType = this->schema.GetCompound().schemaType;
1460       
1461        try
1462        {
1463                const ARPropList& propList = this->schema.GetPropList();
1464                CARProplistHelper propIdx(&propList);
1465
1466                strm << "<div id='schemaProperties'>";
1467
1468                // doc basic properties
1469                ShowBasicProperties(strm, &propIdx);
1470                ShowEntryPointProperties(strm, &propIdx);
1471
1472                if (schemaType != AR_SCHEMA_DIALOG)
1473                {
1474                        ShowResultListProperties(strm, &propIdx);
1475                        ShowSortListProperties(strm, &propIdx);
1476                        ShowArchiveProperties(strm);
1477
1478                        if (pInside->CompareServerVersion(7,0) >= 0) 
1479                        {
1480                                ShowAuditProperties(strm);
1481                        }
1482                       
1483                        if (schemaType != AR_SCHEMA_VENDOR && schemaType != AR_SCHEMA_VIEW)
1484                                ShowIndexProperties(strm, &propIdx);
1485
1486                        ShowFTSMTSProperties(strm, &propIdx);
1487                }
1488
1489                ShowPermissionProperties(strm, &propIdx);
1490
1491                propIdx.UnusedPropertiesToHTML(strm, rootLevel);
1492
1493                ShowChangeHistory(strm, &propIdx);
1494
1495                strm << "</div>";
1496        }
1497        catch(exception& e)
1498        {
1499                cerr << "EXCEPTION enumerating properties: " << e.what() << endl;
1500        }
1501        return strm.str();
1502}
1503
1504void CDocSchemaDetails::ShowBasicProperties(std::ostream& strm, CARProplistHelper* propIndex)
1505{
1506        ARValueStruct* propVal;
1507
1508        try
1509        {
1510                stringstream tmpStrm;
1511                CTable tbl("basicProps", "TblNoBorder");
1512                tbl.AddColumn(20, "Description");
1513                tbl.AddColumn(80, "Value");
1514                tbl.DisableHeader();
1515
1516                // entry id block size
1517                ARLong32 nextIDBlockSize = -1;
1518
1519                propVal = propIndex->GetAndUseValue(AR_OPROP_NEXT_ID_BLOCK_SIZE);
1520                if (propVal != NULL)
1521                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1522                                nextIDBlockSize = propVal->u.intVal;
1523
1524                tmpStrm.str("");
1525                tmpStrm << (nextIDBlockSize>0?"Enabled":"Disabled") << "<br/>";
1526                if (nextIDBlockSize>0)
1527                        tmpStrm << "Size: " << nextIDBlockSize;
1528
1529                CTableRow rowBS("");
1530                rowBS.AddCell("Next Request ID Block");
1531                rowBS.AddCell(tmpStrm.str());
1532                tbl.AddRow(rowBS);
1533
1534#if AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1535                // cache properties
1536                ARLong32 cacheDisplayProps = -1;
1537
1538                propVal = propIndex->GetAndUseValue(AR_OPROP_CACHE_DISP_PROP);
1539                if (propVal != NULL) 
1540                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1541                                cacheDisplayProps = propVal->u.intVal;
1542
1543                tmpStrm.str("");
1544                tmpStrm << "Override Server Settings: " << (cacheDisplayProps>=0?"Enabled":"Disabled");
1545                if (cacheDisplayProps>=0)
1546                {
1547                        tmpStrm << "<br/>";
1548                        tmpStrm << CWebUtil::ChkBoxInput("disableVUICaching",(cacheDisplayProps & AR_CACHE_DPROP_VUI) > 0) << "Disable VUI Display Property Caching<br/>" ;
1549                        tmpStrm << CWebUtil::ChkBoxInput("disableFieldCaching",(cacheDisplayProps & AR_CACHE_DPROP_FIELD) > 0) << "Disable Field Display Property Caching" ;
1550                }
1551
1552                CTableRow rowOC("");
1553                rowOC.AddCell("Display Property Caching");
1554                rowOC.AddCell(tmpStrm.str());
1555                tbl.AddRow(rowOC);
1556
1557                /////////////////////////////////////////////////////////////////////////////////////
1558
1559                ARLong32 disableStatusHistory = 0;
1560                propVal = propIndex->GetAndUseValue(AR_OPROP_CORE_FIELDS_OPTION_MASK);
1561                if (propVal != NULL)
1562                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1563                                disableStatusHistory = propVal->u.intVal;
1564
1565                CTableRow disSH("");
1566                disSH.AddCell("Disable Status History");
1567                disSH.AddCell((disableStatusHistory & AR_CORE_FIELDS_OPTION_DISABLE_STATUS_HISTORY ? "Yes" : "No"));
1568                tbl.AddRow(disSH);
1569
1570#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1571                ARLong32 allowDelete = 0;
1572                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1573                if (propVal != NULL)
1574                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1575                                allowDelete = propVal->u.intVal;
1576
1577                CTableRow row("");
1578                row.AddCell("Allow Delete");
1579                row.AddCell((allowDelete == 1 ? "Yes" : "No"));
1580                tbl.AddRow(row);
1581
1582                /////////////////////////////////////////////////////////////////////////////////////
1583
1584                ARLong32 allowDrillDownWebReports = 0;
1585                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1586                if (propVal != NULL)
1587                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1588                                allowDrillDownWebReports = propVal->u.intVal;
1589
1590                row.ClearCells();
1591                row.AddCell("Allow Drill Down in Web Reports");
1592                row.AddCell((allowDrillDownWebReports == 1 ? "Yes" : "No"));
1593                tbl.AddRow(row);
1594
1595                /////////////////////////////////////////////////////////////////////////////////////
1596
1597                ARLong32 value = 0;
1598                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_VIEWS);
1599                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1600                {
1601                        value = propVal->u.intVal;
1602                }
1603                else
1604                        value = AR_LOCALIZE_FORM_VIEWS_ALL;     // default, if property isn't present
1605
1606                const char* strState = "Disabled";
1607                if (value == AR_LOCALIZE_FORM_VIEWS_ALL) strState = "All";
1608                if (value == AR_LOCALIZE_FORM_VIEWS_ALIASES) strState = "Only for selection field aliases";
1609
1610                row.ClearCells();
1611                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_VIEWS));
1612                row.AddCell(strState);
1613                tbl.AddRow(row);
1614
1615                /////////////////////////////////////////////////////////////////////////////////////
1616
1617                value = 0;
1618                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_DATA);
1619                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1620                {
1621                        value = propVal->u.intVal;
1622                }
1623                else
1624                        value = AR_LOCALIZE_FORM_DATA_ALL; // default, if property isn't present
1625
1626                row.ClearCells();
1627                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_DATA));
1628                row.AddCell((value == 1 ? "Yes" : "No"));
1629                tbl.AddRow(row);
1630
1631#if AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1632               
1633                const char* strValue = "";
1634                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_TAG_NAME);
1635                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
1636                {
1637                        strValue = propVal->u.charVal;
1638                }
1639
1640                row.ClearCells();
1641                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_FORM_TAG_NAME));
1642                row.AddCell(strValue);
1643                tbl.AddRow(row);
1644
1645#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1646#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1647#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1648
1649                // now write the table
1650                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Basic" << "</h2>";
1651                strm << "<div>" << tbl << "</div>";
1652        }
1653        catch(exception& e)
1654        {
1655                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1656        }
1657}
1658
1659void CDocSchemaDetails::ShowEntryPointProperties(std::ostream &strm, CARProplistHelper *propIndex)
1660{
1661        ARValueStruct* propVal;
1662
1663        try
1664        {
1665                stringstream tmpStrm;
1666                CTable tbl("entryPoints", "TblNoBorder");
1667                tbl.AddColumn(20, "Description");
1668                tbl.AddColumn(80, "Value");
1669                tbl.DisableHeader();
1670
1671                // entry points
1672                ARLong32 entryPointNewOrder = -1;
1673                ARLong32 entryPointSearchOrder = -1;
1674
1675                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_NEW_ORDER);
1676                if (propVal != NULL) 
1677                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1678                                entryPointNewOrder = propVal->u.intVal;
1679
1680                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_SEARCH_ORDER);
1681                if (propVal != NULL) 
1682                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1683                                entryPointSearchOrder = propVal->u.intVal;
1684
1685
1686                tmpStrm << CWebUtil::ChkBoxInput("" ,(entryPointNewOrder >= 0)) << "Enable Entry Point" << "<br/>";
1687                tmpStrm << "Application List Display Order: "; if (entryPointNewOrder >=0) tmpStrm << entryPointNewOrder; tmpStrm << "<br/>" << "<br/>";
1688
1689                CTableRow row;
1690                row.AddCell("New Mode");
1691                row.AddCell(tmpStrm.str());
1692                tbl.AddRow(row);
1693               
1694                tmpStrm.str("");
1695                tmpStrm << CWebUtil::ChkBoxInput("", (entryPointSearchOrder >= 0)) << "Enable Entry Point" << "<br/>";
1696                tmpStrm << "Application List Display Order: "; if (entryPointSearchOrder >= 0) tmpStrm << entryPointSearchOrder; tmpStrm << endl;
1697
1698                row.ClearCells();
1699                row.AddCell("Search Mode");
1700                row.AddCell(tmpStrm.str());
1701                tbl.AddRow(row);
1702               
1703                // now write the table
1704                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "EntryPoints" << "</h2>";
1705                strm << "<div>" << tbl << "</div>";
1706        }
1707        catch(exception& e)
1708        {
1709                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1710        }
1711}
1712
1713void CDocSchemaDetails::ShowAuditProperties(std::ostream& strm)
1714{
1715        try
1716        {
1717                const ARAuditInfoStruct& audit = this->schema.GetAuditInfo();
1718                CTable tbl("displayPropList", "TblObjectList");
1719                tbl.AddColumn(20, "Description");
1720                tbl.AddColumn(80, "Values");
1721
1722                CTableRow row("");
1723                row.AddCell("Audit Style");
1724                row.AddCell(CAREnum::AuditStyle(audit.style));
1725                tbl.AddRow(row);
1726
1727                row.ClearCells();
1728                row.AddCell("Audit Enabled");
1729                row.AddCell((audit.enable==0?"No":"Yes"));
1730                tbl.AddRow(row);
1731
1732#if AR_CURRENT_API_VERSION > 13 // Version 7.5 and higher
1733                row.ClearCells();
1734                row.AddCell("Audit Only Changed Fields");
1735                row.AddCell(CAREnum::AuditChangedFields(audit.auditMask));
1736                tbl.AddRow(row);
1737#endif
1738
1739                row.ClearCells();
1740                switch (audit.style)
1741                {
1742                        case AR_AUDIT_NONE:
1743                                {
1744                                        if (audit.formName[0] != 0)
1745                                        {
1746                                                row.AddCell("Audited From Form");
1747                                                row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1748                                                tbl.AddRow(row);
1749                                        }
1750                                }
1751                                break;
1752                        case AR_AUDIT_COPY:
1753                                {
1754                                        row.AddCell("Audit Form");
1755                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1756                                        tbl.AddRow(row);
1757                                }
1758                                break;
1759                        case AR_AUDIT_LOG:
1760                                {
1761                                        row.AddCell("Audit Log Form");
1762                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1763                                        tbl.AddRow(row);
1764                                }
1765                                break;
1766                        case AR_AUDIT_LOG_SHADOW:
1767                                {
1768                                        row.AddCell("Audited From Forms");
1769                                        row.AddCell(AuditTargetReferences());
1770                                        tbl.AddRow(row);
1771                                }
1772                                break;
1773                }
1774
1775                // audit qualification
1776                stringstream qualStrm; qualStrm.str("");
1777                int pFormId = schema.GetInsideId();
1778
1779                if (audit.query.operation != AR_COND_OP_NONE)
1780                {
1781                        CRefItem refItem(this->schema, REFM_SCHEMA_AUDIT_QUALIFICATION);
1782                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1783                        arQual.CheckQuery(&audit.query, qualStrm);
1784                }
1785                else
1786                {
1787                        qualStrm << EmptyRunIf << endl;
1788                }
1789
1790                row.ClearCells();
1791                row.AddCell("Qualification");
1792                row.AddCell(qualStrm.str());
1793                tbl.AddRow(row);
1794
1795                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Audit Settings" << "</h2>";
1796                strm << "<div>" << tbl << "</div>";
1797        }
1798        catch (...)
1799        {
1800                cerr << "EXCEPTION audit properties" << endl;
1801        }
1802}
1803
1804void CDocSchemaDetails::ShowArchiveProperties(std::ostream& strm)
1805{
1806        try
1807        {
1808                const ARArchiveInfoStruct& archive = this->schema.GetArchiveInfo();
1809                bool archiveToForm = (archive.archiveType & AR_ARCHIVE_FORM)>0;
1810                bool deleteSource = (archive.archiveType & AR_ARCHIVE_DELETE)>0;
1811                bool archiveToFile = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML))>0;
1812                unsigned int fileFormat = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML)) << 2;
1813                bool noAttachments = (archive.archiveType & AR_ARCHIVE_NO_ATTACHMENTS)>0;
1814                bool noDiary = (archive.archiveType & AR_ARCHIVE_NO_DIARY)>0;
1815
1816                CTable tbl("displayPropList", "TblObjectList");
1817                tbl.AddColumn(20, "Description");
1818                tbl.AddColumn(80, "Values");
1819
1820                // archive type
1821                stringstream typeStrm; typeStrm.str("");
1822                if (!archiveToForm && !archiveToFile)
1823                {
1824                        typeStrm << "None";
1825                }
1826                else if (archiveToForm || deleteSource)
1827                {
1828                        if (archiveToForm) typeStrm << "Copy to Archive";
1829                        if (deleteSource && archiveToForm) typeStrm << " and ";
1830                        if (deleteSource) typeStrm << "Delete From Source";
1831                }
1832
1833                CTableRow row("");
1834                row.AddCell("Archive Type");
1835                row.AddCell(typeStrm.str());
1836                tbl.AddRow(row);
1837
1838                row.ClearCells();
1839                row.AddCell("Archive State");
1840                row.AddCell((archive.enable==0?"Disabled":"Enabled"));
1841                tbl.AddRow(row);
1842
1843                row.ClearCells();
1844                if (archiveToFile)
1845                {
1846                        // archive to file is not supported by admin/developer tool; but maybe some day...
1847                        row.AddCell("Archive to File");
1848                        row.AddCell(archive.u.dirPath);
1849                        tbl.AddRow(row);
1850                }
1851                else if (archiveToForm)
1852                {
1853                        stringstream tmpStrm; tmpStrm.str("");
1854                        tmpStrm << this->pInside->LinkToSchema(archive.u.formName,rootLevel) << "<br/>" << endl;
1855                        tmpStrm << CWebUtil::ChkBoxInput("noAttachments",noAttachments) << "No Attachments&nbsp;&nbsp;";
1856                        tmpStrm << CWebUtil::ChkBoxInput("noDiary",noDiary) << "No Diary" << endl;
1857
1858                        row.AddCell("Archive to Form");
1859                        row.AddCell(tmpStrm.str());
1860                        tbl.AddRow(row);
1861                }
1862
1863                if (archive.archiveFrom[0] != 0)
1864                {
1865                        row.ClearCells();
1866                        row.AddCell("Archive From Form");
1867                        row.AddCell(this->pInside->LinkToSchema(archive.archiveFrom, rootLevel));
1868                        tbl.AddRow(row);
1869                }
1870
1871                stringstream qualStrm; qualStrm.str("");
1872                int pFormId = this->schema.GetInsideId(); //this->pInside->SchemaGetInsideId(this->schema.GetARName());
1873
1874                if (archive.query.operation != AR_COND_OP_NONE)
1875                {
1876                        CRefItem refItem(this->schema, REFM_SCHEMA_ARCHIVE_QUALIFICATION);
1877                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1878                        arQual.CheckQuery(&archive.query, qualStrm);
1879                }
1880                else
1881                {
1882                        qualStrm << EmptyRunIf << endl;
1883                }
1884
1885                row.ClearCells();
1886                row.AddCell("Times");
1887                row.AddCell(CARDayStructHelper::DayStructToHTMLString(archive.archiveTime));
1888                tbl.AddRow(row);
1889
1890                row.ClearCells();
1891                row.AddCell("Qualification");
1892                row.AddCell(qualStrm.str());
1893                tbl.AddRow(row);
1894
1895                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Archive Settings" << "</h2>";
1896                strm << "<div>" << tbl << "</div>";
1897        }
1898        catch (...)
1899        {
1900                cerr << "EXCEPTION archive properties" << endl;
1901        }
1902}
1903
1904void CDocSchemaDetails::WorkflowReferences(std::ostream &strm)
1905{
1906        try
1907        {
1908                CTable tabSet("setFieldReferences", "TblObjectList");
1909                tabSet.AddColumn(50, "Object Name");
1910                tabSet.AddColumn(10, "Enabled");
1911                tabSet.AddColumn(20, "Execute On");
1912                tabSet.AddColumn(20, "Description");
1913
1914                CTable tabPush("pushReferences", "TblObjectList");
1915                tabPush.AddColumn(50, "Object Name");
1916                tabPush.AddColumn(10, "Enabled");
1917                tabPush.AddColumn(20, "Execute On");
1918                tabPush.AddColumn(20, "Description");
1919
1920                CTable delAction("deleteReferences", "TblObjectList");
1921                delAction.AddColumn(50, "Object Name");
1922                delAction.AddColumn(10, "Enabled");
1923                delAction.AddColumn(20, "Execute On");
1924                delAction.AddColumn(20, "Description");
1925
1926                CTable tabService("serviceReferences", "TblObjectList");
1927                tabService.AddColumn(50, "Object Name");
1928                tabService.AddColumn(10, "Enabled");
1929                tabService.AddColumn(20, "Execute On");
1930                tabService.AddColumn(20, "Description");
1931
1932
1933                const CARSchema::ReferenceList &refList = schema.GetReferences();
1934                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
1935                CARSchema::ReferenceList::const_iterator endIt = refList.end();
1936
1937                for (; curIt != endIt; ++curIt)
1938                {
1939                        int messageId = curIt->GetMessageId();
1940                        if (messageId == REFM_SETFIELDS_FORM)
1941                        {
1942                                bool hasEnabledFlag;
1943                                string tmpEnabled = "";
1944                                string tmpCssEnabled = "";
1945
1946                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
1947
1948                                if (hasEnabledFlag)
1949                                {
1950                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
1951                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
1952                                }
1953
1954                                CTableRow row;
1955                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
1956                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
1957                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
1958                                row.AddCell(curIt->GetDescription(rootLevel));
1959                                tabSet.AddRow(row);
1960                        }
1961                        if (messageId == REFM_SERVICE_CALL)
1962                        {
1963                                bool hasEnabledFlag;
1964                                string tmpEnabled = "";
1965                                string tmpCssEnabled = "";
1966
1967                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
1968
1969                                if (hasEnabledFlag)
1970                                {
1971                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
1972                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
1973                                }
1974
1975                                CTableRow row;
1976                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
1977                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
1978                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
1979                                row.AddCell(curIt->GetDescription(rootLevel));
1980                                tabService.AddRow(row);
1981                        }
1982                        if (messageId == REFM_PUSHFIELD_TARGET)
1983                        {
1984                                bool hasEnabledFlag;
1985                                string tmpEnabled = "";
1986                                string tmpCssEnabled = "";
1987
1988                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
1989
1990                                if (hasEnabledFlag)
1991                                {
1992                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
1993                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
1994                                }
1995
1996                                CTableRow row;
1997                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
1998                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
1999                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2000                                row.AddCell(curIt->GetDescription(rootLevel));
2001                                tabPush.AddRow(row);
2002                        }
2003                        if (messageId == REFM_DELETE_ENTRY_ACTION)
2004                        {
2005                                bool hasEnabledFlag;
2006                                string tmpEnabled = "";
2007                                string tmpCssEnabled = "";
2008
2009                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2010
2011                                if (hasEnabledFlag)
2012                                {
2013                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2014                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2015                                }
2016
2017                                CTableRow row;
2018                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2019                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2020                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2021                                row.AddCell(curIt->GetDescription(rootLevel));
2022                                delAction.AddRow(row);
2023                        }
2024                }
2025
2026                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow reading data from this form" << endl;
2027                tabSet.ToXHtml(strm);
2028
2029                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow writing data to this form" << endl;
2030                tabPush.ToXHtml(strm);
2031
2032                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow deleting data on this form" << endl;
2033                delAction.ToXHtml(strm);
2034
2035                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow executing services on this form" << endl;
2036                tabService.ToXHtml(strm);
2037        }
2038        catch(exception& e)
2039        {
2040                cout << "EXCEPTION enumerating filter push fields references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
2041        }
2042}
2043
2044string CDocSchemaDetails::GenerateReferencesTable(const ARCompoundSchema &compSchema)
2045{
2046        stringstream strmTmp;
2047        WorkflowReferences(strmTmp);
2048
2049        //Schema Properties
2050        CTable tblObjProp("objProperties", "TblObjectList");
2051        tblObjProp.AddColumn(0, "Property");
2052        tblObjProp.AddColumn(0, "Value");
2053
2054        //Schema type informations
2055        CTableRow row("cssStdRow");     
2056        CTableCell cellProp("");                               
2057        CTableCell cellPropValue("");   
2058
2059        //Container References
2060        row.ClearCells();
2061        cellProp.content = "Container References";
2062        cellPropValue.content = this->ContainerReferences();
2063        row.AddCell(cellProp);
2064        row.AddCell(cellPropValue);
2065        tblObjProp.AddRow(row);                 
2066
2067        //TableField References
2068        row.ClearCells();
2069        cellProp.content = "Table Fields datasource form";
2070        cellPropValue.content = this->TableFieldReferences();
2071        row.AddCell(cellProp);
2072        row.AddCell(cellPropValue);
2073        tblObjProp.AddRow(row); 
2074
2075        //AL window open references
2076        row.ClearCells();
2077        cellProp.content = "Active Link \"Open Window Action\"";
2078        cellPropValue.content = this->AlWindowOpenReferences();
2079        row.AddCell(cellProp);
2080        row.AddCell(cellPropValue);
2081        tblObjProp.AddRow(row);
2082
2083        //Join References
2084        row.ClearCells();
2085        cellProp.content = "Join Form References";
2086        cellPropValue.content = this->JoinFormReferences();
2087        row.AddCell(cellProp);
2088        row.AddCell(cellPropValue);
2089        tblObjProp.AddRow(row);
2090
2091        //Menu References
2092        row.ClearCells();
2093        cellProp.content = "Search Menu References";
2094        cellPropValue.content = this->SearchMenuReferences();
2095        row.AddCell(cellProp);
2096        row.AddCell(cellPropValue);
2097        tblObjProp.AddRow(row);
2098
2099        strmTmp << tblObjProp;
2100        return strmTmp.str();
2101}
2102
2103bool CDocSchemaDetails::IsJoinViewOrVendorForm()
2104{
2105        switch(this->schema.GetCompound().schemaType)
2106        {
2107        case AR_SCHEMA_JOIN:
2108        case AR_SCHEMA_VIEW:
2109        case AR_SCHEMA_VENDOR:
2110                return true;
2111        default:       
2112                return false;
2113        }
2114}
2115
2116string CDocSchemaDetails::ShowGeneralInfo()
2117{
2118        const ARCompoundSchema &compSchema = this->schema.GetCompound();
2119        stringstream strm;
2120
2121        CTable tbl("general", "TblNoBorder");
2122        tbl.AddColumn(20, "");
2123        tbl.AddColumn(80, "");
2124        tbl.DisableHeader();
2125
2126        CTableRow row;
2127        row.AddCell("Name");
2128        row.AddCell(this->schema.GetName());
2129        tbl.AddRow(row);       
2130        row.ClearCells();
2131
2132        // generate the schema type row (and with additional details for special form types like join, view and vendor)
2133        row.AddCell("Type");
2134        row.AddCell(GetSchemaType());
2135        tbl.AddRow(row);
2136        row.ClearCells();
2137        strm.str("");
2138
2139        // search for the default vui
2140        CARVui defaultVUI(this->schema.GetInsideId(), this->schema.GetDefaultVUI());
2141
2142        row.AddCell("Default View");
2143        row.AddCell(CheckedURLLink(defaultVUI, schema.GetDefaultVUI(), rootLevel));
2144        tbl.AddRow(row);
2145        row.ClearCells();
2146
2147        strm << tbl.ToXHtml();
2148        tbl.ClearRows();
2149
2150        if (pInside->CompareServerVersion(7,1) >= 0)
2151        {
2152                stringstream numberConverter;
2153                if (schema.GetDbTableId() > 0)
2154                        numberConverter << schema.GetDbTableId();
2155
2156                row.AddCell("DB Table ID");
2157                row.AddCell(numberConverter.str());
2158                tbl.AddRow(row);
2159                row.ClearCells();
2160
2161                if (compSchema.schemaType != AR_SCHEMA_DIALOG && compSchema.schemaType != AR_SCHEMA_VENDOR)
2162                {
2163                        row.AddCell("DB Table View");
2164                        row.AddCell(schema.GetDbViewName());
2165                        tbl.AddRow(row);
2166                        row.ClearCells();
2167
2168                        row.AddCell("DB Table SH Views");
2169                        row.AddCell(schema.GetDbShViewName());
2170                        tbl.AddRow(row);
2171                        row.ClearCells();
2172                }
2173
2174                strm << tbl.ToXHtml();
2175        }
2176
2177        strm << "<hr/>" << endl;
2178
2179        strm << ShowProperties();
2180
2181        strm << "<hr/>" << endl;
2182
2183        return strm.str();
2184}
2185
2186void CDocSchemaDetails::ShowFTSMTSProperties(std::ostream& strm, CARProplistHelper *propIndex)
2187{
2188#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
2189        if (pInside->CompareServerVersion(7,6,3) < 0)
2190                return;
2191
2192        ARValueStruct* propVal;
2193        int iValue;
2194
2195        try
2196        {
2197                stringstream tmpStrm;
2198                CTable tbl("ftsProps", "TblNoBorder");
2199                tbl.AddColumn(20, "Description");
2200                tbl.AddColumn(80, "Value");
2201                tbl.DisableHeader();
2202
2203                ///////////////////////////////////////////////////////////////////////////////////////
2204
2205                CTableRow       row("");
2206                iValue = 0;
2207                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_OPTION_MASK);
2208                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2209                        iValue = propVal->u.intVal;
2210               
2211                row.AddCell("Exclude from multi-form search");
2212                row.AddCell((iValue & AR_MULTI_FORM_SEARCH_OPTION_EXCLUDE ? "Yes" : "No"));             
2213                tbl.AddRow(row);
2214
2215                ///////////////////////////////////////////////////////////////////////////////////////
2216
2217                row.ClearCells();
2218                char* strValue = NULL;
2219                vector<int> weightedRelevancyFields; weightedRelevancyFields.resize(4);
2220
2221                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_WEIGHTED_RELEVANCY_FIELDS);
2222                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
2223                        strValue = propVal->u.charVal;
2224
2225
2226                if (strValue != NULL && strValue[0] != 0)
2227                {
2228                        int numFields = atoi(strValue);
2229                        char* newPos = strchr(strValue, ';');
2230                        if (newPos)
2231                        {
2232                                strValue = newPos + 1;
2233                                for (int fieldPos = 0; fieldPos < numFields; fieldPos++)
2234                                {
2235                                        int fieldTag = atoi(strValue);
2236                                       
2237                                        newPos = strchr(strValue, ';');
2238                                        if (newPos)
2239                                        {
2240                                                strValue = newPos + 1;
2241                                                int fieldId = atoi(strValue);
2242                                               
2243                                                if (fieldTag > 0 && fieldTag <= AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG)
2244                                                {
2245                                                        weightedRelevancyFields[fieldTag-1] = fieldId;
2246                                                }
2247                                        }
2248                                }
2249                        }
2250                }
2251
2252                CTable weightedRelFields("WRFields", "TblNoBorder");
2253                weightedRelFields.AddColumn(0, "");
2254                weightedRelFields.AddColumn(80, "");
2255                weightedRelFields.DisableHeader();
2256
2257                for (unsigned int wrfPos = 0; wrfPos < AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG; wrfPos++)
2258                {
2259                        int fieldId = weightedRelevancyFields[wrfPos];
2260
2261                        CTableRow wrfRow("");
2262                        wrfRow.AddCell(CAREnum::WeightedRelevancyFieldType(wrfPos+1));
2263                        wrfRow.AddCell((fieldId > 0 ? pInside->LinkToField(this->schema.GetInsideId(), fieldId, rootLevel) : ""));
2264                        weightedRelFields.AddRow(wrfRow);
2265
2266                        if (fieldId > 0 && (!pInside->appConfig.bOverlaySupport || IsVisibleObject(schema)))
2267                        {
2268                                CRefItem ref(schema, REFM_SCHEMA_FTS_WEIGHTED_RELEVANCY_FIELD);
2269                                pInside->AddFieldReference(schema.GetInsideId(), fieldId, ref);
2270                        }
2271                }
2272
2273                row.AddCell("Weighted relevancy fields");
2274                row.AddCell(weightedRelFields.ToXHtml());
2275                tbl.AddRow(row);
2276
2277                ///////////////////////////////////////////////////////////////////////////////////////
2278
2279                row.ClearCells();
2280                ARDayStruct timeValue;
2281                unsigned int intervalValue = 0;
2282
2283                ARZeroMemory(&timeValue);
2284
2285                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MONTH_MASK);
2286                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2287                        timeValue.monthday = propVal->u.intVal;
2288
2289                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_WEEKDAY_MASK);
2290                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2291                        timeValue.weekday = propVal->u.intVal;
2292
2293                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_HOUR_MASK);
2294                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2295                        timeValue.hourmask = propVal->u.intVal;
2296               
2297                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MINUTE);
2298                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2299                        timeValue.minute = propVal->u.intVal;
2300
2301                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_INTERVAL);
2302                if (propVal != NULL && (propVal->dataType == AR_DATA_TYPE_INTEGER || propVal->dataType == AR_DATA_TYPE_ULONG))
2303                        intervalValue = propVal->u.ulongVal;
2304               
2305                row.AddCell("FT-indexed field updates");
2306                if (timeValue.monthday != 0 || timeValue.weekday != 0 || timeValue.hourmask != 0 || timeValue.minute != 0)
2307                {
2308                        row.AddCell(CARDayStructHelper::DayStructToHTMLString(timeValue));
2309                }
2310                else if (intervalValue != 0)
2311                {
2312                        unsigned int days, hours, minutes, seconds;
2313                        CARDayStructHelper::SplitInterval(intervalValue, days, hours, minutes, seconds);
2314
2315                        tmpStrm.str("");
2316                        tmpStrm << days << " Days " << hours << " Hours " << minutes << " Minutes";
2317                        row.AddCell(tmpStrm.str());
2318                }
2319                else
2320                {
2321                        row.AddCell("No Time specified");
2322                }
2323                tbl.AddRow(row);
2324
2325                ///////////////////////////////////////////////////////////////////////////////////////
2326
2327                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Full Text Search" << "</h2>";
2328                strm << "<div>" << tbl << "</div>";
2329        }
2330        catch (exception &e)
2331        {
2332                cerr << "EXCEPTION in ShowFTSMTSProperties: " << e.what() << endl;
2333        }
2334#endif
2335}
2336
2337void CDocSchemaDetails::ShowChangeHistory(std::ostream &strm, CARProplistHelper *propIndex)
2338{
2339        strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Change History &amp; Helptext" << "</h2>"
2340             << "<div>" << this->pInside->ServerObjectHistory(&this->schema, rootLevel, true) << "</div>" << endl;
2341}
2342
2343string CDocSchemaDetails::GetSchemaType()
2344{
2345        const ARCompoundSchema &compSchema = schema.GetCompound();
2346        unsigned int schemaType = compSchema.schemaType;
2347        stringstream strm;
2348
2349        if (IsAuditTarget())
2350        {
2351                schemaType = AR_SCHEMA_AUDIT;
2352        }
2353
2354        if (schemaType == AR_SCHEMA_JOIN)
2355        {
2356                strm << CAREnum::JoinType(compSchema.u.join.option) << "-";
2357        }
2358        strm << CAREnum::SchemaType(schemaType);
2359
2360        if(schemaType == AR_SCHEMA_JOIN
2361                || schemaType == AR_SCHEMA_VIEW
2362                || schemaType == AR_SCHEMA_VENDOR)
2363        {
2364                strm << " " << this->TypeDetails();
2365        }
2366
2367        return strm.str();
2368}
2369
2370bool CDocSchemaDetails::IsAuditTarget()
2371{
2372        const CARSchema::ReferenceList &references = schema.GetReferences();
2373        CARSchema::ReferenceList::const_iterator curIt = references.begin();
2374        CARSchema::ReferenceList::const_iterator endIt = references.end();
2375
2376        for (; curIt != endIt; ++curIt)
2377        {
2378                if (curIt->GetMessageId() == REFM_SCHEMA_AUDIT_SOURCE)
2379                        return true;
2380        }
2381        return false;
2382}
2383
2384string CDocSchemaDetails::AuditTargetReferences()
2385{
2386        vector<int> schemas;
2387
2388        const CARSchema::ReferenceList &references = schema.GetReferences();
2389        CARSchema::ReferenceList::const_iterator curIt = references.begin();
2390        CARSchema::ReferenceList::const_iterator endIt = references.end();
2391
2392        for (; curIt != endIt; ++curIt)
2393        {
2394                if (curIt->GetMessageId() == REFM_SCHEMA_AUDIT_SOURCE && curIt->GetObjectType() == AR_STRUCT_ITEM_XML_SCHEMA)
2395                        schemas.push_back(curIt->GetObjectId());
2396        }
2397
2398        if (schemas.size() > 0)
2399        {
2400                stringstream strm;
2401               
2402                size_t count = schemas.size();
2403
2404                for (size_t index = 0; index < count; ++index)
2405                {
2406                        if (index > 0) { strm << "<br/>"; }
2407                        strm << pInside->LinkToSchema(schemas[index], rootLevel);
2408                }
2409                return strm.str();
2410        }
2411        return "";
2412}
Note: See TracBrowser for help on using the repository browser.