echo
exampleWe consider building a simple “Echo” CORBA server and client. This application echoes a string. The source code for this example is located in examples/corba/echo directory in PolyORB distribution. This applications uses only basic elements of CORBA.
To build this application, you need the following pieces of code:
echo
object
echo
object
echo
objectThis interface defines an echo
object with a unique method
echoString
. Per construction, this method returns its argument.
interface Echo { string echoString (in string Mesg); }; |
echo
objectPackage Echo.Impl
is an implementation of this interface. This
implementation follows the IDL-to-Ada mapping.
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- E C H O . I M P L -- -- -- -- S p e c -- -- -- -- Copyright (C) 2002 Free Software Foundation, Inc. -- -- -- -- PolyORB is free software; you can redistribute it and/or modify it -- -- under terms of the GNU General Public License as published by the Free -- -- Software Foundation; either version 2, or (at your option) any later -- -- version. PolyORB is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. You should have received a copy of the GNU -- -- General Public License distributed with PolyORB; see file COPYING. If -- -- not, write to the Free Software Foundation, 59 Temple Place - Suite 330, -- -- Boston, MA 02111-1307, USA. -- -- -- -- As a special exception, if other files instantiate generics from this -- -- unit, or you link this unit with other files to produce an executable, -- -- this unit does not by itself cause the resulting executable to be -- -- covered by the GNU General Public License. This exception does not -- -- however invalidate any other reasons why the executable file might be -- -- covered by the GNU Public License. -- -- -- -- PolyORB is maintained by ACT Europe. -- -- (email: sales@@act-europe.fr) -- -- -- ------------------------------------------------------------------------------ with CORBA; with PortableServer; package Echo.Impl is -- My own implementation of echo object. -- This is simply used to define the operations. type Object is new PortableServer.Servant_Base with null record; type Object_Acc is access Object; function EchoString (Self : access Object; Mesg : in CORBA.String) return CORBA.String; end Echo.Impl;
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- E C H O . I M P L -- -- -- -- B o d y -- -- -- -- Copyright (C) 2002 Free Software Foundation, Inc. -- -- -- -- PolyORB is free software; you can redistribute it and/or modify it -- -- under terms of the GNU General Public License as published by the Free -- -- Software Foundation; either version 2, or (at your option) any later -- -- version. PolyORB is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. You should have received a copy of the GNU -- -- General Public License distributed with PolyORB; see file COPYING. If -- -- not, write to the Free Software Foundation, 59 Temple Place - Suite 330, -- -- Boston, MA 02111-1307, USA. -- -- -- -- As a special exception, if other files instantiate generics from this -- -- unit, or you link this unit with other files to produce an executable, -- -- this unit does not by itself cause the resulting executable to be -- -- covered by the GNU General Public License. This exception does not -- -- however invalidate any other reasons why the executable file might be -- -- covered by the GNU Public License. -- -- -- -- PolyORB is maintained by ACT Europe. -- -- (email: sales@@act-europe.fr) -- -- -- ------------------------------------------------------------------------------ with Ada.Text_IO; with Echo.Skel; pragma Warnings (Off, Echo.Skel); -- No entity from Echo.Skel is referenced. package body Echo.Impl is ---------------- -- EchoString -- ---------------- function EchoString (Self : access Object; Mesg : in CORBA.String) return CORBA.String is pragma Warnings (Off); pragma Unreferenced (Self); pragma Warnings (On); begin Ada.Text_IO.Put_Line ("Echoing string: « " & CORBA.To_Standard_String (Mesg) & " »"); return Mesg; end EchoString; end Echo.Impl;
Note: Echo.Impl
body requires a dependency on
Echo.Skel
to ensure the elaboration of skeleton code and the
correct setup of PolyORB's internals.
Client and server code demonstrate how to make a remote invocation on a CORBA object, and how to setup an object on a server node.
Note: the dependency on PolyORB.Setup.Client
or
PolyORB.Setup.No_Tasking_Server
enforces compile-time
configuration, see Sample files.
IOR
), which is passed through command
line.
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- C L I E N T -- -- -- -- B o d y -- -- -- -- Copyright (C) 2002-2004 Free Software Foundation, Inc. -- -- -- -- PolyORB is free software; you can redistribute it and/or modify it -- -- under terms of the GNU General Public License as published by the Free -- -- Software Foundation; either version 2, or (at your option) any later -- -- version. PolyORB is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. You should have received a copy of the GNU -- -- General Public License distributed with PolyORB; see file COPYING. If -- -- not, write to the Free Software Foundation, 59 Temple Place - Suite 330, -- -- Boston, MA 02111-1307, USA. -- -- -- -- As a special exception, if other files instantiate generics from this -- -- unit, or you link this unit with other files to produce an executable, -- -- this unit does not by itself cause the resulting executable to be -- -- covered by the GNU General Public License. This exception does not -- -- however invalidate any other reasons why the executable file might be -- -- covered by the GNU Public License. -- -- -- -- PolyORB is maintained by ACT Europe. -- -- (email: sales@@act-europe.fr) -- -- -- ------------------------------------------------------------------------------ -- echo client. with Ada.Command_Line; with Ada.Text_IO; with CORBA.ORB; with Echo; with PolyORB.Setup.Client; pragma Warnings (Off, PolyORB.Setup.Client); with PolyORB.Utils.Report; procedure Client is use Ada.Command_Line; use Ada.Text_IO; use PolyORB.Utils.Report; Sent_Msg, Rcvd_Msg : CORBA.String; myecho : Echo.Ref; begin New_Test ("Echo client"); CORBA.ORB.Initialize ("ORB"); if Argument_Count /= 1 then Put_Line ("usage : client <IOR_string_from_server>|-i"); return; end if; -- Getting the CORBA.Object CORBA.ORB.String_To_Object (CORBA.To_CORBA_String (Ada.Command_Line.Argument (1)), myecho); -- Checking if it worked if Echo.Is_Nil (myecho) then Put_Line ("main : cannot invoke on a nil reference"); return; end if; -- Sending message Sent_Msg := CORBA.To_CORBA_String (Standard.String'("Hello Ada !")); Rcvd_Msg := Echo.echoString (myecho, Sent_Msg); -- Printing result Put_Line ("I said : " & CORBA.To_Standard_String (Sent_Msg)); Put_Line ("The object answered : " & CORBA.To_Standard_String (Rcvd_Msg)); End_Report; exception when E : CORBA.Transient => declare Memb : CORBA.System_Exception_Members; begin CORBA.Get_Members (E, Memb); Put ("received exception transient, minor"); Put (CORBA.Unsigned_Long'Image (Memb.Minor)); Put (", completion status: "); Put_Line (CORBA.Completion_Status'Image (Memb.Completed)); End_Report; end; end Client;
RootPOA
. Then an IOR
reference is built to enable
interaction with other nodes.
------------------------------------------------------------------------------ -- -- -- POLYORB COMPONENTS -- -- -- -- S E R V E R -- -- -- -- B o d y -- -- -- -- Copyright (C) 2002-2004 Free Software Foundation, Inc. -- -- -- -- PolyORB is free software; you can redistribute it and/or modify it -- -- under terms of the GNU General Public License as published by the Free -- -- Software Foundation; either version 2, or (at your option) any later -- -- version. PolyORB is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -- -- License for more details. You should have received a copy of the GNU -- -- General Public License distributed with PolyORB; see file COPYING. If -- -- not, write to the Free Software Foundation, 59 Temple Place - Suite 330, -- -- Boston, MA 02111-1307, USA. -- -- -- -- As a special exception, if other files instantiate generics from this -- -- unit, or you link this unit with other files to produce an executable, -- -- this unit does not by itself cause the resulting executable to be -- -- covered by the GNU General Public License. This exception does not -- -- however invalidate any other reasons why the executable file might be -- -- covered by the GNU Public License. -- -- -- -- PolyORB is maintained by ACT Europe. -- -- (email: sales@@act-europe.fr) -- -- -- ------------------------------------------------------------------------------ with Ada.Text_IO; with CORBA.Impl; with CORBA.Object; with CORBA.ORB; with PortableServer.POA.Helper; with PortableServer.POAManager; with Echo.Impl; with PolyORB.CORBA_P.CORBALOC; -- Setup server node: use no tasking default configuration with PolyORB.Setup.No_Tasking_Server; pragma Warnings (Off, PolyORB.Setup.No_Tasking_Server); procedure Server is begin declare Argv : CORBA.ORB.Arg_List := CORBA.ORB.Command_Line_Arguments; begin CORBA.ORB.Init (CORBA.ORB.To_CORBA_String ("ORB"), Argv); declare Root_POA : PortableServer.POA.Ref; Ref : CORBA.Object.Ref; Obj : constant CORBA.Impl.Object_Ptr := new Echo.Impl.Object; begin -- Retrieve Root POA Root_POA := PortableServer.POA.Helper.To_Ref (CORBA.ORB.Resolve_Initial_References (CORBA.ORB.To_CORBA_String ("RootPOA"))); PortableServer.POAManager.Activate (PortableServer.POA.Get_The_POAManager (Root_POA)); -- Set up new object Ref := PortableServer.POA.Servant_To_Reference (Root_POA, PortableServer.Servant (Obj)); -- Output IOR Ada.Text_IO.Put_Line ("'" & CORBA.To_Standard_String (CORBA.Object.Object_To_String (Ref)) & "'"); Ada.Text_IO.New_Line; -- Output corbaloc Ada.Text_IO.Put_Line ("'" & CORBA.To_Standard_String (PolyORB.CORBA_P.CORBALOC.Object_To_Corbaloc (Ref)) & "'"); -- Launch the server CORBA.ORB.Run; end; end; end Server;
To compile this demo,
idlac
$ idlac echo.idl
$ gnatmake client.adb `polyorb-config`
$ gnatmake server.adb `polyorb-config`
Note the use of backticks (`). This means that polyorb-config is first executed, and then the command line is replaced with the output of the script, setting up library and include paths and library names.
To run this demo:
$ ./server Loading configuration from polyorb.conf No polyorb.conf configuration file. 'IOR:01534f410d00000049444c3[..]'
$ ./client 'IOR:01534f410d00000049444c3[..]' Echoing string: « Hello Ada ! » I said : Hello Ada ! The object answered : Hello Ada !