package org.jacorb.test.bugs.bugjac178; import java.util.ArrayList; import java.util.List; import org.jacorb.config.Configurable; import org.jacorb.config.Configuration; import org.jacorb.config.ConfigurationException; import org.omg.CORBA.INTERNAL; import org.omg.CORBA.ORB; import org.omg.CORBA.Policy; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; /** * <code>JAC178Impl</code> is the implementation code to test SINGLE_THREAD and * ORB_CTRL threading models within the POA. * * @author Nick Cross */ public class JAC178Impl extends JAC178POA implements Configurable { /** * <code>orb</code> is the ORB instance. */ private ORB orb; /** * <code>rootPoa</code> is the root POA. */ private POA rootPoa; /** * <code>result</code> holds an ordered list the of operation calls to return * for checking. */ private static List<String> result = new ArrayList<String>(); public JAC178Impl() { super(); } public JAC178Impl(ORB orb, POA poa) { this(); this.orb = orb; this.rootPoa = poa; } /** * <code>getObject</code> returns a child object within a new POA using the * selected threading model. * * @param sessionID a <code>String</code> value * @return an <code>org.omg.CORBA.Object</code> value */ public org.omg.CORBA.Object getObject (String sessionID) { try { // Create child using the supplied session ID Policy policies[] = new Policy[1]; // The sessionID encodes which thread model to use (sneaky!). if (sessionID.startsWith ("Single")) { policies[0] = rootPoa.create_thread_policy( org.omg.PortableServer.ThreadPolicyValue.SINGLE_THREAD_MODEL); } else { policies[0] = rootPoa.create_thread_policy( org.omg.PortableServer.ThreadPolicyValue.ORB_CTRL_MODEL); } POA poa = rootPoa.create_POA(sessionID, rootPoa.the_POAManager(), policies); JAC178Impl child = new JAC178Impl(orb, poa); poa.activate_object (child); org.omg.CORBA.Object obj = poa.servant_to_reference( child ); return obj; } catch (Exception e) { throw new INTERNAL("Test error " + e); } } /** * <code>shortOp</code> is the quick short operation to be interleaved with the * longOp. * * @param name a <code>String</code> value */ public void shortOp (String name) { add ("begin-shortOp" + name); try { Thread.sleep (1000); } catch (InterruptedException e) { throw new INTERNAL("Test error - was interrupted" + e); } add ("end-shortOp" + name); } /** * <code>longOp</code> is the long operation * @see #shortOp(String) */ public void longOp () { add ("begin-longOp"); try { Thread.sleep (5000); } catch (InterruptedException e) { throw new INTERNAL("Test error - was interrupted" + e); } add ("end-longOp"); } /** * <code>getResult</code> returns operations in order of execution. * * @return a <code>String</code> value */ public String getResult () { try { return result.toString (); } finally { result.clear(); } } /** * <code>add</code> adds the operation name to the stack. * * @param name a <code>String</code> value */ private synchronized void add (String name) { result.add(name); } public void configure(Configuration arg0) throws ConfigurationException { org.jacorb.config.Configuration config = arg0; orb = config.getORB(); try { rootPoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); } catch (InvalidName e) { throw new RuntimeException(); } } }