/* $Id$ */ package ibis.ipl.impl.smartsockets; import ibis.ipl.CapabilitySet; import ibis.ipl.Credentials; import ibis.ipl.Ibis; import ibis.ipl.IbisCapabilities; import ibis.ipl.IbisCreationFailedException; import ibis.ipl.IbisFactory; import ibis.ipl.PortType; import ibis.ipl.RegistryEventHandler; import java.util.ArrayList; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class SmartSocketsIbisStarter extends ibis.ipl.IbisStarter { static final Logger logger = LoggerFactory .getLogger("ibis.ipl.impl.smartsockets.SmartSocketsIbisStarter"); static final IbisCapabilities ibisCapabilities = new IbisCapabilities( IbisCapabilities.CLOSED_WORLD, IbisCapabilities.MEMBERSHIP_TOTALLY_ORDERED, IbisCapabilities.MEMBERSHIP_UNRELIABLE, IbisCapabilities.SIGNALS, IbisCapabilities.ELECTIONS_UNRELIABLE, IbisCapabilities.ELECTIONS_STRICT, IbisCapabilities.MALLEABLE, IbisCapabilities.TERMINATION); static final PortType portCapabilities = new PortType( PortType.SERIALIZATION_OBJECT_SUN, PortType.SERIALIZATION_OBJECT_IBIS, PortType.SERIALIZATION_OBJECT, PortType.SERIALIZATION_DATA, PortType.SERIALIZATION_BYTE, PortType.COMMUNICATION_FIFO, PortType.COMMUNICATION_NUMBERED, PortType.COMMUNICATION_RELIABLE, PortType.CONNECTION_DOWNCALLS, PortType.CONNECTION_UPCALLS, PortType.CONNECTION_TIMEOUT, PortType.CONNECTION_MANY_TO_MANY, PortType.CONNECTION_MANY_TO_ONE, PortType.CONNECTION_ONE_TO_MANY, PortType.CONNECTION_ONE_TO_ONE, PortType.CONNECTION_LIGHT, PortType.CONNECTION_ULTRALIGHT, PortType.CONNECTION_DIRECT, PortType.RECEIVE_POLL, PortType.RECEIVE_AUTO_UPCALLS, PortType.RECEIVE_EXPLICIT, PortType.RECEIVE_POLL_UPCALLS, PortType.RECEIVE_TIMEOUT); public SmartSocketsIbisStarter(String nickName, String iplVersion, String implementationVersion) { super(nickName, iplVersion, implementationVersion); } @Override public boolean matches(IbisCapabilities capabilities, PortType[] types) { if (!capabilities.matchCapabilities(ibisCapabilities)) { return false; } for (PortType portType : types) { if (!portType.matchCapabilities(portCapabilities)) { return false; } } return true; } @Override public CapabilitySet unmatchedIbisCapabilities( IbisCapabilities capabilities, PortType[] types) { return capabilities.unmatchedCapabilities(ibisCapabilities); } @Override public PortType[] unmatchedPortTypes(IbisCapabilities capabilities, PortType[] types) { ArrayList<PortType> result = new ArrayList<PortType>(); for (PortType portType : types) { if (!portType.matchCapabilities(portCapabilities)) { result.add(portType); } } return result.toArray(new PortType[0]); } @Override public Ibis startIbis(IbisFactory factory, RegistryEventHandler registryEventHandler, Properties userProperties, IbisCapabilities capabilities, Credentials credentials, byte[] applicationTag, PortType[] portTypes, String specifiedSubImplementation) throws IbisCreationFailedException { return new SmartSocketsIbis(registryEventHandler, capabilities, credentials, applicationTag, portTypes, userProperties, this); } }