summaryrefslogtreecommitdiff
path: root/gnu/CORBA/gnuRequest.java
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/CORBA/gnuRequest.java')
-rw-r--r--gnu/CORBA/gnuRequest.java638
1 files changed, 509 insertions, 129 deletions
diff --git a/gnu/CORBA/gnuRequest.java b/gnu/CORBA/gnuRequest.java
index cbff17f69..3784eba6a 100644
--- a/gnu/CORBA/gnuRequest.java
+++ b/gnu/CORBA/gnuRequest.java
@@ -44,27 +44,43 @@ import gnu.CORBA.GIOP.MessageHeader;
import gnu.CORBA.GIOP.ReplyHeader;
import gnu.CORBA.GIOP.RequestHeader;
import gnu.CORBA.GIOP.cxCodeSet;
+import gnu.CORBA.Interceptor.gnuClientRequestInfo;
+import gnu.CORBA.Poa.ORB_1_4;
import org.omg.CORBA.ARG_IN;
import org.omg.CORBA.ARG_INOUT;
import org.omg.CORBA.ARG_OUT;
import org.omg.CORBA.Any;
import org.omg.CORBA.BAD_INV_ORDER;
+import org.omg.CORBA.BAD_PARAM;
import org.omg.CORBA.Bounds;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.Context;
import org.omg.CORBA.ContextList;
import org.omg.CORBA.Environment;
import org.omg.CORBA.ExceptionList;
+import org.omg.CORBA.INV_POLICY;
import org.omg.CORBA.MARSHAL;
+import org.omg.CORBA.NO_IMPLEMENT;
import org.omg.CORBA.NO_RESOURCES;
import org.omg.CORBA.NVList;
import org.omg.CORBA.NamedValue;
import org.omg.CORBA.ORB;
+import org.omg.CORBA.Policy;
import org.omg.CORBA.Request;
import org.omg.CORBA.SystemException;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.UnknownUserException;
+import org.omg.CORBA.portable.ObjectImpl;
+import org.omg.IOP.ServiceContext;
+import org.omg.IOP.TAG_CODE_SETS;
+import org.omg.IOP.TAG_INTERNET_IOP;
+import org.omg.IOP.TaggedComponent;
+import org.omg.IOP.TaggedProfile;
+import org.omg.PortableInterceptor.ClientRequestInfo;
+import org.omg.PortableInterceptor.ClientRequestInterceptorOperations;
+import org.omg.PortableInterceptor.ForwardRequest;
+import org.omg.PortableInterceptor.InvalidSlot;
import java.io.IOException;
import java.io.InputStream;
@@ -73,14 +89,14 @@ import java.io.OutputStream;
import java.net.BindException;
import java.net.Socket;
+import java.util.ArrayList;
+
/**
* The implementation of the CORBA request.
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class gnuRequest
- extends Request
- implements Cloneable
+public class gnuRequest extends Request implements Cloneable
{
/**
* The maximal supported GIOP version.
@@ -88,25 +104,34 @@ public class gnuRequest
public static Version MAX_SUPPORTED = new Version(1, 2);
/**
- * The initial pause that the Request makes when
- * the required port is not available.
+ * The initial pause that the Request makes when the required port is not
+ * available.
*/
public static int PAUSE_INITIAL = 50;
/**
- * The number of repretetive attempts to get a required
- * port, if it is not immediately available.
+ * The number of repretetive attempts to get a required port, if it is not
+ * immediately available.
*/
public static int PAUSE_STEPS = 12;
/**
- * The maximal pausing interval between two repetetive attempts.
- * The interval doubles after each unsuccessful attempt, but
- * will not exceed this value.
+ * The maximal pausing interval between two repetetive attempts. The interval
+ * doubles after each unsuccessful attempt, but will not exceed this value.
*/
public static int PAUSE_MAX = 1000;
/**
+ * The interceptor, listening the major request submission points.
+ */
+ ClientRequestInterceptorOperations m_interceptor;
+
+ /**
+ * The request info, used by interceptor.
+ */
+ ClientRequestInfo m_info = new gnuClientRequestInfo(this);
+
+ /**
* The empty byte array.
*/
private static final binaryReply EMPTY =
@@ -123,14 +148,13 @@ public class gnuRequest
protected ContextList m_context_list;
/**
- * The request environment for holding the exception
- * the has possibly been thrown by the method being invoked.
+ * The request environment for holding the exception the has possibly been
+ * thrown by the method being invoked.
*/
protected Environment m_environment = new gnuEnvironment();
/**
- * The list of all exceptions that can be thrown by the
- * method being invoked.
+ * The list of all exceptions that can be thrown by the method being invoked.
*/
protected ExceptionList m_exceptions = new gnuExceptionList();
@@ -140,6 +164,16 @@ public class gnuRequest
protected NamedValue m_result = new gnuNamedValue();
/**
+ * The exception id, received from the server, null if none.
+ */
+ protected String m_exception_id;
+
+ /**
+ * The thrown system exception.
+ */
+ protected SystemException m_sys_ex;
+
+ /**
* The invocation target.
*/
protected org.omg.CORBA.Object m_target;
@@ -150,20 +184,32 @@ public class gnuRequest
protected String m_operation;
/**
- * The flag, indicating that the request has been sent
- * and the result is already received.
+ * This field temporary remembers the value of the forwarded ior reference. If
+ * it is not null, the request was forwarded and the effective target is not
+ * the same as the default target.
+ */
+ public IOR m_forward_ior;
+
+ /**
+ * Is set when object, and not IOR is directly available.
+ */
+ public org.omg.CORBA.Object m_forwarding_target;
+
+ /**
+ * The flag, indicating that the request has been sent and the result is
+ * already received.
*/
protected boolean complete;
/**
- * The flag, indicating that the response to this request must be
- * ignored (used with {@link #send_oneway()}).
+ * The flag, indicating that the response to this request must be ignored
+ * (used with {@link #send_oneway()}).
*/
protected boolean oneWay;
/**
- * The flag, indicating that the request has been sent
- * and no result is yet received.
+ * The flag, indicating that the request has been sent and no result is yet
+ * received.
*/
protected boolean running;
@@ -173,12 +219,27 @@ public class gnuRequest
protected gnuNVList m_args = new gnuNVList();
/**
- * The request arguments in the case when they are directly written into
- * the parameter buffer.
+ * The request arguments in the case when they are directly written into the
+ * parameter buffer.
*/
protected streamRequest m_parameter_buffer;
/**
+ * The array of slots.
+ */
+ protected Any[] m_slots;
+
+ /**
+ * The request header currently in use.
+ */
+ protected RequestHeader m_rqh;
+
+ /**
+ * The reply header currently in use.
+ */
+ protected ReplyHeader m_rph;
+
+ /**
* The IOR of the target.
*/
private IOR ior;
@@ -191,17 +252,16 @@ public class gnuRequest
/**
* The encoding, used to send the message.
*
- * The default encoding is inherited from the set IOR
- * (that string reference can be encoded in either Big or
- * Little endian). If the IOR encoding is not known
- * (for example, by obtaining the reference from the naming
- * service), the Big Endian is used.
+ * The default encoding is inherited from the set IOR (that string reference
+ * can be encoded in either Big or Little endian). If the IOR encoding is not
+ * known (for example, by obtaining the reference from the naming service),
+ * the Big Endian is used.
*/
private boolean Big_endian = true;
/**
- * Set the IOR data, sufficient to find the invocation target.
- * This also sets default endian encoding for invocations.
+ * Set the IOR data, sufficient to find the invocation target. This also sets
+ * default endian encoding for invocations.
*
* @see IOR.parse(String)
*/
@@ -232,18 +292,26 @@ public class gnuRequest
public void setORB(ORB an_orb)
{
orb = an_orb;
+
+ // Take the interceptor from the ORB.
+ if (orb instanceof Restricted_ORB)
+ m_interceptor = ((Restricted_ORB) orb).iClient;
+
+ if (m_interceptor != null && orb instanceof ORB_1_4)
+ {
+ m_slots = ((ORB_1_4) orb).ic_current.clone_slots();
+ }
}
/**
- * Set the encoding that will be used to send the message.
- * The default encoding is inherited from the set IOR
- * (that string reference can be encoded in either Big or
- * Little endian). If the IOR encoding is not known
- * (for example, by obtaining the reference from the naming
- * service), the Big Endian is used.
+ * Set the encoding that will be used to send the message. The default
+ * encoding is inherited from the set IOR (that string reference can be
+ * encoded in either Big or Little endian). If the IOR encoding is not known
+ * (for example, by obtaining the reference from the naming service), the Big
+ * Endian is used.
*
- * @param use_big_endian true to use the Big Endian, false
- * to use the Little Endian encoding.
+ * @param use_big_endian true to use the Big Endian, false to use the Little
+ * Endian encoding.
*/
public void setBigEndian(boolean use_big_endian)
{
@@ -261,15 +329,15 @@ public class gnuRequest
}
/**
- * Get the parameter stream, where the invocation arguments should
- * be written if they are written into the stream directly.
+ * Get the parameter stream, where the invocation arguments should be written
+ * if they are written into the stream directly.
*/
public streamRequest getParameterStream()
{
m_parameter_buffer = new streamRequest();
m_parameter_buffer.request = this;
m_parameter_buffer.setVersion(ior.Internet.version);
- m_parameter_buffer.setCodeSet(cxCodeSet.negotiate(ior.CodeSets));
+ m_parameter_buffer.setCodeSet(cxCodeSet.negotiate(ior.Internet.CodeSets));
m_parameter_buffer.setOrb(orb);
m_parameter_buffer.setBigEndian(Big_endian);
return m_parameter_buffer;
@@ -384,33 +452,29 @@ public class gnuRequest
}
/** {@inheritDoc} */
- public void get_response()
- throws org.omg.CORBA.WrongTransaction
+ public void get_response() throws org.omg.CORBA.WrongTransaction
{
/**
- * The response is ready after it is received.
- * FIXME implement context checks and any other functionality,
- * if required.
+ * The response is ready after it is received. FIXME implement context
+ * checks and any other functionality, if required.
*/
}
/**
- * Submit the request, suspending the current thread until the
- * answer is received.
+ * Submit the request, suspending the current thread until the answer is
+ * received.
*
- * This implementation requires to set the IOR property
- * ({@link #setIOR(IOR)} before calling this method.
+ * This implementation requires to set the IOR property ({@link #setIOR(IOR)}
+ * before calling this method.
*
- * @throws BAD_INV_ORDER, minor code 0, if the IOR has not been
- * previously set.
+ * @throws BAD_INV_ORDER, minor code 0, if the IOR has not been previously
+ * set.
*
- * @throws SystemException if this exception has been thrown on
- * remote side. The exact exception type and the minor code are
- * the same as they have been for the exception, thrown on remoted
- * side.
+ * @throws SystemException if this exception has been thrown on remote side.
+ * The exact exception type and the minor code are the same as they have been
+ * for the exception, thrown on remoted side.
*/
- public synchronized void invoke()
- throws BAD_INV_ORDER
+ public synchronized void invoke() throws BAD_INV_ORDER
{
waitWhileBusy();
complete = false;
@@ -421,7 +485,32 @@ public class gnuRequest
try
{
- p_invoke();
+ Forwardings:
+ while (true)
+ {
+ try
+ {
+ p_invoke();
+ break Forwardings;
+ }
+ catch (ForwardRequest e)
+ {
+ try
+ {
+ ObjectImpl impl = (ObjectImpl) e.forward;
+ Simple_delegate delegate =
+ (Simple_delegate) impl._get_delegate();
+ ior = delegate.getIor();
+ }
+ catch (Exception ex)
+ {
+ BAD_PARAM bad =
+ new BAD_PARAM("Unsupported forwarding target");
+ bad.initCause(ex);
+ throw bad;
+ }
+ }
+ }
}
finally
{
@@ -456,7 +545,8 @@ public class gnuRequest
return m_result;
}
- /** {@inheritDoc}
+ /**
+ * {@inheritDoc}
*
*/
public Any return_value()
@@ -478,9 +568,8 @@ public class gnuRequest
}
/**
- * Send a request and forget about it, not waiting for a response.
- * This can be done also for methods that normally are expected
- * to return some values.
+ * Send a request and forget about it, not waiting for a response. This can be
+ * done also for methods that normally are expected to return some values.
*
* TODO It is generally recommended to reuse the threads. Reuse?
*/
@@ -499,9 +588,8 @@ public class gnuRequest
}
/**
- * Set the argument list.
- * This field is initialised as empty non null instance by default,
- * so the method is only used in cases when the direct replacement
+ * Set the argument list. This field is initialised as empty non null instance
+ * by default, so the method is only used in cases when the direct replacement
* is desired.
*
* @param a_args the argument list.
@@ -529,8 +617,8 @@ public class gnuRequest
}
/**
- * Set the context list that is later returned by the
- * method {@link #contexts()}.
+ * Set the context list that is later returned by the method
+ * {@link #contexts()}.
*
* @param a_context_list a new context list.
*/
@@ -540,10 +628,9 @@ public class gnuRequest
}
/**
- * Set the exception container.
- * This field is initialised as empty non null instance by default,
- * so the method is only used in cases when the direct replacement
- * is desired.
+ * Set the exception container. This field is initialised as empty non null
+ * instance by default, so the method is only used in cases when the direct
+ * replacement is desired.
*
* @param a_environment the new exception container.
*/
@@ -553,10 +640,9 @@ public class gnuRequest
}
/**
- * Set the list of exceptions.
- * This field is initialised as empty non null instance by default,
- * so the method is only used in cases when the direct replacement
- * is desired.
+ * Set the list of exceptions. This field is initialised as empty non null
+ * instance by default, so the method is only used in cases when the direct
+ * replacement is desired.
*
* @param a_exceptions a list of exceptions.
*/
@@ -576,10 +662,9 @@ public class gnuRequest
}
/**
- * Set the named value, returned as result.
- * This field is initialised as empty non null instance by default,
- * so the method is only used in cases when the direct replacement
- * is desired.
+ * Set the named value, returned as result. This field is initialised as empty
+ * non null instance by default, so the method is only used in cases when the
+ * direct replacement is desired.
*
* @param a_result the result keeper.
*/
@@ -589,8 +674,8 @@ public class gnuRequest
}
/**
- * Set the type of the named value, returned as a result.
- * Instantiates a new instance of the result value.
+ * Set the type of the named value, returned as a result. Instantiates a new
+ * instance of the result value.
*/
public void set_return_type(TypeCode returns)
{
@@ -612,17 +697,16 @@ public class gnuRequest
}
/**
- * Do the actual invocation.
- * This implementation requires to set the IOR property
- * ({@link #setIOR(IOR)} before calling this method.
+ * Do the actual invocation. This implementation requires to set the IOR
+ * property ({@link #setIOR(IOR)} before calling this method.
*
- * @throws BAD_INV_ORDER, minor code 0, if the IOR has not been
- * previously set or if the direct argument addition is mixed with
- * the direct argument writing into the output stream.
+ * @throws BAD_INV_ORDER, minor code 0, if the IOR has not been previously set
+ * or if the direct argument addition is mixed with the direct argument
+ * writing into the output stream.
*
* @return the server response in binary form.
*/
- public synchronized binaryReply submit()
+ public synchronized binaryReply submit() throws ForwardRequest
{
gnu.CORBA.GIOP.MessageHeader header = new gnu.CORBA.GIOP.MessageHeader();
@@ -633,16 +717,21 @@ public class gnuRequest
header.version = useVersion(ior.Internet.version);
RequestHeader rh = header.create_request_header();
-
- rh.object_key = ior.key;
rh.operation = m_operation;
+ rh.object_key = ior.key;
+
+ // Update interceptor.
+ m_rqh = rh;
+
+ if (m_interceptor != null)
+ m_interceptor.send_request(m_info);
// Prepare the submission.
cdrBufOutput request_part = new cdrBufOutput();
request_part.setOffset(header.getHeaderSize());
request_part.setVersion(header.version);
- request_part.setCodeSet(cxCodeSet.negotiate(ior.CodeSets));
+ request_part.setCodeSet(cxCodeSet.negotiate(ior.Internet.CodeSets));
request_part.setOrb(orb);
request_part.setBigEndian(header.isBigEndian());
@@ -656,9 +745,8 @@ public class gnuRequest
if (m_parameter_buffer != null)
throw new BAD_INV_ORDER("Please either add parameters or " +
- "write them into stream, but not both " +
- "at once."
- );
+ "write them into stream, but not both " + "at once."
+ );
}
if (m_parameter_buffer != null)
@@ -714,8 +802,8 @@ public class gnuRequest
if (socket == null)
throw new NO_RESOURCES(ior.Internet.host + ":" + ior.Internet.port +
- " in use"
- );
+ " in use"
+ );
socket.setKeepAlive(true);
OutputStream socketOutput = socket.getOutputStream();
@@ -749,9 +837,9 @@ public class gnuRequest
{
MARSHAL m =
new MARSHAL("Unable to open a socket at " + ior.Internet.host + ":" +
- ior.Internet.port, 10000 + ior.Internet.port,
- CompletionStatus.COMPLETED_NO
- );
+ ior.Internet.port, 10000 + ior.Internet.port,
+ CompletionStatus.COMPLETED_NO
+ );
m.initCause(io_ex);
throw m;
}
@@ -781,9 +869,9 @@ public class gnuRequest
}
/**
- * Get the used version. Normally, it is better to respond using the
- * same version as it is specified in IOR, but not above the maximal
- * supported version.
+ * Get the used version. Normally, it is better to respond using the same
+ * version as it is specified in IOR, but not above the maximal supported
+ * version.
*/
public Version useVersion(Version desired)
{
@@ -795,12 +883,11 @@ public class gnuRequest
/**
* Wait while the response to request, submitted using
- * {@link #send_deferred()} or {@link #invoke()} (from other thread)
- * is returned.
+ * {@link #send_deferred()} or {@link #invoke()} (from other thread) is
+ * returned.
*
- * FIXME It is possible to rewrite this using
- * Object.wait() and Object.notify(), but be sure to prepare the test
- * as well.
+ * FIXME It is possible to rewrite this using Object.wait() and
+ * Object.notify(), but be sure to prepare the test as well.
*/
public synchronized void waitWhileBusy()
{
@@ -824,24 +911,25 @@ public class gnuRequest
}
/**
- * Do actual invocation. This method recursively calls itself if
- * the redirection is detected.
+ * Do actual invocation. This method recursively calls itself if the
+ * redirection is detected.
*/
- private void p_invoke()
- throws SystemException
+ private void p_invoke() throws SystemException, ForwardRequest
{
binaryReply response = submit();
- ReplyHeader rh = response.header.create_reply_header();
+ if (m_rph == null)
+ m_rph = response.header.create_reply_header();
+
cdrBufInput input = response.getStream();
input.setOrb(orb);
- rh.read(input);
+ m_rph.read(input);
// The stream must be aligned sinve v1.2, but only once.
boolean align = response.header.version.since_inclusive(1, 2);
- switch (rh.reply_status)
+ switch (m_rph.reply_status)
{
case ReplyHeader.NO_EXCEPTION :
@@ -884,6 +972,9 @@ public class gnuRequest
}
}
+ if (m_interceptor != null)
+ m_interceptor.receive_reply(m_info);
+
break;
case ReplyHeader.SYSTEM_EXCEPTION :
@@ -892,12 +983,15 @@ public class gnuRequest
input.align(8);
align = false;
}
+ readExceptionId(input);
- SystemException exception = ObjectCreator.readSystemException(input);
+ m_sys_ex = ObjectCreator.readSystemException(input);
+ m_environment.exception(m_sys_ex);
- m_environment.exception(exception);
+ if (m_interceptor != null)
+ m_interceptor.receive_exception(m_info);
- throw exception;
+ throw m_sys_ex;
case ReplyHeader.USER_EXCEPTION :
if (align)
@@ -905,15 +999,20 @@ public class gnuRequest
input.align(8);
align = false;
}
+ readExceptionId(input);
// Prepare an Any that will hold the exception.
gnuAny exc = new gnuAny();
+ exc.setOrb(orb);
exc.insert_Streamable(new streamReadyHolder(input));
UnknownUserException unuex = new UnknownUserException(exc);
m_environment.exception(unuex);
+ if (m_interceptor != null)
+ m_interceptor.receive_exception(m_info);
+
break;
case ReplyHeader.LOCATION_FORWARD_PERM :
@@ -929,24 +1028,39 @@ public class gnuRequest
catch (IOException ex)
{
new MARSHAL("Cant read forwarding info", 5103,
- CompletionStatus.COMPLETED_NO
- );
+ CompletionStatus.COMPLETED_NO
+ );
}
setIor(forwarded);
+ m_forward_ior = forwarded;
+
+ if (m_interceptor != null)
+ m_interceptor.receive_other(m_info);
+
// Repeat with the forwarded information.
p_invoke();
return;
default :
- throw new MARSHAL("Unknow reply status", 8100 + rh.reply_status,
- CompletionStatus.COMPLETED_NO
- );
+ throw new MARSHAL("Unknow reply status", 8100 + m_rph.reply_status,
+ CompletionStatus.COMPLETED_NO
+ );
}
}
/**
+ * Read exception id without changing the stream pointer position.
+ */
+ void readExceptionId(cdrBufInput input)
+ {
+ input.mark(2048);
+ m_exception_id = input.read_string();
+ input.reset();
+ }
+
+ /**
* Write the operation parameters.
*
* @param header the message header
@@ -955,9 +1069,8 @@ public class gnuRequest
* @throws MARSHAL if the attempt to write the parameters has failde.
*/
protected void write_parameter_buffer(MessageHeader header,
- cdrBufOutput request_part
- )
- throws MARSHAL
+ cdrBufOutput request_part
+ ) throws MARSHAL
{
try
{
@@ -982,9 +1095,8 @@ public class gnuRequest
* @throws MARSHAL if the attempt to write the parameters has failde.
*/
protected void write_parameters(MessageHeader header,
- cdrBufOutput request_part
- )
- throws MARSHAL
+ cdrBufOutput request_part
+ ) throws MARSHAL
{
// Align after 1.2, but only once.
boolean align = header.version.since_inclusive(1, 2);
@@ -997,7 +1109,7 @@ public class gnuRequest
{
para = m_args.item(i);
- //This bit is set both for ARG_IN and ARG_INOUT
+ // This bit is set both for ARG_IN and ARG_INOUT
if ((para.flags() & ARG_IN.value) != 0)
{
if (align)
@@ -1016,4 +1128,272 @@ public class gnuRequest
throw ierr;
}
}
+
+ /* **************Implementation of the request info operations. ***** */
+
+ /**
+ * Add context to request.
+ */
+ public void add_request_service_context(ServiceContext service_context,
+ boolean replace
+ )
+ {
+ m_rqh.addContext(service_context, replace);
+ }
+
+ /**
+ * Get the Internet profile as an effective profile.
+ */
+ public TaggedProfile effective_profile()
+ {
+ cdrBufOutput buf = new cdrBufOutput(512);
+ buf.setOrb(orb);
+ ior.Internet.write(buf);
+
+ TaggedProfile p = new TaggedProfile();
+ p.tag = TAG_INTERNET_IOP.value;
+ p.profile_data = buf.buffer.toByteArray();
+ return p;
+ }
+
+ /**
+ * Return either target or forwarded targed.
+ */
+ public org.omg.CORBA.Object effective_target()
+ {
+ return new IOR_contructed_object(orb, ior);
+ }
+
+ /**
+ * Get effective component with the give id from the Internet profile.
+ */
+ public TaggedComponent get_effective_component(int id)
+ throws BAD_PARAM
+ {
+ if (id == TAG_CODE_SETS.value)
+ {
+ // Codesets are encoded separately.
+ cdrBufOutput buf = new cdrBufOutput(512);
+ buf.setOrb(orb);
+ ior.Internet.CodeSets.write(buf);
+
+ TaggedComponent t = new TaggedComponent();
+ t.tag = TAG_CODE_SETS.value;
+ t.component_data = buf.buffer.toByteArray();
+ return t;
+ }
+ else
+ {
+ for (int i = 0; i < ior.Internet.components.size(); i++)
+ {
+ TaggedComponent c =
+ (TaggedComponent) ior.Internet.components.get(i);
+ if (c.tag == id)
+ return c;
+ }
+ }
+ throw new BAD_PARAM("No component " + id + " in the Internet profile", 28,
+ CompletionStatus.COMPLETED_MAYBE
+ );
+ }
+
+ /**
+ * Get all components with the given id from the internet profile.
+ */
+ public TaggedComponent[] get_effective_components(int id)
+ throws BAD_PARAM
+ {
+ if (id == TAG_CODE_SETS.value)
+ return new TaggedComponent[] { get_effective_component(TAG_CODE_SETS.value) };
+ else
+ {
+ ArrayList components = new ArrayList(ior.Internet.components.size());
+ for (int i = 0; i < ior.Internet.components.size(); i++)
+ {
+ TaggedComponent c =
+ (TaggedComponent) ior.Internet.components.get(i);
+ if (c.tag == id)
+ components.add(c);
+ }
+ if (components.size() == 0)
+ throw new BAD_PARAM("No component " + id +
+ " in the Internet profile", 28, CompletionStatus.COMPLETED_MAYBE
+ );
+ else
+ {
+ TaggedComponent[] t = new TaggedComponent[ components.size() ];
+ for (int i = 0; i < t.length; i++)
+ t [ i ] = (TaggedComponent) components.get(i);
+ return t;
+ }
+ }
+ }
+
+ /**
+ * This should be not implemented up till jdk 1.5 inclusive.
+ */
+ public Policy get_request_policy(int type) throws INV_POLICY
+ {
+ throw new NO_IMPLEMENT();
+ }
+
+ /** @inheritDoc */
+ public String received_exception_id()
+ {
+ return m_exception_id;
+ }
+
+ /** @inheritDoc */
+ public Any received_exception()
+ {
+ if (m_exception_id == null)
+ return null;
+
+ if (m_sys_ex != null)
+ {
+ Any a = orb.create_any();
+ ObjectCreator.insertSysException(a, m_sys_ex);
+ return a;
+ }
+
+ Exception mex = m_environment.exception();
+
+ UnknownUserException ex = (UnknownUserException) mex;
+ if (ex == null)
+ return null;
+ else
+ return ex.except;
+ }
+
+ /**
+ * Return the forwarded reference, null if none.
+ */
+ public org.omg.CORBA.Object forward_reference()
+ {
+ if (m_forwarding_target != null)
+ return m_forwarding_target;
+
+ if (m_forward_ior != null)
+ return new IOR_contructed_object(orb, m_forward_ior);
+ else
+ return null;
+ }
+
+ /**
+ * Get the slot from the slot array inside this request.
+ */
+ public Any get_slot(int id) throws InvalidSlot
+ {
+ try
+ {
+ return m_slots [ id ];
+ }
+ catch (Exception e)
+ {
+ throw new InvalidSlot("slot id " + id + ":" + e);
+ }
+ }
+
+ /**
+ * Get the reply status.
+ */
+ public short reply_status()
+ {
+ if (m_rph == null)
+ throw new BAD_INV_ORDER("Request not yet sent", 14,
+ CompletionStatus.COMPLETED_NO
+ );
+ return (short) m_rph.reply_status;
+ }
+
+ /**
+ * Get the request id.
+ */
+ public int request_id()
+ {
+ return m_rqh.request_id;
+ }
+
+ /**
+ * Return true if the response is expected.
+ */
+ public boolean response_expected()
+ {
+ return !oneWay;
+ }
+
+ /**
+ * Determines how far the request shall progress before control is returned to
+ * the client. However up till JDK 1.5 inclusive this method always returns
+ * SYNC_WITH_TRANSPORT.
+ *
+ * @return {@link org.omg.Messaging.SYNC_WITH_TRANSPORT.value (1), always.
+ *
+ * @specnote as defined in the Suns 1.5 JDK API.
+ */
+ public short sync_scope()
+ {
+ return org.omg.Messaging.SYNC_WITH_TRANSPORT.value;
+ }
+
+ /** @inheritDoc */
+ public ServiceContext get_request_service_context(int ctx_name)
+ throws BAD_PARAM
+ {
+ return gnu.CORBA.GIOP.ServiceContext.findContext(ctx_name,
+ m_rqh.service_context
+ );
+ }
+
+ /** @inheritDoc */
+ public ServiceContext get_reply_service_context(int ctx_name)
+ throws BAD_PARAM
+ {
+ if (m_rph == null)
+ throw new BAD_INV_ORDER("Reply context not yet available");
+ return gnu.CORBA.GIOP.ServiceContext.findContext(ctx_name,
+ m_rph.service_context
+ );
+ }
+
+ /** @inheritDoc */
+ public String[] operation_context()
+ {
+ return ice_contexts();
+ }
+
+ /**
+ * Get contexts as required by interceptor.
+ */
+ public String[] ice_contexts()
+ {
+ if (m_context_list == null)
+ return new String[ 0 ];
+ else
+ {
+ try
+ {
+ String[] cn = new String[ m_context_list.count() ];
+ for (int i = 0; i < cn.length; i++)
+ cn [ i ] = m_context_list.item(i);
+ return cn;
+ }
+ catch (Bounds e)
+ {
+ throw new Unexpected(e);
+ }
+ }
+ }
+
+ /**
+ * Check if the call is done via DII.
+ */
+ public void checkDii()
+ {
+ if (m_parameter_buffer != null)
+ throw new NO_RESOURCES("The invocation method provides " +
+ "no access to this resource. DII call required.", 1,
+ CompletionStatus.COMPLETED_MAYBE
+ );
+ }
} \ No newline at end of file