Hitachi

VisiBroker Version 5 Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド


6.6 コードサンプルのまとめ

ここでは,この章で説明したコード全体を示します。コードサンプル6-16は,この章で説明したC++のコード全体を示します。コードサンプル6-17は,この章で説明したJavaのコード全体を示します。

コードサンプル6-16 サーバ側コード全体(C++)
// Server.C
#include "Bank_s.hh"
#include <math.h>
 
class Dictionary {
   private:
      struct Data {
         const char* name;
         void* value;
      };
 
      unsigned _count;
      Data* _data;
   public:
      Dictionary() {
      _count = 0;
   }
   void put(const char* name, void* value) {
      Data* oldData = _data;
      _data = new Data[_count +1];
      for(unsigned i = 0; i < _count; i++) {
         _data[i] = oldData[i];
      }
      _data[_count].name = strdup(name);
      _data[_count].value = value;
      _count++;
   }
   void* get(const char* name) {
      for(unsigned i =0; i < _count; i++) {
         if(!strcmp(name, _data[i].name)) {
            return _data[i].value;
         }
      }
      return 0;
   }
};
 
class AccountImpl : public POA_Bank::Account {
   private:
      float _balance;
   public:
      AccountImpl(float balance) {
         _balance = balance;
      }
      virtual float balance() {
         return _balance;
   }
};
 
class AccountManagerImpl : public POA_Bank::AccountManager {
   private:
      Dictionary _accounts;
   public:
      virtual Bank::Account_ptr open(const char* name) {
         // Lookup the account in the account dictionary.
         Bank::Account_ptr account = 
               (Bank::Account_ptr) _accounts.get(name);
 
         if(account == Bank::Account::_nil()) {
            // Make up the account's balance, between 
            // 0 and 1000 dollars.
            float balance = abs(rand()) % 100000 / 100.0;
            // Create the account implementation, given 
            // the balance.
            AccountImpl *accountServant = 
                  new AccountImpl(balance);
            try {
               // Activate it on the default POA which is 
               // rootPOA for this servant
               PortableServer::POA_var rootPOA = _default_POA();
               CORBA::Object_var obj = 
                  rootPOA->servant_to_reference(accountServant);
               account = Bank::Account::_narrow(obj);
               } catch(const CORBA::Exception& e) {
                  cerr << "_narrow caught exception: " << e 
                        << endl;
               }
               //Print out the new account.
               cout << "Created " << name << "'s account: " 
                     << account << endl;
               // Save the account in the account dictionary.
               _accounts.put(name, account);
            }
            // Return the account.
            return Bank::Account::_duplicate(account);
      }
};
int main(int argc, char* const* argv) {
   try {
      // Initialize the ORB.
      CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
 
      // get a reference to the rootPOA
      CORBA::Object_var obj = 
            orb->resolve_initial_references("RootPOA");
      // narrow the object reference to a POA reference
      PortableServer::POA_var rootPOA = 
            PortableServer::POA::_narrow(obj);
 
      CORBA::PolicyList policies;
      policies.length(1);
 
      policies[(CORBA::ULong)0] = 
            rootPOA->create_lifespan_policy(
            PortableServer::PERSISTENT
      );
      // Create myPOA with the right policies
      PortableServer::POAManager_var rootManager = 
            rootPOA->the_POAManager();
      PortableServer::POA_var myPOA = 
            rootPOA->create_POA( "bank_agent_poa", 
            rootManager,policies );
 
      // Create the servant
      AccountManagerImpl managerServant;
 
      // Decide on the ID for the servant
      PortableServer::ObjectId_var managerId = 
            PortableServer::string_to_ObjectId("BankManager");
 
      // Activate the servant with the ID on myPOA
      myPOA->activate_object_with_id(managerId,&managerServant);
 
      // Activate the POA Manager
      rootPOA->the_POAManager()->activate();
 
      cout << myPOA->servant_to_reference(&managerServant) 
            << " is ready" << endl;
 
      // Wait for incoming requests
      orb->run();
   } catch(const CORBA::Exception& e) {
      cerr << e << endl;
   }
}
コードサンプル6-17 サーバ側コード全体(Java)
// Server.java
import org.omg.PortableServer.*;
public class Server {
  public static void main(String[ ] args){
   try {
     // Initialize the ORB.
     org.omg.CORBA.ORB orb =
                         org.omg.CORBA.ORB.init(args, null);
     // get a reference to the rootPOA
     POA rootPOA = POAHelper.narrow(
       orb.resolve_initial_references("RootPOA"));
 
     // Create policies for our persistent POA
     org.omg.CORBA.Policy[ ] policies = {
        rootPOA.create_lifespan_policy(
                             LifespanPolicyValue.PERSISTENT)
     };
     // Create myPOA with the right policies
     POA myPOA = rootPOA.create_POA( "bank_agent_poa",
                                    rootPOA.the_POAManager(),
                                    policies );
 
     // Create the servant
     AccountManagerImpl managerServant =
                                   new AccountManagerImpl();
     // Decide on the ID for the servant
     byte[ ] managerId = "BankManager".getBytes();
     // Activate the servant with the ID on myPOA
     myPOA.activate_object_with_id(managerId,
                                   managerServant);
     // Activate the POA manager
     rootPOA.the_POAManager().activate();
     System.out.println(
       myPOA.servant_to_reference(managerServant) +
       "is ready.");
     // Wait for incoming requests
     orb.run();
   }catch (Exception e) {
     e.printStackTrace();
   }
  }
}