class LUISGrammarEvaluator implements GrammarEvaluator {

    @Override
    public Object getSemanticInterpretation(final DataModel model,
            String utterance) {
        final HttpClientBuilder builder = HttpClientBuilder.create();
        if (PROXY_HOST != null) {
            HttpHost proxy = new HttpHost(PROXY_HOST, PROXY_PORT);
            builder.setProxy(proxy);
        }
        try (CloseableHttpClient client = builder.build()){
            final URIBuilder uribuilder = new URIBuilder(grammarUri);
            uribuilder.addParameter("subscription-key", subscriptionKey);
            uribuilder.addParameter("q", utterance);
            final URI uri = uribuilder.build();
            final HttpGet request = new HttpGet(uri);
            final HttpResponse response = client.execute(request);
            final StatusLine statusLine = response.getStatusLine();
            final int status = statusLine.getStatusCode();
            if (status != HttpStatus.SC_OK) {
                final String reasonPhrase = statusLine.getReasonPhrase();
                LOGGER.error("error accessing '" + uri +"': " +
                        reasonPhrase + " (HTTP error code "
                        + status + ")");
                return null;
            }
            final HttpEntity entity = response.getEntity();
            final InputStream input = entity.getContent();
            final Object interpretation = parseLUISResponse(model, input);
            return interpretation;
        } catch (IOException | URISyntaxException | ParseException | SemanticError e) {
            LOGGER.error(e.getMessage(), e);
            return null;
        }
    }

    public  LUISGrammarEvaluator(final String subscription,
            final URI documentURI);

}