Repository: metamodel Updated Branches: refs/heads/master 61479411c -> 889075cda
METAMODEL-124: Fixed Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/889075cd Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/889075cd Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/889075cd Branch: refs/heads/master Commit: 889075cda8e471627241ca980441e6fb67236173 Parents: 6147941 Author: Kasper Sørensen <[email protected]> Authored: Sat Mar 21 17:28:26 2015 +0100 Committer: Kasper Sørensen <[email protected]> Committed: Sat Mar 21 17:28:26 2015 +0100 ---------------------------------------------------------------------- CHANGES.md | 1 + .../ElasticSearchDropTableBuilder.java | 43 ++++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/889075cd/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index da76568..0925565 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ ### Apache MetaModel work-in-progress * [METAMODEL-123] - Added compatibility with ElasticSearch version 1.4.x + * [METAMODEL-124] - Invoked ElasticSearch cross-version incompatible methods via reflection ### Apache MetaModel 4.3.2 http://git-wip-us.apache.org/repos/asf/metamodel/blob/889075cd/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDropTableBuilder.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDropTableBuilder.java b/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDropTableBuilder.java index 32becdf..e691ff2 100644 --- a/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDropTableBuilder.java +++ b/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDropTableBuilder.java @@ -18,6 +18,8 @@ */ package org.apache.metamodel.elasticsearch; +import java.lang.reflect.Method; + import org.apache.metamodel.MetaModelException; import org.apache.metamodel.drop.AbstractTableDropBuilder; import org.apache.metamodel.drop.TableDropBuilder; @@ -37,7 +39,7 @@ import org.slf4j.LoggerFactory; final class ElasticSearchDropTableBuilder extends AbstractTableDropBuilder { private static final Logger logger = LoggerFactory.getLogger(ElasticSearchDropTableBuilder.class); - + private final ElasticSearchUpdateCallback _updateCallback; public ElasticSearchDropTableBuilder(ElasticSearchUpdateCallback updateCallback, Table table) { @@ -56,11 +58,46 @@ final class ElasticSearchDropTableBuilder extends AbstractTableDropBuilder { final String indexName = dataContext.getIndexName(); final DeleteMappingRequestBuilder requestBuilder = new DeleteMappingRequestBuilder(indicesAdminClient) - .setIndices(indexName).setType(documentType); + .setIndices(indexName); + setType(requestBuilder, documentType); + final DeleteMappingResponse result = requestBuilder.execute().actionGet(); logger.debug("Delete mapping response: acknowledged={}", result.isAcknowledged()); - + final MutableSchema schema = (MutableSchema) table.getSchema(); schema.removeTable(table); } + + /** + * Invokes the {@link DeleteMappingRequestBuilder#setType(String...)} method + * using reflection. This is done because the API of ElasticSearch was + * changed and the method signature differes between different versions. + * + * @param requestBuilder + * @param documentType + */ + private void setType(DeleteMappingRequestBuilder requestBuilder, String documentType) { + Object argument; + Method method; + try { + try { + method = requestBuilder.getClass().getDeclaredMethod("setType", String[].class); + argument = new String[] {documentType}; + } catch (NoSuchMethodException e) { + logger.debug("No setType(String[]) method found, trying with a single String instead", e); + method = requestBuilder.getClass().getDeclaredMethod("setType", String.class); + argument = documentType; + } + } catch (Exception e) { + logger.error("Failed to resolve DeleteMappingRequestBuilder.setType(...) method", e); + throw new IllegalStateException("Failed to resolve DeleteMappingRequestBuilder.setType(...) method", e); + } + try { + method.setAccessible(true); + method.invoke(requestBuilder, argument); + } catch (Exception e) { + logger.error("Failed to invoke {}", method, e); + throw new IllegalStateException("Failed to invoke " + method, e); + } + } }
