1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43:
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58:
59: import ;
60:
61: import ;
62:
63:
72: public class IorDelegate extends SimpleDelegate
73: {
74:
77: public IorDelegate(ORB an_orb, IOR an_ior)
78: {
79: super(an_orb, an_ior);
80: }
81:
82:
95: public Request create_request(org.omg.CORBA.Object target, Context context,
96: String operation, NVList parameters, NamedValue returns
97: )
98: {
99: gnuRequest request = getRequestInstance(target);
100:
101: request.setIor(getIor());
102: request.set_target(target);
103:
104: request.setOperation(operation);
105: request.set_args(parameters);
106: request.m_context = context;
107: request.set_result(returns);
108: request.setORB(orb);
109:
110: return request;
111: }
112:
113:
124: public Request create_request(org.omg.CORBA.Object target, Context context,
125: String operation, NVList parameters, NamedValue returns,
126: ExceptionList exceptions, ContextList ctx_list
127: )
128: {
129: gnuRequest request = getRequestInstance(target);
130:
131: request.setIor(ior);
132: request.set_target(target);
133:
134: request.setOperation(operation);
135: request.set_args(parameters);
136: request.m_context = context;
137: request.set_result(returns);
138: request.set_exceptions(exceptions);
139: request.set_context_list(ctx_list);
140: request.setORB(orb);
141:
142: return request;
143: }
144:
145:
148: protected gnuRequest getRequestInstance(org.omg.CORBA.Object target)
149: {
150: return new gnuRequest();
151: }
152:
153:
174: public InputStream invoke(org.omg.CORBA.Object target, OutputStream output)
175: throws ApplicationException, RemarshalException
176: {
177: StreamBasedRequest request = (StreamBasedRequest) output;
178: Forwardings: while (true)
179: {
180: try
181: {
182: if (request.response_expected)
183: {
184: RawReply response = request.request.submit();
185:
186:
187: ReplyHeader rh = response.header.create_reply_header();
188: BufferredCdrInput input = response.getStream();
189: input.setOrb(orb);
190: rh.read(input);
191: request.request.m_rph = rh;
192:
193: boolean moved_permanently = false;
194:
195: switch (rh.reply_status)
196: {
197: case ReplyHeader.NO_EXCEPTION:
198: if (request.request.m_interceptor != null)
199: request.request.m_interceptor.receive_reply(request.request.m_info);
200: if (response.header.version.since_inclusive(1, 2))
201: input.align(8);
202: return input;
203:
204: case ReplyHeader.SYSTEM_EXCEPTION:
205: if (response.header.version.since_inclusive(1, 2))
206: input.align(8);
207: showException(request, input);
208:
209: throw ObjectCreator.readSystemException(input,
210: rh.service_context);
211:
212: case ReplyHeader.USER_EXCEPTION:
213: if (response.header.version.since_inclusive(1, 2))
214: input.align(8);
215: showException(request, input);
216:
217: throw new ApplicationException(
218: request.request.m_exception_id, input);
219:
220: case ReplyHeader.LOCATION_FORWARD_PERM:
221: moved_permanently = true;
222:
223: case ReplyHeader.LOCATION_FORWARD:
224: if (response.header.version.since_inclusive(1, 2))
225: input.align(8);
226:
227: IOR forwarded = new IOR();
228: try
229: {
230: forwarded._read_no_endian(input);
231: }
232: catch (IOException ex)
233: {
234: MARSHAL t = new MARSHAL("Cant read forwarding info",
235: 5102, CompletionStatus.COMPLETED_NO);
236: t.initCause(ex);
237: throw t;
238: }
239:
240: gnuRequest prev = request.request;
241: gnuRequest r = getRequestInstance(target);
242:
243: r.m_interceptor = prev.m_interceptor;
244: r.m_slots = prev.m_slots;
245:
246: r.m_args = prev.m_args;
247: r.m_context = prev.m_context;
248: r.m_context_list = prev.m_context_list;
249: r.m_environment = prev.m_environment;
250: r.m_exceptions = prev.m_exceptions;
251: r.m_operation = prev.m_operation;
252: r.m_parameter_buffer = prev.m_parameter_buffer;
253: r.m_parameter_buffer.request = r;
254: r.m_result = prev.m_result;
255: r.m_target = prev.m_target;
256: r.oneWay = prev.oneWay;
257: r.m_forward_ior = forwarded;
258:
259: if (r.m_interceptor != null)
260: r.m_interceptor.receive_other(r.m_info);
261:
262: r.setIor(forwarded);
263:
264: IorObject it = new IorObject(orb,
265: forwarded);
266:
267: r.m_target = it;
268:
269: request.request = r;
270:
271: IOR prev_ior = getIor();
272:
273: setIor(forwarded);
274:
275: try
276: {
277: return invoke(it, request);
278: }
279: finally
280: {
281: if (!moved_permanently)
282: setIor(prev_ior);
283: }
284:
285: default:
286: throw new MARSHAL("Unknow reply status: "
287: + rh.reply_status, 8000 + rh.reply_status,
288: CompletionStatus.COMPLETED_NO);
289: }
290: }
291: else
292: {
293: request.request.send_oneway();
294: return null;
295: }
296: }
297: catch (ForwardRequest forwarded)
298: {
299: ForwardRequest fw = forwarded;
300: Forwarding2: while (true)
301: {
302: try
303: {
304: gnuRequest prev = request.request;
305: gnuRequest r = getRequestInstance(target);
306:
307: r.m_interceptor = prev.m_interceptor;
308: r.m_args = prev.m_args;
309: r.m_context = prev.m_context;
310: r.m_context_list = prev.m_context_list;
311: r.m_environment = prev.m_environment;
312: r.m_exceptions = prev.m_exceptions;
313: r.m_operation = prev.m_operation;
314: r.m_parameter_buffer = prev.m_parameter_buffer;
315: r.m_parameter_buffer.request = r;
316: r.m_result = prev.m_result;
317: r.m_target = prev.m_target;
318: r.oneWay = prev.oneWay;
319:
320: r.m_forwarding_target = fw.forward;
321:
322: if (r.m_interceptor != null)
323: r.m_interceptor.receive_other(r.m_info);
324:
325: r.m_target = fw.forward;
326: request.request = r;
327: break Forwarding2;
328: }
329: catch (ForwardRequest e)
330: {
331: forwarded = e;
332: }
333: }
334: }
335: }
336: }
337:
338:
341: void showException(StreamBasedRequest request, BufferredCdrInput input)
342: throws ForwardRequest
343: {
344: input.mark(2048);
345: request.request.m_exception_id = input.read_string();
346: input.reset();
347:
348: if (request.request.m_interceptor != null)
349: request.request.m_interceptor.receive_exception(request.request.m_info);
350: }
351:
352:
360: public Request request(org.omg.CORBA.Object target, String operation)
361: {
362: gnuRequest request = getRequestInstance(target);
363:
364: request.setIor(ior);
365: request.set_target(target);
366:
367: request.setOperation(operation);
368: request.setORB(orb);
369:
370: return request;
371: }
372:
373:
383: public OutputStream request(org.omg.CORBA.Object target, String operation,
384: boolean response_expected
385: )
386: {
387: gnuRequest request = getRequestInstance(target);
388:
389: request.setIor(ior);
390: request.set_target(target);
391: request.setOperation(operation);
392:
393: StreamBasedRequest out = request.getParameterStream();
394: out.response_expected = response_expected;
395: request.setORB(orb);
396: out.setOrb(orb);
397:
398: return out;
399: }
400:
401:
408: public void release(org.omg.CORBA.Object target)
409: {
410: String key = ior.Internet.host + ":" + ior.Internet.port;
411:
412: Socket socket = SocketRepository.get_socket(key);
413: try
414: {
415: if (socket != null)
416: {
417: socket.close();
418: }
419: }
420: catch (IOException ex)
421: {
422:
423: }
424: }
425:
426:
430: public void setIor(IOR an_ior)
431: {
432: super.setIor(an_ior);
433: }
434:
435:
438: public boolean is_local(org.omg.CORBA.Object self)
439: {
440: return false;
441: }