You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2016/02/02 18:43:06 UTC

lucene-solr git commit: Some refactoring to MergePolicyFactory

Repository: lucene-solr
Updated Branches:
  refs/heads/master-solr-8621 43671b3e0 -> 2367d8457


Some refactoring to MergePolicyFactory

(*) Remove MergePolicyFactoryHelper. MergePolicyFactory now takes a
SolrResourceLoader for creating MergePolicy and MergePolicyFactory
instances.

(*) Adds support for "wrapped.prefix" key for a
WrapperMergePolicyFactory. This is used to configure the wrapped
MergePolicyFactory.

(*) WrapperMergePolicyFactory defines an abstract
getDefaultMergePolicy() so implementations can return the default MP
in case none is configured.

(*) WrapperMergePolicyFactory only implements getting the wrapped
MergePolicy instance, while implementations return the actual final
MergePolicy.

(*) SimpleMergePolicyFactory requires implementations to return the MP
instance, while it then configures it with the set properties.

(*) Changed SolrIndexConfig to not fail (for now) if solrconfig.xml
contains <mergePolicy> but not the <mPFactory>, so that in this commit
we can focus on getting the actual classes in place. In a follow-on
commit we should remove support for <mergePolicy> in trunk and
deprecate in 5x.

(*) Added RandomMergePolicyFactory for tests.

(*) Removed all the added tests since the factory and associated
classes were moved to solr/ code.

(*) Added WrapperMergePolicyFactoryTest.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2367d845
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2367d845
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2367d845

Branch: refs/heads/master-solr-8621
Commit: 2367d845743874ea9ef2434d1a17247699ca5b5a
Parents: 43671b3
Author: Shai Erera <sh...@apache.org>
Authored: Tue Feb 2 13:34:44 2016 +0200
Committer: Shai Erera <sh...@apache.org>
Committed: Tue Feb 2 19:41:25 2016 +0200

----------------------------------------------------------------------
 .../index/LogByteSizeMergePolicyFactory.java    | 31 -------
 .../lucene/index/LogDocMergePolicyFactory.java  | 31 -------
 .../apache/lucene/index/MergePolicyFactory.java | 38 --------
 .../lucene/index/MergePolicyFactoryArgs.java    | 64 -------------
 .../lucene/index/MergePolicyFactoryHelper.java  | 26 ------
 .../lucene/index/SimpleMergePolicyFactory.java  | 45 ---------
 .../lucene/index/TieredMergePolicyFactory.java  | 31 -------
 .../index/UpgradeIndexMergePolicyFactory.java   | 31 -------
 .../lucene/index/WrapperMergePolicyFactory.java | 81 ----------------
 .../apache/lucene/util/LucenePluginUtils.java   | 56 -----------
 .../apache/lucene/index/TestLogMergePolicy.java | 18 ----
 .../apache/lucene/index/TestNoMergePolicy.java  | 15 ---
 .../lucene/index/TestTieredMergePolicy.java     | 18 ----
 .../index/TestUpgradeIndexMergePolicy.java      | 12 ---
 .../lucene/index/TestSortingMergePolicy.java    | 17 ----
 .../lucene/index/BaseMergePolicyTestCase.java   | 97 --------------------
 .../index/LogByteSizeMergePolicyFactory.java    | 37 ++++++++
 .../solr/index/LogDocMergePolicyFactory.java    | 37 ++++++++
 .../apache/solr/index/MergePolicyFactory.java   | 37 ++++++++
 .../solr/index/MergePolicyFactoryArgs.java      | 61 ++++++++++++
 .../solr/index/SimpleMergePolicyFactory.java    | 41 +++++++++
 .../solr/index/TieredMergePolicyFactory.java    | 37 ++++++++
 .../index/UpgradeIndexMergePolicyFactory.java   | 46 ++++++++++
 .../solr/index/WrapperMergePolicyFactory.java   | 91 ++++++++++++++++++
 .../org/apache/solr/update/SolrIndexConfig.java | 35 ++++---
 .../org/apache/solr/util/SolrPluginUtils.java   | 27 ++++--
 .../solrconfig-tieredmergepolicyfactory.xml     |  1 -
 .../solrconfig.snippet.randomindexconfig.xml    |  2 +-
 .../index/WrapperMergePolicyFactoryTest.java    | 86 +++++++++++++++++
 .../apache/solr/update/SolrIndexConfigTest.java |  5 +-
 .../solr/util/RandomMergePolicyFactory.java     | 35 +++++++
 31 files changed, 545 insertions(+), 644 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/LogByteSizeMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/LogByteSizeMergePolicyFactory.java b/lucene/core/src/java/org/apache/lucene/index/LogByteSizeMergePolicyFactory.java
