Java tutorial
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.metamodel.elasticsearch.rest; import java.net.MalformedURLException; import java.net.URL; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.metamodel.ConnectionException; import org.apache.metamodel.DataContext; import org.apache.metamodel.factory.DataContextFactory; import org.apache.metamodel.factory.DataContextProperties; import org.apache.metamodel.factory.ResourceFactoryRegistry; import org.apache.metamodel.factory.UnsupportedDataContextPropertiesException; import org.apache.metamodel.util.SimpleTableDef; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; /** * Factory for ElasticSearch data context of REST type. * * The factory will activate when DataContext type is specified as * "elasticsearch", "es-rest" or "elasticsearch-rest". * * This factory is configured with the following properties: * * <ul> * <li>url (http or https based base URL of elasticsearch)</li> * <li>database (index name)</li> * <li>username (optional)</li> * <li>password (optional)</li> * </ul> */ public class ElasticSearchRestDataContextFactory implements DataContextFactory { @Override public boolean accepts(DataContextProperties properties, ResourceFactoryRegistry resourceFactoryRegistry) { switch (properties.getDataContextType()) { case "elasticsearch": // ensure that the url is http or https based to infer that this is // a REST based connection final String url = properties.getUrl(); return url != null && url.startsWith("http") && acceptsInternal(properties); case "es-rest": case "elasticsearch-rest": return acceptsInternal(properties); } return false; } private boolean acceptsInternal(DataContextProperties properties) { if (properties.getUrl() == null) { return false; } if (getIndex(properties) == null) { return false; } return true; } private ElasticSearchRestClient createClient(final DataContextProperties properties) throws MalformedURLException { final URL url = new URL(properties.getUrl()); final RestClientBuilder builder = RestClient.builder(new HttpHost(url.getHost(), url.getPort())); if (properties.getUsername() != null) { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(properties.getUsername(), properties.getPassword())); builder.setHttpClientConfigCallback( httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); } return new ElasticSearchRestClient(builder.build()); } private String getIndex(DataContextProperties properties) { final String databaseName = properties.getDatabaseName(); if (databaseName == null) { properties.toMap().get("index"); } return databaseName; } @Override public DataContext create(DataContextProperties properties, ResourceFactoryRegistry resourceFactoryRegistry) throws UnsupportedDataContextPropertiesException, ConnectionException { try { ElasticSearchRestClient client = createClient(properties); final String indexName = getIndex(properties); final SimpleTableDef[] tableDefinitions = properties.getTableDefs(); return new ElasticSearchRestDataContext(client, indexName, tableDefinitions); } catch (MalformedURLException e) { throw new UnsupportedDataContextPropertiesException(e); } } }