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 the examples/corba/echo directory in the 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-2008, 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 : 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-2008, 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 : 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 set up 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 on 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-2007, 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, 51 Franklin Street, Fifth --
-- Floor, Boston, MA 02111-1301, 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 AdaCore --
-- (email: sales@adacore.com) --
-- --
------------------------------------------------------------------------------
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.Local_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_Local_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 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 !