This is an automated email from the ASF dual-hosted git repository.

krisden pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 4752462  SOLR-16030: Enable spotless on scripting module
4752462 is described below

commit 475246256403135e2d5b2c7605fc1ba1da631d1f
Author: Kevin Risden <[email protected]>
AuthorDate: Sat Feb 19 10:49:57 2022 -0500

    SOLR-16030: Enable spotless on scripting module
---
 gradle/validation/spotless.gradle                  |   1 -
 .../org/apache/solr/scripting/package-info.java    |   4 +-
 .../scripting/update/ScriptEngineCustomizer.java   |   4 +-
 .../update/ScriptUpdateProcessorFactory.java       | 373 ++++++++++-----------
 .../apache/solr/scripting/update/package-info.java |   4 +-
 .../solr/scripting/xslt/TransformerProvider.java   |  68 ++--
 .../apache/solr/scripting/xslt/XSLTConstants.java  |   1 +
 .../solr/scripting/xslt/XSLTResponseWriter.java    |  25 +-
 .../scripting/xslt/XSLTUpdateRequestHandler.java   |   7 +-
 .../apache/solr/scripting/xslt/package-info.java   |   8 +-
 .../solr/scripting/update/ScriptEngineTest.java    |  40 ++-
 .../update/ScriptUpdateProcessorFactoryTest.java   | 236 ++++++-------
 .../TestBadScriptingUpdateProcessorConfig.java     |  72 ++--
 .../solr/scripting/xslt/XSLTOutputWriterTest.java  |   8 +-
 .../xslt/XSLTUpdateRequestHandlerTest.java         |  80 +++--
 15 files changed, 442 insertions(+), 489 deletions(-)

