/*
* JBoss, Home of Professional Open Source
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags.
* See the copyright.txt in the distribution for a full listing
* of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2005-2006,
* @author JBoss Inc.
*/
/*
* Copyright (C) 2003,
*
* Arjuna Technologies Limited,
* Newcastle upon Tyne,
* Tyne and Wear,
* UK.
*
* $Id: ClientForwardInterceptor.java 2342 2006-03-30 13:06:17Z $
*/
package com.arjuna.ats.internal.jts.orbspecific.ibmorb.recoverycoordinators;
import com.arjuna.ats.jts.logging.jtsLogger;
import org.omg.CORBA.Any;
import org.omg.CORBA.TCKind;
import org.omg.CosTransactions.RecoveryCoordinator;
import org.omg.CosTransactions.RecoveryCoordinatorHelper;
import org.omg.IOP.ServiceContext;
import org.omg.PortableInterceptor.ClientRequestInfo;
import org.omg.PortableInterceptor.ClientRequestInterceptor;
import org.omg.PortableInterceptor.ForwardRequest;
/**
* This interceptor redirects requests towards the RecoveryCoordinator returned on register_resource
* to another target, a Recovery Coordinator located in the Recovery Manager, by throwing a ForwardRequest
* exception.
*
* @author Malik Saheb
*/
public class ClientForwardInterceptor
extends org.omg.CORBA.LocalObject
implements ClientRequestInterceptor
{
public ClientForwardInterceptor(org.omg.CORBA.ORB orb,
org.omg.PortableInterceptor.Current _piCurrent,
int _IndicatorSlotId)
{
if (jtsLogger.logger.isDebugEnabled()) {
jtsLogger.logger.debug("Client Interceptor for RecoveryCoordinators created");
}
piCurrent = _piCurrent;
IndicatorSlotId = _IndicatorSlotId;
_ourOrb = orb;
}
public String name()
{
return "arjuna.ClientForwardInterceptor";
}
public void destroy()
{
}
/**
* Throws a ForwardRequest
*/
public void send_request(ClientRequestInfo ri)
throws ForwardRequest
{
String objectIdString = null;
try {
RCobjectId = JavaIdlRCServiceInit._poa.reference_to_id(ri.effective_target());
objectIdString = new String(RCobjectId);
if ( JavaIdlRCServiceInit.RC_ID.equals(objectIdString) )
{
Any indicator = ri.get_slot(IndicatorSlotId);
if (indicator.type().kind().equals(TCKind.tk_null))
{
ri.add_request_service_context(RCctx, false);
}
}
}
catch(Exception ex) {
jtsLogger.i18NLogger.warn_orbspecific_jacorb_recoverycoordinators_ClientForwardInterceptor_4(ex);
}
if (!in_loop)
{
in_loop = true;
if ( JavaIdlRCServiceInit.RC_ID.equals(objectIdString) ) {
if (ri.effective_target()._is_a(RecoveryCoordinatorHelper.id()))
{
/*
* Extract the substring of the ObjectId that contains the Uid and
* the Process Id and pass it to the data of the service context
*/
RCobjectId = extractObjectId(objectIdString).getBytes();
RCctx = new ServiceContext(RecoveryContextId, RCobjectId);
in_loop = false;
throw new ForwardRequest( reco );
}
else
{
in_loop = false;
}
}
in_loop = false;
}
}
public void send_poll(ClientRequestInfo ri){
}
public void receive_reply(ClientRequestInfo ri){
}
public void receive_exception(ClientRequestInfo ri)
throws ForwardRequest{
}
public void receive_other(ClientRequestInfo ri)
throws ForwardRequest{
}
/*
* Extract from the ObjectID of the recoveryCorrdinator Object the substring containing the transaction Id
* and the process Id that should be propagated in the service context.
* The Object reference of the default recoveryCoordinator that receives effectively replay_completion
* is also extract and passed to the global private variable reco, defined below, is also extracted.
* null is returned if not found appropriate String.
*/
private String extractObjectId(String encodedRCData)
{
if (jtsLogger.logger.isDebugEnabled()) {
jtsLogger.logger.debug("RecoveryCoordinatorId(" + encodedRCData + ")");
}
String ObjectId2SvcCtx = null;
char delimiter = '#';
boolean ok = (encodedRCData != null);
if (ok)
{
int index1 = encodedRCData.indexOf(delimiter);
if (index1 != -1)
{
ObjectId2SvcCtx = encodedRCData.substring(0, index1);
}
else
ok = false;
if (ok)
{
try
{
String RCDefaultObjectReference = encodedRCData.substring(index1 +1);
org.omg.CORBA.Object obj = _ourOrb.string_to_object(RCDefaultObjectReference) ;
reco = RecoveryCoordinatorHelper.narrow(obj);
}
catch (Exception e) {
jtsLogger.i18NLogger.warn_orbspecific_jacorb_recoverycoordinators_ClientForwardInterceptor_2(e);
}
}
}
return ObjectId2SvcCtx;
}
private RecoveryCoordinator reco = null;
private boolean in_loop = false;
private org.omg.CORBA.ORB _ourOrb = null;
ServiceContext RCctx = null;
// The following tag should be placed somewhere else and advertise it should not be used by applications
int RecoveryContextId = 100001;
byte[] RCobjectId;
private org.omg.PortableInterceptor.Current piCurrent;
private int IndicatorSlotId = -1;
} // ClientForwardInterceptor