All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bluejeans.jin.client.BasicJinClient Maven / Gradle / Ivy

/**
 *
 */
package com.bluejeans.jin.client;

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.net.ssl.SSLContext;

import org.apache.commons.io.IOUtils;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;

/**
 * @author Dinesh Ilindra
 *
 */
public class BasicJinClient {

    public static final int DEFAULT_PORT = 5678;

    public static final String API_PREFIX = "/do";

    public static final String GET_PREFIX = "/get";

    public static final String RUN_PREFIX = "/run";

    public abstract class JinRequestContext {
        private final StringBuilder api = new StringBuilder();

        public JinRequestContext append(final String part) {
            api.append(part);
            return this;
        }

        public String getApi() {
            return api.toString();
        }
    }

    public class JinRequestTarget extends JinRequestContext {
        public JinRequestTarget(final String target) {
            append("/");
            append(target);
        }

        public JinRequestProperty property(final String property) {
            return new JinRequestProperty(this, property);
        }
    }

    public class JinRequestProperty extends JinRequestContext {
        private String argStr(final Object obj) {
            if (obj == null) {
                return "{NULL}";
            } else if (obj instanceof Boolean) {
                return "{" + obj + "}";
            } else {
                return obj.toString();
            }
        }

        public JinRequestProperty(final JinRequestTarget target, final String property) {
            append(target.getApi());
            append("/");
            append(property);
        }

        public JinRequestProperty f(final String name) {
            return field(name);
        }

        public JinRequestProperty field(final String name) {
            append("..$");
            append(name);
            return this;
        }

        public JinRequestProperty fSet(final String name, final Object value) {
            field(name);
            append("~~");
            if (value == null) {
                append("$null");
            } else {
                append(String.valueOf(value));
            }
            return this;
        }

        public JinRequestProperty m(final String name) {
            return method(name);
        }

        public JinRequestProperty method(final String name) {
            append("..");
            append(name);
            return this;
        }

        public JinRequestProperty get(final String key) {
            return mapGet(key);
        }

        public JinRequestProperty get(final int index) {
            return listGet(index);
        }

        public JinRequestProperty mapGet(final String key) {
            append("..");
            append("~");
            append(key);
            return this;
        }

        public JinRequestProperty mapSet(final String key, final Object value) {
            append("..");
            append("~");
            append(key);
            append("~~");
            append(value.toString());
            return this;
        }

        public JinRequestProperty listGet(final int index) {
            append("..");
            append("~");
            append(String.valueOf(index));
            return this;
        }

        public JinRequestProperty listSet(final int index, final Object value) {
            append("..");
            append("~");
            append(String.valueOf(index));
            append("~~");
            append(value.toString());
            return this;
        }

        public JinRequestProperty args(final Object... args) {
            return withArgs(args);
        }

        public JinRequestProperty withArgs(final Object... args) {
            append("~~");
            append(Arrays.asList(args).stream().map(a -> argStr(a)).collect(Collectors.joining("::")));
            return this;
        }

        public List get() {
            return BasicJinClient.this.get(getApi());
        }

        public List call() {
            return BasicJinClient.this.call(getApi());
        }
    }

    public class JinRequestSpring extends JinRequestProperty {
        public JinRequestSpring() {
            super(new JinRequestTarget("spring"), "context");
        }

        public JinRequestProperty bean(final String name) {
            return method("getBean").withArgs(name);
        }
    }

    private Set urls = null;
    private JinUrlProvider provider = null;
    private CloseableHttpClient httpClient = null;

    public BasicJinClient() {
        this("localhost");
    }

    public BasicJinClient(final String jins) {
        final List jinList = Arrays.asList(jins.split(","));
        urls = jinList.stream().map(j -> j.contains("://") ? j : "http://" + j)
                .map(j -> j.split(":").length > 2 ? j : j + ":" + DEFAULT_PORT).collect(Collectors.toSet());
        initHttp();
    }

    public BasicJinClient(final JinUrlProvider provider) {
        this.provider = provider;
        initHttp();
    }

    private void initHttp() {
        if (httpClient == null) {
            final SSLContextBuilder builder = SSLContexts.custom();
            PoolingHttpClientConnectionManager cm = null;
            try {
                builder.loadTrustMaterial(null, (chain, authType) -> true);
                final SSLContext sslContext = builder.build();
                final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
                        NoopHostnameVerifier.INSTANCE);
                final Registry socketFactoryRegistry = RegistryBuilder
                        . create().register("https", sslsf)
                        .register("http", new PlainConnectionSocketFactory()).build();
                cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
            } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException ex) {
                cm = new PoolingHttpClientConnectionManager();
            }
            cm.setMaxTotal(200);
            cm.setDefaultMaxPerRoute(20);
            httpClient = HttpClients.custom().setConnectionManager(cm).build();
        }
    }

    public List invoke(final String uri, final String prefix) {
        return (urls == null ? provider.getJinUrls() : urls).parallelStream().map(u -> {
            try {
                return IOUtils.toString(httpClient.execute(new HttpGet(u + prefix + uri)).getEntity().getContent());
            } catch (final Exception e) {
                return null;
            }
        }).filter(v -> v != null).filter(v -> !v.trim().startsWith("{\"error\"")).collect(Collectors.toList());
    }

    public List run(final String scr) {
        return invoke(scr, RUN_PREFIX);
    }

    public List call(final String api) {
        return invoke(api, API_PREFIX);
    }

    public List get(final String api) {
        return invoke(api, GET_PREFIX);
    }

    public JinRequestTarget target(final String name) {
        return new JinRequestTarget(name);
    }

    public JinRequestSpring spring() {
        return new JinRequestSpring();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy