package org.jacorb.demo.policies;
import java.io.*;
import org.omg.CORBA.*;
import org.omg.Messaging.*;
/**
* A simple org.jacorb.demo.that shows how to use CORBA QoS policies at the level
* of individual objects, or ORB-wide. This is a variaton on hello
* world and relies on IOR files rather than the naming service.
*
* @author Gerald Brose
*/
public class Client
{
public static final int MSEC_FACTOR = 10000;
public static final int ONE_SECOND = 1000 * MSEC_FACTOR;
public static void main( String args[] ) throws Exception
{
if( args.length != 1 )
{
System.out.println( "Usage: jaco org.jacorb.demo.policies.Client <ior_file>" );
return;
}
// read IOR from file
File f = new File( args[ 0 ] );
if( ! f.exists() )
{
System.out.println("File " + args[0] +
" does not exist.");
System.exit( -1 );
}
//check if args[0] points to a directory
if( f.isDirectory() )
{
System.out.println("File " + args[0] +
" is a directory.");
System.exit( -1 );
}
BufferedReader br =
new BufferedReader( new FileReader( f ));
// initialize the ORB
ORB orb = ORB.init( args, null );
// get object reference from command-line argument file
org.omg.CORBA.Object obj =
orb.string_to_object( br.readLine() );
br.close();
// and narrow it to HelloWorld.GoodDay
// if this fails, a BAD_PARAM will be thrown
GoodDay goodDay = GoodDayHelper.narrow( obj );
// get PolicyManager and create policies ....
PolicyManager policyManager =
PolicyManagerHelper.narrow( orb.resolve_initial_references("ORBPolicyManager"));
// create an timeout value of 1 sec. The unit is a time
// step of 100 nano secs., so 10000 of these make up a
// micro second.
Any rrtPolicyAny = orb.create_any();
rrtPolicyAny.insert_ulonglong( ONE_SECOND );
// create a relative roundtrip timeout policy and set this
// policy ORB-wide
Policy rrtPolicy =
orb.create_policy( RELATIVE_RT_TIMEOUT_POLICY_TYPE.value,
rrtPolicyAny );
policyManager.set_policy_overrides( new Policy[] {rrtPolicy},
SetOverrideType.ADD_OVERRIDE);
// create a sync scope policy
Any syncPolicyAny = orb.create_any();
syncPolicyAny.insert_short( SYNC_WITH_SERVER.value );
Policy syncPolicy =
orb.create_policy( SYNC_SCOPE_POLICY_TYPE.value, syncPolicyAny );
// set the sync scope policy on an object reference
goodDay = GoodDayHelper.narrow(
goodDay._set_policy_override( new Policy[] {syncPolicy},
SetOverrideType.ADD_OVERRIDE) );
// try to invoke the operation and print the result: this
// should result in a timeout exception because the server
// will sleep longer than the timeout (sleep is int msecs.)
System.out.println( "Should see a TIMEOUT exception soon...");
try
{
System.out.println( goodDay.hello( 2000 ) );
System.out.println( "... should not be here, no exception!");
}
catch ( org.omg.CORBA.TIMEOUT t )
{
System.out.println( "here it is: " + t.getMessage());
}
// create another timeout poliy
Any objRrtPolicyAny = orb.create_any();
objRrtPolicyAny.insert_ulonglong( 4 * ONE_SECOND );
Policy objRrtPolicy =
orb.create_policy( RELATIVE_RT_TIMEOUT_POLICY_TYPE.value,
objRrtPolicyAny );
goodDay = GoodDayHelper.narrow(
goodDay._set_policy_override( new Policy[] {objRrtPolicy},
SetOverrideType.ADD_OVERRIDE));
// see what the effective policy is now...
Policy objPol =
goodDay._get_policy( RELATIVE_RT_TIMEOUT_POLICY_TYPE.value );
if ( objPol != null)
{
long timoutValue = ((RelativeRoundtripTimeoutPolicy)objPol).relative_expiry();
System.out.println("Object-level timeout is " + timoutValue + " timesteps (100ns)");
// try the invocation again, in this case the override
// policy's new timeout should be sufficient to let
// the call come back
System.out.println( goodDay.hello( 100 ));
}
else
{
System.out.println("ERROR, no Object-level timeout found");
}
goodDay.shutdown();
}
}