package multiprof;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CORBA.*;
import java.io.File;
import java.util.List;
import java.util.Properties;
public class NSTest
{
public NamingContextExt ctx;
public Process primary;
public Process backup;
public ProcessBuilder primaryCmd;
public ProcessBuilder backupCmd;
public String aceRoot;
public String taoRoot;
public String nsPersist;
public String grpPersist;
public String nsIorFile;
public String nsIor;
public String primaryIorFile;
public String backupIorFile;
public void retry_resolve (String name, boolean retry)
{
String iteration = retry ? "First" : "Second";
try
{
org.omg.CORBA.Object obj = ctx.resolve_str (name);
System.out.println ("Resolve " + name + " worked on " + iteration + " try.");
}
catch (org.omg.CosNaming.NamingContextPackage.NotFound nfe)
{
System.out.println (iteration + " resolve threw a not found exception");
}
catch (org.omg.CosNaming.NamingContextPackage.CannotProceed cpe)
{
System.out.println (iteration + " resolve threw a cannot proceed exception");
}
catch (org.omg.CosNaming.NamingContextPackage.InvalidName ine)
{
System.out.println (iteration + " resolve threw an invalid name exception");
}
catch (org.omg.CORBA.SystemException ex)
{
System.out.println (iteration + " resolve threw " + ex);
if (retry)
{
retry_resolve (name, false);
}
}
}
public void purgeFiles (File root)
{
if (root.isDirectory ())
{
File f[] = root.listFiles ();
for (int i = 0; i < f.length; i++)
{
String n = f[i].getName ();
if (n.equals (".") || n.equals (".."))
{
continue;
}
if (f[i].isDirectory ())
{
purgeFiles (f[i]);
}
f[i].delete ();
}
}
root.delete ();
}
public void initServer ()
{
taoRoot = System.getenv ("TAO_ROOT");
aceRoot = System.getenv ("ACE_ROOT");
nsPersist = "nserv";
grpPersist = "gserv";
nsIorFile = "ns.ior";
nsIor = "file://ns.ior";
primaryIorFile = nsPersist + File.separator + "ns_replica_primary.ior";
backupIorFile = nsPersist + File.separator + "ns_replica_backup.ior";
File dir = new File (nsPersist);
if (dir.exists ())
{
purgeFiles (dir);
}
dir.mkdir ();
dir = new File (grpPersist);
if (dir.exists ())
{
purgeFiles (dir);
}
dir.mkdir ();
System.out.println ("Starting primary TAO NameService");
System.out.println ("waiting for " + primaryIorFile );
primaryCmd =
new ProcessBuilder (taoRoot + "/orbsvcs/FT_Naming_Service/tao_ft_naming",
"--primary",
"-ORBListenEndPoints", "iiop://127.0.0.1:37107",
"-ORBDebugLevel", "10",
"-ORBLogFile", "ns_primary.log",
"-r", nsPersist,
"-v", grpPersist);
startServer (1);
System.out.println ("Starting backup TAO NameService");
backupCmd =
new ProcessBuilder (taoRoot + "/orbsvcs/FT_Naming_Service/tao_ft_naming",
"--backup",
"-ORBListenEndPoints", "iiop://127.0.0.1:37110",
"-ORBDebugLevel", "10",
"-ORBLogFile", "ns_backup.log",
"-c", nsIorFile,
"-r", nsPersist,
"-v", grpPersist);
startServer (2);
File f = new File (nsIorFile);
try
{
for (int retries = 0; !f.exists () && retries < 5; retries ++)
{
Thread.currentThread ().sleep (1000);
}
}
catch (Exception ex)
{
System.out.println ("Caught starting backup " + ex);
}
try
{
System.out.println ("invoking tao_nsadd --ns " + nsIor + " --name test1 --ior " + nsIor);
ProcessBuilder util = new ProcessBuilder ("tao_nsadd",
"--ns", nsIor,
"--name", "test1",
"--ior", nsIor);
Process p = util.start ();
p.waitFor ();
List<String> args = util.command ();
args.set (4, "test2");
System.out.println ("invoking tao_nsadd --ns " + nsIor + " --name test2 --ior " + nsIor);
p = util.start ();
p.waitFor ();
}
catch (Exception ex)
{
System.out.println ("Caught populating ns " + ex);
}
}
public void cleanup ()
{
kill (0);
purgeFiles (new File (nsPersist));
purgeFiles (new File (grpPersist));
File f = new File (nsIorFile);
f.delete ();
}
public void startServer (int which)
{
try
{
File f;
if (which == 1)
{
primary = primaryCmd.start ();
f = new File (primaryIorFile);
}
else
{
backup = backupCmd.start ();
f = new File (backupIorFile);
}
for (int retries = 0; !f.exists () && retries < 10; retries ++)
{
Thread.currentThread ().sleep (1000);
}
if (!f.exists ())
{
System.out.println ("Failed to start ns #" + which);
}
else
{
System.out.println ("Started ns #" + which);
}
}
catch (Exception ex)
{
System.out.println ("Caught starting ns #" + which + " " + ex);
}
}
public void kill (int which)
{
if (which != 2)
{
primary.destroy ();
File f = new File (primaryIorFile);
f.delete ();
System.out.println ("Killed ns #1");
}
if (which != 1)
{
backup.destroy ();
File f = new File (backupIorFile);
f.delete ();
System.out.println ("Killed ns #2");
}
}
public static void main( String args[] )
{
NSTest nstest = new NSTest ();
nstest.initServer ();
try
{
Properties props = new Properties();
props.setProperty ("ORBInitRef.NameService",nstest.nsIor);
props.setProperty ("jacorb.log.default.verbosity","2");
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init( args, props );
System.out.println ("invoking narrow");
nstest.ctx = NamingContextExtHelper.narrow
(orb.resolve_initial_references ("NameService"));
System.out.println ("resolve 1");
nstest.retry_resolve ("test1", true);
nstest.kill (1);
Thread.currentThread ().sleep (5000);
System.out.println ("resolve 2");
nstest.retry_resolve ("test2", true);
nstest.startServer (1);
nstest.kill (2);
Thread.currentThread ().sleep (5000);
System.out.println ("resolve 3");
nstest.retry_resolve ("test1", true);
}
catch( Exception ex )
{
ex.printStackTrace();
}
nstest.cleanup ();
}
}