mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-07-13 23:26:35 +02:00
134 lines
4.1 KiB
ObjectPascal
134 lines
4.1 KiB
ObjectPascal
program project;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses
|
|
SysUtils,
|
|
sdo, sdo_datafactory, sdo_serialization,
|
|
sdo_serialization_xml, sdo_xsd_helper;
|
|
|
|
const
|
|
s_manager = 'Manager';
|
|
s_is_manager = 'IsManager';
|
|
s_member = 'Member';
|
|
s_name = 'Name';
|
|
s_person_type = 'Person';
|
|
s_project_leader = 'ProjectLeader';
|
|
s_project_list_type = 'ProjectList';
|
|
s_project_name = 'ProjectName';
|
|
s_project = 'Project';
|
|
s_project_type = 'ProjectType';
|
|
s_uri = 'uri:sample';
|
|
|
|
function IndentStr(const AIndent : Integer) : string;
|
|
begin
|
|
Result := StringOfChar(' ',3*AIndent);
|
|
end;
|
|
|
|
function ToString(const AObj : ISDODataObject; const AIndent : Integer) : string;overload;forward;
|
|
function ToString(const AObj : ISDODataObjectList; const AItemType : ISDOType; const AIndent : Integer) : string;overload;
|
|
var
|
|
crs : ISDOCursor;
|
|
oldPos : ISDOCursorBookmark;
|
|
begin
|
|
crs := AObj.getCursor();
|
|
oldPos := crs.GetBookmark();
|
|
try
|
|
crs.Reset();
|
|
if AItemType.isDataType() then begin
|
|
while crs.MoveNext() do begin
|
|
Result := Format('%s, %s',[Result,AObj.getString()]);
|
|
end;
|
|
end else begin
|
|
while crs.MoveNext() do begin
|
|
Result := Result + sLinebreak + IndentStr(AIndent+1) + '(' +// sLineBreak +
|
|
Copy(IndentStr(1),2,1024) + TrimLeft(ToSTring(AObj.getDataObject(),AIndent+1)) + sLineBreak +
|
|
IndentStr(AIndent+1) + ')';
|
|
end;
|
|
Result := Copy(IndentStr(1),2,1024) + TrimLeft(Result);
|
|
end;
|
|
if ( Length(Result) > 0 ) and ( Result[1] = ',' ) then
|
|
Delete(Result,1,1);
|
|
finally
|
|
crs.GotoBookmark(oldPos);
|
|
end;
|
|
Result := sLineBreak + IndentStr(AIndent) + '[' + //sLineBreak +
|
|
Result +
|
|
sLineBreak + IndentStr(AIndent) + ']';
|
|
end;
|
|
|
|
function ToString(const AObj : ISDODataObject; const AIndent : Integer) : string;overload;
|
|
var
|
|
pls : ISDOPropertyList;
|
|
p : ISDOProperty;
|
|
i, c : PtrInt;
|
|
begin
|
|
Result := '';
|
|
if ( AObj = nil ) then begin
|
|
Result := sLineBreak + IndentStr(AIndent + 1) +'<nil>';
|
|
end else begin
|
|
pls := AObj.getInstanceProperties();
|
|
c := pls.getCount();
|
|
if ( c > 0 ) then begin
|
|
for i := 0 to Pred(c) do begin
|
|
p := pls.getItem(i);
|
|
if ( p.getTypeEnum() = ChangeSummaryType ) then
|
|
Continue;
|
|
if not p.isMany() then begin
|
|
if p.getType().isDataType() then begin
|
|
Result := Result + sLineBreak +
|
|
IndentStr(AIndent + 1) + p.getName() + ' : ' + AObj.getString(p);
|
|
end else begin
|
|
Result := Result + sLineBreak +
|
|
IndentStr(AIndent + 1) + p.getName() + ' :' + //sLineBreak +
|
|
ToString(AObj.getDataObject(p),AIndent+1);
|
|
end;
|
|
end else begin
|
|
Result := Result + sLineBreak +
|
|
IndentStr(AIndent + 1) + p.getName() + ' :' + //sLineBreak +
|
|
ToString(AObj.getList(p),p.getType(),AIndent+2);
|
|
end;
|
|
end;
|
|
if ( Length(Result) > 0 ) and ( Result[1] = ',' ) then
|
|
Delete(Result,1,1);
|
|
end;
|
|
end;
|
|
Result := IndentStr(AIndent) + Result;
|
|
end;
|
|
|
|
procedure GenerateSchemaFileFromFactory(AFactory : ISDODataFactory; AFileName : string);
|
|
var
|
|
xsdHelper : IXSDHelper;
|
|
begin
|
|
xsdHelper := TXSDHelper.Create(AFactory);
|
|
xsdHelper.Generate(AFactory.getTypes(),s_uri,AFileName);
|
|
end;
|
|
|
|
procedure MainProc();
|
|
var
|
|
fact : ISDODataFactory;
|
|
projList, proj, pers,b : ISDODataObject;
|
|
serializer : ISDOSerializer;
|
|
locDataFileName, locSchemaFileName : string;
|
|
begin
|
|
fact := TSDODataFactory.Create();
|
|
locDataFileName := ExpandFileName('.' + PathDelim + 'data-with-schema.xml');
|
|
|
|
//Load data from the file
|
|
serializer := TSDOSerializer.Create(fact,TSDOSerializerStreamXML.Create());
|
|
projList := serializer.load(locDataFileName);
|
|
|
|
locSchemaFileName := ExpandFileName('.' + PathDelim + 'schema.xsd');
|
|
GenerateSchemaFileFromFactory(fact,locSchemaFileName);
|
|
WriteLn('Schema file generated !');
|
|
|
|
Writeln;
|
|
WriteLn('Data :');
|
|
WriteLn(ToString(projList,0));
|
|
end;
|
|
|
|
begin
|
|
MainProc();
|
|
end.
|
|
|