source: branches/work_312/doc/DocSchemaDetails.cpp @ 660

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