package org.jacorb.test.listenendpoints.echo_corbaloc;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.jacorb.orb.util.PrintIOR;
import org.jacorb.test.harness.FixedPortORBTestCase;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Policy;
import org.omg.PortableServer.IdAssignmentPolicyValue;
import org.omg.PortableServer.ImplicitActivationPolicyValue;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
public class Server extends FixedPortORBTestCase
{
public static void main(String[] args)
{
try
{
CmdArgs cmdArgs = new CmdArgs("Server", args);
Properties props = new Properties();
props.setProperty("jacorb.implname", "EchoServer");
props.setProperty("OAPort", Integer.toString(getNextAvailablePort()));
String helloID = "EchoID";
List<Endpoint> endpointList = null;
try
{
endpointList = ListenEndpoints.getEndpointList(args);
}
catch (Exception e)
{
System.err.println("Got an exception in ListenEndpoints.getEndpointList(): " + e.getMessage());
System.exit(1);
}
//init ORB
ORB orb = ORB.init(args, props);
//init POA
POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
//init new POA
Policy[] policies = new Policy[2];
policies[0] = rootPOA.create_lifespan_policy(LifespanPolicyValue.PERSISTENT);
policies[1] = rootPOA.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID);
POA helloPOAPersistent = rootPOA.create_POA
("EchoPOAP", rootPOA.the_POAManager(), policies);
// Setup a second POA with a transient policy therebye producing a different corbaloc.
policies = new Policy[3];
policies[0] = rootPOA.create_lifespan_policy(LifespanPolicyValue.TRANSIENT);
policies[1] = rootPOA.create_id_assignment_policy (IdAssignmentPolicyValue.SYSTEM_ID);
policies[2] = rootPOA.create_implicit_activation_policy (ImplicitActivationPolicyValue.IMPLICIT_ACTIVATION);
POA helloPOATransient = rootPOA.create_POA
("EchoPOAT", rootPOA.the_POAManager(), policies);
helloPOAPersistent.the_POAManager().activate();
helloPOATransient.the_POAManager().activate();
// create servant object
EchoMessageImpl echoServant = new EchoMessageImpl("EchoPOA-Persistent");
helloPOAPersistent.activate_object_with_id(helloID.getBytes(), echoServant);
// Manually create a persistent based corbaloc.
for (Iterator<Endpoint> x = endpointList.iterator(); x.hasNext();)
{
Endpoint ep = x.next();
List<String> corbalocStrList = null;
if (ep.getHostInetAddress() != null)
{
corbalocStrList = buildCorbalocString(ep.getHostInetAddress(),
ep.getProtocol(), ep.getPort(),
props.getProperty("jacorb.implname"),
helloPOAPersistent.the_name(),
helloID);
}
else
{
corbalocStrList = getCorbalocEndpoints(
ep.getProtocol(), ep.getPort(),
props.getProperty("jacorb.implname"),
helloPOAPersistent.the_name(),
helloID);
}
int n = 0;
for (Iterator<String> xx = corbalocStrList.iterator(); xx.hasNext();)
{
++n;
String corbalocStr = xx.next();
if (!cmdArgs.getTestMode())
{
System.out.println("Server-Persistent corbaloc " + n + ": " + corbalocStr);
}
else
{
System.out.println("SERVER IOR: " + corbalocStr);
}
org.omg.CORBA.Object objP = orb.string_to_object(corbalocStr);
if (!cmdArgs.getTestMode())
{
System.out.println("Server-Persistent ior: " + orb.object_to_string (objP));
}
else if (cmdArgs.getTestType().equalsIgnoreCase("P") ||
cmdArgs.getTestType().equalsIgnoreCase("A"))
{
System.out.println("SERVER IOR: " + orb.object_to_string (objP));
}
System.out.flush();
if (cmdArgs.getIORFile() != null)
{
PrintWriter ps = new PrintWriter(new FileOutputStream(
new File( cmdArgs.getIORFile() + Integer.toString(n) ) + ".persistent"));
ps.println( orb.object_to_string( objP ) );
ps.close();
}
// Add an object key mapping to second server
// System.out.println("Adding object mapping for server 1 ior: " + orb.object_to_string (objP));
((org.jacorb.orb.ORB)orb).addObjectKey ("VeryShortKey", orb.object_to_string (objP));
}
}
// Setup second server
org.omg.CORBA.Object objT = helloPOATransient.servant_to_reference(new EchoMessageImpl("EchoPOA-Transient"));
// Use the PrintIOR utility function to extract a transient corbaloc string.
String corbalocStr = PrintIOR.printCorbalocIOR (orb, orb.object_to_string(objT));
if (!cmdArgs.getTestMode())
{
System.out.println("Server-Transient corbaloc: " + corbalocStr);
}
else if (cmdArgs.getTestType().equalsIgnoreCase("T") ||
cmdArgs.getTestType().equalsIgnoreCase("A"))
{
System.out.println("SERVER IOR: " + corbalocStr);
}
if (cmdArgs.getIORFile() != null)
{
PrintWriter ps = new PrintWriter(new FileOutputStream(new File( cmdArgs.getIORFile() ) + ".transient"));
ps.println( corbalocStr );
ps.close();
}
System.out.flush();
// wait for requests
orb.run();
}
catch (Exception e)
{
e.printStackTrace();
}
}
private static List<InetAddress> getInetAddressList() throws SocketException
{
List<InetAddress> inetList = new ArrayList<InetAddress>();
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
{
for ( InetAddress inetAddress : Collections.list(netint.getInetAddresses()) )
{
inetList.add(inetAddress);
}
}
return inetList;
}
private static List<String> getCorbalocEndpoints(String protocol, int listen_port,
String implName, String poaName, String objId) throws SocketException
{
try
{
List<InetAddress> inets = getInetAddressList();
List<String> listen_eps = new ArrayList<String>();
for (Iterator<InetAddress> x = inets.iterator(); x.hasNext();)
{
InetAddress inetAddr = x.next();
String ipaddr = inetAddr.toString().substring(1);
String conHostName = inetAddr.getCanonicalHostName();
String hostName = inetAddr.getHostName();
if (!inetAddr.isLoopbackAddress() && !inetAddr.isLinkLocalAddress())
{
if (inetAddr instanceof Inet4Address)
{
String s = new String (
"corbaloc:" + protocol + ":" + ipaddr + ":" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId);
listen_eps.add(s);
if (!hostName.equals(ipaddr))
{
listen_eps.add(new String ("corbaloc:" + protocol + ":" + hostName + ":" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
if (!conHostName.equals(ipaddr) && !conHostName.equals(hostName))
{
listen_eps.add(new String ("corbaloc:" + protocol + ":" + hostName + ":" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
}
else if (inetAddr instanceof Inet6Address)
{
String ipv6 = ipaddr;
int zoneid_delim = ipv6.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = ipv6.substring(0, zoneid_delim);
}
if (!ipv6.startsWith("fe80"))
{
listen_eps.add(new String ("corbaloc:" + protocol + ":" + "[" + ipv6 + "]:" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
if (!hostName.equals(ipaddr))
{
zoneid_delim = hostName.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = hostName.substring(0, zoneid_delim);
}
listen_eps.add(new String ("corbaloc:" + protocol + ":" + "[" + ipv6 + "]:" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
if (!conHostName.equals(ipaddr) && !conHostName.equals(hostName))
{
zoneid_delim = conHostName.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = conHostName.substring(0, zoneid_delim);
}
listen_eps.add(new String ("corbaloc:" + protocol + ":" + "[" + ipv6 + "]:" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
}
}
}
return listen_eps;
}
catch (SocketException e)
{
throw new SocketException (e.getMessage());
}
}
private static List<String> buildCorbalocString(InetAddress inetAddr,
String protocol, int listen_port,
String implName, String poaName, String objId)
throws SocketException
{
List<String> listen_eps = new ArrayList<String>();
String ipaddr = inetAddr.toString().substring(1);
String conHostName = inetAddr.getCanonicalHostName();
String hostName = inetAddr.getHostName();
// if (!inetAddr.isLoopbackAddress() && !inetAddr.isLinkLocalAddress())
if (!inetAddr.isLoopbackAddress())
{
if (inetAddr instanceof Inet4Address)
{
String s = new String (
"corbaloc:" + protocol + ":" + ipaddr + ":" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId);
listen_eps.add (s);
if (!hostName.equals(ipaddr))
{
listen_eps.add (new String ("corbaloc:" + protocol + ":" + hostName + ":" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
if (!conHostName.equals(ipaddr) && !conHostName.equals(hostName))
{
listen_eps.add (new String ("corbaloc:" + protocol + ":" + hostName + ":" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
}
else if (inetAddr instanceof Inet6Address)
{
String ipv6 = ipaddr;
int zoneid_delim = ipv6.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = ipv6.substring(0, zoneid_delim);
}
if (!ipv6.startsWith("fe80"))
{
listen_eps.add (new String ("corbaloc:" + protocol + ":" + "[" + ipv6 + "]:" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
if (!hostName.equals(ipaddr))
{
zoneid_delim = hostName.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = hostName.substring(0, zoneid_delim);
}
listen_eps.add (new String ("corbaloc:" + protocol + ":" + "[" + ipv6 + "]:" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
if (!conHostName.equals(ipaddr) && !conHostName.equals(hostName))
{
zoneid_delim = conHostName.indexOf('%');
if (zoneid_delim > 0)
{
ipv6 = conHostName.substring(0, zoneid_delim);
}
listen_eps.add (new String ("corbaloc:" + protocol + ":" + "[" + ipv6 + "]:" + listen_port
+ "/" + implName + "/" + poaName + "/" + objId));
}
}
}
return listen_eps;
}
}