diff --git a/gradle/validation/spotless.gradle 
b/gradle/validation/spotless.gradle
index e14920e..931ea5d 100644
--- a/gradle/validation/spotless.gradle
+++ b/gradle/validation/spotless.gradle
@@ -47,7 +47,6 @@ configure(project(":solr").subprojects) { prj ->
           case ":solr:modules:gcs-repository":
           case ":solr:modules:hadoop-auth":
           case ":solr:modules:hdfs":
-          case ":solr:modules:scripting":
           case ":solr:modules:sql":
           case ":solr:core":
           case ":solr:solrj":
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/package-info.java 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/package-info.java
index c6d67f2..dee34f3 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/package-info.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/package-info.java
@@ -15,7 +15,5 @@
  * limitations under the License.
  */
 
-/**
- * Classes related to applying run time scripting changes to Solr.
- */
+/** Classes related to applying run time scripting changes to Solr. */
 package org.apache.solr.scripting;
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptEngineCustomizer.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptEngineCustomizer.java
index 05dd604..b67f9a1 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptEngineCustomizer.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptEngineCustomizer.java
@@ -19,10 +19,10 @@ package org.apache.solr.scripting.update;
 import javax.script.ScriptEngine;
 
 /**
- * Enables customization of a script engine. Will mostly be used to register 
engine scoped variables.
+ * Enables customization of a script engine. Will mostly be used to register 
engine scoped
+ * variables.
  */
 public interface ScriptEngineCustomizer {
 
   void customize(ScriptEngine engine);
-
 }
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptUpdateProcessorFactory.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptUpdateProcessorFactory.java
index 4543b97..a5de3f6 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptUpdateProcessorFactory.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/update/ScriptUpdateProcessorFactory.java
@@ -16,28 +16,6 @@
  */
 package org.apache.solr.scripting.update;
 
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.SolrResourceLoader;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.request.LocalSolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.update.*;
-import org.apache.solr.update.processor.UpdateRequestProcessor;
-import org.apache.solr.update.processor.UpdateRequestProcessorFactory;
-import org.apache.solr.util.plugin.SolrCoreAware;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.FilenameUtils;
-
-import javax.script.Invocable;
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptEngineFactory;
-import javax.script.ScriptException;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
@@ -49,87 +27,91 @@ import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.security.ProtectionDomain;
-import java.util.Set;
-import java.util.LinkedHashSet;
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Collection;
-
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import javax.script.Invocable;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrException.ErrorCode;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.request.LocalSolrQueryRequest;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.update.*;
+import org.apache.solr.update.processor.UpdateRequestProcessor;
+import org.apache.solr.update.processor.UpdateRequestProcessorFactory;
+import org.apache.solr.util.plugin.SolrCoreAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * <p>
- * An update request processor factory that enables the use of update
- * processors implemented as scripts which can be loaded from the
- * configSet.  Previously known as the StatelessScriptUpdateProcessorFactory.
- * </p>
- * <p>
- * This factory requires at least one configuration parameter named
- * <code>script</code> which may be the name of a script file as a string,
- * or an array of multiple script files.  If multiple script files are
- * specified, they are executed sequentially in the order specified in the
+ * An update request processor factory that enables the use of update 
processors implemented as
+ * scripts which can be loaded from the configSet. Previously known as the
+ * StatelessScriptUpdateProcessorFactory.
+ *
+ * <p>This factory requires at least one configuration parameter named 
<code>script</code> which may
+ * be the name of a script file as a string, or an array of multiple script 
files. If multiple
+ * script files are specified, they are executed sequentially in the order 
specified in the
  * configuration -- as if multiple factories were configured sequentially
- * </p>
- * <p>
- * Each script file is expected to declare functions with the same name
- * as each method in {@link UpdateRequestProcessor}, using the same
- * arguments.  One slight deviation is in the optional return value from
- * these functions: If a script function has a <code>boolean</code> return
- * value, and that value is <code>false</code> then the processor will
- * cleanly terminate processing of the command and return, without forwarding
- * the command on to the next script or processor in the chain.
- * Due to limitations in the {@link ScriptEngine} API used by
- * this factory, it can not enforce that all functions exist on initialization,
- * so errors from missing functions will only be generated at runtime when
- * the chain attempts to use them.
- * </p>
- * <p>
- * The factory may also be configured with an optional "params" argument,
- * which can be an {@link NamedList} (or array, or any other simple Java
- * object) which will be put into the global scope for each script.
- * </p>
- * <p>
- * The following variables are define as global variables for each script:
+ *
+ * <p>Each script file is expected to declare functions with the same name as 
each method in {@link
+ * UpdateRequestProcessor}, using the same arguments. One slight deviation is 
in the optional return
+ * value from these functions: If a script function has a <code>boolean</code> 
return value, and
+ * that value is <code>false</code> then the processor will cleanly terminate 
processing of the
+ * command and return, without forwarding the command on to the next script or 
processor in the
+ * chain. Due to limitations in the {@link ScriptEngine} API used by this 
factory, it can not
+ * enforce that all functions exist on initialization, so errors from missing 
functions will only be
+ * generated at runtime when the chain attempts to use them.
+ *
+ * <p>The factory may also be configured with an optional "params" argument, 
which can be an {@link
+ * NamedList} (or array, or any other simple Java object) which will be put 
into the global scope
+ * for each script.
+ *
+ * <p>The following variables are define as global variables for each script:
+ *
  * <ul>
- *  <li>req - The {@link SolrQueryRequest}</li>
- *  <li>rsp - The {@link SolrQueryResponse}</li>
- *  <li>logger - A {@link Logger} that can be used for logging purposes in the 
script</li>
- *  <li>params - The "params" init argument in the factory configuration (if 
any)</li>
+ *   <li>req - The {@link SolrQueryRequest}
+ *   <li>rsp - The {@link SolrQueryResponse}
+ *   <li>logger - A {@link Logger} that can be used for logging purposes in 
the script
+ *   <li>params - The "params" init argument in the factory configuration (if 
any)
  * </ul>
- * <p>
- * Internally this update processor uses JDK 6 scripting engine support,
- * and any {@link Invocable} implementations of <code>ScriptEngine</code>
- * that can be loaded using the Solr Plugin ClassLoader may be used.
- * By default, the engine used for each script is determined by the file
- * extension (ie: a *.js file will be treated as a JavaScript script) but
- * this can be overridden by specifying an explicit "engine" name init
- * param for the factory, which identifies a registered name of a
- * {@link ScriptEngineFactory}.
- * (This may be particularly useful if multiple engines are available for
- * the same scripting language, and you wish to force the usage of a
- * particular engine because of known quirks)
- * </p>
- * <p>
- * A new {@link ScriptEngineManager} is created for each
- * <code>SolrQueryRequest</code> defining a "global" scope for the script(s)
- * which is request specific.  Separate <code>ScriptEngine</code> instances
- * are then used to evaluate the script files, resulting in an "engine" scope
- * that is specific to each script.
- * </p>
- * <p>
- * A simple example...
- * </p>
+ *
+ * <p>Internally this update processor uses JDK 6 scripting engine support, 
and any {@link
+ * Invocable} implementations of <code>ScriptEngine</code> that can be loaded 
using the Solr Plugin
+ * ClassLoader may be used. By default, the engine used for each script is 
determined by the file
+ * extension (ie: a *.js file will be treated as a JavaScript script) but this 
can be overridden by
+ * specifying an explicit "engine" name init param for the factory, which 
identifies a registered
+ * name of a {@link ScriptEngineFactory}. (This may be particularly useful if 
multiple engines are
+ * available for the same scripting language, and you wish to force the usage 
of a particular engine
+ * because of known quirks)
+ *
+ * <p>A new {@link ScriptEngineManager} is created for each 
<code>SolrQueryRequest</code> defining a
+ * "global" scope for the script(s) which is request specific. Separate 
<code>ScriptEngine</code>
+ * instances are then used to evaluate the script files, resulting in an 
"engine" scope that is
+ * specific to each script.
+ *
+ * <p>A simple example...
+ *
  * <pre class="prettyprint">
  * &lt;processor 
class="org.apache.solr.scripting.update.ScriptUpdateProcessorFactory"&gt;
  *   &lt;str name="script"&gt;updateProcessor.js&lt;/str&gt;
  * &lt;/processor&gt;
  * </pre>
- * <p>
- * A more complex example involving multiple scripts in different languages,
- * and a "params" <code>NamedList</code> that will be put into the global
- * scope of each script...
- * </p>
+ *
+ * <p>A more complex example involving multiple scripts in different 
languages, and a "params"
+ * <code>NamedList</code> that will be put into the global scope of each 
script...
+ *
  * <pre class="prettyprint">
  * &lt;processor 
class="org.apache.solr.scripting.update.ScriptUpdateProcessorFactory"&gt;
  *   &lt;arr name="script"&gt;
@@ -142,10 +124,10 @@ import org.slf4j.LoggerFactory;
  *   &lt;/lst&gt;
  * &lt;/processor&gt;
  * </pre>
- * <p>
- * An example where the script file extensions are ignored, and an
- * explicit script engine is used....
- * </p>
+ *
+ * <p>An example where the script file extensions are ignored, and an explicit 
script engine is
+ * used....
+ *
  * <pre class="prettyprint">
  * &lt;processor 
class="org.apache.solr.scripting.update.ScriptUpdateProcessorFactory"&gt;
  *   &lt;arr name="script"&gt;
@@ -158,13 +140,14 @@ import org.slf4j.LoggerFactory;
  *
  * @since 4.0.0
  */
-public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory implements SolrCoreAware {
+public class ScriptUpdateProcessorFactory extends UpdateRequestProcessorFactory
+    implements SolrCoreAware {
 
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private final static String SCRIPT_ARG = "script";
-  private final static String PARAMS_ARG = "params";
-  private final static String ENGINE_NAME_ARG = "engine";
+  private static final String SCRIPT_ARG = "script";
+  private static final String PARAMS_ARG = "params";
+  private static final String ENGINE_NAME_ARG = "engine";
 
   private List<ScriptFile> scriptFiles;
 
@@ -179,12 +162,11 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
 
   @Override
   public void init(NamedList<?> args) {
-    Collection<String> scripts =
-      args.removeConfigArgs(SCRIPT_ARG);
+    Collection<String> scripts = args.removeConfigArgs(SCRIPT_ARG);
     if (scripts.isEmpty()) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-                              "ScriptUpdateProcessorFactory must be " +
-                              "initialized with at least one " + SCRIPT_ARG);
+      throw new SolrException(
+          SolrException.ErrorCode.SERVER_ERROR,
+          "ScriptUpdateProcessorFactory must be " + "initialized with at least 
one " + SCRIPT_ARG);
     }
     scriptFiles = new ArrayList<>();
     for (String script : scripts) {
@@ -196,21 +178,24 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
     Object engine = args.remove(ENGINE_NAME_ARG);
     if (engine != null) {
       if (engine instanceof String) {
-        engineName = (String)engine;
+        engineName = (String) engine;
       } else {
-        throw new SolrException
-          (SolrException.ErrorCode.SERVER_ERROR,
-           "'" + ENGINE_NAME_ARG + "' init param must be a String (found: " +
-           engine.getClass() + ")");
+        throw new SolrException(
+            SolrException.ErrorCode.SERVER_ERROR,
+            "'"
+                + ENGINE_NAME_ARG
+                + "' init param must be a String (found: "
+                + engine.getClass()
+                + ")");
       }
     }
 
     super.init(args);
-
   }
 
   @Override
-  public UpdateRequestProcessor getInstance(SolrQueryRequest req, 
SolrQueryResponse rsp, UpdateRequestProcessor next) {
+  public UpdateRequestProcessor getInstance(
+      SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor 
next) {
     List<EngineInfo> scriptEngines = null;
 
     scriptEngines = initEngines(req, rsp);
@@ -218,7 +203,8 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
     return new ScriptUpdateProcessor(req, rsp, scriptEngines, next);
   }
 
-  // TODO: Make this useful outside of tests, such that a 
ScriptEngineCustomizer could be looked up through the resource loader
+  // TODO: Make this useful outside of tests, such that a 
ScriptEngineCustomizer could be looked up
+  // through the resource loader
   void setScriptEngineCustomizer(ScriptEngineCustomizer 
scriptEngineCustomizer) {
     this.scriptEngineCustomizer = scriptEngineCustomizer;
   }
@@ -226,9 +212,11 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
   @Override
   public void inform(SolrCore core) {
     if (!core.getCoreDescriptor().isConfigSetTrusted()) {
-      throw new SolrException(ErrorCode.UNAUTHORIZED, "The configset for this 
collection was uploaded without any authentication in place,"
-          + " and this operation is not available for collections with 
untrusted configsets. To use this component, re-upload the configset"
-          + " after enabling authentication and authorization.");
+      throw new SolrException(
+          ErrorCode.UNAUTHORIZED,
+          "The configset for this collection was uploaded without any 
authentication in place,"
+              + " and this operation is not available for collections with 
untrusted configsets. To use this component, re-upload the configset"
+              + " after enabling authentication and authorization.");
     }
     resourceLoader = core.getResourceLoader();
 
@@ -245,12 +233,10 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
     } finally {
       req.close();
     }
-
-
   }
 
-
-  //================================================ Helper Methods 
==================================================
+  // ================================================ Helper Methods
+  // ==================================================
 
   /**
    * Initializes a list of script engines - an engine per script file.
@@ -259,14 +245,13 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
    * @param rsp The solr response
    * @return The list of initialized script engines.
    */
-  private List<EngineInfo> initEngines(SolrQueryRequest req,
-                                       SolrQueryResponse rsp)
-    throws SolrException {
+  private List<EngineInfo> initEngines(SolrQueryRequest req, SolrQueryResponse 
rsp)
+      throws SolrException {
 
     List<EngineInfo> scriptEngines = new ArrayList<>();
 
-    ScriptEngineManager scriptEngineManager
-      = new ScriptEngineManager(resourceLoader.getClassLoader());
+    ScriptEngineManager scriptEngineManager =
+        new ScriptEngineManager(resourceLoader.getClassLoader());
 
     scriptEngineManager.put("logger", log);
     scriptEngineManager.put("req", req);
@@ -281,33 +266,33 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
         engine = scriptEngineManager.getEngineByName(engineName);
         if (engine == null) {
           String details = getSupportedEngines(scriptEngineManager, false);
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-                                  "No ScriptEngine found by name: "
-                                  + engineName +
-                                  (null != details ?
-                                   " -- supported names: " + details : ""));
+          throw new SolrException(
+              SolrException.ErrorCode.SERVER_ERROR,
+              "No ScriptEngine found by name: "
+                  + engineName
+                  + (null != details ? " -- supported names: " + details : 
""));
         }
       } else {
-        engine = scriptEngineManager.getEngineByExtension
-          (scriptFile.getExtension());
+        engine = 
scriptEngineManager.getEngineByExtension(scriptFile.getExtension());
         if (engine == null) {
           String details = getSupportedEngines(scriptEngineManager, true);
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-                                  "No ScriptEngine found by file extension: "
-                                  + scriptFile.getFileName() +
-                                  (null != details ?
-                                   " -- supported extensions: " + details : 
""));
-
+          throw new SolrException(
+              SolrException.ErrorCode.SERVER_ERROR,
+              "No ScriptEngine found by file extension: "
+                  + scriptFile.getFileName()
+                  + (null != details ? " -- supported extensions: " + details 
: ""));
         }
       }
 
-      if (! (engine instanceof Invocable)) {
+      if (!(engine instanceof Invocable)) {
         String msg =
-          "Engine " + ((null != engineName) ? engineName :
-                       ("for script " + scriptFile.getFileName())) +
-          " does not support function invocation (via Invocable): " +
-          engine.getClass().toString() + " (" +
-          engine.getFactory().getEngineName() + ")";
+            "Engine "
+                + ((null != engineName) ? engineName : ("for script " + 
scriptFile.getFileName()))
+                + " does not support function invocation (via Invocable): "
+                + engine.getClass().toString()
+                + " ("
+                + engine.getFactory().getEngineName()
+                + ")";
         log.error(msg);
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg);
       }
@@ -316,45 +301,49 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
         scriptEngineCustomizer.customize(engine);
       }
 
-      scriptEngines.add(new EngineInfo((Invocable)engine, scriptFile));
+      scriptEngines.add(new EngineInfo((Invocable) engine, scriptFile));
       try {
         Reader scriptSrc = scriptFile.openReader(resourceLoader);
 
         try {
           try {
-            AccessController.doPrivileged(new 
PrivilegedExceptionAction<Void>() {
-              @Override
-              public Void run() throws ScriptException  {
-                engine.eval(scriptSrc);
-                return null;
-              }
-            }, SCRIPT_SANDBOX);
+            AccessController.doPrivileged(
+                new PrivilegedExceptionAction<Void>() {
+                  @Override
+                  public Void run() throws ScriptException {
+                    engine.eval(scriptSrc);
+                    return null;
+                  }
+                },
+                SCRIPT_SANDBOX);
           } catch (PrivilegedActionException e) {
             throw (ScriptException) e.getException();
           }
         } catch (ScriptException e) {
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-                                  "Unable to evaluate script: " +
-                                  scriptFile.getFileName(), e);
+          throw new SolrException(
+              SolrException.ErrorCode.SERVER_ERROR,
+              "Unable to evaluate script: " + scriptFile.getFileName(),
+              e);
         } finally {
           IOUtils.closeQuietly(scriptSrc);
         }
       } catch (IOException ioe) {
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-            "Unable to evaluate script: " +
-            scriptFile.getFileName(), ioe);
+        throw new SolrException(
+            SolrException.ErrorCode.SERVER_ERROR,
+            "Unable to evaluate script: " + scriptFile.getFileName(),
+            ioe);
       }
     }
     return scriptEngines;
   }
 
   /**
-   * For error messages - returns null if there are any exceptions of any
-   * kind building the string (or of the list is empty for some unknown 
reason).
+   * For error messages - returns null if there are any exceptions of any kind 
building the string
+   * (or of the list is empty for some unknown reason).
+   *
    * @param ext - if true, list of extensions, otherwise a list of engine names
    */
