You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jd...@apache.org on 2012/03/21 18:22:14 UTC

svn commit: r1303470 - in /lucene/dev/trunk/solr/contrib/dataimporthandler/src: java/org/apache/solr/handler/dataimport/ScriptTransformer.java test/org/apache/solr/handler/dataimport/TestScriptTransformer.java

Author: jdyer
Date: Wed Mar 21 17:22:13 2012
New Revision: 1303470

URL: http://svn.apache.org/viewvc?rev=1303470&view=rev
Log:
SOLR-3260:  better messages when ScriptTransform fails on init (remove Reflection in Trunk, JRE1.6+ assurred)

Modified:
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java?rev=1303470&r1=1303469&r2=1303470&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java Wed Mar 21 17:22:13 2012
@@ -19,10 +19,13 @@ package org.apache.solr.handler.dataimpo
 import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow;
 import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.Map;
 
+import javax.script.Invocable;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+
 /**
  * <p>
  * A {@link Transformer} instance capable of executing functions written in scripting
@@ -40,11 +43,8 @@ import java.util.Map;
  * @since solr 1.3
  */
 public class ScriptTransformer extends Transformer {
-  private Object engine;
-
-  private Method invokeFunctionMethod;
-
-  private String functionName;
+ private Invocable engine;
+ private String functionName;
 
   @Override
   public Object transformRow(Map<String, Object> row, Context context) {
@@ -53,17 +53,9 @@ public class ScriptTransformer extends T
         initEngine(context);
       if (engine == null)
         return row;
-      return invokeFunctionMethod.invoke(engine, functionName, new Object[]{
-              row, context});
+      return engine.invokeFunction(functionName, new Object[]{row, context});      
     } catch (DataImportHandlerException e) {
       throw e;
-    } catch (InvocationTargetException e) {
-      wrapAndThrow(SEVERE,e,
-              "Could not invoke method :"
-                      + functionName
-                      + "\n <script>\n"
-                      + context.getScript()
-                      + "</script>");
     } catch (Exception e) {
       wrapAndThrow(SEVERE,e, "Error invoking script for entity " + context.getEntityAttribute("name"));
     }
@@ -78,27 +70,23 @@ public class ScriptTransformer extends T
       throw new DataImportHandlerException(SEVERE,
           "<script> tag is not present under <dataConfig>");
     }
-    Object scriptEngineMgr = null;
-    try {
-      scriptEngineMgr = Class.forName("javax.script.ScriptEngineManager")
-          .newInstance();
-    } catch (Exception e) {
-      wrapAndThrow(SEVERE, e, "<script> can be used only in java 6 or above");
+    ScriptEngineManager scriptEngineMgr = new ScriptEngineManager();
+    ScriptEngine scriptEngine = scriptEngineMgr.getEngineByName(scriptLang);
+    if (scriptEngine == null) {
+      throw new DataImportHandlerException(SEVERE,
+          "Cannot load Script Engine for language: " + scriptLang);
     }
-    try {
-      Method getEngineMethod = scriptEngineMgr.getClass().getMethod(
-          "getEngineByName", String.class);
-      engine = getEngineMethod.invoke(scriptEngineMgr, scriptLang);
-    } catch (Exception e) {
-      wrapAndThrow(SEVERE, e, "Cannot load Script Engine for language: "
-          + scriptLang);
+    if (scriptEngine instanceof Invocable) {
+      engine = (Invocable) scriptEngine;
+    } else {
+      throw new DataImportHandlerException(SEVERE,
+          "The installed ScriptEngine for: " + scriptLang
+              + " does not implement Invocable.  Class is "
+              + scriptEngine.getClass().getName());
     }
     try {
-      Method evalMethod = engine.getClass().getMethod("eval", String.class);
-      invokeFunctionMethod = engine.getClass().getMethod("invokeFunction",
-          String.class, Object[].class);
-      evalMethod.invoke(engine, scriptText);
-    } catch (Exception e) {
+      scriptEngine.eval(scriptText);
+    } catch (ScriptException e) {
       wrapAndThrow(SEVERE, e, "'eval' failed with language: " + scriptLang
           + " and script: \n" + scriptText);
     }

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java?rev=1303470&r1=1303469&r2=1303470&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java Wed Mar 21 17:22:13 2012
@@ -52,9 +52,7 @@ public class TestScriptTransformer exten
       sep.init(context);
       sep.applyTransformer(map);
       assertEquals(map.get("name"), "Hello Scott");
-    } catch (DataImportHandlerException e) {
-      assumeFalse("JRE does not contain a JavaScript engine (OpenJDK)", 
-                  e.getMessage().startsWith("<script> can be used only in java 6 or above"));      
+    } catch (DataImportHandlerException e) {           
       throw e;
     }
   }
@@ -86,8 +84,6 @@ public class TestScriptTransformer exten
       sep.applyTransformer(map);
       assertEquals(map.get("name"), "Hello Scott");
     } catch (DataImportHandlerException e) {
-      assumeFalse("JRE does not contain a JavaScript engine (OpenJDK)", 
-                  e.getMessage().startsWith("<script> can be used only in java 6 or above"));      
       throw e;
     }
   }
@@ -103,8 +99,6 @@ public class TestScriptTransformer exten
               .item(0));
       assertTrue(config.script.text.indexOf("checkNextToken") > -1);
     } catch (DataImportHandlerException e) {
-      assumeFalse("JRE does not contain a JavaScript engine (OpenJDK)", 
-                  e.getMessage().startsWith("<script> can be used only in java 6 or above"));      
       throw e;
     }
   }
@@ -132,8 +126,6 @@ public class TestScriptTransformer exten
       sep.applyTransformer(map);
       assertNull(map.get("$hasMore"));
     } catch (DataImportHandlerException e) {
-      assumeFalse("JRE does not contain a JavaScript engine (OpenJDK)", 
-                  e.getMessage().startsWith("<script> can be used only in java 6 or above"));      
       throw e;
     }
   }