Professional Documents
Culture Documents
A Tutorial Using
C++Builder 4, JBuilder 2 and VisiGenic ORB
Furrukh S. Khan
Summer 1999
Introduction
module Bank {
interface Account {
float balance();
};
interface AccountManager {
Account open(in string name);
};
};
This tutorial guides you, step by step, to build servers in C++ and
Java, which serve objects conforming to the above IDL interfaces, and
to build clients in C++ and Java, which use these objects through these
interfaces. All the servers and clients built in this tutorial can
interoperate, independent of the language of implementation, by using
the VisiGenic ORB.
1
C++
Create Folders
D:\CorbaDemo
D:\CorbaDemo\Cpp
D:\CorbaDemo\Cpp\ClientCpp
D:\CorbaDemo\Cpp\ServerCpp
C++ Server
Start C+Builder4
#include <corbapch.h>
#pragma hdrstop
//---------------------------------------------------------------------
#include <corba.h>
#include <condefs.h>
USEIDL("Bank.idl");
USEUNIT("Bank_c.cpp");
USEUNIT("Bank_s.cpp");
//---------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
try
{
// Initialize the ORB and BOA
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::BOA_var boa = orb->BOA_init(argc, argv);
// Wait for incoming requests
boa->impl_is_ready();
}
catch(const CORBA::Exception& e)
{
cerr << e << endl;
return(1);
2
}
return 0;
}
Create Bank.idl
Choose File->NewMultitier Tag-> CORBA idl File
module Bank {
interface Account {
float balance();
};
interface AccountManager {
Account open(in string name);
};
};
Compile Bank.idl:
Choose Project Manager: view->Project Manager
right click on Bank.idl in the Project Manager and choose compile
In Main: Checked
3
Object Name: AccountManagerObject
#include <corbapch.h>
#pragma hdrstop
//---------------------------------------------------------------------
#include "AccountManagerServer.h"
#include <corba.h>
#include <condefs.h>
USEIDL("Bank.idl");
USEUNIT("Bank_c.cpp");
USEUNIT("Bank_s.cpp");
USEUNIT("AccountManagerServer.cpp"); /* Bank.idl: CORBAIdlFile */
//---------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
try
{
// Initialize the ORB and BOA
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::BOA_var boa = orb->BOA_init(argc, argv);
AccountManagerImpl
accountManager_AccountManagerObject("AccountManagerObject");
boa->obj_is_ready(&accountManager_AccountManagerObject);
// Wait for incoming requests
boa->impl_is_ready();
}
catch(const CORBA::Exception& e)
{
cerr << e << endl;
return(1);
}
return 0;
}
Account Interface:
File->New->Multitier Tag-> CORBA Object Implementation
4
Deligation Tie: unchecked
In Main: Checked
#include <corbapch.h>
#pragma hdrstop
//---------------------------------------------------------------------
#include "AccountServer.h"
#include "AccountManagerServer.h"
#include <corba.h>
#include <condefs.h>
USEIDL("Bank.idl");
USEUNIT("Bank_c.cpp");
USEUNIT("Bank_s.cpp");
USEUNIT("AccountManagerServer.cpp"); /* Bank.idl: CORBAIdlFile */
USEUNIT("AccountServer.cpp"); /* Bank.idl: CORBAIdlFile */
//---------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
try
{
// Initialize the ORB and BOA
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::BOA_var boa = orb->BOA_init(argc, argv);
AccountManagerImpl
accountManager_AccountManagerObject("AccountManagerObject");
boa->obj_is_ready(&accountManager_AccountManagerObject);
AccountImpl account_AccountObject("AccountObject");
boa->obj_is_ready(&account_AccountObject);
// Wait for incoming requests
boa->impl_is_ready();
}
catch(const CORBA::Exception& e)
{
cerr << e << endl;
return(1);
}
return 0;
}
By now, c++Builder has produces the following .h, and .cpp files, which
contain classes with empty bodies (i.e. no implementation), we need to
fill in the implementaion ourselves. Here are the files as initially
generated:
5
//---------------------- AccountManagerServer.h ---------------------
#ifndef AccountManagerServerH
#define AccountManagerServerH
#include "Bank_s.hh"
//---------------------------------------------------------------------
class AccountManagerImpl: public _sk_Bank::_sk_AccountManager
{
protected:
public:
AccountManagerImpl(const char *object_name=NULL);
Bank::Account_ptr open(const char* name);
};
#endif
//-----------------AccountManagerServer.cpp----------------------------
#include <corbapch.h>
#pragma hdrstop
#include <corba.h>
#include "AccountManagerServer.h"
//---------------------------------------------------------------------
#pragma package(smart_init)
//-------------------AccountServer.cpp---------------------------------
#include <corbapch.h>
#pragma hdrstop
#include <corba.h>
#include "AccountServer.h"
//---------------------------------------------------------------------
#pragma package(smart_init)
6
AccountImpl::AccountImpl(const char *object_name):
_sk_Bank::_sk_Account(object_name)
{
}
CORBA::Float AccountImpl::balance()
{
}
public:
AccountImpl(const char *object_name=NULL, CORBA::Float
balance=0.0);
CORBA::Float balance();
};
#endif
//-----------------AccountServer.cpp---------------------------
#include <corbapch.h>
#pragma hdrstop
#include <corba.h>
#include "AccountServer.h"
//---------------------------------------------------------------------
#pragma package(smart_init)
CORBA::Float AccountImpl::balance()
{
return _balance;
}
7
//-------------AccountManagrServer.h--------------------------
#ifndef AccountManagerServerH
#define AccountManagerServerH
#include "Bank_s.hh"
//---------------------------------------------------------------------
class AccountManagerImpl: public _sk_Bank::_sk_AccountManager
{
private:
int accountCount;
public:
AccountManagerImpl(const char *object_name=NULL);
Bank::Account_ptr open(const char* name);
};
#endif
//------------AccountManagerServer.cpp---------------------------------
#include <corbapch.h>
#include "AccountServer.h"
#pragma hdrstop
#include <corba.h>
#include "AccountManagerServer.h"
//---------------------------------------------------------------------
#pragma package(smart_init)
8
C++ Client
Start C++Builder 4
//-----------------ClientCpp.cpp-----------------------------
#include <corbapch.h>
#pragma hdrstop
//---------------------------------------------------------------------
#include <corba.h>
#include <condefs.h>
USEIDL("Bank.idl");
//---------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
try
{
// Initialize the ORB and BOA
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::BOA_var boa = orb->BOA_init(argc, argv);
}
catch(const CORBA::Exception& e)
{
cerr << e << endl;
return(1);
}
return 0;
}
Compile Bank.idl
view->Project Manager right click on Bank.idl and choose compile
9
C++Builder produces the files in the directory.
D:\CorbaDemo\Cpp\ClientCpp
//-----------------ClientCpp.cpp-----------------------------
#include <corbapch.h>
#pragma hdrstop
//---------------------------------------------------------------------
#include <corba.h>
#include <condefs.h>
USEIDL("Bank.idl");
USEUNIT("Bank_c.cpp");
USEUNIT("Bank_s.cpp");
//---------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
try
{
// Initialize the ORB and BOA
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::BOA_var boa = orb->BOA_init(argc, argv);
}
catch(const CORBA::Exception& e)
{
cerr << e << endl;
return(1);
}
return 0;
}
//-----------------ClientCpp.cpp-----------------------------
#include <corbapch.h>
#pragma hdrstop
//---------------------------------------------------------------------
#include "Bank_c.hh"
#include <corba.h>
#include <condefs.h>
#include <iostream>
USEIDL("Bank.idl");
USEUNIT("Bank_c.cpp");
USEFILE("Bank_c.hh");
10
USEUNIT("Bank_s.cpp");
//---------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
try
{
// Initialize the ORB
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
Bank::AccountManager_var theAccountManager =
Bank::AccountManager::_bind("AccountManagerObject");
Bank::Account_ptr theAccount1 =
theAccountManager->open("Nadia");
float theBalance = theAccount1->balance();
std::cout<<"The Balance for Account1 is:
"<<theBalance<<std::endl;
Bank::Account_ptr theAccount2 =
theAccountManager->open("Furrukh");
theBalance = theAccount2->balance();
std::cout<<"The Balance for Account2 is:
"<<theBalance<<std::endl;
Bank::Account_var theAccount3 =
Bank::Account::_bind("AccountObject");
theBalance = theAccount3->balance();
std::cout<<"The Balance for Account3 is:
"<<theBalance<<std::endl;
// Pause
char c;
std::cout<<"Input a char to quit ..."<<std::endl;
std::cin>>c;
}
catch(const CORBA::Exception& e)
{
cerr << e << endl;
return(1);
}
return 0;
}
11
Java
Create folders:
D:\CorbaDemo\Java
D:\CorbaDemo\Java\ClientJava
D:\CorbaDemo\Java\ServerJava
Java Client
Start Jbuilder2
File->New Project
Compile Bank.idl
_AccountImplBase.java (skeleton)
_st_Account.java (stub)
Account.java (java interface corresponding to the idl interface)
AccountHelper.java (helper class for locating server
implementations)
AccountHolder.java (class to enable out parameters in IDL)
_AccountManagerImplBase.java (skeleton)
_st_AccountManager.java (stub)
AccountManager.java (java interface corresponding the idl interface)
AccountManagerHelper.java (helper class for locating server
implementations)
AccountManagerHolder.java (class to enable out parameters in IDL)
12
//-------------------------ClientJava.java-----------------------------
package clientJava;
import Pause.*;
Bank.AccountManager theAccountManager =
Bank.AccountManagerHelper.bind(orb,
"AccountManagerObject");
Bank.Account theAccount1 = theAccountManager.open("Nadia");
float theBalance = theAccount1.balance();
System.out.println("The Balance for Account1 is: "+theBalance );
Bank.Account theAccount2 = theAccountManager.open("Furrukh");
theBalance = theAccount2.balance();
System.out.println("The Balance for Account2 is: "+theBalance);
Pause.pause();
}
}
Java Server
Start Jbuilder2
File->New Project
Compile Bank.idl
Right click on Bank.idl in the project explorer and choose Rebuild
13
_AccountImplBase.java (skeleton)
_st_Account.java (stub)
Account.java (java interface corresponding the idl interface)
AccountHelper.java (helper class for locating server
implementations)
AccountHolder.java (class to enable out parameters in IDL)
_AccountManagerImplBase.java (skeleton)
_st_AccountManager.java (stub)
AccountManager.java (java interface corresponding the idl interface)
AccountManagerHelper.java (helper class for locating server
implementations)
AccountManagerHolder.java (class to enable out parameters in IDL)
//-------------------------AccountImpl.java----------------------------
package ServerJava;
import java.io.*;
//-------------------------AccountManagerImpl.java---------------------
package ServerJava;
14
}
Creating ServerJava
File->New->VisiBroker Tab->CORBA Server
Jbuilder produces:
//-------------------ServerJava.java-----------------------------------
package ServerJava;
import java.util.*;
//-------------------ServerJava.java-----------------------------------
package ServerJava;
import java.util.*;
15
try {
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
org.omg.CORBA.BOA boa = orb.BOA_init();
Bank.AccountManager accountManager_AccountManagerObject =
new AccountManagerImpl("AccountManagerObject");
boa.obj_is_ready(accountManager_AccountManagerObject);
Bank.Account account_AccountObject =
new AccountImpl("AccountObject", 123.00f);
boa.obj_is_ready(account_AccountObject);
boa.impl_is_ready();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
16
Running the Clients and Servers
Finally, follow these steps to use the services provided by the C++ or
Java Servers, in C++ or Java Clients, with complete interoperability.
17