-  private static String getSupportedEngines(ScriptEngineManager mgr,
-                                            boolean ext) {
+  private static String getSupportedEngines(ScriptEngineManager mgr, boolean 
ext) {
     String result = null;
     try {
       List<ScriptEngineFactory> factories = mgr.getEngineFactories();
@@ -375,18 +364,19 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
     return result;
   }
 
+  // ================================================= Inner Classes
+  // ==================================================
 
-
-  //================================================= Inner Classes 
==================================================
-
-  /**
-   * The actual update processor. All methods delegate to scripts.
-   */
+  /** The actual update processor. All methods delegate to scripts. */
   private static class ScriptUpdateProcessor extends UpdateRequestProcessor {
 
     private List<EngineInfo> engines;
 
-    private ScriptUpdateProcessor(SolrQueryRequest req, SolrQueryResponse res, 
List<EngineInfo> engines, UpdateRequestProcessor next) {
+    private ScriptUpdateProcessor(
+        SolrQueryRequest req,
+        SolrQueryResponse res,
+        List<EngineInfo> engines,
+        UpdateRequestProcessor next) {
       super(next);
       this.engines = engines;
     }
@@ -403,7 +393,6 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
       if (invokeFunction("processDelete", cmd)) {
         super.processDelete(cmd);
       }
-
     }
 
     @Override
@@ -435,18 +424,19 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
     }
 
     /**
-     * returns true if processing should continue, or false if the
-     * request should be ended now.  Result value is computed from the return
-     * value of the script function if: it exists, is non-null, and can be
-     * cast to a java Boolean.
+     * returns true if processing should continue, or false if the request 
should be ended now.
+     * Result value is computed from the return value of the script function 
if: it exists, is
+     * non-null, and can be cast to a java Boolean.
      */
     private boolean invokeFunction(String name, Object... cmd) {
-      return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
-        @Override
-        public Boolean run() {
-          return invokeFunctionUnsafe(name, cmd);
-        }
-      }, SCRIPT_SANDBOX);
+      return AccessController.doPrivileged(
+          new PrivilegedAction<Boolean>() {
+            @Override
+            public Boolean run() {
+              return invokeFunctionUnsafe(name, cmd);
+            }
+          },
+          SCRIPT_SANDBOX);
     }
 
     private boolean invokeFunctionUnsafe(String name, Object... cmd) {
@@ -455,17 +445,21 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
         try {
           Object result = engine.getEngine().invokeFunction(name, cmd);
           if (null != result && result instanceof Boolean) {
-            if (! ((Boolean)result).booleanValue() ) {
+            if (!((Boolean) result).booleanValue()) {
               return false;
             }
           }
 
         } catch (ScriptException | NoSuchMethodException e) {
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-                                  "Unable to invoke function " + name +
-                                  " in script: " +
-                                  engine.getScriptFile().getFileName() +
-                                  ": " + e.getMessage(), e);
+          throw new SolrException(
+              SolrException.ErrorCode.SERVER_ERROR,
+              "Unable to invoke function "
+                  + name
+                  + " in script: "
+                  + engine.getScriptFile().getFileName()
+                  + ": "
+                  + e.getMessage(),
+              e);
         }
       }
 
@@ -473,9 +467,7 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
     }
   }
 
-  /**
-   * Holds the script engine and its associated script file.
-   */
+  /** Holds the script engine and its associated script file. */
   private static class EngineInfo {
 
     private final Invocable engine;
@@ -495,9 +487,7 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
     }
   }
 
-  /**
-   * Represents a script file.
-   */
+  /** Represents a script file. */
   private static class ScriptFile {
 
     private final String fileName;
@@ -518,12 +508,11 @@ public class ScriptUpdateProcessorFactory extends 
UpdateRequestProcessorFactory
 
     public Reader openReader(SolrResourceLoader resourceLoader) throws 
IOException {
       InputStream input = resourceLoader.openResource(fileName);
-      return org.apache.lucene.util.IOUtils.getDecodingReader
-        (input, StandardCharsets.UTF_8);
+      return org.apache.lucene.util.IOUtils.getDecodingReader(input, 
StandardCharsets.UTF_8);
     }
   }
 
   // sandbox for script code: zero permissions
   private static final AccessControlContext SCRIPT_SANDBOX =
-      new AccessControlContext(new ProtectionDomain[] { new 
ProtectionDomain(null, null) });
+      new AccessControlContext(new ProtectionDomain[] {new 
ProtectionDomain(null, null)});
 }
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/update/package-info.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/update/package-info.java
index 5bf1066..f02b33f 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/update/package-info.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/update/package-info.java
@@ -15,7 +15,5 @@
  * limitations under the License.
  */
 
