/* * 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. */ package org.jacorb.orb.giop; import org.jacorb.config.ConfigurationException; import org.jacorb.orb.CDRInputStream; import org.jacorb.orb.ORB; import org.jacorb.orb.iiop.IIOPAddress; import org.jacorb.orb.iiop.IIOPProfile; import org.jacorb.orb.portableInterceptor.DefaultServerInterceptor; import org.jacorb.orb.portableInterceptor.ServerRequestInfoImpl; import org.omg.IIOP.BiDirIIOPServiceContext; import org.omg.IIOP.BiDirIIOPServiceContextHelper; import org.omg.IIOP.ListenPoint; import org.omg.IOP.BI_DIR_IIOP; import org.omg.IOP.ServiceContext; import org.omg.PortableInterceptor.ForwardRequest; import org.omg.PortableInterceptor.ServerRequestInfo; import org.slf4j.Logger; import java.util.ArrayList; import java.util.List; /** * @author Nicolas Noffke */ public class BiDirConnectionServerInterceptor extends DefaultServerInterceptor { private static final String NAME = "BiDirConnectionServerInterceptor"; private final ORB orb; private final Logger logger; private final ClientConnectionManager conn_mg; protected BiDirConnectionServerInterceptor( ORB orb ) { super(); this.orb = orb; this.logger = orb.getConfiguration().getLogger("org.jacorb.giop.bidir.interceptor"); conn_mg = orb.getClientConnectionManager(); } public String name() { return NAME; } public void destroy() { // nothing to do } public void receive_request_service_contexts( ServerRequestInfo requestInfo ) throws ForwardRequest { if( orb.useBiDirGIOP() ) { try { final ServiceContext context = requestInfo.get_request_service_context( BI_DIR_IIOP.value ); addConnections(requestInfo, context); } catch( org.omg.CORBA.BAD_PARAM e ) { logger.debug("no BiDir context present"); } } } private void addConnections(ServerRequestInfo requestInfo, ServiceContext ctx) { final BiDirIIOPServiceContext bidir_ctx = readBiDirContext(ctx); GIOPConnection connection = ((ServerRequestInfoImpl) requestInfo).getConnection(); IIOPProfile prof = null; int numLP = bidir_ctx.listen_points.length; List<IIOPAddress> alternates = numLP == 1 ? null : new ArrayList<IIOPAddress>(numLP-1); for (int i = 0; i < numLP; i++) { ListenPoint listenPoint = bidir_ctx.listen_points[i]; IIOPAddress addr = new IIOPAddress (listenPoint.host, listenPoint.port); try { addr.configure(orb.getConfiguration()); } catch (ConfigurationException ce) { logger.warn("ConfigurationException", ce); } if (i == 0) { if (logger.isDebugEnabled()) { logger.debug("BiDirIIOPContext: Client conn. added to target " + addr ); } prof = new IIOPProfile (addr, null, connection.profile.version().minor); } else { if (logger.isDebugEnabled()) { logger.debug("BiDirIIOPContext: target alternate " + addr ); } alternates.add (addr); } } if (numLP > 1) { prof.setAlternateAddresses(alternates); } conn_mg.addConnection( connection, prof); } private BiDirIIOPServiceContext readBiDirContext(ServiceContext ctx) { final CDRInputStream cdr_in = new CDRInputStream( orb, ctx.context_data ); try { cdr_in.openEncapsulatedArray(); return BiDirIIOPServiceContextHelper.read(cdr_in); } finally { cdr_in.close(); } } }