project.pas 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. program project;
  2. {$mode objfpc}{$H+}
  3. uses
  4. SysUtils,
  5. sdo, sdo_datafactory, sdo_serialization,
  6. sdo_serialization_xml, sdo_xsd_helper;
  7. const
  8. s_manager = 'Manager';
  9. s_is_manager = 'IsManager';
  10. s_member = 'Member';
  11. s_name = 'Name';
  12. s_person_type = 'Person';
  13. s_project_leader = 'ProjectLeader';
  14. s_project_list_type = 'ProjectList';
  15. s_project_name = 'ProjectName';
  16. s_project = 'Project';
  17. s_project_type = 'ProjectType';
  18. s_uri = 'uri:sample';
  19. function IndentStr(const AIndent : Integer) : string;
  20. begin
  21. Result := StringOfChar(' ',3*AIndent);
  22. end;
  23. function ToString(const AObj : ISDODataObject; const AIndent : Integer) : string;overload;forward;
  24. function ToString(const AObj : ISDODataObjectList; const AItemType : ISDOType; const AIndent : Integer) : string;overload;
  25. var
  26. crs : ISDOCursor;
  27. oldPos : ISDOCursorBookmark;
  28. begin
  29. crs := AObj.getCursor();
  30. oldPos := crs.GetBookmark();
  31. try
  32. crs.Reset();
  33. if AItemType.isDataType() then begin
  34. while crs.MoveNext() do begin
  35. Result := Format('%s, %s',[Result,AObj.getString()]);
  36. end;
  37. end else begin
  38. while crs.MoveNext() do begin
  39. Result := Result + sLinebreak + IndentStr(AIndent+1) + '(' +// sLineBreak +
  40. Copy(IndentStr(1),2,1024) + TrimLeft(ToSTring(AObj.getDataObject(),AIndent+1)) + sLineBreak +
  41. IndentStr(AIndent+1) + ')';
  42. end;
  43. Result := Copy(IndentStr(1),2,1024) + TrimLeft(Result);
  44. end;
  45. if ( Length(Result) > 0 ) and ( Result[1] = ',' ) then
  46. Delete(Result,1,1);
  47. finally
  48. crs.GotoBookmark(oldPos);
  49. end;
  50. Result := sLineBreak + IndentStr(AIndent) + '[' + //sLineBreak +
  51. Result +
  52. sLineBreak + IndentStr(AIndent) + ']';
  53. end;
  54. function ToString(const AObj : ISDODataObject; const AIndent : Integer) : string;overload;
  55. var
  56. pls : ISDOPropertyList;
  57. p : ISDOProperty;
  58. i, c : PtrInt;
  59. begin
  60. Result := '';
  61. if ( AObj = nil ) then begin
  62. Result := sLineBreak + IndentStr(AIndent + 1) +'<nil>';
  63. end else begin
  64. pls := AObj.getInstanceProperties();
  65. c := pls.getCount();
  66. if ( c > 0 ) then begin
  67. for i := 0 to Pred(c) do begin
  68. p := pls.getItem(i);
  69. if ( p.getTypeEnum() = ChangeSummaryType ) then
  70. Continue;
  71. if not p.isMany() then begin
  72. if p.getType().isDataType() then begin
  73. Result := Result + sLineBreak +
  74. IndentStr(AIndent + 1) + p.getName() + ' : ' + AObj.getString(p);
  75. end else begin
  76. Result := Result + sLineBreak +
  77. IndentStr(AIndent + 1) + p.getName() + ' :' + //sLineBreak +
  78. ToString(AObj.getDataObject(p),AIndent+1);
  79. end;
  80. end else begin
  81. Result := Result + sLineBreak +
  82. IndentStr(AIndent + 1) + p.getName() + ' :' + //sLineBreak +
  83. ToString(AObj.getList(p),p.getType(),AIndent+2);
  84. end;
  85. end;
  86. if ( Length(Result) > 0 ) and ( Result[1] = ',' ) then
  87. Delete(Result,1,1);
  88. end;
  89. end;
  90. Result := IndentStr(AIndent) + Result;
  91. end;
  92. procedure GenerateSchemaFileFromFactory(AFactory : ISDODataFactory; AFileName : string);
  93. var
  94. xsdHelper : IXSDHelper;
  95. begin
  96. xsdHelper := TXSDHelper.Create(AFactory);
  97. xsdHelper.Generate(AFactory.getTypes(),s_uri,AFileName);
  98. end;
  99. procedure MainProc();
  100. var
  101. fact : ISDODataFactory;
  102. projList, proj, pers,b : ISDODataObject;
  103. serializer : ISDOSerializer;
  104. locDataFileName, locSchemaFileName : string;
  105. begin
  106. fact := TSDODataFactory.Create();
  107. locDataFileName := ExpandFileName('.' + PathDelim + 'data-with-schema.xml');
  108. //Load data from the file
  109. serializer := TSDOSerializer.Create(fact,TSDOSerializerStreamXML.Create());
  110. projList := serializer.load(locDataFileName);
  111. locSchemaFileName := ExpandFileName('.' + PathDelim + 'schema.xsd');
  112. GenerateSchemaFileFromFactory(fact,locSchemaFileName);
  113. WriteLn('Schema file generated !');
  114. Writeln;
  115. WriteLn('Data :');
  116. WriteLn(ToString(projList,0));
  117. end;
  118. begin
  119. MainProc();
  120. end.