/*
* JacORB - a free Java ORB
*
* Copyright (C) 1999-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.
*
*/
package org.jacorb.orb.portableInterceptor;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.jacorb.orb.ORB;
import org.omg.CORBA.Any;
import org.omg.CORBA.BAD_PARAM;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.NO_RESOURCES;
import org.omg.CORBA.TypeCode;
import org.omg.Dynamic.Parameter;
import org.omg.IOP.ServiceContext;
import org.omg.PortableInterceptor.InvalidSlot;
import org.omg.PortableInterceptor.RequestInfo;
import org.omg.PortableInterceptor.UNKNOWN;
/**
* This is the abstract base class of the two
* Info classes, namely ClientRequestInfo and
* ServerRequestInfo. <br>
* See PI Spec p. 5-41ff
*
* @author Nicolas Noffke
*/
public abstract class RequestInfoImpl
extends org.omg.CORBA.LocalObject
implements RequestInfo
{
protected int request_id;
protected String operation;
protected Parameter[] arguments = null;
protected TypeCode[] exceptions = null;
protected Any result = null;
protected boolean response_expected;
protected org.omg.CORBA.Object forward_reference = null;
protected short reply_status = UNKNOWN.value;
protected org.omg.PortableInterceptor.Current current = null;
protected ORB orb;
protected short sync_scope;
protected final Map<Integer, ServiceContext> request_ctx;
protected final Map<Integer, ServiceContext> reply_ctx;
protected short caller_op = -1;
public RequestInfoImpl(ORB o)
{
super();
orb = o;
request_ctx = new HashMap<Integer, ServiceContext>();
reply_ctx = new HashMap<Integer, ServiceContext>();
}
/**
* Make the existing request ServiceContexts available to
* the interceptors. Only one ServiceContext per id
* is allowed.
*/
public void setRequestServiceContexts(ServiceContext[] ctx)
{
synchronized(request_ctx)
{
for (int i = 0; i < ctx.length; i++)
{
request_ctx.put(ctx[i].context_id, ctx[i]);
}
}
}
/**
* This is a method to be used when handling local calls that involve
* portable interceptors. There is no request/stream so we need
* to get the service contexts as an array
*/
public Collection<ServiceContext> getRequestServiceContexts()
{
return request_ctx.values ();
}
/**
* Make the existing reply ServiceContexts available to
* the interceptors. Only one ServiceContext per id
* is allowed.
*/
public void setReplyServiceContexts(ServiceContext[] ctx)
{
synchronized(reply_ctx)
{
for (int i = 0; i < ctx.length; i++)
{
reply_ctx.put(ctx[i].context_id, ctx[i]);
}
}
}
/**
* This is a method to be used when handling local calls that involve
* portable interceptors. There is no request/stream so we need
* to get the service contexts as an array
*/
public Collection<ServiceContext> getReplyServiceContexts()
{
return reply_ctx.values ();
}
public void setArguments (Parameter[] args)
{
this.arguments = args;
}
public void setResult (Any result)
{
this.result = result;
}
public org.omg.PortableInterceptor.Current current()
{
return current;
}
public void setCurrent (org.omg.PortableInterceptor.Current current)
{
this.current = current;
}
public void setReplyStatus (short reply_status)
{
this.reply_status = reply_status;
}
public void setForwardReference (org.omg.CORBA.Object forward_reference)
{
this.forward_reference = forward_reference;
}
// implementation of org.omg.PortableInterceptor.RequestInfoOperations interface
public Parameter[] arguments()
{
return arguments;
}
public String[] contexts()
{
throw new NO_RESOURCES("JacORB does not support operation contexts",
1, CompletionStatus.COMPLETED_MAYBE);
}
public TypeCode[] exceptions()
{
return exceptions;
}
public org.omg.CORBA.Object forward_reference()
{
return forward_reference;
}
public ServiceContext get_reply_service_context(int id)
{
final ServiceContext result;
synchronized(reply_ctx)
{
result = reply_ctx.get(id);
}
if (result == null)
{
throw new BAD_PARAM("No ServiceContext with id " + id, 26, CompletionStatus.COMPLETED_MAYBE);
}
return result;
}
public ServiceContext get_request_service_context(int id)
{
final ServiceContext result;
synchronized(request_ctx)
{
result = request_ctx.get(Integer.valueOf(id));
}
if (result == null)
{
throw new BAD_PARAM("No ServiceContext with id " + id, 26, CompletionStatus.COMPLETED_MAYBE);
}
return result;
}
public Any get_slot(int id) throws InvalidSlot
{
return current.get_slot(id);
}
public String operation() {
return operation;
}
public String[] operation_context()
{
throw new NO_RESOURCES("JacORB does not support operation contexts", 1,
CompletionStatus.COMPLETED_MAYBE);
}
public short reply_status()
{
return reply_status;
}
public int request_id()
{
return request_id;
}
public boolean response_expected()
{
return response_expected;
}
public Any result()
{
if (result == null)
{
throw new NO_RESOURCES("Stream-based skeletons/stubs do not support this op",
1, CompletionStatus.COMPLETED_MAYBE);
}
return result;
}
/**
* Return the sync_scope as set in the constructor
*/
public short sync_scope()
{
return sync_scope;
}
/**
* Public accessor to retrieve the ORB for this Request.
* @return a <code>org.jacorb.orb.ORB</code> value.
*/
public ORB orb()
{
return orb;
}
}