package org.jacorb.orb;
/*
* 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 java.util.Iterator;
import java.util.List;
import org.jacorb.orb.giop.ClientConnectionManager;
import org.jacorb.orb.iiop.IIOPProfile;
import org.omg.ETF.Profile;
import org.omg.IOP.TAG_INTERNET_IOP;
/**
* @author Steve Osselton
*/
public class SpecificProfileSelector implements ProfileSelector
{
private final org.omg.RTCORBA.Protocol[] protocols;
private Profile currentProfile = null;
public SpecificProfileSelector (org.omg.RTCORBA.Protocol[] protocols)
{
this.protocols = protocols;
}
/**
* Select first IOP profile that matches protocol
*/
public Profile selectProfile (List<Profile> profiles, ClientConnectionManager ccm)
{
return selectNextProfile (profiles, null);
}
private boolean validate (Profile profile)
{
final int profileTag = profile.tag ();
for (int i = 0; i < protocols.length; i++)
{
final int tagToMatch = protocols[i].protocol_type;
if (profileTag == tagToMatch)
{
return true;
}
if (profile instanceof IIOPProfile)
{
// Special case check for IIOP profile supporting SSL
IIOPProfile iiopProfile = (IIOPProfile) profile;
if (tagToMatch == ORBConstants.JAC_SSL_PROFILE_ID &&
iiopProfile.getSSL () != null)
{
return true;
}
// Special case check for IIOP profile not supporting SSL
if (tagToMatch == ORBConstants.JAC_NOSSL_PROFILE_ID &&
(iiopProfile.getSSL () == null ||
// SSL port contains a valid value but further check is required
// see if protection is enabled.
(((iiopProfile.getSSL()).target_requires &
org.omg.Security.NoProtection.value) != 0)))
{
return true;
}
}
}
return false;
}
public Profile selectNextProfile(List<Profile> profileList, Profile lastProfile)
{
//sanity check
if (profileList == null || profileList.isEmpty())
{
return null;
}
// locate the last profile in the list
Iterator<Profile> iterator;
for (iterator = profileList.iterator(); iterator.hasNext();)
{
Profile p = iterator.next();
if (lastProfile != null)
{
if (lastProfile.equals(p))
{
break;
}
}
else if (validate (p))
{
currentProfile = p;
return p;
}
}
// if we exit the loop but lastProfile is null, that means no
// valid profiles were found.
if (lastProfile == null)
{
currentProfile = null;
return null;
}
// return the next profile, which is next to the last profile.
while (true)
{
if (!iterator.hasNext())
{
iterator = profileList.iterator();
}
Profile p = iterator.next();
if (lastProfile.equals (p))
{
// came all the way back around
break;
}
if (validate (p))
{
currentProfile = p;
return p;
}
}
return null;
}
}