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);
+        }
+    }
 }

Reply via email to