class ClientConnectionService {

    public ClientConnection getConnection(final RequestMetadata requestMetadata) throws ConnectionFailureException {
        final String deviceIdentification = requestMetadata.getDeviceIdentification();
        LOGGER.debug("Get connection called for device {}.", deviceIdentification);

        final Iec60870Device device = this.getIec60870Device(deviceIdentification);
        final String connectionDeviceIdentification = this.getConnectionDeviceIdentification(device);

        if (device.hasGatewayDevice()) {
            LOGGER.debug("Getting connection for device {} using gateway device {}.", deviceIdentification,
                    connectionDeviceIdentification);
        }

        final ClientConnection cachedDeviceConnection = this.connectionCache
                .getConnection(connectionDeviceIdentification);

        if (cachedDeviceConnection != null) {
            LOGGER.info("Connection found in cache for device {}.", connectionDeviceIdentification);
            return cachedDeviceConnection;
        } else {
            LOGGER.info("No connection found in cache for device {}, creating new connection.",
                    connectionDeviceIdentification);
            return this.createConnection(requestMetadata);
        }
    }

}