13.3.2 スマートエージェントが認識するものをすべて検索

コードサンプル13-3および13-4は,スマートエージェントが認識するものをすべて検索する方法を示します。これにはまず,all_repository_ids()メソッドを呼び出して,既知のインタフェースをすべて取得します。次に,all_instances_descs()メソッドをインタフェースごとに呼び出して,インスタンス記述を取得します。

コードサンプル13-3 スマートエージェントが認識するものをすべて検索(C++)

#include "corba.h"

#include "locate_c.hh"

// USE_STD_NS is a define setup by VisiBroker to use
// the std namespace if it exists
USE_STD_NS

int DisplaybyRepID(CORBA::ORB_ptr the_orb,
        ObjLocation::Agent_var the_agent,
        char * myRepId){
  ObjLocation::ObjSeq_var accountRefs;
  accountRefs = the_agent->all_instances(myRepId);
  cout << "Obtained " << accountRefs->length() <<
        "Account objects" << endl;
  for (CORBA::ULong i=0; i < accountRefs->length(); i++) {
     cout << "Stringified IOR for account #" << i << ":"
           << endl;
     CORBA::String_var stringified_ior(
           the_orb->object_to_string(accountRefs[i]));
     cout << stringified_ior << endl;
     cout << endl;
  }
  return(1);
}
void PrintUsage(char * name) {
  cout << "¥nUsage: ¥n" << endl;
  cout << "¥t" << name << " [Rep ID]" << endl;
  cout << "¥n¥tWith no argument,
        finds and prints all objects" << endl;
  cout << "¥tOptional rep ID searches for
        specific rep ID¥n" << endl;
}
int main(int argc, char** argv) {
  char myRepId[255] = "";
  if (argc == 2) {
     if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "/?") ||
           !strcmp(argv[1], "-?") ){
        PrintUsage(argv[0]);
        exit(0);
     } else {
        strcpy(myRepId, argv[1]);
     }
  }
  else if (argc > 2) {
     PrintUsage(argv[0]);
     exit(0);
  }
  try {
     CORBA::ORB_ptr the_orb = CORBA::ORB_init(argc, argv);
     CORBA::Object_ptr obj = the_orb->
     resolve_initial_references("LocationService");
     if ( CORBA::is_nil(obj) ) {
        cout << "Unable to locate initial LocationService"
              << endl;
        return 0;
     }
     ObjLocation::Agent_var the_agent =
           ObjLocation::Agent::_narrow(obj);
     ObjLocation::DescSeq_var descriptors;

     //Display stringified IOR for RepID requested and exit
     if (argc == 2) {
        DisplaybyRepID(the_orb, the_agent, myRepId);
        exit(0);
     }
     //Report all hosts running osagents
     ObjLocation::HostnameSeq_var HostsRunningAgents =
           the_agent->all_agent_locations();
     cout << "Located " << HostsRunningAgents->length() <<
           "Hosts running Agents" << endl;
     for (CORBA::ULong k=
           0; k<HostsRunningAgents->length(); k++){
        cout << "¥tHost #" << (k+1) << ": " <<
              (const char*) HostsRunningAgents[k] << endl;
     }
     cout << endl;

     // Find and display all Repository Ids
     ObjLocation::RepositoryIdSeq_var repIds =
           the_agent->all_repository_ids();
     cout << "Located " << repIds->length() <<
           " Repository Ids" << endl;
     for (CORBA::ULong j=0; j<repIds->length(); j++) {
        cout << "¥tRepository ID #" << (j+1) << ": " <<
              repIds[j] << endl;
     }
     // Find all Object Descriptors for each Repository Id
     for (CORBA::ULong i=0; i < repIds->length(); i++) {
        descriptors =
              the_agent->all_instances_descs(repIds[i]);
        cout << endl;
        cout << "Located " << descriptors->length()
              << " objects for " << (const char*) (repIds[i])
              << " (Repository Id #" << (i+1) << "):" <<endl;
        for (CORBA::ULong j=0; j < descriptors->length(); j++){
           cout << endl;
           cout << (const char*) repIds[i] << " #"
                 << (j+1) << ":" << endl;
           cout << "¥tInstance Name ¥t=
                 " << descriptors[j].instance_name << endl;
           cout << "¥tHost ¥t=
                 " << descriptors[j].iiop_locator.host << endl;
           cout << "¥tPort ¥t=
                 " << descriptors[j].iiop_locator.port << endl;
           cout << "¥tAgent Host ¥t=
                 " << descriptors[j].agent_hostname << endl;
           cout << "¥tActivable ¥t="
              << (descriptors[j].activable?"YES":"NO") << endl;
        }
     }
  } catch (const CORBA::Exception& e) {
     cout << "CORBA Exception during execution of find_all: "
           << e << endl;
     return 0;
  }
  return 1;
}

