package org.jacorb.orb.portableInterceptor;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-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.
*/
import org.jacorb.orb.SystemExceptionHelper;
import org.omg.CORBA.UserException;
import org.omg.PortableInterceptor.ForwardRequest;
import org.omg.PortableInterceptor.Interceptor;
import org.omg.PortableInterceptor.LOCATION_FORWARD;
import org.omg.PortableInterceptor.ServerRequestInterceptor;
/**
* This class iterates over an array of
* ServerRequestInterceptors.
*
* @author Nicolas Noffke
*/
public class ServerInterceptorIterator
extends RequestInterceptorIterator
{
public static final short RECEIVE_REQUEST_SERVICE_CONTEXTS = 0;
public static final short RECEIVE_REQUEST = 1;
public static final short SEND_REPLY = 2;
public static final short SEND_EXCEPTION = 3;
public static final short SEND_OTHER = 4;
private ServerRequestInfoImpl info = null;
public ServerInterceptorIterator(Interceptor[] interceptors)
{
super(interceptors);
}
/**
* Iterates over the enumeration, i.e. calls "op" on
* nextElement() until !hasMoreElements().
*/
public void iterate( ServerRequestInfoImpl info, short op )
throws UserException
{
this.info = info;
this.op = op;
//set sending_exception right
info.update();
info.caller_op = op;
// ok, op <= RECEIVE_REQUEST is more efficient but
// less understandable
setDirection( (op == RECEIVE_REQUEST_SERVICE_CONTEXTS) ||
(op == RECEIVE_REQUEST));
/**
* If we are in an intermediate point we need to handle
* reverse calls for all registered interceptors as they
* will all have completed a start point e.g
* RECEIVE_REQUEST_SERVICE_CONTEXTS. The only intermediate
* point is RECEIVE_REQUEST. See RequestInterceptorIterator
* for more details.
*/
setIntermediatePoint (op == RECEIVE_REQUEST);
iterate();
//propagate last exception upwards
if ( interceptor_ex != null )
{
if (interceptor_ex instanceof ForwardRequest)
{
throw (ForwardRequest) interceptor_ex;
}
throw (org.omg.CORBA.SystemException) interceptor_ex;
}
}
protected void invoke(Interceptor interceptor)
throws UserException
{
try
{
switch (op)
{
case RECEIVE_REQUEST_SERVICE_CONTEXTS :
{
((ServerRequestInterceptor) interceptor).
receive_request_service_contexts(info);
break;
}
case RECEIVE_REQUEST :
{
((ServerRequestInterceptor) interceptor).receive_request(info);
break;
}
case SEND_REPLY :
{
((ServerRequestInterceptor) interceptor).send_reply(info);
break;
}
case SEND_EXCEPTION :
{
((ServerRequestInterceptor) interceptor).send_exception(info);
break;
}
case SEND_OTHER :
{
((ServerRequestInterceptor) interceptor).send_other(info);
break;
}
}
}
catch (ForwardRequest _fwd)
{
reverseDirection();
op = SEND_OTHER;
info.reply_status = LOCATION_FORWARD.value;
info.forward_reference = _fwd.forward;
interceptor_ex = _fwd;
}
catch (org.omg.CORBA.SystemException _sysex)
{
reverseDirection();
op = SEND_EXCEPTION;
interceptor_ex = _sysex;
SystemExceptionHelper.insert(info.sending_exception, _sysex);
}
info.caller_op = op;
}
}