package TAO_Helper; import java.net.*; import java.io.*; /** * This class implements the TAO service discovery protocol. * *
** For example: *
*
* import TAO_Helper.*;
* NamingContext nc;
* int two_k_name_server_port = 20000;
*
* TAO_Helper tao_helper = new TAO_Helper(two_k_name_server_port);
*
* String ns_ior = tao_helper.resolve_initial_references("NameService");
*
* obj1 = orb.string_to_object(ns_ior);
* nc = NamingContextHelper.narrow(obj1);
*
* ...
*
*
* Source: TAO_Helper.java
*
* @version 1.0 06/25/99
* @author Tomonori Yamane
* @since 1.0
*/
public class TAO_Helper
{
static boolean debug = true;
/**
* Default Constructor.
* Default multicast port for NameService = 10013.
* Default multicast port for TraderService = 10016.
*/
public TAO_Helper() {}
/**
* Constructor with the specified name server port number.
*
* 2K group's persistent name server uses port = 200000.
*/
public TAO_Helper(int name_port) {
TAO_DEFAULT_NAME_SERVER_REQUEST_PORT = name_port;
}
/**
* Constructor with command line arguments.
* We can specify the options.
* We have -ORBnameserviceport and -ORBtradingserviceport
*/
public TAO_Helper(String args[]) {
parse_args(args);
}
//
// parse_argments to specify port number
//
void parse_args(String args[]) {
for (int i = 0 ; i < (args.length - 1); i++) {
if (debug) System.out.println("arg " + i + " " + args[i]);
if (args[i].compareTo("-ORBnameserviceport")==0) {
TAO_DEFAULT_NAME_SERVER_REQUEST_PORT = Integer.parseInt(args[i+1]);
i++;
continue;
} else if (args[i].compareTo("-ORBnameserviceior")==0) {
// Specify NamingService IOR
System.out.println("-ORBnameserviceior Not implemented yet");
i++;
continue;
} else if (args[i].compareTo("-ORBtradingserviceport")==0) {
TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT = Integer.parseInt(args[i+1]);
i++;
continue;
} else if (args[i].compareTo("-ORBtradingserviceior")==0) {
// Specify TradingService IOR
System.out.println("-ORBtradingserviceior Not implemented yet");
i++;
continue;
}
}
}
/**
Resolve initial reference for the old TAO (0.3)
@param name Name of the service. "NameService" or "TraderService"
@return Stringified IOR for the specified TAO service
*/
public String resolve_old_initial_references(String name) {
int port = 0;
int serviceid = 0;
String ior;
//
// Parse command line option
//
if (name.compareTo(TAO_OBJID_NAMESERVICE) == 0) {
if (debug) System.out.println("Looking for NameService");
port = TAO_DEFAULT_NAME_SERVER_REQUEST_PORT;
serviceid = TAO_SERVICEID_NAMESERVICE;
} else if (name.compareTo(TAO_OBJID_TRADINGSERVICE) == 0) {
if (debug) System.out.println("Looking for TradingService");
port = TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT;
serviceid = TAO_SERVICEID_TRADINGSERVICE;
} else {
if (debug) System.out.println("What's this? : " + name);
return null;
}
try {
InetAddress group = InetAddress.getByName(ACE_DEFAULT_MULTICAST_ADDR);
MulticastSocket snd_sock = new MulticastSocket(port);
if (debug) System.out.println("Multicast socket opened");
snd_sock.joinGroup(group);
if (debug) System.out.println("Multicast joingroup");
DatagramSocket recv_sock = new DatagramSocket();
int recv_port = recv_sock.getLocalPort();
recv_sock.setSoTimeout(1 * 1000); // Timeout set to 1 sec
byte[] mcast_info = new byte[4];
// packet (internet byte order)
//
// struct
// {
// u_short reply_port;
// CORBA::Short service_id;
// } mcast_info;
mcast_info[0] = (byte)(recv_port >> 8);
mcast_info[1] = (byte)(recv_port & 255);
mcast_info[2] = (byte)(serviceid >> 8);
mcast_info[3] = (byte)(serviceid & 255);
if (debug) System.out.println("mcast_info created " + mcast_info.length);
DatagramPacket snd = new DatagramPacket(mcast_info, 4, group, port);
if (debug) System.out.println("Multicast data packet created");
snd_sock.send(snd);
if (debug) System.out.println("Multicast data sent");
byte[] rbuf = new byte[ACE_MAX_DGRAM_SIZ];
DatagramPacket recv = new DatagramPacket(rbuf, rbuf.length);
recv_sock.receive(recv);
if (debug) System.out.println("Reply received");
snd_sock.leaveGroup(group);
// Close sokets
snd_sock.close();
recv_sock.close();
ior = new String(rbuf);
if (debug) System.out.println("ior.length = " + ior.length());
// We need to trim the string
ior = ior.trim();
if (debug) System.out.println("trimed ior.length = " + ior.length());
System.err.println("IOR = " + ior);
if (debug) System.err.println("******************");
} catch(java.io.InterruptedIOException iioe) {
System.err.println("multicast query time out");
iioe.printStackTrace(System.err);
return null;
} catch (Exception e) {
System.err.println("tao_resolve_initial_references() failed");
e.printStackTrace(System.err);
return null;
}
return ior;
}
/**
Resolve initial reference.
@param name Name of the service. "NameService" or "TraderService"
@return Stringified IOR for the specified TAO service
*/
public String resolve_initial_references(String name) {
int port = 0;
int serviceid = 0;
String ior;
//
// Parse command line option
//
if (name.compareTo(TAO_OBJID_NAMESERVICE) == 0) {
if (debug) System.out.println("Looking for NameService");
port = TAO_DEFAULT_NAME_SERVER_REQUEST_PORT;
serviceid = TAO_SERVICEID_NAMESERVICE;
} else if (name.compareTo(TAO_OBJID_TRADINGSERVICE) == 0) {
if (debug) System.out.println("Looking for TradingService");
port = TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT;
serviceid = TAO_SERVICEID_TRADINGSERVICE;
} else {
if (debug) System.out.println("What's this? : " + name);
return null;
}
try {
InetAddress group = InetAddress.getByName(ACE_DEFAULT_MULTICAST_ADDR);
MulticastSocket snd_sock = new MulticastSocket(port);
if (debug) System.out.println("Multicast socket opened");
snd_sock.joinGroup(group);
if (debug) System.out.println("Multicast joingroup");
// DatagramSocket recv_sock = new DatagramSocket();
ServerSocket recv_sock = new ServerSocket(0);
int recv_port = recv_sock.getLocalPort();
recv_sock.setSoTimeout(3 * 1000); // Timeout set to 3 sec
// packet (internet byte order)
//
// struct
// {
// u_short reply_port; // UDP port
// CORBA::Short service_id;
// } mcast_info;
// New packet (internet byte order)
//
// struct
// {
// short header ---- size of data
// u_short reply_port; // TCP port
// CORBA::String service_id; ---- null terminated
// } mcast_info;
ByteArrayOutputStream msg = new ByteArrayOutputStream();
int dataLength = name.length() + 3;
msg.write((dataLength >> 8) & 0xff);
msg.write(dataLength & 0xff);
msg.write((recv_port >> 8) & 0xff);
msg.write(recv_port & 0xff);
msg.write(name.getBytes());
msg.write(0);
// byte[] mcast_info = new byte[4];
//
// mcast_info[0] = (byte)(recv_port >> 8);
// mcast_info[1] = (byte)(recv_port & 255);
// mcast_info[2] = (byte)(serviceid >> 8);
// mcast_info[3] = (byte)(serviceid & 255);
// if (debug) System.out.println("mcast_info created " + mcast_info.length);
// DatagramPacket snd = new DatagramPacket(mcast_info, 4, group, port);
DatagramPacket snd = new DatagramPacket(msg.toByteArray(), msg.size(),
group, port);
if (debug) System.out.println("Multicast data packet created");
snd_sock.send(snd);
if (debug) System.out.println("Multicast data sent");
Socket accepted_sock = recv_sock.accept(); // For TCP port, this blocks
byte[] rbuf = new byte[ACE_MAX_DGRAM_SIZ];
// DatagramPacket recv = new DatagramPacket(rbuf, rbuf.length);
//
// recv_sock.receive(recv);
InputStream in = accepted_sock.getInputStream();
int length;
// skip data length part
in.read();
in.read();
for (length = 0; length < rbuf.length; length++) {
if ((rbuf[length] = (byte) in.read()) == 0) {
break;
}
}
//////
if (debug) System.out.println("Reply received");
snd_sock.leaveGroup(group);
// Close sokets
snd_sock.close();
recv_sock.close();
ior = new String(rbuf);
if (debug) System.out.println("ior.length = " + ior.length());
// We need to trim the string
ior = ior.trim();
if (debug) System.out.println("trimed ior.length = " + ior.length());
System.err.println("IOR = " + ior);
if (debug) System.err.println("******************");
} catch(java.io.InterruptedIOException iioe) {
System.err.println("multicast query time out");
iioe.printStackTrace(System.err);
return null;
} catch (Exception e) {
System.err.println("tao_resolve_initial_references() failed");
e.printStackTrace(System.err);
return null;
}
return ior;
}
//
// tao/orbconf.h
// Default UDP multicast port number for locating TAO services
//
// 2K group's persistent name server uses port = 200000
//
/** Default multicast port for locating NameService. */
static int TAO_DEFAULT_NAME_SERVER_REQUEST_PORT = 10013;
/** Default multicast port for locating TraderService. */
static int TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT = 10016;
// tao/ORB.h
static String TAO_OBJID_NAMESERVICE = "NameService";
static String TAO_OBJID_TRADINGSERVICE = "TradingService";
static String TAO_OBJID_ROOTPOA = "RootPOA";
static String TAO_DEFAULT_ROOTPOA_NAME = "TradingService";
static String TAO_OBJID_POACURRENT = "POACurrent";
static String TAO_OBJID_INTERFACEREP = "InterfaceRepository";
static short TAO_SERVICEID_NAMESERVICE = 0;
static short TAO_SERVICEID_TRADINGSERVICE = 1;
// ace/OS.h
/** Multicast address for TAO (ACE). */
static String ACE_DEFAULT_MULTICAST_ADDR = "224.9.9.2";
static int ACE_MAX_DGRAM_SIZ = 8192;
}