package org.jacorb.test.orb;
import java.util.Iterator;
import java.util.List;
import org.jacorb.orb.iiop.IIOPAddress;
import org.jacorb.orb.iiop.IIOPProfile;
import org.jacorb.orb.portableInterceptor.IORInfoExt;
import org.omg.CORBA.LocalObject;
import org.omg.IOP.TAG_ALTERNATE_IIOP_ADDRESS;
import org.omg.IOP.TAG_INTERNET_IOP;
import org.omg.PortableInterceptor.IORInfo;
import org.omg.PortableInterceptor.IORInterceptor;
/**
* An IOR Interceptor that adds alternate addresses to IIOP Profiles,
* using the special JacORB mechanism via IORInfoExt.
*
* @author Marc Heide
*/
public class IIOPProfileInterceptor
extends LocalObject
implements IORInterceptor
{
public List<IIOPAddress> alternateAddresses = IIOPAddressInterceptor.alternateAddresses;
public void establish_components(IORInfo info)
{
IORInfoExt infoExt = (IORInfoExt) info;
// ORB should have added already 1 profile with IOP tag
int nrOfProf = infoExt.get_number_of_profiles(TAG_INTERNET_IOP.value);
if( nrOfProf != 1 )
{
throw new RuntimeException ("unexpected number of IOP Profiles: " + nrOfProf);
}
IIOPProfile primaryProf =
(IIOPProfile) infoExt.get_profile(TAG_INTERNET_IOP.value, 0);
try
{
// now add alternate addresses to primary profile
for (Iterator<IIOPAddress> i = alternateAddresses.iterator(); i.hasNext();) {
IIOPAddress addr = i.next();
primaryProf.addComponent( TAG_ALTERNATE_IIOP_ADDRESS.value, addr.toCDR() );
}
// now add a secondary and third profile like used e.g. by
// Visibroker 4.5
for (Iterator<IIOPAddress> i = alternateAddresses.iterator(); i.hasNext();)
{
IIOPAddress addr = i.next();
IIOPProfile additionalProfile =
(IIOPProfile) primaryProf.clone();
additionalProfile.patchPrimaryAddress(addr);
infoExt.add_profile(additionalProfile);
}
}
catch ( CloneNotSupportedException ex )
{
throw new RuntimeException ("Exception during cloning of profile: "
+ ex);
}
nrOfProf = infoExt.get_number_of_profiles(TAG_INTERNET_IOP.value);
if( nrOfProf != 1 + alternateAddresses.size())
{
throw new RuntimeException ("unexpected number of IOP Profiles after addition: "
+ nrOfProf
+ ", where number of alternates was: "
+ alternateAddresses.size());
}
// check access functions
primaryProf =
(IIOPProfile) infoExt.get_profile(TAG_INTERNET_IOP.value, 0);
IIOPProfile primaryProf2 =
(IIOPProfile) infoExt.get_profile(TAG_INTERNET_IOP.value);
// they should be equal to primary
if ( ! primaryProf.equals(primaryProf2) )
{
throw new RuntimeException ("difference between "
+ "get_profile(tag, idx) and "
+ "get_profile(tag): ");
}
}
public String name()
{
return "IIOPProfileInterceptor";
}
public void destroy()
{
alternateAddresses.clear();
}
}