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