コードサンプル13-4 スマートエージェントが認識するものをすべて検索(Java)

// Find.java
public class Find {
public static void main(String[ ] args){
  try {
     // Initialize the ORB.
     org.omg.CORBA.ORB orb =
                      org.omg.CORBA.ORB.init(args,null);
     com.inprise.vbroker.ObjLocation.Agent agent = null;
     try {
        agent =
        com.inprise.vbroker.ObjLocation.AgentHelper.narrow(
        orb.resolve_initial_references("LocationService"));
     } catch (org.omg.CORBA.ORBPackage.InvalidName e){
        System.out.println(
           "Not able to resolve references " +
           "for LocationService");
     System.exit(1);
     } catch (Exception e){
        System.out.println(
           "Not able to resolve references " +
           "for LocationService");
        System.out.println("Caught exception: " + e);
        System.exit(1);
     }
     boolean done=false;
     java.io.BufferedReader in =
        new java.io.BufferedReader(
           new java.io.InputStreamReader(System.in));
     while (!done){
        System.out.print("-> ");
        System.out.flush();
        String line = in.readLine();
        if(line.startsWith("agents")){
           java.lang.String[ ] agentList =
                               agent.all_agent_locations();
           System.out.println(
                "Located " + agentList.length  + "agents");
           for (int i=0; i < agentList.length; i++){
              System.out.println("¥t" + "Agent #" +
                 (i+1) + ": " + agentList[i]);
           }
        }else if(line.startsWith("rep")){
          java.lang.String[ ] repIds =
                                agent.all_repository_ids();
          System.out.println("Located " + repIds.length  +
                             "repository Ids");
          for (int i=0; i <repIds.length; i++){
             System.out.println("¥t" + "Repository Id #"
                                + (i+1) + ": " + repIds[i]);
          }
        } else if(line.startsWith("objects ")){
           String names = line.substring(
                        "objects ".length(), line.length());
           PrintObjects(names,agent,orb);
        } else if(line.startsWith("quit")){
           done = true;
        } else {
           System.out.println("Commands: agents¥n" +
              "          repository_ids¥n" +
              "          objects <rep Id>¥n" +
              "          objects <rep Id><obj name>¥n" +
              "          quit¥n");
        }
     }
  } catch (com.inprise.vbroker.ObjLocation.Fail err){
     System.out.println(
         "Location call failed with reason " + err.reason);
  } catch (java.lang.Exception err){
     System.out.println("Caught error " + err);
     err.printStackTrace();
  }
}
public static void PrintObjects(String names,
              com.inprise.vbroker.ObjLocation.Agent agent,
              org.omg.CORBA.ORB orb)
     throws com.inprise.vbroker.ObjLocation.Fail {
  int space_pos = names.indexOf(' ');
  String repository_id;
  String object_name;
  if (space_pos == -1){
     repository_id = names;
     object_name = null;
  }else {
     repository_id = names.substring(0,names.indexOf(' '));
     object_name = names.substring(names.indexOf(' ') + 1);
  }
  org.omg.CORBA.Object[ ] objects;
  com.inprise.vbroker.ObjLocation.Desc[ ] descriptors;
  if (object_name == null){
     objects = agent.all_instances(repository_id);
     descriptors =
        agent.all_instances_descs(repository_id);
  }else {
     objects =
              agent.all_replica(repository_id,object_name);
              descriptors = agent.all_replica_descs(
                                repository_id,object_name);
  }
  System.out.println(
                "Returned " + objects.length  + " objects");
  for (int i=0; i<objects.length; i++){
     System.out.println("¥n¥nObject #" + (i+1) + ":");
     System.out.println("==================");
     System.out.println("¥tRep ID: " +
                        ((com.inprise.vbroker.CORBA.Object)
                             objects[i])._repository_id());
     System.out.println("¥tInstance:" +
                        ((com.inprise.vbroker.CORBA.Object)
                               objects[i])._object_name());
     System.out.println(
              "¥tIOR: " + orb.object_to_string(objects[i]));
     System.out.println();
     System.out.println("Descriptor #" + (i+1));
     System.out.println(
                  "=====================================");
     System.out.println(
               "Host:" + descriptors[i].iiop_locator.host);
     System.out.println(
               "Port:" + descriptors[i].iiop_locator.port);
     System.out.println(
            "Agent Host:" + descriptors[i].agent_hostname);
     System.out.println(
          "Repository Id:" + descriptors[i].repository_id);
     System.out.println(
               "Instance:" + descriptors[i].instance_name);
     System.out.println(
                  "Activable:" + descriptors[i].activable);
  }
}
}