deleted file mode 100644
index 82ee6a8..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/LogByteSizeMergePolicyFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.lucene.index;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A {@link MergePolicyFactory} for {@link LogByteSizeMergePolicy} objects.
- *
- * @lucene.experimental
- */
-public class LogByteSizeMergePolicyFactory extends SimpleMergePolicyFactory {
-
-  public LogByteSizeMergePolicyFactory(MergePolicyFactoryHelper helper, MergePolicyFactoryArgs args) {
-    super(helper, args, LogByteSizeMergePolicy.class.getName());
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/LogDocMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/LogDocMergePolicyFactory.java b/lucene/core/src/java/org/apache/lucene/index/LogDocMergePolicyFactory.java
deleted file mode 100644
index 1327ff7..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/LogDocMergePolicyFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.lucene.index;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A {@link MergePolicyFactory} for {@link LogDocMergePolicy} objects.
- *
- * @lucene.experimental
- */
-public class LogDocMergePolicyFactory extends SimpleMergePolicyFactory {
-
-  public LogDocMergePolicyFactory(MergePolicyFactoryHelper helper, MergePolicyFactoryArgs args) {
-    super(helper, args, LogDocMergePolicy.class.getName());
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactory.java b/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactory.java
deleted file mode 100644
index f8d50d9..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.apache.lucene.index;
-
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A factory for {@link MergePolicy} objects.
- *
- * @lucene.experimental
- */
-public abstract class MergePolicyFactory {
-
-  protected final MergePolicyFactoryHelper helper;
-  protected final MergePolicyFactoryArgs args;
-
-  protected MergePolicyFactory(MergePolicyFactoryHelper helper, MergePolicyFactoryArgs args) {
-    this.helper = helper;
-    this.args = args;
-  }
-
-  public abstract MergePolicy getMergePolicy();
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryArgs.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryArgs.java b/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryArgs.java
deleted file mode 100644
index e8730e5..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryArgs.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.apache.lucene.index;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.lucene.util.LucenePluginUtils;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-public class MergePolicyFactoryArgs {
-
-  private final Map<String, Object> args = new HashMap<>();
-
-  public MergePolicyFactoryArgs() {
-  }
-
-  public MergePolicyFactoryArgs(Iterator<Map.Entry<String, Object>> iterator) {
-    while (iterator.hasNext()) {
-      final Map.Entry<String, Object> entry = iterator.next();
-      args.put(entry.getKey(), entry.getValue());
-    }
-  }
-
-  public void put(String key, Object val) {
-    args.put(key, val);
-  }
-
-  public Object remove(String key) {
-    return args.remove(key);
-  }
-
-  public Object get(String key) {
-    return args.get(key);
-  }
-
-  public Set<String> keySet() {
-    return args.keySet();
-  }
-
-  public void invokeSetters(MergePolicy policy) {
-    for (String key : args.keySet()) {
-      final Object val = args.get(key);
-      LucenePluginUtils.invokeSetter(policy, key, val);
-    }
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryHelper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryHelper.java b/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryHelper.java
deleted file mode 100644
index 6fdeb79..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/MergePolicyFactoryHelper.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.apache.lucene.index;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-public abstract class MergePolicyFactoryHelper {
-
-  public static final Class[] NO_CLASSES = new Class[0];
-  public static final Object[] NO_OBJECTS = new Object[0];
-
-  public abstract <T> T newInstance(String cName, Class<T> expectedType, Class[] params, Object[] args);
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/SimpleMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/SimpleMergePolicyFactory.java b/lucene/core/src/java/org/apache/lucene/index/SimpleMergePolicyFactory.java
deleted file mode 100644
index ab99955..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/SimpleMergePolicyFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.apache.lucene.index;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A {@link MergePolicyFactory} for simple {@link MergePolicy} objects.
- *
- * @lucene.experimental
- */
-public abstract class SimpleMergePolicyFactory extends MergePolicyFactory {
-
-  private final String mergePolicyClassName;
-
-  protected SimpleMergePolicyFactory(MergePolicyFactoryHelper helper, MergePolicyFactoryArgs args, String mergePolicyClassName) {
-    super(helper, args);
-    this.mergePolicyClassName = mergePolicyClassName;
-  }
-
-  @Override
-  public MergePolicy getMergePolicy() {
-    final MergePolicy mp = helper.newInstance(
-        mergePolicyClassName,
-        MergePolicy.class,
-        MergePolicyFactoryHelper.NO_CLASSES,
-        MergePolicyFactoryHelper.NO_OBJECTS);
-    args.invokeSetters(mp);
-    return mp;
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicyFactory.java b/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicyFactory.java
deleted file mode 100644
index fb8e8dd..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicyFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.lucene.index;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A {@link MergePolicyFactory} for {@link TieredMergePolicy} objects.
- *
- * @lucene.experimental
- */
-public class TieredMergePolicyFactory extends SimpleMergePolicyFactory {
-
-  public TieredMergePolicyFactory(MergePolicyFactoryHelper helper, MergePolicyFactoryArgs args) {
-    super(helper, args, TieredMergePolicy.class.getName());
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/UpgradeIndexMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/UpgradeIndexMergePolicyFactory.java b/lucene/core/src/java/org/apache/lucene/index/UpgradeIndexMergePolicyFactory.java
deleted file mode 100644
index 11cb182..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/UpgradeIndexMergePolicyFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.lucene.index;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A {@link MergePolicyFactory} for {@link UpgradeIndexMergePolicy} objects.
- *
- * @lucene.experimental
- */
-public class UpgradeIndexMergePolicyFactory extends WrapperMergePolicyFactory {
-
-  public UpgradeIndexMergePolicyFactory(MergePolicyFactoryHelper helper, MergePolicyFactoryArgs args) {
-    super(helper, args, UpgradeIndexMergePolicy.class.getName(), "base");
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/index/WrapperMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/WrapperMergePolicyFactory.java b/lucene/core/src/java/org/apache/lucene/index/WrapperMergePolicyFactory.java
deleted file mode 100644
index 3d750ca..0000000
--- a/lucene/core/src/java/org/apache/lucene/index/WrapperMergePolicyFactory.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.apache.lucene.index;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A {@link MergePolicyFactory} for wrapping {@link MergePolicy} objects.
- *
- * @lucene.experimental
- */
-public abstract class WrapperMergePolicyFactory extends MergePolicyFactory {
-
-  private class WrappedMergePolicyFactoryArgs extends MergePolicyFactoryArgs {
-
-    final String mergePolicyFactoryClassName;
-
-    WrappedMergePolicyFactoryArgs(MergePolicyFactoryArgs wrapperArgs, String baseArgName) {
-      super();
-      String wrappedMergePolicyFactoryClassName = null;
-      final String baseArgsPrefix = baseArgName+'.';
-      for (String key : wrapperArgs.keySet()) {
-        final Object val = wrapperArgs.get(key);
-        if (baseArgName.equals(key)) {
-          wrappedMergePolicyFactoryClassName = (String)val;
-          wrapperArgs.remove(key);
-        } if (key.startsWith(baseArgsPrefix)) {
-          this.put(key.substring(baseArgsPrefix.length()), val);
-          wrapperArgs.remove(key);
-        }
-      }
-      mergePolicyFactoryClassName = wrappedMergePolicyFactoryClassName;
-    }
-  }
-
-  private final String wrapperMergePolicyClassName;
-  private final WrappedMergePolicyFactoryArgs wrappedMergePolicyArgs;
-
-  protected WrapperMergePolicyFactory(MergePolicyFactoryHelper helper,
-      MergePolicyFactoryArgs wrapperArgs, String wrapperMergePolicyClassName,
-      String baseArgName) {
-    super(helper, wrapperArgs);
-    this.wrapperMergePolicyClassName = wrapperMergePolicyClassName;
-    wrappedMergePolicyArgs = new WrappedMergePolicyFactoryArgs(this.args, baseArgName);
-  }
-
-  @Override
-  public MergePolicy getMergePolicy() {
-    final MergePolicy wrappedMP = getWrappedMergePolicy();
-    final MergePolicy wrapperMP = (helper == null ? null : helper.newInstance(
-        wrapperMergePolicyClassName,
-        MergePolicy.class,
-        new Class[] { MergePolicy.class },
-        new Object[] { wrappedMP }));
-    args.invokeSetters(wrapperMP);
-    return wrapperMP;
-  }
-
-  protected MergePolicy getWrappedMergePolicy() {
-    final MergePolicyFactory mpf = helper.newInstance(
-        wrappedMergePolicyArgs.mergePolicyFactoryClassName,
-        MergePolicyFactory.class,
-        new Class[] { MergePolicyFactoryArgs.class },
-        new Object[] { wrappedMergePolicyArgs });
-    return mpf.getMergePolicy();
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/java/org/apache/lucene/util/LucenePluginUtils.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/util/LucenePluginUtils.java b/lucene/core/src/java/org/apache/lucene/util/LucenePluginUtils.java
deleted file mode 100644
index 606d0ae..0000000
--- a/lucene/core/src/java/org/apache/lucene/util/LucenePluginUtils.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.lucene.util;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Iterator;
-import java.util.Map;
-
-public class LucenePluginUtils {
-
-  public static void invokeSetters(Object bean, Iterator<Map.Entry<String, Object>> iterator) {
-    while (iterator.hasNext()) {
-      Map.Entry<String, Object> entry = iterator.next();
-      String key = entry.getKey();
-      Object val = entry.getValue();
-      invokeSetter(bean, key, val);
-    }
-  }
-
-  public static void invokeSetter(Object bean, String key, Object val) {
-    String setterName = "set" + String.valueOf(Character.toUpperCase(key.charAt(0))) + key.substring(1);
-    Method method = null;
-    try {
-      for (Method m : bean.getClass().getMethods()) {
-        if (m.getName().equals(setterName) && m.getParameterTypes().length == 1) {
-          method = m;
-          break;
-        }
-      }
-      if (method == null) {
-        throw new RuntimeException("no setter corrresponding to '" + key + "' in " + bean.getClass().getName());
-      }
-      Class<?> pClazz = method.getParameterTypes()[0];
-      method.invoke(bean, val);
-    } catch (InvocationTargetException | IllegalAccessException e1) {
-      throw new RuntimeException("Error invoking setter " + setterName + " on class : " + bean.getClass().getName(), e1);
-    }
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/test/org/apache/lucene/index/TestLogMergePolicy.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestLogMergePolicy.java b/lucene/core/src/test/org/apache/lucene/index/TestLogMergePolicy.java
index 104836e..8dffdf8 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestLogMergePolicy.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestLogMergePolicy.java
@@ -23,24 +23,6 @@ public class TestLogMergePolicy extends BaseMergePolicyTestCase {
     return newLogMergePolicy(random());
   }
 
-  final private boolean changeMergeFactor = random().nextBoolean();
-  final private boolean changeNoCFSRatio = random().nextBoolean();
-
-  @Override
-  MergePolicyFactoryArgs mergePolicyFactoryArgs() {
-    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
-    if (changeMergeFactor) args.put("mergeFactor", new Integer(42));
-    if (changeNoCFSRatio) args.put("noCFSRatio", new Double(0.42d));
-    return args;
-  }
-
-  protected void checkFactoryCreatedMergePolicy(MergePolicy mergePolicy) {
-    assertTrue(mergePolicy instanceof LogMergePolicy);
-    final LogMergePolicy mp = (LogMergePolicy)mergePolicy;
-    if (changeMergeFactor) assertEquals(42, mp.getMergeFactor());
-    if (changeNoCFSRatio) assertEquals(0.42d, mp.getNoCFSRatio(), 0.0);
-  }
-
   public void testDefaultForcedMergeMB() {
     LogByteSizeMergePolicy mp = new LogByteSizeMergePolicy();
     assertTrue(mp.getMaxMergeMBForForcedMerge() > 0.0);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/test/org/apache/lucene/index/TestNoMergePolicy.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestNoMergePolicy.java b/lucene/core/src/test/org/apache/lucene/index/TestNoMergePolicy.java
index 418516f..bdd83c6 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestNoMergePolicy.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestNoMergePolicy.java
@@ -31,21 +31,6 @@ public class TestNoMergePolicy extends BaseMergePolicyTestCase {
     return NoMergePolicy.INSTANCE;
   }
 
-  final private boolean changeNoCFSRatio = random().nextBoolean();
-
-  @Override
-  MergePolicyFactoryArgs mergePolicyFactoryArgs() {
-    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
-    if (changeNoCFSRatio) args.put("noCFSRatio", new Double(0.42d));
-    return args;
-  }
-
-  protected void checkFactoryCreatedMergePolicy(MergePolicy mergePolicy) {
-    assertTrue(mergePolicy instanceof NoMergePolicy);
-    final NoMergePolicy mp = (NoMergePolicy)mergePolicy;
-    if (changeNoCFSRatio) assertEquals(0.42d, mp.getNoCFSRatio(), 0.0);
-  }
-
   @Test
   public void testNoMergePolicy() throws Exception {
     MergePolicy mp = mergePolicy();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/test/org/apache/lucene/index/TestTieredMergePolicy.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestTieredMergePolicy.java b/lucene/core/src/test/org/apache/lucene/index/TestTieredMergePolicy.java
index 7e8aa07..945cf10 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestTieredMergePolicy.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestTieredMergePolicy.java
@@ -29,24 +29,6 @@ public class TestTieredMergePolicy extends BaseMergePolicyTestCase {
     return newTieredMergePolicy();
   }
 
-  final private boolean changeMaxMergeAtOnce = random().nextBoolean();
-  final private boolean changeReclaimDeletesWeight = random().nextBoolean();
-
-  @Override
-  MergePolicyFactoryArgs mergePolicyFactoryArgs() {
-    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
-    if (changeMaxMergeAtOnce) args.put("maxMergeAtOnce", new Integer(42));
-    if (changeReclaimDeletesWeight) args.put("reclaimDeletesWeight", new Double(4.2d));
-    return args;
-  }
-
-  protected void checkFactoryCreatedMergePolicy(MergePolicy mergePolicy) {
-    assertTrue(mergePolicy instanceof TieredMergePolicy);
-    final TieredMergePolicy mp = (TieredMergePolicy)mergePolicy;
-    if (changeMaxMergeAtOnce) assertEquals(42, mp.getMaxMergeAtOnce());
-    if (changeReclaimDeletesWeight) assertEquals(4.2d, mp.getReclaimDeletesWeight(), 0.0);
-  }
-
   public void testForceMergeDeletes() throws Exception {
     Directory dir = newDirectory();
     IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random()));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/core/src/test/org/apache/lucene/index/TestUpgradeIndexMergePolicy.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestUpgradeIndexMergePolicy.java b/lucene/core/src/test/org/apache/lucene/index/TestUpgradeIndexMergePolicy.java
index a154ba7..857bcca 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestUpgradeIndexMergePolicy.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestUpgradeIndexMergePolicy.java
@@ -23,16 +23,4 @@ public class TestUpgradeIndexMergePolicy extends BaseMergePolicyTestCase {
     return new UpgradeIndexMergePolicy(newMergePolicy(random()));
   }
 
-  @Override
-  MergePolicyFactoryArgs mergePolicyFactoryArgs() {
-    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
-    // TODO
-    return args;
-  }
-
-  protected void checkFactoryCreatedMergePolicy(MergePolicy mergePolicy) {
-    assertTrue(mergePolicy instanceof UpgradeIndexMergePolicy);
-    // TODO
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/misc/src/test/org/apache/lucene/index/TestSortingMergePolicy.java
----------------------------------------------------------------------
diff --git a/lucene/misc/src/test/org/apache/lucene/index/TestSortingMergePolicy.java b/lucene/misc/src/test/org/apache/lucene/index/TestSortingMergePolicy.java
index 786e291..d9baf55 100644
--- a/lucene/misc/src/test/org/apache/lucene/index/TestSortingMergePolicy.java
+++ b/lucene/misc/src/test/org/apache/lucene/index/TestSortingMergePolicy.java
@@ -82,23 +82,6 @@ public class TestSortingMergePolicy extends BaseMergePolicyTestCase {
     return newSortingMergePolicy(sort);
   }
 
-  @Override
-  MergePolicyFactoryArgs mergePolicyFactoryArgs() {
-    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
-    // SOLR-5730 will add stuff here.
-    return args;
-  }
-
-  @Override
-  public void testMergePolicyFactory() throws IOException {
-    // This is a no-op until SOLR-5730 is in place.
-  }
-
-  protected void checkFactoryCreatedMergePolicy(MergePolicy mergePolicy) {
-    assertTrue(mergePolicy instanceof SortingMergePolicy);
-    // SOLR-5730 will add stuff here.
-  }
-
   public static SortingMergePolicy newSortingMergePolicy(Sort sort) {
     // usually create a MP with a low merge factor so that many merges happen
     MergePolicy mp;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/lucene/test-framework/src/java/org/apache/lucene/index/BaseMergePolicyTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseMergePolicyTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseMergePolicyTestCase.java
index ab4c8c7..d94c1c3 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseMergePolicyTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseMergePolicyTestCase.java
@@ -24,9 +24,6 @@ import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 
 import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Modifier;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -69,98 +66,4 @@ public abstract class BaseMergePolicyTestCase extends LuceneTestCase {
     dir.close();
   }
   
-  Class<?>[] mergePolicyFactoryConstructorParameterTypes() {
-    return new Class[] {
-        MergePolicyFactoryHelper.class,
-        MergePolicyFactoryArgs.class
-    };
-  }
-
-  Object[] mergePolicyFactoryConstructorParameters() {
-    return new Object[] {
-        mergePolicyFactoryHelper(),
-        mergePolicyFactoryArgs()
-    };
-  }
-
-  protected abstract void checkFactoryCreatedMergePolicy(MergePolicy mergePolicy);
-
-  MergePolicyFactoryHelper mergePolicyFactoryHelper() {
-    return new MergePolicyFactoryHelper() {
-      public <T> T newInstance(String cName, Class<T> expectedType, Class[] params, Object[] args) {
-        Class<? extends T> clazz;
-        try {
-          clazz = Class.forName(cName).asSubclass(expectedType);
-        } catch (ClassNotFoundException e) {
-          return null;
-        }
-        Constructor<? extends T> constructor = null;
-        try {
-          constructor = clazz.getConstructor(params);
-        } catch (NoSuchMethodException|SecurityException e) {
-          return null;
-        }
-        T obj = null;
-        try {
-          obj = constructor.newInstance(args);
-        } catch (IllegalAccessException|IllegalArgumentException|InstantiationException|InvocationTargetException e) {
-          return null;
-        }
-        return obj;
-      }
-    };
-  }
-
-  MergePolicyFactoryArgs mergePolicyFactoryArgs() {
-    return new MergePolicyFactoryArgs();
-  }
-
-  public void testMergePolicyFactory() throws IOException {
-    final MergePolicy mp = mergePolicy();
-    Class<?> mpClass = mp.getClass();
-    do {
-      implTestMergePolicyFactory(mpClass);
-      mpClass = mpClass.getSuperclass();
-    } while (MergePolicy.class.isAssignableFrom(mpClass));
-    implTestMergePolicyFactory(MergePolicy.class);
-  }
-
-  private void implTestMergePolicyFactory(Class<?> mpClass) throws IOException {
-    if (Modifier.isAbstract(mpClass.getModifiers())) return;
-    final String mpClassName = mpClass.getName();
-    final String mpfClassName = mpClassName+"Factory";
-    // find factory class
-    Class<?> mpfClass = null;
-    try {
-      mpfClass = Class.forName(mpfClassName);
-    } catch (ClassNotFoundException e) {
-      fail(mpfClassName+" factory for "+mpClassName+" not found: "+mpClass);
-    }
-    final int mpfClassModifiers = mpfClass.getModifiers();
-    assertTrue(mpfClassName+" factory for "+mpClassName+" is not public: "+mpfClass,
-        Modifier.isPublic(mpfClassModifiers));
-    // find factory class's constructor
-    Constructor<?> constructor = null;
-    final Class<?>[] mpfConstructorParameterTypes = mergePolicyFactoryConstructorParameterTypes();
-    try {
-      constructor = mpfClass.getConstructor(mpfConstructorParameterTypes);
-    } catch (NoSuchMethodException|SecurityException e) {
-      fail(mpfClassName+" constructor("+mpfConstructorParameterTypes+") not found - "+e);
-    }
-    // construct a factory instance
-    MergePolicyFactory mpf = null;
-    final Object[] mpfConstructorParameters = mergePolicyFactoryConstructorParameters();
-    try {
-      final Object obj = constructor.newInstance(mpfConstructorParameters);
-      assertTrue(obj+" is not a MergePolicyFactory", obj instanceof MergePolicyFactory);
-      mpf = (MergePolicyFactory)obj;
-    } catch (IllegalAccessException|IllegalArgumentException|InstantiationException|InvocationTargetException e) {
-      fail(mpfClassName+" constructor.newInstance("+mpfConstructorParameterTypes+") failed - "+e);
-    }
-    // create a merge policy using the factory instance
-    final MergePolicy mp = mpf.getMergePolicy();
-    assertTrue(mp+" cannot be assigned to "+mpClass, mpClass.isAssignableFrom(mp.getClass()));
-    checkFactoryCreatedMergePolicy(mp);
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/LogByteSizeMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/LogByteSizeMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/LogByteSizeMergePolicyFactory.java
new file mode 100644
index 0000000..4b9e970
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/LogByteSizeMergePolicyFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import org.apache.lucene.index.LogByteSizeMergePolicy;
+import org.apache.lucene.index.MergePolicy;
+import org.apache.solr.core.SolrResourceLoader;
+
+/**
+ * A {@link MergePolicyFactory} for {@link LogByteSizeMergePolicy} objects.
+ */
+public class LogByteSizeMergePolicyFactory extends SimpleMergePolicyFactory {
+
+  public LogByteSizeMergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args) {
+    super(resourceLoader, args);
+  }
+
+  @Override
+  protected MergePolicy getMergePolicyInstance() {
+    return new LogByteSizeMergePolicy();
+  }
+  
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/LogDocMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/LogDocMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/LogDocMergePolicyFactory.java
new file mode 100644
index 0000000..d7bfbfe
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/LogDocMergePolicyFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import org.apache.lucene.index.LogDocMergePolicy;
+import org.apache.lucene.index.MergePolicy;
+import org.apache.solr.core.SolrResourceLoader;
+
+/**
+ * A {@link MergePolicyFactory} for {@link LogDocMergePolicy} objects.
+ */
+public class LogDocMergePolicyFactory extends SimpleMergePolicyFactory {
+
+  public LogDocMergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args) {
+    super(resourceLoader, args);
+  }
+
+  @Override
+  protected MergePolicy getMergePolicyInstance() {
+    return new LogDocMergePolicy();
+  }
+  
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/MergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/MergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/MergePolicyFactory.java
new file mode 100644
index 0000000..5dfba20
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/MergePolicyFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.solr.core.SolrResourceLoader;
+
+/**
+ * A factory for creating a {@link MergePolicy}.
+ */
+public abstract class MergePolicyFactory {
+
+  protected final MergePolicyFactoryArgs args;
+  protected final SolrResourceLoader resourceLoader;
+
+  protected MergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args) {
+    this.resourceLoader = resourceLoader;
+    this.args = args;
+  }
+
+  public abstract MergePolicy getMergePolicy();
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java b/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java
new file mode 100644
index 0000000..2259ece
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/MergePolicyFactoryArgs.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.solr.util.SolrPluginUtils;
+
+public class MergePolicyFactoryArgs {
+
+  private final Map<String,Object> args = new HashMap<>();
+
+  public MergePolicyFactoryArgs() {
+    this(Collections.<String,Object> emptyMap().entrySet());
+  }
+
+  public MergePolicyFactoryArgs(Iterable<Map.Entry<String,Object>> args) {
+    for (final Map.Entry<String,Object> arg : args) {
+      this.args.put(arg.getKey(), arg.getValue());
+    }
+  }
+
+  public void put(String key, Object val) {
+    args.put(key, val);
+  }
+
+  public Object remove(String key) {
+    return args.remove(key);
+  }
+
+  public Object get(String key) {
+    return args.get(key);
+  }
+
+  public Set<String> keys() {
+    return args.keySet();
+  }
+
+  public void invokeSetters(MergePolicy policy) {
+    SolrPluginUtils.invokeSetters(policy, args.entrySet());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/SimpleMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/SimpleMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/SimpleMergePolicyFactory.java
new file mode 100644
index 0000000..6e975bc
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/SimpleMergePolicyFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.solr.core.SolrResourceLoader;
+
+/**
+ * A {@link MergePolicyFactory} for simple {@link MergePolicy} objects. Implementations need only create the policy
+ * {@link #getMergePolicyInstance() instance} and this class will then configure it with all set properties.
+ */
+public abstract class SimpleMergePolicyFactory extends MergePolicyFactory {
+
+  protected SimpleMergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args) {
+    super(resourceLoader, args);
+  }
+
+  protected abstract MergePolicy getMergePolicyInstance();
+
+  @Override
+  public final MergePolicy getMergePolicy() {
+    final MergePolicy mp = getMergePolicyInstance();
+    args.invokeSetters(mp);
+    return mp;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/TieredMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/TieredMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/TieredMergePolicyFactory.java
new file mode 100644
index 0000000..e97089a
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/TieredMergePolicyFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.lucene.index.TieredMergePolicy;
+import org.apache.solr.core.SolrResourceLoader;
+
+/**
+ * A {@link MergePolicyFactory} for {@link TieredMergePolicy} objects.
+ */
+public class TieredMergePolicyFactory extends SimpleMergePolicyFactory {
+
+  public TieredMergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args) {
+    super(resourceLoader, args);
+  }
+  
+  @Override
+  protected MergePolicy getMergePolicyInstance() {
+    return new TieredMergePolicy();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/UpgradeIndexMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/UpgradeIndexMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/UpgradeIndexMergePolicyFactory.java
new file mode 100644
index 0000000..d864919
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/UpgradeIndexMergePolicyFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.lucene.index.TieredMergePolicy;
+import org.apache.lucene.index.UpgradeIndexMergePolicy;
+import org.apache.solr.core.SolrResourceLoader;
+
+/**
+ * A {@link MergePolicyFactory} for {@link UpgradeIndexMergePolicy} objects.
+ */
+public class UpgradeIndexMergePolicyFactory extends WrapperMergePolicyFactory {
+
+  public UpgradeIndexMergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args) {
+    super(resourceLoader, args);
+  }
+  
+  @Override
+  protected MergePolicy getDefaultWrappedMergePolicy() {
+    return new TieredMergePolicy();
+  }
+
+  @Override
+  public MergePolicy getMergePolicy() {
+    final MergePolicy wrappedMP = getWrappedMergePolicy();
+    final MergePolicy mp = new UpgradeIndexMergePolicy(wrappedMP);
+    args.invokeSetters(mp);
+    return mp;
+  }
+  
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java
new file mode 100644
index 0000000..8dbac4e
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import java.util.Iterator;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.solr.core.SolrResourceLoader;
+
+/**
+ * A {@link MergePolicyFactory} for wrapping additional {@link MergePolicyFactory factories}.
+ */
+public abstract class WrapperMergePolicyFactory extends MergePolicyFactory {
+
+  private static final String[] NO_SUB_PACKAGES = new String[0];
+
+  static final String WRAPPED_PREFIX = "wrapped.prefix";
+  static final String CLASS = "class";
+
+  private final MergePolicyFactoryArgs wrappedMergePolicyArgs;
+
+  protected WrapperMergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs args) {
+    super(resourceLoader, args);
+    wrappedMergePolicyArgs = filterWrappedMergePolicyFactoryArgs();
+  }
+
+  /**
+   * Returns the default wrapped {@link MergePolicy}. This is called if the factory settings do not explicitly specify
+   * the wrapped policy.
+   */
+  protected abstract MergePolicy getDefaultWrappedMergePolicy();
+
+  /** Returns an instance of the wrapped {@link MergePolicy} after it has been configured with all set parameters. */
+  protected final MergePolicy getWrappedMergePolicy() {
+    if (wrappedMergePolicyArgs == null) {
+      return getDefaultWrappedMergePolicy();
+    }
+
+    final String className = (String) wrappedMergePolicyArgs.remove(CLASS);
+    if (className == null) {
+      throw new IllegalArgumentException("Class name not defined for wrapped MergePolicyFactory!");
+    }
+
+    final MergePolicyFactory mpf = resourceLoader.newInstance(
+        className,
+        MergePolicyFactory.class,
+        NO_SUB_PACKAGES,
+        new Class[] {SolrResourceLoader.class, MergePolicyFactoryArgs.class},
+        new Object[] {resourceLoader, wrappedMergePolicyArgs});
+    return mpf.getMergePolicy();
+  }
+
+  /**
+   * Returns a {@link MergePolicyFactoryArgs} for the wrapped {@link MergePolicyFactory}. This method also removes all
+   * args from this instance's args.
+   */
+  private MergePolicyFactoryArgs filterWrappedMergePolicyFactoryArgs() {
+    final String wrappedPolicyPrefix = (String) args.get(WRAPPED_PREFIX);
+    if (wrappedPolicyPrefix == null) {
+      return null;
+    }
+
+    final String baseArgsPrefix = wrappedPolicyPrefix + '.';
+    final int baseArgsPrefixLength = baseArgsPrefix.length();
+    final MergePolicyFactoryArgs wrappedArgs = new MergePolicyFactoryArgs();
+    // Must use an iterator since we remove items from the map during iteration.
+    for (Iterator<String> iter = args.keys().iterator(); iter.hasNext();) {
+      String key = iter.next();
+      if (key.startsWith(baseArgsPrefix)) {
+        wrappedArgs.put(key.substring(baseArgsPrefixLength), args.get(key));
+        iter.remove();
+      }
+    }
+    return wrappedArgs;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java b/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
index 68bc357..9349a72 100644
--- a/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
+++ b/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
@@ -35,6 +35,10 @@ import org.apache.solr.core.MapSerializable;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.index.MergePolicyFactory;
+import org.apache.solr.index.MergePolicyFactoryArgs;
+import org.apache.solr.index.TieredMergePolicyFactory;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.util.SolrPluginUtils;
 import org.slf4j.Logger;
@@ -75,7 +79,6 @@ public class SolrIndexConfig implements MapSerializable {
   /**
    * Internal constructor for setting defaults based on Lucene Version
    */
-  @SuppressWarnings("deprecation")
   private SolrIndexConfig(SolrConfig solrConfig) {
     luceneVersion = solrConfig.luceneMatchVersion;
     effectiveUseCompoundFileSetting = false;
@@ -99,7 +102,6 @@ public class SolrIndexConfig implements MapSerializable {
    * @param prefix the XPath prefix for which section to parse (mandatory)
    * @param def a SolrIndexConfig instance to pick default values from (optional)
    */
-  @SuppressWarnings("deprecation")
   public SolrIndexConfig(SolrConfig solrConfig, String prefix, SolrIndexConfig def)  {
     if (prefix == null) {
       prefix = "indexConfig";
@@ -147,11 +149,11 @@ public class SolrIndexConfig implements MapSerializable {
     }
 
     assertWarnOrFail("Beginning with Solr 5.5, <mergePolicy> is deprecated, use <mergePolicyFactory> instead.",
-        (mergePolicyInfo != null), true);
-    assertWarnOrFail("<maxMergeDocs> ignored when using <mergePolicyFactory>, use ??? instead.",
-        (mergePolicyFactoryInfo != null && maxMergeDocs != def.maxMergeDocs), true);
-    assertWarnOrFail("<mergeFactor> ignored when using <mergePolicyFactory>, use ??? instead.",
-        (mergePolicyFactoryInfo != null && mergeFactor != def.mergeFactor), true);
+        (mergePolicyInfo == null), false);
+    assertWarnOrFail("Beginning with Solr 5.5, <maxMergeDocs> is deprecated, configure it on the relevant <mergePolicyFactory> instead.",
+        (mergePolicyFactoryInfo != null && maxMergeDocs == def.maxMergeDocs), false);
+    assertWarnOrFail("Beginning with Solr 5.5, <mergeFactor> is deprecated, configure it on the relevant <mergePolicyFactory> instead.",
+        (mergePolicyFactoryInfo != null && mergeFactor == def.mergeFactor), false);
 
     String val = solrConfig.get(prefix + "/termIndexInterval", null);
     if (val != null) {
@@ -246,6 +248,7 @@ public class SolrIndexConfig implements MapSerializable {
    * Builds a MergePolicy using the configured MergePolicyFactory
    * or if no factory is configured uses the configured mergePolicy PluginInfo.
    */
+  @SuppressWarnings("unchecked")
   private MergePolicy buildMergePolicy(final IndexSchema schema) {
     if (mergePolicyInfo != null) {
       return buildMergePolicyFromInfo(schema);
@@ -259,22 +262,16 @@ public class SolrIndexConfig implements MapSerializable {
       mpfArgs = new MergePolicyFactoryArgs();
     } else {
       mpfClassName =  mergePolicyFactoryInfo.className;
-      mpfArgs = new MergePolicyFactoryArgs(mergePolicyFactoryInfo.initArgs.iterator());
+      mpfArgs = new MergePolicyFactoryArgs(mergePolicyFactoryInfo.initArgs);
     }
 
-    final MergePolicyFactoryHelper mpfHelper = new MergePolicyFactoryHelper() {
-      @Override
-      public <T> T newInstance(String cName, Class<T> expectedType, Class[] params, Object[] args) {
-        return schema.getResourceLoader().newInstance(
-            cName, expectedType, NO_SUB_PACKAGES, params, args);
-      }
-    };
-
-    final MergePolicyFactory mpf = mpfHelper.newInstance(
+    final SolrResourceLoader resourceLoader = schema.getResourceLoader();
+    final MergePolicyFactory mpf = resourceLoader.newInstance(
         mpfClassName,
         MergePolicyFactory.class,
-        new Class[] { MergePolicyFactoryHelper.class, MergePolicyFactoryArgs.class },
-        new Object[] { mpfHelper, mpfArgs });
+        NO_SUB_PACKAGES,
+        new Class[] { SolrResourceLoader.class, MergePolicyFactoryArgs.class },
+        new Object[] { resourceLoader, mpfArgs });
 
     return mpf.getMergePolicy();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
index 270f91f..7bbd2d9 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
@@ -25,7 +25,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -42,7 +41,6 @@ import org.apache.lucene.search.DisjunctionMaxQuery;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Sort;
-import org.apache.lucene.util.LucenePluginUtils;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
@@ -53,7 +51,6 @@ import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.RequestParams;
-import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.component.HighlightComponent;
 import org.apache.solr.handler.component.ResponseBuilder;
 import org.apache.solr.handler.component.ShardDoc;
@@ -1042,14 +1039,28 @@ public class SolrPluginUtils {
     return list;
   }
 
-
-  public static void invokeSetters(Object bean, NamedList initArgs) {
+  public static void invokeSetters(Object bean, Iterable<Map.Entry<String,Object>> initArgs) {
     if (initArgs == null) return;
-    Iterator<Map.Entry<String, Object>> iterator = initArgs.iterator();
-    LucenePluginUtils.invokeSetters(bean, iterator);
+    for (Map.Entry<String,Object> entry : initArgs) {
+      final String key = entry.getKey();
+      final String setterName = "set" + String.valueOf(Character.toUpperCase(key.charAt(0))) + key.substring(1);
+      try {
+        final Method method = findMethod(bean, setterName, key);
+        method.invoke(bean, entry.getValue());
+      } catch (final InvocationTargetException | IllegalAccessException e1) {
+        throw new RuntimeException("Error invoking setter " + setterName + " on class : " + bean.getClass().getName(), e1);
+      }
+    }
   }
 
-
+  private static Method findMethod(Object bean, String setterName, String key) {
+    for (Method m : bean.getClass().getMethods()) {
+      if (m.getName().equals(setterName) && m.getParameterTypes().length == 1) {
+        return m;
+      }
+    }
+    throw new RuntimeException("No setter corrresponding to '" + key + "' in " + bean.getClass().getName());
+  }
 
    /**
    * Given the integer purpose of a request generates a readable value corresponding 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicyfactory.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicyfactory.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicyfactory.xml
index 1b118ae..e790ccf 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicyfactory.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicyfactory.xml
@@ -23,7 +23,6 @@
   <schemaFactory class="ClassicIndexSchemaFactory"/>
 
   <indexConfig>
-    <mergeFactor>7</mergeFactor>
     <mergePolicyFactory class="org.apache.lucene.index.TieredMergePolicyFactory">
       <int name="maxMergeAtOnceExplicit">19</int>
       <int name="segmentsPerTier">9</int>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
index 069ccb8..a23bf0a 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
@@ -26,7 +26,7 @@ A solrconfig.xml snippet containing indexConfig settings for randomized testing.
        the RandomMergePolicy in all tests - but some tests expect very specific
        Merge behavior, so those tests can set it as needed.
   -->
-  <mergePolicy class="${solr.tests.mergePolicy:org.apache.solr.util.RandomMergePolicy}" />
+  <mergePolicyFactory class="org.apache.solr.util.RandomMergePolicyFactory" />
   
   <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/test/org/apache/solr/index/WrapperMergePolicyFactoryTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/index/WrapperMergePolicyFactoryTest.java b/solr/core/src/test/org/apache/solr/index/WrapperMergePolicyFactoryTest.java
new file mode 100644
index 0000000..69aa499
--- /dev/null
+++ b/solr/core/src/test/org/apache/solr/index/WrapperMergePolicyFactoryTest.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.index;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.lucene.index.NoMergePolicy;
+import org.apache.lucene.index.TieredMergePolicy;
+import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.core.SolrResourceLoader;
+
+/** Unit tests for {@link WrapperMergePolicyFactory}. */
+public class WrapperMergePolicyFactoryTest extends SolrTestCaseJ4 {
+
+  private final SolrResourceLoader resourceLoader = new SolrResourceLoader();
+
+  public void testReturnsDefaultMergePolicyIfNoneSpecified() {
+    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
+    MergePolicyFactory mpf = new DefaultingWrapperMergePolicyFactory(resourceLoader, args);
+    assertSame(mpf.getMergePolicy(), NoMergePolicy.INSTANCE);
+  }
+
+  public void testFailsIfNoClassSpecifiedForWrappedPolicy() {
+    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
+    args.put(WrapperMergePolicyFactory.WRAPPED_PREFIX, "foo");
+    try {
+      new DefaultingWrapperMergePolicyFactory(resourceLoader, args).getMergePolicy();
+      fail("Should have failed when no 'class' specified for wrapped merge policy");
+    } catch (final IllegalArgumentException e) {
+      // Good!
+    }
+  }
+
+  public void testProperlyInitializesWrappedMergePolicy() {
+    final MergePolicyFactoryArgs args = new MergePolicyFactoryArgs();
+    args.put(WrapperMergePolicyFactory.WRAPPED_PREFIX, "test");
+    args.put("test.class", TieredMergePolicyFactory.class.getName());
+    args.put("test.maxMergeAtOnce", 2);
+    args.put("test.maxMergedSegmentMB", 1.0);
+    MergePolicyFactory mpf = new WrapperMergePolicyFactory(resourceLoader, args) {
+      @Override
+      protected MergePolicy getDefaultWrappedMergePolicy() {
+        throw new IllegalStateException("Should not have reached here!");
+      }
+
+      @Override
+      public MergePolicy getMergePolicy() {
+        return getWrappedMergePolicy();
+      }
+    };
+    final MergePolicy mp = mpf.getMergePolicy();
+    assertSame(mp.getClass(), TieredMergePolicy.class);
+  }
+  
+  private static class DefaultingWrapperMergePolicyFactory extends WrapperMergePolicyFactory {
+
+    DefaultingWrapperMergePolicyFactory(SolrResourceLoader resourceLoader, MergePolicyFactoryArgs wrapperArgs) {
+      super(resourceLoader, wrapperArgs);
+    }
+
+    @Override
+    protected MergePolicy getDefaultWrappedMergePolicy() {
+      return NoMergePolicy.INSTANCE;
+    }
+
+    @Override
+    public MergePolicy getMergePolicy() {
+      return getWrappedMergePolicy();
+    }
+
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
index 576c590..cd4b5e4 100644
--- a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
+++ b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
@@ -44,7 +44,6 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
   private static final String solrConfigFileNameWarmer = "solrconfig-warmer.xml";
   private static final String solrConfigFileNameTieredMergePolicy = "solrconfig-tieredmergepolicy.xml";
   private static final String solrConfigFileNameTieredMergePolicyFactory = "solrconfig-tieredmergepolicyfactory.xml";
-
   private static final String schemaFileName = "schema.xml";
 
   @BeforeClass
@@ -72,9 +71,7 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
   public void testTieredMPSolrIndexConfigCreation() throws Exception {
     String solrConfigFileName = random().nextBoolean() ? solrConfigFileNameTieredMergePolicy : solrConfigFileNameTieredMergePolicyFactory;
     SolrConfig solrConfig = new SolrConfig(instanceDir, solrConfigFileName, null);
-    SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null,
-        null);
-    assertNotNull(solrIndexConfig);
+    SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
     IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
     
     h.getCore().setLatestSchema(indexSchema);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2367d845/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicyFactory.java
----------------------------------------------------------------------
diff --git a/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicyFactory.java b/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicyFactory.java
new file mode 100644
index 0000000..0888d58
--- /dev/null
+++ b/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicyFactory.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.util;
+
+import org.apache.lucene.index.MergePolicy;
+import org.apache.solr.index.MergePolicyFactory;
+import org.apache.solr.index.MergePolicyFactoryArgs;
+
+/** A {@link MergePolicyFactory} for {@link RandomMergePolicy}. */
+public final class RandomMergePolicyFactory extends MergePolicyFactory {
+
+  public RandomMergePolicyFactory() {
+    super(null, new MergePolicyFactoryArgs());
+  }
+  
+  @Override
+  public MergePolicy getMergePolicy() {
+    return new RandomMergePolicy();
+  }
+
+}