package org.jacorb.test.harness;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
import java.util.Properties;
import org.jacorb.config.Configurable;
import org.jacorb.config.Configuration;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Policy;
import org.omg.PortableServer.IdAssignmentPolicyValue;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.Servant;
import org.slf4j.Logger;
/**
* A server program that can set up an arbitrary CORBA servant.
* The program takes the name of the servant class to use from
* the command line. It then creates an instance of this class,
* using its no-arg constructor (which must exist). It registers
* the instance with the POA, and prints the resulting IOR to
* standard output. If anything goes wrong, a message starting
* with the string "ERROR" is instead written to standard output.
* <p>
* This program is intended to be used with a
* {@link ClientServerSetup ClientServerSetup}. To read and process
* the <code>TestServer</code>'s output from another program such as
* the above, JacORB's normal diagnostic messages should be completely
* silenced. This must be done using the normal configuration settings,
* e.g. from the command line (see
* {@link ServerSetup#setUp} for an
* example).
* <p>
* @author Andre Spiegel <spiegel@gnu.org>
*/
public class TestServer
{
/**
* The Constant TRUE.
*/
private static final String TRUE = "true";
/**
* The Constant ON.
*/
private static final String ON = "on";
private static Boolean useCorbaloc = null;
private static Boolean useIMR = null;
/**
* Returns true if this TestServer should make its object available
* via a corbaloc URL.
*/
public static boolean useCorbaloc()
{
if (useCorbaloc == null)
{
String value = System.getProperty ("jacorb.test.corbaloc.enable", "false").trim();
useCorbaloc = Boolean.valueOf ((ON.equals(value) || TRUE.equals(value)));
}
return useCorbaloc.booleanValue();
}
/**
* Returns true if this TestServer should use an IMR.
*/
public static boolean useIMR()
{
if (useIMR == null)
{
String value = System.getProperty ("jacorb.use_imr", "false").trim();
useIMR = Boolean.valueOf ((ON.equals(value) || TRUE.equals(value)));
}
return useIMR.booleanValue();
}
/**
* Creates and returns the POA with which the test server object should be
* registered. In the normal case, this is just the RootPOA. When
* Corbaloc is used, a child POA with the appropriate settings is created
* and returned.
*/
public static POA createPOA (ORB orb) throws Exception
{
POA rootPOA = POAHelper.narrow
(
orb.resolve_initial_references ("RootPOA")
);
if (useCorbaloc() || useIMR())
{
Policy[] p = new Policy[2];
p[0] = rootPOA.create_lifespan_policy (LifespanPolicyValue.PERSISTENT);
p[1] = rootPOA.create_id_assignment_policy (IdAssignmentPolicyValue.USER_ID);
POA poa = rootPOA.create_POA
(
System.getProperty("jacorb.test.corbaloc.poaname",
System.getProperty("jacorb.implname", Integer.toString(orb.hashCode()))),
rootPOA.the_POAManager(), p
);
poa.the_POAManager().activate();
return poa;
}
else
{
rootPOA.the_POAManager().activate();
return rootPOA;
}
}
/**
* Returns the Corbaloc URL under which the test server object
* can be accessed. This only works if jacorb.test.corbaloc.enable is
* true, and the additional parameters are set via properties, see below.
*/
public static String getCorbaloc()
{
StringBuffer result = new StringBuffer();
result.append ("corbaloc::localhost:");
result.append (System.getProperty ("jacorb.test.corbaloc.port"));
result.append ("/");
result.append (System.getProperty ("jacorb.test.corbaloc.implname"));
result.append ("/");
result.append (System.getProperty ("jacorb.test.corbaloc.poaname"));
result.append ("/");
result.append (System.getProperty ("jacorb.test.corbaloc.objectid"));
return result.toString();
}
public static void main (String[] args)
{
Thread.currentThread().setContextClassLoader(TestServer.class.getClassLoader());
Logger logger = null;
try
{
Properties props = new Properties(System.getProperties());
if (useCorbaloc())
{
props.put ("OAPort",
System.getProperty("jacorb.test.corbaloc.port", "0"));
props.put ("OASSLPort",
System.getProperty("jacorb.test.corbaloc.sslport", "0"));
props.put ("jacorb.implname",
System.getProperty("jacorb.test.corbaloc.implname"));
}
//init ORB
ORB orb = ORB.init (args, props);
log("init ORB (using corbaloc " + useCorbaloc() + " and using imr " + useIMR());
try
{
Configuration config = ((org.jacorb.orb.ORB)orb).getConfiguration();
logger = config.getLogger("TestServer");
}
catch (ClassCastException e)
{
// ignore. not a JacORB ORB
}
//init POA
POA poa = createPOA (orb);
log("init POA");
final String servantName = args[0];
log("use ServantClass: " + servantName);
Class<?> servantClass = TestUtils.classForName(servantName);
Servant servant = ( Servant ) servantClass.newInstance();
log("using Servant: " + servant);
if (servant instanceof Configurable && orb instanceof org.jacorb.orb.ORB)
{
((Configurable)servant).configure (((org.jacorb.orb.ORB)orb).getConfiguration());
log("configured Servant");
}
final String ior;
if (useCorbaloc())
{
String oid = System.getProperty ("jacorb.test.corbaloc.objectid");
poa.activate_object_with_id (oid.getBytes(), servant);
String shortcut = System.getProperty ("jacorb.test.corbaloc.shortcut");
if (shortcut != null)
((org.jacorb.orb.ORB)orb).addObjectKey(shortcut,
System.getProperty ("jacorb.test.corbaloc.implname")
+ "/" + System.getProperty ("jacorb.test.corbaloc.poaname")
+ "/" + System.getProperty ("jacorb.test.corbaloc.objectid"));
ior = "SERVER IOR: " + getCorbaloc();
}
else
{
// create the object reference
org.omg.CORBA.Object obj = null;
if (useIMR())
{
poa.activate_object_with_id (servant.getClass().getName().getBytes(), servant);
obj = poa.id_to_reference (servant.getClass().getName().getBytes());
}
else
{
obj = poa.servant_to_reference( servant );
}
ior = "SERVER IOR: " + orb.object_to_string(obj);
}
/**
* NOTE: output SERVER IOR for client to pick it up.
* Don't delete or the test will fail.
*/
System.out.println(ior);
TestUtils.getLogger().debug("using IOR: " + ior);
System.out.flush();
if (logger != null)
{
logger.debug("Entering ORB event loop" );
}
// wait for requests
orb.run();
}
catch( Exception e )
{
if (logger != null)
{
logger.error ("TestServer error ", e);
}
else
{
System.err.println ("TestServer error " + e);
e.printStackTrace ();
}
}
}
private static void log(String msg)
{
TestUtils.getLogger().debug("TestServer: " + msg);
}
}