-/**
- * Support for scripting during document updates.
- */
+/** Support for scripting during document updates. */
 package org.apache.solr.scripting.update;
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/TransformerProvider.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/TransformerProvider.java
index d11173d..2db5c94 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/TransformerProvider.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/TransformerProvider.java
@@ -38,13 +38,12 @@ import org.apache.solr.util.TimeOut;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** 
- *  Singleton that creates a Transformer for XSLT
- *  For now, only caches the last created Transformer, but
- *  could evolve to use an LRU cache of Transformers.
- *  
- *  See http://www.javaworld.com/javaworld/jw-05-2003/jw-0502-xsl_p.html for
- *  one possible way of improving caching. 
+/**
+ * Singleton that creates a Transformer for XSLT For now, only caches the last 
created Transformer,
+ * but could evolve to use an LRU cache of Transformers.
+ *
+ * <p>See http://www.javaworld.com/javaworld/jw-05-2003/jw-0502-xsl_p.html for 
one possible way of
+ * improving caching.
  */
 class TransformerProvider {
   private String lastFilename;
@@ -53,16 +52,17 @@ class TransformerProvider {
 
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private static final XMLErrorLogger xmllog = new XMLErrorLogger(log);
-  
+
   public static TransformerProvider instance = new TransformerProvider();
 
   /** singleton */
   private TransformerProvider() {
     // tell'em: currently, we only cache the last used XSLT transform, and 
blindly recompile it
     // once cacheLifetimeSeconds expires
-    log.warn("The TransformerProvider's simplistic XSLT caching mechanism is 
not appropriate "
-        + "for high load scenarios, unless a single XSLT transform is used"
-        + " and xsltCacheLifetimeSeconds is set to a sufficiently high 
value.");
+    log.warn(
+        "The TransformerProvider's simplistic XSLT caching mechanism is not 
appropriate "
+            + "for high load scenarios, unless a single XSLT transform is used"
+            + " and xsltCacheLifetimeSeconds is set to a sufficiently high 
value.");
   }
 
   /**
@@ -86,59 +86,67 @@ class TransformerProvider {
     return result;
   }
 
-  /** Return a new Transformer, possibly created from our cached Templates 
object  
+  /**
+   * Return a new Transformer, possibly created from our cached Templates 
object
+   *
    * @throws IOException If there is a low-level I/O error.
-   */ 
-  public synchronized Transformer getTransformer(SolrConfig solrConfig, String 
filename,int cacheLifetimeSeconds) throws IOException {
+   */
+  public synchronized Transformer getTransformer(
+      SolrConfig solrConfig, String filename, int cacheLifetimeSeconds) throws 
IOException {
     // For now, the Templates are blindly reloaded once cacheExpires is over.
     // It'd be better to check the file modification time to reload only if 
needed.
-    if(lastTemplates!=null && filename.equals(lastFilename) &&
-        cacheExpiresTimeout != null && ! cacheExpiresTimeout.hasTimedOut()) {
-      if(log.isDebugEnabled()) {
+    if (lastTemplates != null
+        && filename.equals(lastFilename)
+        && cacheExpiresTimeout != null
+        && !cacheExpiresTimeout.hasTimedOut()) {
+      if (log.isDebugEnabled()) {
         log.debug("Using cached Templates:{}", filename);
       }
     } else {
-      lastTemplates = getTemplates(solrConfig.getResourceLoader(), 
filename,cacheLifetimeSeconds);
+      lastTemplates = getTemplates(solrConfig.getResourceLoader(), filename, 
cacheLifetimeSeconds);
     }
-    
+
     Transformer result = null;
-    
+
     try {
       result = lastTemplates.newTransformer();
-    } catch(TransformerConfigurationException tce) {
+    } catch (TransformerConfigurationException tce) {
       log.error(getClass().getName(), "getTransformer", tce);
       throw new IOException("newTransformer fails ( " + lastFilename + ")", 
tce);
     }
-    
+
     return result;
   }
-  
+
   /** Return a Templates object for the given filename */
-  private Templates getTemplates(ResourceLoader loader, String filename,int 
cacheLifetimeSeconds) throws IOException {
-    
+  private Templates getTemplates(ResourceLoader loader, String filename, int 
cacheLifetimeSeconds)
+      throws IOException {
+
     Templates result = null;
     lastFilename = null;
     try {
-      if(log.isDebugEnabled()) {
+      if (log.isDebugEnabled()) {
         log.debug("compiling XSLT templates:{}", filename);
       }
       final String fn = "xslt/" + filename;
       final TransformerFactory tFactory = TransformerFactory.newInstance();
       tFactory.setURIResolver(new SystemIdResolver(loader).asURIResolver());
       tFactory.setErrorListener(xmllog);
-      final StreamSource src = new StreamSource(loader.openResource(fn),
-        SystemIdResolver.createSystemIdFromResourceName(fn));
+      final StreamSource src =
+          new StreamSource(
+              loader.openResource(fn), 
SystemIdResolver.createSystemIdFromResourceName(fn));
       try {
         result = tFactory.newTemplates(src);
       } finally {
-        // some XML parsers are broken and don't close the byte stream (but 
they should according to spec)
+        // some XML parsers are broken and don't close the byte stream (but 
they should according to
+        // spec)
         IOUtils.closeQuietly(src.getInputStream());
       }
     } catch (Exception e) {
       log.error(getClass().getName(), "newTemplates", e);
       throw new IOException("Unable to initialize Templates '" + filename + 
"'", e);
     }
-    
+
     lastFilename = filename;
     lastTemplates = result;
     cacheExpiresTimeout = new TimeOut(cacheLifetimeSeconds, TimeUnit.SECONDS, 
TimeSource.NANO_TIME);
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTConstants.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTConstants.java
index 36ca62e..48592df 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTConstants.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTConstants.java
@@ -20,6 +20,7 @@ package org.apache.solr.scripting.xslt;
 class XSLTConstants {
   /** Transformer param */
   static final String TR = "tr";
+
   static final String CONTEXT_TRANSFORMER_KEY = "xsltwriter.transformer";
   static final int XSLT_CACHE_DEFAULT = 60;
   static final String XSLT_CACHE_PARAM = "xsltCacheLifetimeSeconds";
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTResponseWriter.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTResponseWriter.java
index 22b21b2..2b807a2 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTResponseWriter.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTResponseWriter.java
@@ -38,12 +38,11 @@ import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.response.XMLWriter;
 
 /**
- *  Customize the format of your search results via XSL stylesheet applied to 
the default
- *  XML response format.
+ * Customize the format of your search results via XSL stylesheet applied to 
the default XML
+ * response format.
  *
- *  QueryResponseWriter captures the output of the XMLWriter
- *  (in memory for now, not optimal performance-wise), and applies an XSLT 
transform
- *  to it.
+ * <p>QueryResponseWriter captures the output of the XMLWriter (in memory for 
now, not optimal
+ * performance-wise), and applies an XSLT transform to it.
  */
 public class XSLTResponseWriter implements QueryResponseWriter {
   public static final String DEFAULT_CONTENT_TYPE = "application/xml";
@@ -61,13 +60,13 @@ public class XSLTResponseWriter implements 
QueryResponseWriter {
     Transformer t = null;
     try {
       t = getTransformer(request);
-    } catch(Exception e) {
+    } catch (Exception e) {
       // TODO should our parent interface throw (IO)Exception?
-      throw new RuntimeException("getTransformer fails in getContentType",e);
+      throw new RuntimeException("getTransformer fails in getContentType", e);
     }
 
     String mediaType = t.getOutputProperty("media-type");
-    if (mediaType == null || mediaType.length()==0) {
+    if (mediaType == null || mediaType.length() == 0) {
       // This did not happen in my tests, mediaTypeFromXslt is set to 
"text/xml"
       // if the XSLT transform does not contain an xsl:output element. Not sure
       // if this is standard behavior or if it's just my JVM/libraries
@@ -76,7 +75,7 @@ public class XSLTResponseWriter implements 
QueryResponseWriter {
 
     if (!mediaType.contains("charset")) {
       String encoding = t.getOutputProperty("encoding");
-      if (encoding == null || encoding.length()==0) {
+      if (encoding == null || encoding.length() == 0) {
         encoding = "UTF-8";
       }
       mediaType = mediaType + "; charset=" + encoding;
@@ -86,12 +85,13 @@ public class XSLTResponseWriter implements 
QueryResponseWriter {
   }
 
   @Override
-  public void write(Writer writer, SolrQueryRequest request, SolrQueryResponse 
response) throws IOException {
+  public void write(Writer writer, SolrQueryRequest request, SolrQueryResponse 
response)
+      throws IOException {
     final Transformer t = getTransformer(request);
 
     // capture the output of the XMLWriter
     final CharArrayWriter w = new CharArrayWriter();
-    XMLWriter.writeResponse(w,request,response);
+    XMLWriter.writeResponse(w, request, response);
 
     // and write transformed result to our writer
     final Reader r = new BufferedReader(new CharArrayReader(w.toCharArray()));
@@ -99,7 +99,7 @@ public class XSLTResponseWriter implements 
QueryResponseWriter {
     final StreamResult result = new StreamResult(writer);
     try {
       t.transform(source, result);
-    } catch(TransformerException te) {
+    } catch (TransformerException te) {
       throw new IOException("XSLT transformation error", te);
     }
   }
@@ -108,5 +108,4 @@ public class XSLTResponseWriter implements 
QueryResponseWriter {
     final String xslt = request.getParams().required().get(TR);
     return TransformerProvider.getTransformer(request, xslt, 
xsltCacheLifetimeSeconds);
   }
-
 }
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandler.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandler.java
index d58e03c..a7ff851 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandler.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandler.java
@@ -19,6 +19,7 @@ package org.apache.solr.scripting.xslt;
 
 import static org.apache.solr.scripting.xslt.XSLTConstants.*;
 
+import com.google.common.annotations.VisibleForTesting;
 import java.util.Map;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -27,7 +28,6 @@ import javax.xml.transform.TransformerException;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.sax.SAXSource;
-import com.google.common.annotations.VisibleForTesting;
 import org.apache.solr.common.EmptyEntityResolver;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.SolrParams;
@@ -43,8 +43,8 @@ import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 
 /**
- * Send XML formatted documents to Solr, transforming them from the original 
XML
- * format to the Solr XML format using an XSLT stylesheet via the 'tr' 
parameter.
+ * Send XML formatted documents to Solr, transforming them from the original 
XML format to the Solr
+ * XML format using an XSLT stylesheet via the 'tr' parameter.
  */
 public class XSLTUpdateRequestHandler extends UpdateRequestHandler {
 
@@ -128,7 +128,6 @@ public class XSLTUpdateRequestHandler extends 
UpdateRequestHandler {
         if (parser != null) parser.close();
       }
     }
-
   }
 
   //////////////////////// SolrInfoMBeans methods //////////////////////
diff --git 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/package-info.java
 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/package-info.java
index e12c765..175f22a 100644
--- 
a/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/package-info.java
+++ 
b/solr/modules/scripting/src/java/org/apache/solr/scripting/xslt/package-info.java
@@ -14,10 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
- 
-/** 
- * XSLT related classes.
- */
-package org.apache.solr.scripting.xslt;
-
 
+/** XSLT related classes. */
+package org.apache.solr.scripting.xslt;
diff --git 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptEngineTest.java
 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptEngineTest.java
index e0bd83b..735f649 100644
--- 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptEngineTest.java
+++ 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptEngineTest.java
@@ -16,21 +16,19 @@
  */
 package org.apache.solr.scripting.update;
 
-import org.apache.lucene.util.Constants;
-
+import java.io.StringReader;
 import javax.script.Invocable;
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 import javax.script.ScriptException;
-import java.io.StringReader;
-
+import org.apache.lucene.util.Constants;
 import org.apache.solr.SolrTestCase;
 import org.junit.Assume;
 import org.junit.BeforeClass;
 
 /**
- * Sanity tests basic functionality of {@link ScriptEngineManager} and 
- * {@link ScriptEngine} w/o exercising any Lucene specific code.
+ * Sanity tests basic functionality of {@link ScriptEngineManager} and {@link 
ScriptEngine} w/o
+ * exercising any Lucene specific code.
  */
 public class ScriptEngineTest extends SolrTestCase {
 
@@ -38,7 +36,8 @@ public class ScriptEngineTest extends SolrTestCase {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    assumeFalse("https://twitter.com/UweSays/status/260487231880433664 / 
SOLR-4233: OS X bogusly starts AWT!",
+    assumeFalse(
+        "https://twitter.com/UweSays/status/260487231880433664 / SOLR-4233: OS 
X bogusly starts AWT!",
         Constants.MAC_OS_X);
     Assume.assumeNotNull((new 
ScriptEngineManager()).getEngineByExtension("js"));
     Assume.assumeNotNull((new 
ScriptEngineManager()).getEngineByName("JavaScript"));
@@ -68,7 +67,7 @@ public class ScriptEngineTest extends SolrTestCase {
     ScriptEngine engine = manager.getEngineByName("JavaScript");
     assertNotNull(engine);
     engine.eval("function add(a,b) { return a + b }");
-    Number result = (Number) ((Invocable)engine).invokeFunction("add", 1, 2);
+    Number result = (Number) ((Invocable) engine).invokeFunction("add", 1, 2);
     assertNotNull(result);
     assertEquals(3, result.intValue());
   }
@@ -78,7 +77,7 @@ public class ScriptEngineTest extends SolrTestCase {
     assertNotNull(engine);
     StringReader reader = new StringReader("function add(a,b) { return a + b 
}");
     engine.eval(reader);
-    Number result = (Number) ((Invocable)engine).invokeFunction("add", 1, 2);
+    Number result = (Number) ((Invocable) engine).invokeFunction("add", 1, 2);
     assertNotNull(result);
     assertEquals(3, result.intValue());
   }
@@ -89,22 +88,21 @@ public class ScriptEngineTest extends SolrTestCase {
     engine.put("b", 2);
     assertNotNull(engine);
     engine.eval("function add() { return a + b }");
-    Number result = (Number) ((Invocable)engine).invokeFunction("add", 1, 2);
+    Number result = (Number) ((Invocable) engine).invokeFunction("add", 1, 2);
     assertNotNull(result);
     assertEquals(3, result.intValue());
   }
 
- public void testJRuby() throws ScriptException, NoSuchMethodException {  
-   // Simply adding jruby.jar to Solr's lib/ directory gets this test passing
-   ScriptEngine engine = manager.getEngineByName("jruby");
+  public void testJRuby() throws ScriptException, NoSuchMethodException {
+    // Simply adding jruby.jar to Solr's lib/ directory gets this test passing
+    ScriptEngine engine = manager.getEngineByName("jruby");
 
-   Assume.assumeNotNull(engine);
-
-   assertNotNull(engine);
-   engine.eval("def add(a,b); a + b; end");
-   Number result = (Number) ((Invocable)engine).invokeFunction("add", 1, 2);
-   assertNotNull(result);
-   assertEquals(3, result.intValue());
- }
+    Assume.assumeNotNull(engine);
 
+    assertNotNull(engine);
+    engine.eval("def add(a,b); a + b; end");
+    Number result = (Number) ((Invocable) engine).invokeFunction("add", 1, 2);
+    assertNotNull(result);
+    assertEquals(3, result.intValue());
+  }
 }
diff --git 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptUpdateProcessorFactoryTest.java
 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptUpdateProcessorFactoryTest.java
index 81ff231..9c8110b 100644
--- 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptUpdateProcessorFactoryTest.java
+++ 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/update/ScriptUpdateProcessorFactoryTest.java
@@ -16,11 +16,10 @@
  */
 package org.apache.solr.scripting.update;
 
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
 import java.util.ArrayList;
 import java.util.List;
-
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -33,114 +32,108 @@ import org.junit.BeforeClass;
 /**
  * Tests {@link ScriptUpdateProcessorFactory}.
  *
- * TODO: This test, to run from an IDE, requires a working directory of 
&lt;path-to&gt;/solr/modules/scripting/src/test-files.  Fix!
+ * <p>TODO: This test, to run from an IDE, requires a working directory of
+ * &lt;path-to&gt;/solr/modules/scripting/src/test-files. Fix!
  */
 public class ScriptUpdateProcessorFactoryTest extends UpdateProcessorTestBase {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
     Assume.assumeNotNull((new 
ScriptEngineManager()).getEngineByExtension("js"));
-    initCore("solrconfig-script-updateprocessor.xml", "schema.xml", 
getFile("scripting/solr").getAbsolutePath());
+    initCore(
+        "solrconfig-script-updateprocessor.xml",
+        "schema.xml",
+        getFile("scripting/solr").getAbsolutePath());
   }
 
   /**
-   * simple test of a basic script processor chain using the full
-   * RequestHandler + UpdateProcessorChain flow
+   * simple test of a basic script processor chain using the full 
RequestHandler +
+   * UpdateProcessorChain flow
    */
   public void testFullRequestHandlerFlow() throws Exception {
 
-    assertU("Simple assertion that adding a document works",
-            adoc("id",  "4055",
-                 "subject", "Hoss"));
+    assertU(
+        "Simple assertion that adding a document works",
+        adoc(
+            "id", "4055",
+            "subject", "Hoss"));
     assertU(commit());
 
-    assertQ("couldn't find hoss using script added field",
-            req("q","script_added_i:[40 TO 45]",
-                "fq","id:4055")
-            ,"//result[@numFound=1]"
-            ,"//str[@name='id'][.='4055']"
-            );
+    assertQ(
+        "couldn't find hoss using script added field",
+        req(
+            "q", "script_added_i:[40 TO 45]",
+            "fq", "id:4055"),
+        "//result[@numFound=1]",
+        "//str[@name='id'][.='4055']");
 
     // clean up
-    processDeleteById("run-no-scripts","4055");
+    processDeleteById("run-no-scripts", "4055");
     processCommit("run-no-scripts");
-
   }
 
   public void testSingleScript() throws Exception {
     SolrCore core = h.getCore();
     UpdateRequestProcessorChain chained = 
core.getUpdateProcessingChain("single-script");
-    final ScriptUpdateProcessorFactory factory = 
((ScriptUpdateProcessorFactory) chained.getProcessors().get(0));
+    final ScriptUpdateProcessorFactory factory =
+        ((ScriptUpdateProcessorFactory) chained.getProcessors().get(0));
     final List<String> functionMessages = new ArrayList<>();
-    factory.setScriptEngineCustomizer(new ScriptEngineCustomizer() {
-      @Override
-      public void customize(ScriptEngine engine) {
-        engine.put("functionMessages", functionMessages);
-      }
-    });
+    factory.setScriptEngineCustomizer(
+        new ScriptEngineCustomizer() {
+          @Override
+          public void customize(ScriptEngine engine) {
+            engine.put("functionMessages", functionMessages);
+          }
+        });
     assertNotNull(chained);
 
-    SolrInputDocument d = processAdd("single-script",
-        doc(f("id", "1"),
-            f("name", " foo "),
-            f("subject", "bar")));
+    SolrInputDocument d =
+        processAdd("single-script", doc(f("id", "1"), f("name", " foo "), 
f("subject", "bar")));
 
     processCommit("run-no-scripts");
 
-    assertQ("couldn't find doc by id",
-            req("q","id:1")
-            , "//result[@numFound=1]");
+    assertQ("couldn't find doc by id", req("q", "id:1"), 
"//result[@numFound=1]");
 
-    processDeleteById("single-script","1");
+    processDeleteById("single-script", "1");
     processCommit("single-script");
 
-    assertQ("found deleted doc",
-            req("q","id:1")
-            , "//result[@numFound=0]");
-
+    assertQ("found deleted doc", req("q", "id:1"), "//result[@numFound=0]");
 
     assertEquals(3, functionMessages.size());
 
     assertTrue(functionMessages.contains("processAdd0"));
     assertTrue(functionMessages.contains("processDelete0"));
     assertTrue(functionMessages.contains("processCommit0"));
-
   }
 
   public void testMultipleScripts() throws Exception {
     SolrCore core = h.getCore();
 
-    for (final String chain : new String[] {"dual-scripts-arr",
-                                            "dual-scripts-strs"}) {
+    for (final String chain : new String[] {"dual-scripts-arr", 
"dual-scripts-strs"}) {
 
       UpdateRequestProcessorChain chained = 
core.getUpdateProcessingChain(chain);
       final ScriptUpdateProcessorFactory factory =
-        ((ScriptUpdateProcessorFactory) chained.getProcessors().get(0));
+          ((ScriptUpdateProcessorFactory) chained.getProcessors().get(0));
       final List<String> functionMessages = new ArrayList<>();
-      ScriptEngineCustomizer customizer = new ScriptEngineCustomizer() {
-          @Override
-          public void customize(ScriptEngine engine) {
-            engine.put("functionMessages", functionMessages);
-          }
-        };
+      ScriptEngineCustomizer customizer =
+          new ScriptEngineCustomizer() {
+            @Override
+            public void customize(ScriptEngine engine) {
+              engine.put("functionMessages", functionMessages);
+            }
+          };
       factory.setScriptEngineCustomizer(customizer);
       assertNotNull(chained);
 
-      SolrInputDocument d = processAdd(chain,
-                                       doc(f("id", "2"),
-                                           f("name", " foo "),
-                                           f("subject", "bar")));
+      SolrInputDocument d =
+          processAdd(chain, doc(f("id", "2"), f("name", " foo "), f("subject", 
"bar")));
 
-      assertEquals(chain + " didn't add Double field",
-                   42.3d, d.getFieldValue("script_added_d"));
-      assertEquals(chain + " didn't add integer field",
-          42, d.getFieldValue("script_added_i"));
+      assertEquals(chain + " didn't add Double field", 42.3d, 
d.getFieldValue("script_added_d"));
+      assertEquals(chain + " didn't add integer field", 42, 
d.getFieldValue("script_added_i"));
 
       processCommit("run-no-scripts");
 
-      assertQ(chain + ": couldn't find doc by id",
-              req("q","id:2")
-              , "//result[@numFound=1]");
+      assertQ(chain + ": couldn't find doc by id", req("q", "id:2"), 
"//result[@numFound=1]");
 
       processDeleteById(chain, "2");
       processCommit(chain);
@@ -148,21 +141,21 @@ public class ScriptUpdateProcessorFactoryTest extends 
UpdateProcessorTestBase {
       assertEquals(chain, 6, functionMessages.size());
       assertTrue(chain, functionMessages.contains("processAdd0"));
       assertTrue(chain, functionMessages.contains("processAdd1"));
-      assertTrue(chain + ": script order doesn't match conf order",
-                 functionMessages.indexOf("processAdd0")
-                 < functionMessages.indexOf("processAdd1"));
+      assertTrue(
+          chain + ": script order doesn't match conf order",
+          functionMessages.indexOf("processAdd0") < 
functionMessages.indexOf("processAdd1"));
 
       assertTrue(chain, functionMessages.contains("processDelete0"));
       assertTrue(chain, functionMessages.contains("processDelete1"));
-      assertTrue(chain + ": script order doesn't match conf order",
-                 functionMessages.indexOf("processDelete0")
-                 < functionMessages.indexOf("processDelete1"));
+      assertTrue(
+          chain + ": script order doesn't match conf order",
+          functionMessages.indexOf("processDelete0") < 
functionMessages.indexOf("processDelete1"));
 
       assertTrue(chain, functionMessages.contains("processCommit0"));
       assertTrue(chain, functionMessages.contains("processCommit1"));
-      assertTrue(chain + ": script order doesn't match conf order",
-                 functionMessages.indexOf("processCommit0")
-                 < functionMessages.indexOf("processCommit1"));
+      assertTrue(
+          chain + ": script order doesn't match conf order",
+          functionMessages.indexOf("processCommit0") < 
functionMessages.indexOf("processCommit1"));
 
       finish(chain);
 
@@ -170,49 +163,33 @@ public class ScriptUpdateProcessorFactoryTest extends 
UpdateProcessorTestBase {
 
       assertTrue(chain, functionMessages.contains("finish0"));
       assertTrue(chain, functionMessages.contains("finish1"));
-      assertTrue(chain + ": script order doesn't match conf order",
-                 functionMessages.indexOf("finish0")
-                 < functionMessages.indexOf("finish1"));
-
-      assertQ(chain + ": found deleted doc",
-              req("q","id:2")
-              , "//result[@numFound=0]");
+      assertTrue(
+          chain + ": script order doesn't match conf order",
+          functionMessages.indexOf("finish0") < 
functionMessages.indexOf("finish1"));
 
+      assertQ(chain + ": found deleted doc", req("q", "id:2"), 
"//result[@numFound=0]");
     }
   }
 
-
   public void testConditionalExecution() throws Exception {
-    for (String chain : new String[] {"conditional-script",
-                                      "conditional-scripts"}) {
+    for (String chain : new String[] {"conditional-script", 
"conditional-scripts"}) {
 
       ModifiableSolrParams reqParams = new ModifiableSolrParams();
 
-      SolrInputDocument d = processAdd(chain,
-                                       reqParams,
-                                       doc(f("id", "3"),
-                                           f("name", " foo "),
-                                           f("subject", "bar")));
+      SolrInputDocument d =
+          processAdd(chain, reqParams, doc(f("id", "3"), f("name", " foo "), 
f("subject", "bar")));
 
-      assertFalse(chain + " added String field despite condition",
-                  d.containsKey("script_added_s"));
-      assertFalse(chain + " added Double field despite condition",
-                  d.containsKey("script_added_d"));
+      assertFalse(chain + " added String field despite condition", 
d.containsKey("script_added_s"));
+      assertFalse(chain + " added Double field despite condition", 
d.containsKey("script_added_d"));
 
       reqParams.add("go-for-it", "true");
 
-      d = processAdd(chain,
-                     reqParams,
-                     doc(f("id", "4"),
-                         f("name", " foo "),
-                         f("subject", "bar")));
-
-      assertEquals(chain + " didn't add String field",
-                   "i went for it", d.getFieldValue("script_added_s"));
-      assertEquals(chain +" didn't add Double field",
-                   42.3d, d.getFieldValue("script_added_d"));
-      assertEquals(chain + " didn't add integer field",
-          42, d.getFieldValue("script_added_i"));
+      d = processAdd(chain, reqParams, doc(f("id", "4"), f("name", " foo "), 
f("subject", "bar")));
+
+      assertEquals(
+          chain + " didn't add String field", "i went for it", 
d.getFieldValue("script_added_s"));
+      assertEquals(chain + " didn't add Double field", 42.3d, 
d.getFieldValue("script_added_d"));
+      assertEquals(chain + " didn't add integer field", 42, 
d.getFieldValue("script_added_i"));
     }
   }
 
@@ -220,55 +197,48 @@ public class ScriptUpdateProcessorFactoryTest extends 
UpdateProcessorTestBase {
     Assume.assumeNotNull((new 
ScriptEngineManager()).getEngineByName("javascript"));
 
     final String chain = "force-script-engine";
-    SolrInputDocument d = processAdd(chain,
-                                     doc(f("id", "5"),
-                                         f("name", " foo "),
-                                         f("subject", "bar")));
-
-    assertEquals(chain +" didn't add Double field",
-                 42.3d, d.getFieldValue("script_added_d"));
-    assertEquals(chain + " didn't add integer field",
-        42, d.getFieldValue("script_added_i"));
+    SolrInputDocument d =
+        processAdd(chain, doc(f("id", "5"), f("name", " foo "), f("subject", 
"bar")));
+
+    assertEquals(chain + " didn't add Double field", 42.3d, 
d.getFieldValue("script_added_d"));
+    assertEquals(chain + " didn't add integer field", 42, 
d.getFieldValue("script_added_i"));
   }
 
-  public void testPropogatedException() throws Exception  {
+  public void testPropogatedException() throws Exception {
     final String chain = "error-on-add";
-    SolrException e = expectThrows(SolrException.class, () ->
-        processAdd(chain, doc(f("id", "5"), f("name", " foo "),
-            f("subject", "bar")))
-    );
-    assertTrue("Exception doesn't contain script error string: " + 
e.getMessage(),
+    SolrException e =
+        expectThrows(
+            SolrException.class,
+            () -> processAdd(chain, doc(f("id", "5"), f("name", " foo "), 
f("subject", "bar"))));
+    assertTrue(
+        "Exception doesn't contain script error string: " + e.getMessage(),
         0 < e.getMessage().indexOf("no-soup-fo-you"));
   }
 
-  public void testMissingFunctions() throws Exception  {
+  public void testMissingFunctions() throws Exception {
     final String chain = "missing-functions";
-    SolrException e = expectThrows(SolrException.class, () ->
-        processAdd(chain, doc(f("id", "5"),
-            f("name", " foo "), f("subject", "bar")))
-    );
-    assertTrue("Exception doesn't contain expected error: " + e.getMessage(),
+    SolrException e =
+        expectThrows(
+            SolrException.class,
+            () -> processAdd(chain, doc(f("id", "5"), f("name", " foo "), 
f("subject", "bar"))));
+    assertTrue(
+        "Exception doesn't contain expected error: " + e.getMessage(),
         0 < e.getMessage().indexOf("processAdd"));
   }
 
-  public void testJavaScriptCompatibility() throws Exception  {
+  public void testJavaScriptCompatibility() throws Exception {
     final String chain = "javascript-compatibility";
-    SolrInputDocument d = processAdd(chain,
-                                 doc(f("id", "5"),
-                                     f("name", " foo "),
-                                     f("subject", "BAR")));
+    SolrInputDocument d =
+        processAdd(chain, doc(f("id", "5"), f("name", " foo "), f("subject", 
"BAR")));
     assertEquals("bar", d.getFieldValue("term_s"));
-
   }
 
-  public void testScriptSandbox() throws Exception  {
+  public void testScriptSandbox() throws Exception {
     assumeTrue("This test only works with security manager", 
System.getSecurityManager() != null);
-    expectThrows(SecurityException.class, () -> {
-      processAdd("evil",
-        doc(f("id", "5"),
-            f("name", " foo "),
-            f("subject", "BAR")));
-    });
+    expectThrows(
+        SecurityException.class,
+        () -> {
+          processAdd("evil", doc(f("id", "5"), f("name", " foo "), 
f("subject", "BAR")));
+        });
   }
-
 }
diff --git 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/update/TestBadScriptingUpdateProcessorConfig.java
 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/update/TestBadScriptingUpdateProcessorConfig.java
index 34be468..666ae0e 100644
--- 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/update/TestBadScriptingUpdateProcessorConfig.java
+++ 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/update/TestBadScriptingUpdateProcessorConfig.java
@@ -18,70 +18,74 @@ package org.apache.solr.scripting.update;
 
 import java.util.Map;
 import java.util.regex.Pattern;
-
 import javax.script.ScriptEngineManager;
-
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.core.CoreContainer;
 import org.junit.Assume;
 
 public class TestBadScriptingUpdateProcessorConfig extends SolrTestCaseJ4 {
 
-
   public void testBogusScriptEngine() throws Exception {
     // sanity check
     Assume.assumeTrue(null == (new 
ScriptEngineManager()).getEngineByName("giberish"));
 
-    assertConfigs("bad-solrconfig-bogus-scriptengine-name.xml",
-                  
"schema.xml",getFile("scripting/solr/collection1").getParent(),"giberish");
+    assertConfigs(
+        "bad-solrconfig-bogus-scriptengine-name.xml",
+        "schema.xml",
+        getFile("scripting/solr/collection1").getParent(),
+        "giberish");
   }
 
   public void testMissingScriptFile() throws Exception {
     // sanity check
     Assume.assumeNotNull((new 
ScriptEngineManager()).getEngineByExtension("js"));
-    assertConfigs("bad-solrconfig-missing-scriptfile.xml",
-                  
"schema.xml",getFile("scripting/solr/collection1").getParent(),"a-file-name-that-does-not-exist.js");
+    assertConfigs(
+        "bad-solrconfig-missing-scriptfile.xml",
+        "schema.xml",
+        getFile("scripting/solr/collection1").getParent(),
+        "a-file-name-that-does-not-exist.js");
   }
 
   public void testInvalidScriptFile() throws Exception {
     // sanity check
     Assume.assumeNotNull((new 
ScriptEngineManager()).getEngineByName("javascript"));
-    assertConfigs("bad-solrconfig-invalid-scriptfile.xml",
-                  
"schema.xml",getFile("scripting/solr/collection1").getParent(),"invalid.script.xml");
+    assertConfigs(
+        "bad-solrconfig-invalid-scriptfile.xml",
+        "schema.xml",
+        getFile("scripting/solr/collection1").getParent(),
+        "invalid.script.xml");
   }
-  
-    /**
-     * Given a solrconfig.xml file name, a schema file name, a solr home 
directory, 
-     * and an expected errString, asserts that initializing a core with these 
-     * files causes an error matching the specified errString ot be thrown.
-     */
-  protected final void assertConfigs(final String solrconfigFile,
-                                     final String schemaFile,
-                                     final String solrHome,
-                                     final String errString) 
-    throws Exception {
+
+  /**
+   * Given a solrconfig.xml file name, a schema file name, a solr home 
directory, and an expected
+   * errString, asserts that initializing a core with these files causes an 
error matching the
+   * specified errString ot be thrown.
+   */
+  protected final void assertConfigs(
+      final String solrconfigFile,
+      final String schemaFile,
+      final String solrHome,
+      final String errString)
+      throws Exception {
 
     ignoreException(Pattern.quote(errString));
     try {
 
       if (null == solrHome) {
-        initCore( solrconfigFile, schemaFile );
+        initCore(solrconfigFile, schemaFile);
       } else {
-        initCore( solrconfigFile, schemaFile, solrHome );
+        initCore(solrconfigFile, schemaFile, solrHome);
       }
 
       CoreContainer cc = h.getCoreContainer();
-      for (Map.Entry<String, CoreContainer.CoreLoadFailure> entry : 
cc.getCoreInitFailures().entrySet()) {
-        if (matches(entry.getValue().exception, errString))
-          return;
+      for (Map.Entry<String, CoreContainer.CoreLoadFailure> entry :
+          cc.getCoreInitFailures().entrySet()) {
+        if (matches(entry.getValue().exception, errString)) return;
       }
-    }
-    catch (Exception e) {
-      if (matches(e, errString))
-        return;
+    } catch (Exception e) {
+      if (matches(e, errString)) return;
       throw e;
-    }
-    finally {
+    } finally {
       deleteCore();
       resetExceptionIgnores();
     }
@@ -90,10 +94,8 @@ public class TestBadScriptingUpdateProcessorConfig extends 
SolrTestCaseJ4 {
 
   private static boolean matches(Exception e, String errString) {
     for (Throwable t = e; t != null; t = t.getCause()) {
-      if (t.getMessage() != null && -1 != t.getMessage().indexOf(errString))
-        return true;
+      if (t.getMessage() != null && -1 != t.getMessage().indexOf(errString)) 
return true;
     }
     return false;
-  }  
-
+  }
 }
diff --git 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTOutputWriterTest.java
 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTOutputWriterTest.java
index 3792564..06122b2 100644
--- 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTOutputWriterTest.java
+++ 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTOutputWriterTest.java
@@ -21,11 +21,10 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 /**
- * Tests the ability to configure multiple query output writers, and select 
those at query time. This test 
- * is specific to the XSLT writer, which isn't part of the core.
- * 
- * See the related unit test OutputWriterTest.
+ * Tests the ability to configure multiple query output writers, and select 
those at query time.
+ * This test is specific to the XSLT writer, which isn't part of the core.
  *
+ * <p>See the related unit test OutputWriterTest.
  */
 public class XSLTOutputWriterTest extends SolrTestCaseJ4 {
 
@@ -49,5 +48,4 @@ public class XSLTOutputWriterTest extends SolrTestCaseJ4 {
     String out = h.query(req("*:*"));
     assertTrue(out.contains("DUMMY"));
   }
-
 }
diff --git 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandlerTest.java
 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandlerTest.java
index bdde784..c6a2a87 100644
--- 
a/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandlerTest.java
+++ 
b/solr/modules/scripting/src/test/org/apache/solr/scripting/xslt/XSLTUpdateRequestHandlerTest.java
@@ -37,14 +37,9 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-/**
- * <p>
- * This tests the XSLTUpdateRequestHandler ability to work with XSLT 
stylesheet and xml content.
- * </p>
-*/
+/** This tests the XSLTUpdateRequestHandler ability to work with XSLT 
stylesheet and xml content. */
 public class XSLTUpdateRequestHandlerTest extends SolrTestCaseJ4 {
 
-
   @BeforeClass
   public static void beforeTests() throws Exception {
     initCore("solrconfig.xml", "schema.xml", 
getFile("scripting/solr").getAbsolutePath());
@@ -59,67 +54,70 @@ public class XSLTUpdateRequestHandlerTest extends 
SolrTestCaseJ4 {
   }
 
   @Test
-  public void testUpdate() throws Exception
-  {
+  public void testUpdate() throws Exception {
     String xml =
-      "<random>" +
-      " <document>" +
-      "  <node name=\"id\" value=\"12345\"/>" +
-      "  <node name=\"name\" value=\"kitten\"/>" +
-      "  <node name=\"text\" enhance=\"3\" value=\"some other day\"/>" +
-      "  <node name=\"title\" enhance=\"4\" value=\"A story\"/>" +
-      "  <node name=\"timestamp\" enhance=\"5\" 
value=\"2011-07-01T10:31:57.140Z\"/>" +
-      " </document>" +
-      "</random>";
+        "<random>"
+            + " <document>"
+            + "  <node name=\"id\" value=\"12345\"/>"
+            + "  <node name=\"name\" value=\"kitten\"/>"
+            + "  <node name=\"text\" enhance=\"3\" value=\"some other day\"/>"
+            + "  <node name=\"title\" enhance=\"4\" value=\"A story\"/>"
+            + "  <node name=\"timestamp\" enhance=\"5\" 
value=\"2011-07-01T10:31:57.140Z\"/>"
+            + " </document>"
+            + "</random>";
 
-    Map<String,String> args = new HashMap<>();
+    Map<String, String> args = new HashMap<>();
     args.put("tr", "xsl-update-handler-test.xsl");
 
     SolrCore core = h.getCore();
-    LocalSolrQueryRequest req = new LocalSolrQueryRequest( core, new 
MapSolrParams( args) );
+    LocalSolrQueryRequest req = new LocalSolrQueryRequest(core, new 
MapSolrParams(args));
     ArrayList<ContentStream> streams = new ArrayList<>();
     streams.add(new ContentStreamBase.StringStream(xml));
     req.setContentStreams(streams);
     SolrQueryResponse rsp = new SolrQueryResponse();
-    //try (UpdateRequestHandler handler = new UpdateRequestHandler()) {
+    // try (UpdateRequestHandler handler = new UpdateRequestHandler()) {
     try (XSLTUpdateRequestHandler handler = new XSLTUpdateRequestHandler()) {
       handler.init(new NamedList<>());
       handler.handleRequestBody(req, rsp);
     }
     StringWriter sw = new StringWriter(32000);
     QueryResponseWriter responseWriter = core.getQueryResponseWriter(req);
-    responseWriter.write(sw,req,rsp);
+    responseWriter.write(sw, req, rsp);
     req.close();
     String response = sw.toString();
     assertU(response);
     assertU(commit());
 
-    assertQ("test document was correctly committed", req("q","*:*")
-            , "//result[@numFound='1']"
-            , "//str[@name='id'][.='12345']"
-        );
+    assertQ(
+        "test document was correctly committed",
+        req("q", "*:*"),
+        "//result[@numFound='1']",
+        "//str[@name='id'][.='12345']");
   }
 
   @Test
-  public void testEntities() throws Exception
-  {
+  public void testEntities() throws Exception {
     // use a binary file, so when it's loaded fail with XML error:
     String file = getFile("mailing_lists.pdf").toURI().toASCIIString();
     String xml =
-      "<?xml version=\"1.0\"?>" +
-      "<!DOCTYPE foo [" +
-      // check that external entities are not resolved!
-      "<!ENTITY bar SYSTEM \""+file+"\">"+
-      // but named entities should be
-      "<!ENTITY wacky \"zzz\">"+
-      "]>" +
-      "<random>" +
-      " &bar;" +
-      " <document>" +
-      "  <node name=\"id\" value=\"12345\"/>" +
-      "  <node name=\"foo_s\" value=\"&wacky;\"/>" +
-      " </document>" +
-      "</random>";
+        "<?xml version=\"1.0\"?>"
+            + "<!DOCTYPE foo ["
+            +
+            // check that external entities are not resolved!
+            "<!ENTITY bar SYSTEM \""
+            + file
+            + "\">"
+            +
+            // but named entities should be
+            "<!ENTITY wacky \"zzz\">"
+            + "]>"
+            + "<random>"
+            + " &bar;"
+            + " <document>"
+            + "  <node name=\"id\" value=\"12345\"/>"
+            + "  <node name=\"foo_s\" value=\"&wacky;\"/>"
+            + " </document>"
+            + "</random>";
     SolrQueryRequest req = req("tr", "xsl-update-handler-test.xsl");
     SolrQueryResponse rsp = new SolrQueryResponse();
     BufferingRequestProcessor p = new BufferingRequestProcessor(null);

Reply via email to