' + LineEnding + ' path is the path to the WST root path.';
+ ),
+ ()
+ );
function wst_RequestHandler(r: Prequest_rec): Integer;
+ function wst_create_dir_config(p: Papr_pool_t; dir: PChar) : Pointer;cdecl;
implementation
uses base_service_intf,
server_service_intf, server_service_imputils,
- server_service_soap, server_binary_formatter,
- metadata_repository, metadata_wsdl, DOM, XMLWrite,
-
- user_service_intf, user_service_intf_binder, user_service_intf_imp,
+ server_service_soap, server_binary_formatter, server_service_xmlrpc,
+ metadata_repository, metadata_wsdl,
+ imp_utils, binary_streamer, library_base_intf, library_imp_utils,
+ DOM, XMLWrite,
metadata_service, metadata_service_binder, metadata_service_imp;
+procedure wst_initialize();
+begin
+ RegisterStdTypes();
+ Server_service_RegisterBinaryFormat();
+ Server_service_RegisterSoapFormat();
+ //Server_service_RegisterXmlRpcFormat();
+
+ RegisterWSTMetadataServiceImplementationFactory();
+ Server_service_RegisterWSTMetadataServiceService();
+end;
+
+function wst_create_dir_config(p: Papr_pool_t; dir: PChar) : Pointer; cdecl;
+begin
+ WstConfigData := PWstConfigData(apr_palloc(p,SizeOf(TWstConfigData)));
+ FillChar(WstConfigData^,SizeOf(TWstConfigData),#0);
+ WstConfigData^.Dir := apr_pstrdup(p,dir);
+ Result := WstConfigData;
+end;
+
+function GetWstPath(): PChar;inline;
+begin
+ Result := WstConfigData^.BasePath;
+end;
+
type
+ PRequestArgument = ^TRequestArgument;
+ TRequestArgument = record
+ Name : shortstring;
+ Value : shortstring;
+ Next : PRequestArgument;
+ end;
TRequestInfo = record
- Root : string;
- URI : string;
- ContentType : string;
- Buffer : string;
- Argument : string;
+ InnerRequest : Pointer;
+ Root : string;
+ URI : string;
+ ContentType : string;
+ Buffer : string;
+ Arguments : string;
+ ArgList : PRequestArgument;
end;
TResponseInfo = record
@@ -43,6 +123,52 @@ type
ContentType : string;
end;
+function ParseArgs(
+ const APool : Papr_pool_t;
+ const AArgs : string;
+ const ASeparator : Char = '&'
+) : PRequestArgument;
+var
+ locBuffer, locArg : string;
+ locPrev, locTmpArg : PRequestArgument;
+begin
+ Result := nil;
+ locBuffer := Trim(AArgs);
+ if not IsStrEmpty(locBuffer) then begin
+ locTmpArg := nil;
+ locPrev := nil;
+ while True do begin
+ locArg := GetToken(locBuffer,ASeparator);
+ if IsStrEmpty(locArg) then
+ Break;
+ locPrev := locTmpArg;
+ locTmpArg := PRequestArgument(apr_palloc(APool,SizeOf(TRequestArgument)));
+ FillChar(locTmpArg^,SizeOf(TRequestArgument),#0);
+ if ( Result = nil ) then begin
+ Result := locTmpArg;
+ end else begin
+ locPrev^.Next := locTmpArg;
+ end;
+ locTmpArg^.Name := GetToken(locArg,'=');
+ locTmpArg^.Value := locArg;
+ end;
+ end;
+end;
+
+function FindArg(const AArgs : PRequestArgument; const AName : string) : PRequestArgument;
+var
+ p : PRequestArgument;
+begin
+ Result := nil;
+ p := AArgs;
+ while Assigned(p) do begin
+ if AnsiSameText(AName,AArgs^.Name) then begin
+ Result := p;
+ Break;
+ end;
+ p := p^.Next;
+ end;
+end;
procedure SaveStringToFile(const AStr,AFile:string;const AKeepExisting : Boolean);
begin
@@ -154,7 +280,7 @@ begin
Result := '' +
''+
''+
- 'The Web Service Toolkit generated Metadata table'+
+ 'The Web Service Toolkit generated Metadata table XXXXX'+
''+
'' +
'The following repositories has available. Click on the link to view the corresponding WSDL.
'+
@@ -233,7 +359,7 @@ begin
AResponseInfo.ContentType := sHTTP_BINARY_CONTENT_TYPE
else
AResponseInfo.ContentType := ctntyp;
- rqst := TRequestBuffer.Create(trgt,ctntyp,inStream,outStream,'');
+ rqst := TRequestBuffer.Create(trgt,ctntyp,inStream,outStream,ARequestInfo.ContentType);
HandleServiceRequest(rqst);
i := outStream.Size;
if ( i > 0 ) then begin
@@ -244,7 +370,7 @@ begin
outStream.Free();
inStream.Free();
{$IFDEF WST_DBG}
- SaveStringToFile('RequestInfo.ContentType=' + ARequestInfo.Argument + LineEnding,'c:\log.log',False);
+ SaveStringToFile('RequestInfo.ContentType=' + ARequestInfo.Arguments + LineEnding,'c:\log.log',False);
{SaveStringToFile('RequestInfo.Buffer=' + ARequestInfo.Buffer + LineEnding,'E:\Inoussa\Sources\lazarus\wst\v0.3\tests\apache_module\log.log',True);
SaveStringToFile('RequestInfo.URI=' + ARequestInfo.URI + LineEnding,'E:\Inoussa\Sources\lazarus\wst\v0.3\tests\apache_module\log.log',True);
SaveStringToFile('ResponseInfo.ContentType=' + AResponseInfo.ContentType + LineEnding,'E:\Inoussa\Sources\lazarus\wst\v0.3\tests\apache_module\log.log',True);
@@ -254,14 +380,94 @@ begin
end;
end;
+const MAX_ERR_LEN = 500;
+function ProcessServiceRequestLibrary(
+ const ARequestInfo : TRequestInfo;
+ out AResponseInfo : TResponseInfo
+) : Boolean;
+var
+ loc_path, ctntyp : string;
+ targetModuleName, targetFormat, targetService : string;
+ wrtr : IDataStore;
+ buffStream : TMemoryStream;
+ strBuff : string;
+ intfBuffer : IwstStream;
+ bl : LongInt;
+ targetModule : IwstModule;
+ handlerProc : TwstLibraryHandlerFunction;
+ pArg : PRequestArgument;
+ i : Integer;
+begin
+ try
+ FillChar(AResponseInfo,SizeOf(TResponseInfo),#0);
+ loc_path := ARequestInfo.URI;
+ targetModuleName := ExtractNextPathElement(loc_path);
+ Result := False;
+ targetModule := LibraryManager.Get(GetWstPath() + targetModuleName + sWST_LIBRARY_EXTENSION);
+ handlerProc := TwstLibraryHandlerFunction(targetModule.GetProc(WST_LIB_HANDLER));
+ if not Assigned(handlerProc) then
+ Exit;
+ targetService := ExtractNextPathElement(loc_path);
+ if AnsiSameText(sWSDL,targetService) then
+ Exit;
+ pArg := FindArg(ARequestInfo.ArgList,'format');
+ if Assigned(pArg) then
+ targetFormat := pArg^.Value;
+ if IsStrEmpty(targetFormat) then
+ targetFormat := ARequestInfo.ContentType;
+ buffStream := TMemoryStream.Create();
+ try
+ wrtr := CreateBinaryWriter(buffStream);
+ wrtr.WriteInt32S(0);
+ wrtr.WriteStr(targetService);
+ wrtr.WriteStr(ARequestInfo.ContentType);
+ wrtr.WriteStr(targetFormat);
+ wrtr.WriteStr(ARequestInfo.Buffer);
+ buffStream.Position := 0;
+ wrtr.WriteInt32S(buffStream.Size-4);
+
+ buffStream.Position := 0;
+ intfBuffer := TwstStream.Create(buffStream);
+ bl := MAX_ERR_LEN;
+ strBuff := StringOfChar(#0,bl);
+ i := handlerProc(intfBuffer,Pointer(strBuff),bl);
+ if ( i <> RET_OK ) then
+ raise Exception.CreateFmt('Library server error :'#13'Code : %d'#13'Message : %s',[i,strBuff]);
+
+ if AnsiSameText(sBINARY_CONTENT_TYPE,ARequestInfo.ContentType) then
+ AResponseInfo.ContentType := sHTTP_BINARY_CONTENT_TYPE
+ else
+ AResponseInfo.ContentType := ARequestInfo.ContentType;
+ buffStream.Position := 0;
+ if ( buffStream.Size > 0 ) then begin
+ SetLength(AResponseInfo.ContentText,buffStream.Size);
+ buffStream.Read(AResponseInfo.ContentText[1],Length(AResponseInfo.ContentText));
+ end else begin
+ AResponseInfo.ContentText := '';
+ end;
+ finally
+ buffStream.Free();
+ end;
+
+ Result := True;
+ except
+ on e : Exception do begin
+ Result := False;
+ ap_log_rerror(PCHAR('wst_apache_binding'),392,APLOG_ERR,0,Prequest_rec(ARequestInfo.InnerRequest),PCHAR(e.Message),[]);
+ end;
+ end;
+end;
+
function wst_RequestHandler(r: Prequest_rec): Integer;
function FillRequestInfo(var ARequestInfo : TRequestInfo):Integer;
begin
+ ARequestInfo.InnerRequest := r;
ARequestInfo.ContentType := apr_table_get(r^.headers_in,sCONTENT_TYPE);
ARequestInfo.Root := ap_get_server_name(r) + sSEPARATOR + sWST_ROOT + sSEPARATOR;
ARequestInfo.URI := r^.uri;
- ARequestInfo.Argument := r^.args;
+ ARequestInfo.Arguments := r^.args;
+ ARequestInfo.ArgList := ParseArgs(r^.pool,ARequestInfo.Arguments);
Result := ReadBuffer(r,ARequestInfo.Buffer);
end;
@@ -279,8 +485,14 @@ begin
try
if AnsiSameText(sSERVICES_PREFIXE,ExtractNextPathElement(loc_RequestInfo.URI)) then begin
+
+{$IFDEF WST_BROKER}
+ if not ProcessServiceRequestLibrary(loc_RequestInfo,loc_ResponseInfo) then
+ ProcessWSDLRequest(loc_RequestInfo,loc_ResponseInfo);
+{$ELSE}
if not ProcessServiceRequest(loc_RequestInfo,loc_ResponseInfo) then
ProcessWSDLRequest(loc_RequestInfo,loc_ResponseInfo);
+{$ENDIF}
end else begin
ProcessWSDLRequest(loc_RequestInfo,loc_ResponseInfo);
end;
@@ -294,7 +506,6 @@ begin
ap_rputs(PCHAR(loc_ResponseInfo.ContentText), r);
end;
Result := OK;
- Exit;
except
on e : Exception do begin
ap_set_content_type(r, 'text/html');
@@ -307,14 +518,6 @@ begin
end;
initialization
- RegisterStdTypes();
- Server_service_RegisterBinaryFormat();
- Server_service_RegisterSoapFormat();
-
- RegisterUserServiceImplementationFactory();
- Server_service_RegisterUserServiceService();
-
- RegisterWSTMetadataServiceImplementationFactory();
- Server_service_RegisterWSTMetadataServiceService();
-
+ wst_initialize();
+
end.
diff --git a/wst/trunk/samples/user_client_console/user_client_console.lpi b/wst/trunk/samples/user_client_console/user_client_console.lpi
index b2cfee300..37eb02192 100644
--- a/wst/trunk/samples/user_client_console/user_client_console.lpi
+++ b/wst/trunk/samples/user_client_console/user_client_console.lpi
@@ -30,15 +30,15 @@
-
+
-
-
+
+
-
+
@@ -46,8 +46,8 @@
-
-
+
+
@@ -55,8 +55,8 @@
-
-
+
+
@@ -64,8 +64,8 @@
-
-
+
+
@@ -73,8 +73,8 @@
-
-
+
+
@@ -94,10 +94,10 @@
-
-
+
+
-
+
@@ -142,8 +142,8 @@
-
-
+
+
@@ -162,9 +162,11 @@
-
-
-
+
+
+
+
+
@@ -177,8 +179,8 @@
-
-
+
+
@@ -194,15 +196,15 @@
-
+
-
-
+
+
@@ -306,8 +308,8 @@
-
-
+
+
@@ -320,10 +322,10 @@
-
-
+
+
-
+
@@ -331,8 +333,8 @@
-
-
+
+
@@ -340,8 +342,8 @@
-
-
+
+
@@ -354,17 +356,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
diff --git a/wst/trunk/samples/user_client_console/user_client_console.pas b/wst/trunk/samples/user_client_console/user_client_console.pas
index 1b1dc887c..e9dceb758 100644
--- a/wst/trunk/samples/user_client_console/user_client_console.pas
+++ b/wst/trunk/samples/user_client_console/user_client_console.pas
@@ -144,8 +144,8 @@ const ADDRESS_MAP : array[TTransportType] of string = (
'LIB:FileName=..\library_server\lib_server.dll;target=UserService',
//'TCP:Address=172.16.82.31;Port=1234;target=UserService',
'TCP:Address=127.0.0.1;Port=1234;target=UserService',
- //'http:Address=http://127.0.0.1:8080/wst/services/UserService/?format=soap'
- 'http:Address=http://127.0.0.1:8000/services/UserService'
+ 'http:Address=http://127.0.0.1:8888/wst/services/lib_server/UserService'
+ //'http:Address=http://127.0.0.1:8000/services/UserService'
);
FORMAT_MAP : array[TFormatType] of string =( 'binary', 'soap', 'xmlrpc' );
var
diff --git a/wst/trunk/samples/user_service_intf_imp.pas b/wst/trunk/samples/user_service_intf_imp.pas
index 388f3b8c5..a5871f294 100644
--- a/wst/trunk/samples/user_service_intf_imp.pas
+++ b/wst/trunk/samples/user_service_intf_imp.pas
@@ -220,9 +220,9 @@ end;
initialization
FUserList := TObjectList.Create(True);
FUserCursor := TObjectListCursor.Create(FUserList);
- if FileExists(sDATA_FILE_NAME) then
+ {if FileExists(sDATA_FILE_NAME) then
FillDataFromFile(sDATA_FILE_NAME)
- else
+ else}
FillSampleData();
finalization
diff --git a/wst/trunk/tests/test_suite/test_utilities.pas b/wst/trunk/tests/test_suite/test_utilities.pas
index ac969aaad..e78e05689 100644
--- a/wst/trunk/tests/test_suite/test_utilities.pas
+++ b/wst/trunk/tests/test_suite/test_utilities.pas
@@ -22,7 +22,8 @@ uses
TestFrameWork,
{$ENDIF}
TypInfo,
- base_service_intf, server_service_intf;
+ base_service_intf, server_service_intf,
+ library_imp_utils;
type
@@ -102,7 +103,24 @@ type
published
procedure POOLED_Discard();
end;
+
+ { TwstModuleNotLoad }
+ TwstModuleNotLoad = class(TwstModule,IInterface,IwstModule)
+ protected
+ procedure Load(const ADoLoad : Boolean);override;
+ end;
+
+ { TTest_TwstModuleManager }
+
+ TTest_TwstModuleManager = class(TTestCase)
+ published
+ function Get(const AFileName : string):IwstModule;
+ procedure Clear();
+ function GetCount() : PtrInt;
+ function GetItem(const AIndex : PtrInt) : IwstModule;
+ end;
+
implementation
{ TTestClass }
@@ -585,19 +603,140 @@ begin
CheckEquals(TSimpleFactoryItem_B,b.GetItemClass());
end;
+{ TwstModuleNotLoad }
+
+procedure TwstModuleNotLoad.Load(const ADoLoad: Boolean);
+begin
+ //;
+end;
+
+{ TTest_TwstModuleManager }
+
+function TTest_TwstModuleManager.Get(const AFileName: string): IwstModule;
+const C = 10;
+var
+ locObj : IwstModuleManager;
+ locModule : IwstModule;
+ i, j, k: Integer;
+ ok : Boolean;
+ locName : string;
+begin
+ locObj := TwstModuleManager.Create(TwstModuleNotLoad);
+
+ for i := 0 to Pred(C) do begin
+ locObj.Get(Format('lib_%d',[i]));
+ end;
+
+ for i := 0 to Pred(C) do begin
+ ok := False;
+ locName := Format('lib_%d',[i]);
+ for j := 0 to Pred(locObj.GetCount()) do begin
+ locModule := locObj.GetItem(j);
+ if AnsiSameText(locName, locModule.GetFileName()) then begin
+ ok := True;
+ k := j + 1;
+ Break;
+ end;
+ end;
+ Check(ok);
+ for j := k to Pred(locObj.GetCount()) do begin
+ locModule := locObj.GetItem(j);
+ if AnsiSameText(locName, locModule.GetFileName()) then begin
+ Check(False,'Duplicated items : ' + locName);
+ end;
+ end;
+ end;
+end;
+
+procedure TTest_TwstModuleManager.Clear();
+const C = 12;
+var
+ locObj : IwstModuleManager;
+ i : Integer;
+begin
+ locObj := TwstModuleManager.Create(TwstModuleNotLoad);
+ locObj.Clear();
+ CheckEquals(0,locObj.GetCount());
+ for i := 0 to Pred(C) do begin
+ locObj.Get(Format('lib_%d',[i]));
+ end;
+ CheckEquals(C,locObj.GetCount());
+ locObj.Clear();
+ CheckEquals(0,locObj.GetCount());
+end;
+
+function TTest_TwstModuleManager.GetCount(): PtrInt;
+const C = 10;
+var
+ locObj : IwstModuleManager;
+ i : Integer;
+begin
+ locObj := TwstModuleManager.Create(TwstModuleNotLoad);
+ CheckEquals(0,locObj.GetCount());
+ CheckEquals(0,locObj.GetCount());
+ for i := 0 to Pred(C) do begin
+ CheckEquals(i,locObj.GetCount(),'before Add');
+ locObj.Get(Format('lib_%d',[i]));
+ CheckEquals(i + 1,locObj.GetCount(),'after Add');
+ end;
+ CheckEquals(C,locObj.GetCount());
+end;
+
+function TTest_TwstModuleManager.GetItem(const AIndex: PtrInt): IwstModule;
+const C = 10;
+var
+ locObj : IwstModuleManager;
+ locModule : IwstModule;
+ i : Integer;
+ ok : Boolean;
+begin
+ locObj := TwstModuleManager.Create(TwstModuleNotLoad);
+ ok := False;
+ try
+ locObj.GetItem(0);
+ except
+ on e : Exception do begin
+ ok := True;
+ end;
+ end;
+ Check(ok);
+
+ ok := False;
+ try
+ locObj.GetItem(1);
+ except
+ on e : Exception do begin
+ ok := True;
+ end;
+ end;
+ Check(ok);
+
+ for i := 0 to Pred(C) do begin
+ locObj.Get(Format('lib_%d',[i]));
+ end;
+
+ for i := 0 to Pred(C) do begin
+ locModule := locObj.GetItem(i);
+ CheckEquals(Format('lib_%d',[i]), locModule.GetFileName());
+ end;
+
+ ok := False;
+ try
+ locObj.GetItem(C + 1);
+ except
+ on e : Exception do begin
+ ok := True;
+ end;
+ end;
+ Check(ok);
+end;
+
initialization
-{$IFDEF FPC}
- RegisterTest(TTest_TIntfPool);
- RegisterTest(TTest_TSimpleItemFactoryEx);
- RegisterTest(TTest_TImplementationFactory);
- RegisterTest(TTest_TIntfPoolItem);
- RegisterTest(TTest_TImplementationFactory);
-{$ELSE}
- RegisterTest(TTest_TIntfPool.Suite);
- RegisterTest(TTest_TSimpleItemFactoryEx.Suite);
- RegisterTest(TTest_TImplementationFactory.Suite);
- RegisterTest(TTest_TIntfPoolItem.Suite);
- RegisterTest(TTest_TImplementationFactory.Suite);
-{$ENDIF}
+ RegisterTest('Utilities',TTest_TIntfPool.Suite);
+ RegisterTest('Utilities',TTest_TSimpleItemFactoryEx.Suite);
+ RegisterTest('Utilities',TTest_TImplementationFactory.Suite);
+ RegisterTest('Utilities',TTest_TIntfPoolItem.Suite);
+ RegisterTest('Utilities',TTest_TImplementationFactory.Suite);
+ RegisterTest('Utilities',TTest_TwstModuleManager.Suite);
end.
diff --git a/wst/trunk/tests/test_suite/wst_test_suite.lpi b/wst/trunk/tests/test_suite/wst_test_suite.lpi
index f2814f23a..3ae6b5d0d 100644
--- a/wst/trunk/tests/test_suite/wst_test_suite.lpi
+++ b/wst/trunk/tests/test_suite/wst_test_suite.lpi
@@ -7,7 +7,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -251,7 +251,7 @@
-
+
@@ -318,10 +318,10 @@
-
-
+
+
-
+
@@ -414,7 +414,7 @@
-
+
@@ -450,7 +450,7 @@
-
+
@@ -459,7 +459,7 @@
-
+
@@ -468,7 +468,7 @@
-
+
@@ -504,7 +504,7 @@
-
+
@@ -519,7 +519,7 @@
-
+
@@ -548,7 +548,7 @@
-
+
@@ -557,7 +557,7 @@
-
+
@@ -566,7 +566,7 @@
-
+
@@ -576,7 +576,7 @@
-
+
@@ -585,7 +585,7 @@
-
+
@@ -608,16 +608,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+