Browse Source

* Allow specifying a class

git-svn-id: trunk@34061 -
michael 9 years ago
parent
commit
743cc27f2f
1 changed files with 8 additions and 5 deletions
  1. 8 5
      packages/fcl-web/src/base/restbase.pp

+ 8 - 5
packages/fcl-web/src/base/restbase.pp

@@ -113,7 +113,7 @@ Type
     Class Function GetParentPropCount : Integer; virtual;
     Class Function GetParentPropCount : Integer; virtual;
     Class Function ExportPropertyName(Const AName : String) : string; virtual;
     Class Function ExportPropertyName(Const AName : String) : string; virtual;
     Class Function CleanPropertyName(Const AName : String) : string;
     Class Function CleanPropertyName(Const AName : String) : string;
-    Class Function CreateObject(Const AKind : String) : TBaseObject;
+    Class Function CreateObject(Const AKind : String; AClass: TClass = Nil) : TBaseObject;
     Class Procedure RegisterObject;
     Class Procedure RegisterObject;
     Class Function ObjectRestKind : String; virtual;
     Class Function ObjectRestKind : String; virtual;
     Procedure LoadPropertyFromJSON(Const AName : String; JSON : TJSONData); virtual;
     Procedure LoadPropertyFromJSON(Const AName : String; JSON : TJSONData); virtual;
@@ -689,15 +689,16 @@ begin
     Case ET^.Kind of
     Case ET^.Kind of
       tkClass :
       tkClass :
         begin
         begin
-        // Writeln(ClassName,' Adding instance of type: ',AN);
-        TObjectArray(AP)[I]:=CreateObject(AN);
+        TObjectArray(AP)[I]:=CreateObject(AN,GetTypeData(ET)^.ClassType);
         TObjectArray(AP)[I].LoadFromJSON(AValue.Objects[i]);
         TObjectArray(AP)[I].LoadFromJSON(AValue.Objects[i]);
         end;
         end;
       tkFloat :
       tkFloat :
         if IsDateTimeProp(ET) then
         if IsDateTimeProp(ET) then
           TDateTimeArray(AP)[I]:=RFC3339ToDateTime(AValue.Strings[i])
           TDateTimeArray(AP)[I]:=RFC3339ToDateTime(AValue.Strings[i])
         else
         else
+          begin
           TFloatArray(AP)[I]:=AValue.Floats[i];
           TFloatArray(AP)[I]:=AValue.Floats[i];
+          end;
       tkInt64 :
       tkInt64 :
         TInt64Array(AP)[I]:=AValue.Int64s[i];
         TInt64Array(AP)[I]:=AValue.Int64s[i];
       tkBool :
       tkBool :
@@ -713,7 +714,6 @@ begin
       tkAstring,
       tkAstring,
       tkLString :
       tkLString :
         begin
         begin
-        // Writeln('Setting String ',i,': ',AValue.Strings[i]);
         TStringArray(AP)[I]:=AValue.Strings[i];
         TStringArray(AP)[I]:=AValue.Strings[i];
         end;
         end;
     else
     else
@@ -792,6 +792,7 @@ begin
 {$else}
 {$else}
     DynArraySetLength(AP,P^.PropType,1,@i);
     DynArraySetLength(AP,P^.PropType,1,@i);
     I:=Length(TObjectArray(AP));
     I:=Length(TObjectArray(AP));
+//    Writeln('Array length : ',I);
     SetDynArrayProp(P,AP);
     SetDynArrayProp(P,AP);
 {$endif}
 {$endif}
     try
     try
@@ -1222,13 +1223,15 @@ begin
    Result:='_'+Result
    Result:='_'+Result
 end;
 end;
 
 
-class function TBaseObject.CreateObject(const AKind: String): TBaseObject;
+class function TBaseObject.CreateObject(const AKind: String; AClass: TClass = Nil): TBaseObject;
 
 
 Var
 Var
   C : TBaseObjectClass;
   C : TBaseObjectClass;
 
 
 begin
 begin
   C:=RESTFactory.GetObjectClass(AKind);
   C:=RESTFactory.GetObjectClass(AKind);
+  if (C=Nil) and Assigned(AClass) and AClass.InheritsFrom(TBaseObject) then
+   C:=TBaseObjectClass(AClass);
   if C<>Nil then
   if C<>Nil then
     Result:=C.Create
     Result:=C.Create
   else
   else