public AmqpRedirect validate()

in qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpRedirect.java [67:132]


    public AmqpRedirect validate() throws Exception {
        String networkHost = (String) redirect.get(NETWORK_HOST);
        if (networkHost == null || networkHost.isEmpty()) {
            throw new IOException("Redirection information not set, missing network host.");
        }

        try {
            Integer.parseInt(redirect.get(PORT).toString());
        } catch (Exception ex) {
            throw new IOException("Redirection information contained invalid port.");
        }

        String sourceScheme = provider.getRemoteURI().getScheme();
        String scheme = (String) redirect.get(SCHEME);
        if (scheme != null && !scheme.isEmpty() && !scheme.equals(sourceScheme)) {

            // Attempt to located a provider using normal scheme (amqp, amqps, etc...)
            ProviderFactory factory = null;
            try {
                factory = ProviderFactory.findProviderFactory(scheme);
            } catch (Throwable error) {
                LOG.trace("Couldn't find AMQP prefixed Provider using scheme: {}", scheme);
            }

            if (factory == null) {
                // Attempt to located a transport level redirect (ws, wss, etc...)
                try {
                    factory = findProviderFactoryByTransportScheme(scheme);
                } catch (Throwable error) {
                    LOG.trace("Couldn't find Provider using transport scheme: {}", scheme);
                }
            }

            if (factory == null || !(factory instanceof AmqpProviderFactory)) {
                throw new IOException("Redirect contained an unknown provider scheme: " + scheme);
            }

            LOG.trace("Found provider: {} for redirect: {}", factory.getName(), scheme);

            AmqpProviderFactory amqpFactory = (AmqpProviderFactory) factory;
            String transportType = amqpFactory.getTransportScheme();

            if (transportType == null || transportType.isEmpty()) {
                throw new IOException("Redirect contained an unknown provider scheme: " + scheme);
            }

            TransportFactory transportFactory = TransportFactory.findTransportFactory(transportType);
            if (transportFactory == null) {
                throw new IOException("Redirect contained an unknown provider scheme: " + scheme);
            }

            // Check for insecure redirect and whether it is allowed.
            if (provider.getTransport().isSecure() && !transportFactory.isSecure() && !provider.isAllowNonSecureRedirects()) {
                throw new IOException("Attempt to redirect to an insecure connection type: " + transportType);
            }

            // Update the redirect information with the resolved target scheme used to create
            // the provider for the redirection.
            redirect.put(SCHEME, amqpFactory.getProviderScheme());
        }

        // Check it actually converts to URI since we require it do so later
        toURI();

        return this;
    }