public NATFeatureRealization executeTest() {
NATFeatureRealization result = NATFeatureRealization.DONT_CARE;
Socket toStunServer = null;
try {
toStunServer = this.createConnectedSocket(this.primaryStunServerAddress);
final Message responseTestI = this.executeTestI(toStunServer);
if (responseTestI.hasAttribute(OtherAddress.class)) {
try {
final Message responseTestII = this.executeTestII(toStunServer);
if (responseTestII.hasAttribute(XorMappedAddress.class)) {
result = NATFeatureRealization.ENDPOINT_INDEPENDENT;
}
} catch (final SocketTimeoutException eII) {
try {
final Message responseTestIII = this.executeTestIII(toStunServer);
if (responseTestIII.hasAttribute(XorMappedAddress.class)) {
result = NATFeatureRealization.ADDRESS_DEPENDENT;
}
} catch (final SocketTimeoutException eIII) {
try {
final Message reponseIV = this.executeTestForConnectionDependent(toStunServer);
if (reponseIV.hasAttribute(XorMappedAddress.class)) {
result = NATFeatureRealization.ADDRESS_AND_PORT_DEPENDENT;
}
} catch (final SocketTimeoutException eIV) {
result = NATFeatureRealization.CONNECTION_DEPENDENT;
}