You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2013/04/23 16:29:13 UTC

svn commit: r1470979 [3/5] - in /lucene/dev/branches/branch_4x: ./ solr/ solr/contrib/ solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/ solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/ solr/...

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java Tue Apr 23 14:29:10 2013
@@ -21,46 +21,59 @@ import org.apache.solr.cloud.ZkControlle
 import org.apache.solr.cloud.ZkSolrResourceLoader;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
+import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkCmdExecutor;
-import org.apache.solr.common.cloud.ZooKeeperException;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrConfig;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
-import org.apache.solr.util.FileUtils;
 import org.apache.solr.util.SystemIdResolver;
+import org.apache.solr.util.plugin.SolrCoreAware;
 import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.InputSource;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringWriter;
 
-public class ManagedIndexSchemaFactory extends IndexSchemaFactory {
+/** Factory for ManagedIndexSchema */
+public class ManagedIndexSchemaFactory extends IndexSchemaFactory implements SolrCoreAware {
   private static final Logger log = LoggerFactory.getLogger(ManagedIndexSchemaFactory.class);
   private static final String UPGRADED_SCHEMA_EXTENSION = ".bak";
+  private static final String SCHEMA_DOT_XML = "schema.xml";
+
+  public static final String DEFAULT_MANAGED_SCHEMA_RESOURCE_NAME = "managed-schema";
+  public static final String MANAGED_SCHEMA_RESOURCE_NAME = "managedSchemaResourceName";
 
   private boolean isMutable;
   private String managedSchemaResourceName;
+  public String getManagedSchemaResourceName() { return managedSchemaResourceName; }
   private SolrConfig config;
   private SolrResourceLoader loader;
+  public SolrResourceLoader getResourceLoader() { return loader; }
   private String resourceName;
-  private IndexSchema schema;
+  private ManagedIndexSchema schema;
+  private SolrCore core;
+  private ZkIndexSchemaReader zkIndexSchemaReader;
+
+
+  private String loadedResource;
+  private boolean shouldUpgrade = false;
 
   @Override
   public void init(NamedList args) {
     SolrParams params = SolrParams.toSolrParams(args);
     isMutable = params.getBool("mutable", false);
     args.remove("mutable");
-    managedSchemaResourceName = params.get("managedSchemaResourceName", "managed-schema");
-    args.remove("managedSchemaResourceName");
-    if ("schema.xml".equals(managedSchemaResourceName)) {
-      String msg = "managedSchemaResourceName can't be 'schema.xml'";
+    managedSchemaResourceName = params.get(MANAGED_SCHEMA_RESOURCE_NAME, DEFAULT_MANAGED_SCHEMA_RESOURCE_NAME);
+    args.remove(MANAGED_SCHEMA_RESOURCE_NAME);
+    if (SCHEMA_DOT_XML.equals(managedSchemaResourceName)) {
+      String msg = MANAGED_SCHEMA_RESOURCE_NAME + " can't be '" + SCHEMA_DOT_XML + "'";
       log.error(msg);
       throw new SolrException(ErrorCode.SERVER_ERROR, msg);
     }
@@ -89,35 +102,102 @@ public class ManagedIndexSchemaFactory e
    * After the managed schema file is persisted, the original schema file is
    * renamed by appending the extension named in {@link #UPGRADED_SCHEMA_EXTENSION}.
    */
-  public IndexSchema create(String resourceName, SolrConfig config) {
+  @Override
+  public ManagedIndexSchema create(String resourceName, SolrConfig config) {
     this.resourceName = resourceName;
     this.config = config;
-    SolrResourceLoader loader = config.getResourceLoader();
-    this.loader = loader;
+    this.loader = config.getResourceLoader();
     InputStream schemaInputStream = null;
-    boolean shouldUpgrade = false;
-    String loadedResource = null;
 
     if (null == resourceName) {
       resourceName = IndexSchema.DEFAULT_SCHEMA_FILE;
     }
 
+    int schemaZkVersion = -1;
+    if ( ! (loader instanceof ZkSolrResourceLoader)) {
+      schemaInputStream = readSchemaLocally();
+    } else { // ZooKeeper
+      final ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
+      final SolrZkClient zkClient = zkLoader.getZkController().getZkClient();
+      final String managedSchemaPath = zkLoader.getCollectionZkPath() + "/" + managedSchemaResourceName;
+      Stat stat = new Stat();
+      try {
+        // Attempt to load the managed schema
+        byte[] data = zkClient.getData(managedSchemaPath, null, stat, true);
+        schemaZkVersion = stat.getVersion();
+        schemaInputStream = new ByteArrayInputStream(data);
+        loadedResource = managedSchemaResourceName;
+        warnIfNonManagedSchemaExists();
+      } catch (InterruptedException e) {
+        // Restore the interrupted status
+        Thread.currentThread().interrupt();
+        log.warn("", e);
+      } catch (KeeperException.NoNodeException e) {
+        log.info("The schema is configured as managed, but managed schema resource " + managedSchemaResourceName
+                + " not found - loading non-managed schema " + resourceName + " instead");
+      } catch (KeeperException e) {
+        String msg = "Error attempting to access " + managedSchemaPath;
+        log.error(msg, e);
+        throw new SolrException(ErrorCode.SERVER_ERROR, msg, e);
+      }
+      if (null == schemaInputStream) {
+        // The managed schema file could not be found - load the non-managed schema
+        try {
+          schemaInputStream = loader.openSchema(resourceName);
+          loadedResource = resourceName;
+          shouldUpgrade = true;
+        } catch (Exception e) {
+          try {
+            // Retry to load the managed schema, in case it was created since the first attempt
+            byte[] data = zkClient.getData(managedSchemaPath, null, stat, true);
+            schemaZkVersion = stat.getVersion();
+            schemaInputStream = new ByteArrayInputStream(data);
+            warnIfNonManagedSchemaExists();
+          } catch (Exception e1) {
+            if (e1 instanceof InterruptedException) {
+              Thread.currentThread().interrupt(); // Restore the interrupted status
+            }
+            final String msg = "Error loading both non-managed schema '" + resourceName + "' and managed schema '"
+                             + managedSchemaResourceName + "'";
+            log.error(msg, e);
+            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg, e);
+          }
+        }
+      }
+    }
+    InputSource inputSource = new InputSource(schemaInputStream);
+    inputSource.setSystemId(SystemIdResolver.createSystemIdFromResourceName(loadedResource));
+    try {
+      schema = new ManagedIndexSchema(config, loadedResource, inputSource, isMutable, 
+                                      managedSchemaResourceName, schemaZkVersion, getSchemaUpdateLock());
+    } catch (KeeperException e) {
+      final String msg = "Error instantiating ManagedIndexSchema";
+      log.error(msg, e);
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg, e);
+    } catch (InterruptedException e) {
+      // Restore the interrupted status
+      Thread.currentThread().interrupt();
+      log.warn("", e);
+    }
+
+    if (shouldUpgrade) {
+      // Persist the managed schema if it doesn't already exist
+      upgradeToManagedSchema();
+    }
+
+    return schema;
+  }
+
+  private InputStream readSchemaLocally() {
+    InputStream schemaInputStream = null;
     try {
       // Attempt to load the managed schema
       schemaInputStream = loader.openSchema(managedSchemaResourceName);
       loadedResource = managedSchemaResourceName;
-
-      // Check if the non-managed schema is also present
-      if ( ! resourceName.equals(managedSchemaResourceName)) {
-        if (nonManagedSchemaExists()) {
-          // Warn if the non-managed schema is present
-          log.warn("The schema has been upgraded to managed, but the non-managed schema " + resourceName
-              + " is still loadable.  PLEASE REMOVE THIS FILE.");
-        }
-      }
+      warnIfNonManagedSchemaExists();
     } catch (IOException e) {
-      log.info("SolrConfig.isManagedSchema = true, but managed schema resource " + managedSchemaResourceName
-          + " not found - loading non-managed schema " + resourceName + " instead");
+      log.info("The schema is configured as managed, but managed schema resource " + managedSchemaResourceName
+              + " not found - loading non-managed schema " + resourceName + " instead");
     }
     if (null == schemaInputStream) {
       // The managed schema file could not be found - load the non-managed schema
@@ -126,63 +206,54 @@ public class ManagedIndexSchemaFactory e
         loadedResource = resourceName;
         shouldUpgrade = true;
       } catch (Exception e) {
-        try {
-          // Retry to load the managed schema, in case it was created since the first attempt
-          schemaInputStream = loader.openSchema(managedSchemaResourceName);
-          loadedResource = managedSchemaResourceName;
-        } catch (IOException e1) {
-          final String msg = "Error loading both non-managed schema '" + resourceName + "' and managed schema '"
-                           + managedSchemaResourceName + "'";
-          log.error(msg, e);
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg, e);
-        }
+        final String msg = "Error loading both non-managed schema '" + resourceName + "' and managed schema '"
+                         + managedSchemaResourceName + "'";
+        log.error(msg, e);
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg, e);
       }
     }
-    InputSource inputSource = new InputSource(schemaInputStream);
-    inputSource.setSystemId(SystemIdResolver.createSystemIdFromResourceName(loadedResource));
-    schema = new ManagedIndexSchema(config, loadedResource, inputSource, isMutable);
-
-    if (shouldUpgrade) {
-      // Persist the managed schema if it doesn't already exist
-      upgradeToManagedSchema();
-    }
-    return schema;
+    return schemaInputStream; 
   }
 
   /**
    * Return whether a non-managed schema exists, either in local storage or on ZooKeeper. 
    */
-  private boolean nonManagedSchemaExists() {
-    boolean exists = false;
-    SolrResourceLoader loader = config.getResourceLoader();
-    if (loader instanceof ZkSolrResourceLoader) {
-      ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
-      String nonManagedSchemaPath = zkLoader.getCollectionZkPath() + "/" + resourceName;
-      try {
-        exists = zkLoader.getZkController().pathExists(nonManagedSchemaPath);
-      } catch (InterruptedException e) {
-        Thread.currentThread().interrupt(); // Restore the interrupted status
-        log.warn("", e); // Log as warning and suppress the exception 
-      } catch (KeeperException e) {
-        // log as warning and suppress the exception
-        log.warn("Error checking for the existence of the non-managed schema " + resourceName, e);
-      }
-    } else { // Config is not in ZooKeeper
-      InputStream nonManagedSchemaInputStream = null;
-      try {
-        nonManagedSchemaInputStream = loader.openSchema(resourceName);
-        if (null != nonManagedSchemaInputStream) {
-          exists = true;
+  private void warnIfNonManagedSchemaExists() {
+    if ( ! resourceName.equals(managedSchemaResourceName)) {
+      boolean exists = false;
+      SolrResourceLoader loader = config.getResourceLoader();
+      if (loader instanceof ZkSolrResourceLoader) {
+        ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
+        String nonManagedSchemaPath = zkLoader.getCollectionZkPath() + "/" + resourceName;
+        try {
+          exists = zkLoader.getZkController().pathExists(nonManagedSchemaPath);
+        } catch (InterruptedException e) {
+          Thread.currentThread().interrupt(); // Restore the interrupted status
+          log.warn("", e); // Log as warning and suppress the exception 
+        } catch (KeeperException e) {
+          // log as warning and suppress the exception
+          log.warn("Error checking for the existence of the non-managed schema " + resourceName, e);
+        }
+      } else { // Config is not in ZooKeeper
+        InputStream nonManagedSchemaInputStream = null;
+        try {
+          nonManagedSchemaInputStream = loader.openSchema(resourceName);
+          if (null != nonManagedSchemaInputStream) {
+            exists = true;
+          }
+        } catch (IOException e) {
+          // This is expected when the non-managed schema does not exist
+        } finally {
+          IOUtils.closeQuietly(nonManagedSchemaInputStream);
         }
-      } catch (IOException e) {
-        // This is expected when the non-managed schema does not exist
-      } finally {
-        IOUtils.closeQuietly(nonManagedSchemaInputStream);
+      }
+      if (exists) {
+        log.warn("The schema has been upgraded to managed, but the non-managed schema " + resourceName
+                + " is still loadable.  PLEASE REMOVE THIS FILE.");
       }
     }
-    return exists;
   }
-
+  
   /**
    * Persist the managed schema and rename the non-managed schema 
    * by appending {@link #UPGRADED_SCHEMA_EXTENSION}.
@@ -196,33 +267,7 @@ public class ManagedIndexSchemaFactory e
       zkUgradeToManagedSchema();
     } else {
       // Configs are not on ZooKeeper
-      File managedSchemaFile = new File(loader.getConfigDir(), managedSchemaResourceName);
-      OutputStreamWriter writer = null;
-      try {
-        File parentDir = managedSchemaFile.getParentFile();
-        if (!parentDir.isDirectory()) {
-          if (!parentDir.mkdirs()) {
-            final String msg = "Can't create managed schema directory " + parentDir.getAbsolutePath();
-            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg);
-          }
-        }
-        final FileOutputStream out = new FileOutputStream(managedSchemaFile);
-        writer = new OutputStreamWriter(out, "UTF-8");
-        schema.persist(writer);
-        log.info("Upgraded to managed schema at " + managedSchemaFile.getPath());
-      } catch (IOException e) {
-        final String msg = "Error persisting managed schema " + managedSchemaFile;
-        log.error(msg, e);
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg, e);
-      } finally {
-        IOUtils.closeQuietly(writer);
-        try {
-          FileUtils.sync(managedSchemaFile);
-        } catch (IOException e) {
-          final String msg = "Error syncing the managed schema file " + managedSchemaFile;
-          log.error(msg, e);
-        }
-      }
+      schema.persistManagedSchema(true);  // Only create it - don't update it if it already exists
 
       // After successfully persisting the managed schema, rename the non-managed
       // schema file by appending UPGRADED_SCHEMA_EXTENSION to its name.
@@ -293,29 +338,7 @@ public class ManagedIndexSchemaFactory e
    * and no exception will be thrown.
    */
   private void zkUgradeToManagedSchema() {
-    ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)config.getResourceLoader();
-    ZkCmdExecutor zkCmdExecutor = new ZkCmdExecutor(30);
-    ZkController zkController = zkLoader.getZkController();
-    final String managedSchemaPath = zkLoader.getCollectionZkPath() + "/" + managedSchemaResourceName;
-    try {
-      // Create the managed schema znode
-      zkCmdExecutor.ensureExists(managedSchemaPath, zkController.getZkClient());
-      // Persist the managed schema
-      StringWriter writer = new StringWriter();
-      schema.persist(writer);
-      zkController.getZkClient().setData(managedSchemaPath, writer.toString().getBytes("UTF-8"), true);
-      log.info("Upgraded to managed schema at " + managedSchemaPath + "");
-    } catch (Exception e) {
-      if (e instanceof InterruptedException) {
-        Thread.currentThread().interrupt(); // Restore the interrupted status
-        log.error("", e);
-        throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR, "", e);
-      } else {
-        final String msg = "Error persisting managed schema resource " + managedSchemaResourceName;
-        log.error(msg, e);
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg, e);
-      }
-    }
+    schema.persistManagedSchemaToZooKeeper(true); // Only create, don't update it if it already exists
 
     // After successfully persisting the managed schema, rename the non-managed
     // schema znode by appending UPGRADED_SCHEMA_EXTENSION to its name.
@@ -325,8 +348,11 @@ public class ManagedIndexSchemaFactory e
           + resourceName + " because it's the same as the managed schema's name.");
     } else {
       // Rename the non-managed schema znode in ZooKeeper
+      ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
       final String nonManagedSchemaPath = zkLoader.getCollectionZkPath() + "/" + resourceName;
       try {
+        ZkController zkController = zkLoader.getZkController();
+        ZkCmdExecutor zkCmdExecutor = new ZkCmdExecutor(zkController.getClientTimeout());
         if (zkController.pathExists(nonManagedSchemaPath)) {
           // First, copy the non-managed schema znode content to the upgraded schema znode
           byte[] bytes = zkController.getZkClient().getData(nonManagedSchemaPath, null, null, true);
@@ -340,20 +366,40 @@ public class ManagedIndexSchemaFactory e
           schema.setResourceName(managedSchemaResourceName);
 
           log.info("After upgrading to managed schema in ZooKeeper, renamed the non-managed schema "
-              + nonManagedSchemaPath + " to " + upgradedSchemaPath);
+                  + nonManagedSchemaPath + " to " + upgradedSchemaPath);
         } else {
           log.info("After upgrading to managed schema in ZooKeeper, the non-managed schema "
-              + nonManagedSchemaPath + " no longer exists.");
+                  + nonManagedSchemaPath + " no longer exists.");
         }
       } catch (Exception e) {
         if (e instanceof InterruptedException) {
           Thread.currentThread().interrupt(); // Restore the interrupted status
-          log.warn("", e); // Log as warning and suppress the exception 
-        } else {
-          final String msg = "Error persisting managed schema resource " + managedSchemaResourceName;
-          log.warn(msg, e); // Log as warning and suppress the exception
         }
+        final String msg = "Error persisting managed schema resource " + managedSchemaResourceName;
+        log.warn(msg, e); // Log as warning and suppress the exception
       }
     }
   }
+
+  private Object schemaUpdateLock = new Object();
+  public Object getSchemaUpdateLock() { return schemaUpdateLock; }
+
+  @Override
+  public void inform(SolrCore core) {
+    this.core = core;
+    if (loader instanceof ZkSolrResourceLoader) {
+      this.zkIndexSchemaReader = new ZkIndexSchemaReader(this);
+    } else {
+      this.zkIndexSchemaReader = null;
+    }
+  }
+
+  public ManagedIndexSchema getSchema() {
+    return schema;
+  }
+
+  public void setSchema(ManagedIndexSchema schema) {
+    this.schema = schema;
+    core.setLatestSchema(schema);
+  }
 }

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/PointType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/PointType.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/PointType.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/PointType.java Tue Apr 23 14:29:10 2013
@@ -55,7 +55,6 @@ public class PointType extends Coordinat
               "The dimension must be > 0: " + dimension);
     }
     args.remove(DIMENSION);
-    this.schema = schema;
     super.init(schema, args);
 
     // cache suffixes
@@ -83,7 +82,7 @@ public class PointType extends Coordinat
 
     if (field.indexed()) {
       for (int i=0; i<dimension; i++) {
-        SchemaField sf = subField(field, i);
+        SchemaField sf = subField(field, i, schema);
         f.add(sf.createField(point[i], sf.indexed() && !sf.omitNorms() ? boost : 1f));
       }
     }
@@ -102,7 +101,7 @@ public class PointType extends Coordinat
   public ValueSource getValueSource(SchemaField field, QParser parser) {
     ArrayList<ValueSource> vs = new ArrayList<ValueSource>(dimension);
     for (int i=0; i<dimension; i++) {
-      SchemaField sub = subField(field, i);
+      SchemaField sub = subField(field, i, schema);
       vs.add(sub.getType().getValueSource(sub, parser));
     }
     return new PointTypeValueSource(field, vs);
@@ -146,7 +145,7 @@ public class PointType extends Coordinat
     }
     BooleanQuery result = new BooleanQuery(true);
     for (int i = 0; i < dimension; i++) {
-      SchemaField subSF = subField(field, i);
+      SchemaField subSF = subField(field, i, schema);
       // points must currently be ordered... should we support specifying any two opposite corner points?
       result.add(subSF.getType().getRangeQuery(parser, subSF, p1[i], p2[i], minInclusive, maxInclusive), BooleanClause.Occur.MUST);
     }
@@ -164,7 +163,7 @@ public class PointType extends Coordinat
     //TODO: should we assert that p1.length == dimension?
     BooleanQuery bq = new BooleanQuery(true);
     for (int i = 0; i < dimension; i++) {
-      SchemaField sf = subField(field, i);
+      SchemaField sf = subField(field, i, schema);
       Query tq = sf.getType().getFieldQuery(parser, sf, p1[i]);
       bq.add(tq, BooleanClause.Occur.MUST);
     }
@@ -186,11 +185,12 @@ public class PointType extends Coordinat
     } catch (InvalidShapeException e) {
       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
     }
+    IndexSchema schema = parser.getReq().getSchema();
     if (dimension == 1){
       //TODO: Handle distance measures
       String lower = String.valueOf(point[0] - options.distance);
       String upper = String.valueOf(point[0] + options.distance);
-      SchemaField subSF = subField(options.field, 0);
+      SchemaField subSF = subField(options.field, 0, schema);
       // points must currently be ordered... should we support specifying any two opposite corner points?
       result = subSF.getType().getRangeQuery(parser, subSF, lower, upper, true, true);
     } else {
@@ -199,7 +199,7 @@ public class PointType extends Coordinat
       double [] ur = DistanceUtils.vectorBoxCorner(point, null, options.distance, true);
       double [] ll = DistanceUtils.vectorBoxCorner(point, null, options.distance, false);
       for (int i = 0; i < ur.length; i++) {
-        SchemaField subSF = subField(options.field, i);
+        SchemaField subSF = subField(options.field, i, schema);
         Query range = subSF.getType().getRangeQuery(parser, subSF, String.valueOf(ll[i]), String.valueOf(ur[i]), true, true);
         tmp.add(range, BooleanClause.Occur.MUST);
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SchemaField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SchemaField.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SchemaField.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SchemaField.java Tue Apr 23 14:29:10 2013
@@ -21,7 +21,6 @@ import org.apache.solr.common.SolrExcept
 import org.apache.lucene.index.IndexableField;
 import org.apache.lucene.search.SortField;
 import org.apache.solr.common.util.SimpleOrderedMap;
-import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.search.QParser;
 
 import org.apache.solr.response.TextResponseWriter;
@@ -49,7 +48,7 @@ public final class SchemaField extends F
   boolean required = false;  // this can't be final since it may be changed dynamically
   
   /** Declared field property overrides */
-  Map<String,String> args = Collections.emptyMap();
+  Map<String,?> args = Collections.emptyMap();
 
 
   /** Create a new SchemaField with the given name and type,
@@ -195,14 +194,14 @@ public final class SchemaField extends F
     
   }
 
-  static SchemaField create(String name, FieldType ft, Map<String,String> props) {
+  static SchemaField create(String name, FieldType ft, Map<String,?> props) {
 
     String defaultValue = null;
     if (props.containsKey(DEFAULT_VALUE)) {
-      defaultValue = props.get(DEFAULT_VALUE);
+      defaultValue = (String)props.get(DEFAULT_VALUE);
     }
     SchemaField field = new SchemaField(name, ft, calcProps(name, ft, props), defaultValue);
-    field.args = new HashMap<String,String>(props);
+    field.args = new HashMap<String,Object>(props);
     return field;
   }
 
@@ -220,7 +219,7 @@ public final class SchemaField extends F
     return new SchemaField(name, ft, props, defValue);
   }
 
-  static int calcProps(String name, FieldType ft, Map<String, String> props) {
+  static int calcProps(String name, FieldType ft, Map<String,?> props) {
     int trueProps = parseProperties(props,true,true);
     int falseProps = parseProperties(props,false,true);
 
@@ -334,13 +333,14 @@ public final class SchemaField extends F
       // The BINARY property is always false
       // properties.add(getPropertyName(BINARY), isBinary());
     } else {
-      for (Map.Entry<String,String> arg : args.entrySet()) {
+      for (Map.Entry<String,?> arg : args.entrySet()) {
         String key = arg.getKey();
-        String value = arg.getValue();
+        Object value = arg.getValue();
         if (key.equals(DEFAULT_VALUE)) {
           properties.add(key, value);
         } else {
-          properties.add(key, StrUtils.parseBool(value, false));
+          boolean boolVal = value instanceof Boolean ? (Boolean)value : Boolean.parseBoolean(value.toString());
+          properties.add(key, boolVal);
         }
       }
     }

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java Tue Apr 23 14:29:10 2013
@@ -43,6 +43,14 @@ public class SpatialPointVectorFieldType
 
   }
 
+  /**
+   * Adds X and Y fields to the given schema for each field with this class as its field type.
+   * 
+   * {@inheritDoc}
+   * 
+   * @param schema {@inheritDoc}
+   *
+   */
   @Override
   public void inform(IndexSchema schema) {
     FieldType fieldType = schema.getFieldTypeByName(numberFieldName);

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java Tue Apr 23 14:29:10 2013
@@ -1442,10 +1442,10 @@ public class ExtendedDismaxQParser exten
     public ExtendedDismaxConfiguration(SolrParams localParams,
         SolrParams params, SolrQueryRequest req) {
       solrParams = SolrParams.wrapDefaults(localParams, params);
-      minShouldMatch = DisMaxQParser.parseMinShouldMatch(req.getSchema(), solrParams);
+      minShouldMatch = DisMaxQParser.parseMinShouldMatch(req.getSchema(), solrParams); // req.getSearcher() here causes searcher refcount imbalance
       userFields = new UserFields(U.parseFieldBoosts(solrParams.getParams(DMP.UF)));
       try {
-        queryFields = DisMaxQParser.parseQueryFields(req.getSchema(), solrParams);
+        queryFields = DisMaxQParser.parseQueryFields(req.getSchema(), solrParams);  // req.getSearcher() here causes searcher refcount imbalance
       } catch (SyntaxError e) {
         throw new RuntimeException();
       }

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/requestfactory/TopGroupsShardRequestFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/requestfactory/TopGroupsShardRequestFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/requestfactory/TopGroupsShardRequestFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/requestfactory/TopGroupsShardRequestFactory.java Tue Apr 23 14:29:10 2013
@@ -27,6 +27,7 @@ import org.apache.solr.common.params.Sha
 import org.apache.solr.handler.component.ResponseBuilder;
 import org.apache.solr.handler.component.ShardRequest;
 import org.apache.solr.schema.FieldType;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.search.Grouping;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.search.grouping.distributed.ShardRequestFactory;
@@ -112,12 +113,13 @@ public class TopGroupsShardRequestFactor
     }
 
     sreq.params.set(GroupParams.GROUP_DISTRIBUTED_SECOND, "true");
+    final IndexSchema schema = rb.req.getSearcher().getSchema();
     for (Map.Entry<String, Collection<SearchGroup<BytesRef>>> entry : rb.mergedSearchGroups.entrySet()) {
       for (SearchGroup<BytesRef> searchGroup : entry.getValue()) {
         String groupValue;
         if (searchGroup.groupValue != null) {
           String rawGroupValue = searchGroup.groupValue.utf8ToString();
-          FieldType fieldType = rb.req.getSearcher().getSchema().getField(entry.getKey()).getType();
+          FieldType fieldType = schema.getField(entry.getKey()).getType();
           groupValue = fieldType.indexedToReadable(rawGroupValue);
         } else {
           groupValue = GROUP_NULL_VALUE;
@@ -127,9 +129,9 @@ public class TopGroupsShardRequestFactor
     }
 
     if ((rb.getFieldFlags() & SolrIndexSearcher.GET_SCORES) != 0 || rb.getSortSpec().includesScore()) {
-      sreq.params.set(CommonParams.FL, rb.req.getSchema().getUniqueKeyField().getName() + ",score");
+      sreq.params.set(CommonParams.FL, schema.getUniqueKeyField().getName() + ",score");
     } else {
-      sreq.params.set(CommonParams.FL, rb.req.getSchema().getUniqueKeyField().getName());
+      sreq.params.set(CommonParams.FL, schema.getUniqueKeyField().getName());
     }
     
     int origTimeAllowed = sreq.params.getInt(CommonParams.TIME_ALLOWED, -1);

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java Tue Apr 23 14:29:10 2013
@@ -32,6 +32,7 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.handler.component.ResponseBuilder;
 import org.apache.solr.handler.component.ShardDoc;
 import org.apache.solr.schema.FieldType;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.grouping.Command;
 import org.apache.solr.search.grouping.distributed.command.QueryCommand;
@@ -66,11 +67,12 @@ public class TopGroupsResultTransformer 
   @Override
   public NamedList transform(List<Command> data) throws IOException {
     NamedList<NamedList> result = new NamedList<NamedList>();
+    final IndexSchema schema = rb.req.getSearcher().getSchema();
     for (Command command : data) {
       NamedList commandResult;
       if (TopGroupsFieldCommand.class.isInstance(command)) {
         TopGroupsFieldCommand fieldCommand = (TopGroupsFieldCommand) command;
-        SchemaField groupField = rb.req.getSearcher().getSchema().getField(fieldCommand.getKey());
+        SchemaField groupField = schema.getField(fieldCommand.getKey());
         commandResult = serializeTopGroups(fieldCommand.result(), groupField);
       } else if (QueryCommand.class.isInstance(command)) {
         QueryCommand queryCommand = (QueryCommand) command;
@@ -184,7 +186,8 @@ public class TopGroupsResultTransformer 
     }
     CharsRef spare = new CharsRef();
 
-    SchemaField uniqueField = rb.req.getSearcher().getSchema().getUniqueKeyField();
+    final IndexSchema schema = rb.req.getSearcher().getSchema();
+    SchemaField uniqueField = schema.getUniqueKeyField();
     for (GroupDocs<BytesRef> searchGroup : data.groups) {
       NamedList<Object> groupResult = new NamedList<Object>();
       groupResult.add("totalHits", searchGroup.totalHits);
@@ -211,7 +214,7 @@ public class TopGroupsResultTransformer 
         for (int j = 0; j < fieldDoc.fields.length; j++) {
           Object sortValue  = fieldDoc.fields[j];
           Sort sortWithinGroup = rb.getGroupingSpec().getSortWithinGroup();
-          SchemaField field = sortWithinGroup.getSort()[j].getField() != null ? rb.req.getSearcher().getSchema().getFieldOrNull(sortWithinGroup.getSort()[j].getField()) : null;
+          SchemaField field = sortWithinGroup.getSort()[j].getField() != null ? schema.getFieldOrNull(sortWithinGroup.getSort()[j].getField()) : null;
           if (field != null) {
             FieldType fieldType = field.getType();
             if (sortValue instanceof BytesRef) {
@@ -244,7 +247,8 @@ public class TopGroupsResultTransformer 
     List<NamedList> documents = new ArrayList<NamedList>();
     queryResult.add("documents", documents);
 
-    SchemaField uniqueField = rb.req.getSearcher().getSchema().getUniqueKeyField();
+    final IndexSchema schema = rb.req.getSearcher().getSchema();
+    SchemaField uniqueField = schema.getUniqueKeyField();
     CharsRef spare = new CharsRef();
     for (ScoreDoc scoreDoc : result.getTopDocs().scoreDocs) {
       NamedList<Object> document = new NamedList<Object>();
@@ -264,7 +268,8 @@ public class TopGroupsResultTransformer 
       for (int j = 0; j < fieldDoc.fields.length; j++) {
         Object sortValue  = fieldDoc.fields[j];
         Sort groupSort = rb.getGroupingSpec().getGroupSort();
-        SchemaField field = groupSort.getSort()[j].getField() != null ? rb.req.getSearcher().getSchema().getFieldOrNull(groupSort.getSort()[j].getField()) : null;
+        SchemaField field = groupSort.getSort()[j].getField() != null 
+                          ? schema.getFieldOrNull(groupSort.getSort()[j].getField()) : null;
         if (field != null) {
           FieldType fieldType = field.getType();
           if (sortValue instanceof BytesRef) {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java Tue Apr 23 14:29:10 2013
@@ -20,14 +20,15 @@ package org.apache.solr.search.similarit
 import org.apache.lucene.search.similarities.DefaultSimilarity;
 import org.apache.lucene.search.similarities.PerFieldSimilarityWrapper;
 import org.apache.lucene.search.similarities.Similarity;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.schema.FieldType;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.SchemaAware;
 import org.apache.solr.schema.SimilarityFactory;
+import org.apache.solr.util.plugin.SolrCoreAware;
 
 /**
  * SimilarityFactory that returns a {@link PerFieldSimilarityWrapper}
- * that delegates to the field type, if its configured, otherwise
+ * that delegates to the field type, if it's configured, otherwise
  * {@link DefaultSimilarity}.
  *
  * <p>
@@ -42,16 +43,23 @@ import org.apache.solr.schema.Similarity
  *
  * @see FieldType#getSimilarity
  */
-public class SchemaSimilarityFactory extends SimilarityFactory implements SchemaAware {
+public class SchemaSimilarityFactory extends SimilarityFactory implements SolrCoreAware {
   private Similarity similarity;
   private Similarity defaultSimilarity = new DefaultSimilarity();
+  private volatile SolrCore core;
+
+  @Override
+  public void inform(SolrCore core) {
+    this.core = core;
+  }
   
   @Override
-  public void inform(final IndexSchema schema) {
+  public void init(SolrParams args) {
+    super.init(args);
     similarity = new PerFieldSimilarityWrapper() {
       @Override
       public Similarity get(String name) {
-        FieldType fieldType = schema.getFieldTypeNoEx(name);
+        FieldType fieldType = core.getLatestSchema().getFieldTypeNoEx(name);
         if (fieldType == null) {
           return defaultSimilarity;
         } else {
@@ -64,7 +72,7 @@ public class SchemaSimilarityFactory ext
 
   @Override
   public Similarity getSimilarity() {
-    assert similarity != null : "inform must be called first";
+    assert core != null : "inform must be called first";
     return similarity;
   }
 }

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java Tue Apr 23 14:29:10 2013
@@ -44,6 +44,7 @@ import org.apache.commons.fileupload.dis
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.lucene.util.IOUtils;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.MultiMapSolrParams;
 import org.apache.solr.common.params.SolrParams;
@@ -161,7 +162,7 @@ public class SolrRequestParsers 
     String[] strs = params.getParams( CommonParams.STREAM_URL );
     if( strs != null ) {
       if( !enableRemoteStreams ) {
-        throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Remote Streaming is disabled." );
+        throw new SolrException( ErrorCode.BAD_REQUEST, "Remote Streaming is disabled." );
       }
       for( final String url : strs ) {
         ContentStreamBase stream = new ContentStreamBase.URLStream( new URL(url) );
@@ -176,7 +177,7 @@ public class SolrRequestParsers 
     strs = params.getParams( CommonParams.STREAM_FILE );
     if( strs != null ) {
       if( !enableRemoteStreams ) {
-        throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Remote Streaming is disabled." );
+        throw new SolrException( ErrorCode.BAD_REQUEST, "Remote Streaming is disabled." );
       }
       for( final String file : strs ) {
         ContentStreamBase stream = new ContentStreamBase.FileStream( new File(file) );
@@ -232,7 +233,7 @@ public class SolrRequestParsers 
             if (pos < len) {
               final char ch = queryString.charAt(pos);
               if (ch > 127) {
-                throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "URLDecoder: The query string contains a not-%-escaped byte > 127 at position " + pos);
+                throw new SolrException(ErrorCode.BAD_REQUEST, "URLDecoder: The query string contains a not-%-escaped byte > 127 at position " + pos);
               }
               pos++;
               return ch;
@@ -243,7 +244,7 @@ public class SolrRequestParsers 
         };
         parseFormDataContent(in, Long.MAX_VALUE, IOUtils.CHARSET_UTF_8, map);
       } catch (IOException ioe) {
-        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, ioe);
+        throw new SolrException(ErrorCode.BAD_REQUEST, ioe);
       }
     }
   }
@@ -273,7 +274,7 @@ public class SolrRequestParsers 
             final String key = decodeChars(keyStream, keyPos, charsetDecoder), value = decodeChars(valueStream, valuePos, charsetDecoder);
             MultiMapSolrParams.addParam(key, value, map);
           } else if (valueStream.size() > 0) {
-            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded invalid: missing key");
+            throw new SolrException(ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded invalid: missing key");
           }
           keyStream.reset();
           valueStream.reset();
@@ -305,7 +306,7 @@ public class SolrRequestParsers 
       }
       len++;
       if (len > maxLen) {
-        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded content exceeds upload limit of " + (maxLen/1024L) + " KB");
+        throw new SolrException(ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded content exceeds upload limit of " + (maxLen/1024L) + " KB");
       }
     }
     return len;
@@ -315,7 +316,7 @@ public class SolrRequestParsers 
     try {
       return charsetDecoder.decode(ByteBuffer.wrap(stream.buffer(), 0, stream.size())).toString();
     } catch (CharacterCodingException cce) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+      throw new SolrException(ErrorCode.BAD_REQUEST,
         "URLDecoder: Invalid character encoding detected after position " + position +
         " of query string / form data (while parsing as " + charsetDecoder.charset().name() + ")"
       );
@@ -331,7 +332,7 @@ public class SolrRequestParsers 
   
   private static int digit16(int b) {
     if (b == -1) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "URLDecoder: Incomplete trailing escape (%) pattern");
+      throw new SolrException(ErrorCode.BAD_REQUEST, "URLDecoder: Incomplete trailing escape (%) pattern");
     }
     if (b >= '0' && b <= '9') {
       return b - '0';
@@ -342,7 +343,7 @@ public class SolrRequestParsers 
     if (b >= 'a' && b <= 'f') {
       return b - ('a' - 10);
     }
-    throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "URLDecoder: Invalid digit (" + ((char) b) + ") in escape (%) pattern");
+    throw new SolrException(ErrorCode.BAD_REQUEST, "URLDecoder: Invalid digit (" + ((char) b) + ") in escape (%) pattern");
   }
   
   public boolean isHandleSelect() {
@@ -471,7 +472,7 @@ class MultipartRequestParser implements 
       final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
   {
     if( !ServletFileUpload.isMultipartContent(req) ) {
-      throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Not multipart content! "+req.getContentType() );
+      throw new SolrException( ErrorCode.BAD_REQUEST, "Not multipart content! "+req.getContentType() );
     }
     
     MultiMapSolrParams params = SolrRequestParsers.parseQueryString( req.getQueryString() );
@@ -526,7 +527,7 @@ class FormDataRequestParser implements S
       final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
   {
     if (!isFormData(req)) {
-      throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Not application/x-www-form-urlencoded content: "+req.getContentType() );
+      throw new SolrException( ErrorCode.BAD_REQUEST, "Not application/x-www-form-urlencoded content: "+req.getContentType() );
     }
     
     final Map<String,String[]> map = new HashMap<String, String[]>();
@@ -541,7 +542,7 @@ class FormDataRequestParser implements S
     final long totalLength = req.getContentLength();
     final long maxLength = ((long) uploadLimitKB) * 1024L;
     if (totalLength > maxLength) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded content length (" +
+      throw new SolrException(ErrorCode.BAD_REQUEST, "application/x-www-form-urlencoded content length (" +
         totalLength + " bytes) exceeds upload limit of " + uploadLimitKB + " KB");
     }
     
@@ -556,7 +557,7 @@ class FormDataRequestParser implements S
         throw getParameterIncompatibilityException();
       }
     } catch (IOException ioe) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, ioe);
+      throw new SolrException(ErrorCode.BAD_REQUEST, ioe);
     } catch (IllegalStateException ise) {
       throw (SolrException) getParameterIncompatibilityException().initCause(ise);
     } finally {
@@ -567,7 +568,7 @@ class FormDataRequestParser implements S
   }
   
   private SolrException getParameterIncompatibilityException() {
-    return new SolrException(SolrException.ErrorCode.SERVER_ERROR,
+    return new SolrException(ErrorCode.SERVER_ERROR,
       "Solr requires that request parameters sent using application/x-www-form-urlencoded " +
       "content-type can be read through the request input stream. Unfortunately, the " +
       "stream was empty / not available. This may be caused by another servlet filter calling " +
@@ -613,7 +614,8 @@ class StandardRequestParser implements S
       final HttpServletRequest req, ArrayList<ContentStream> streams ) throws Exception
   {
     String method = req.getMethod().toUpperCase(Locale.ROOT);
-    if ("GET".equals(method) || "HEAD".equals(method)) {
+    if ("GET".equals(method) || "HEAD".equals(method) 
+        || ("PUT".equals(method) && req.getRequestURI().contains("/schema"))) {
       return SolrRequestParsers.parseQueryString(req.getQueryString());
     }
     if ("POST".equals( method ) ) {
@@ -625,7 +627,7 @@ class StandardRequestParser implements S
       }
       return raw.parseParamsAndFillStreams(req, streams);
     }
-    throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Unsupported method: "+method );
+    throw new SolrException(ErrorCode.BAD_REQUEST, "Unsupported method: " + method + " for request " + req);
   }
 }
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java Tue Apr 23 14:29:10 2013
@@ -21,7 +21,13 @@ import java.io.InputStreamReader;
 import java.util.List;
 
 import org.apache.lucene.document.Field;
-import org.apache.lucene.index.*;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.LogByteSizeMergePolicy;
+import org.apache.lucene.index.LogMergePolicy;
+import org.apache.solr.schema.IndexSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -60,7 +66,7 @@ public class FileBasedSpellChecker exten
 
   @Override
   public void build(SolrCore core, SolrIndexSearcher searcher) throws IOException {
-    loadExternalFileDictionary(core);
+    loadExternalFileDictionary(core, searcher);
     spellChecker.clearIndex();
     // TODO: you should be able to specify the IWC params?
     // TODO: if we enable this, codec gets angry since field won't exist in the schema
@@ -76,12 +82,12 @@ public class FileBasedSpellChecker exten
     return null;
   }
 
-  private void loadExternalFileDictionary(SolrCore core) {
+  private void loadExternalFileDictionary(SolrCore core, SolrIndexSearcher searcher) {
     try {
-
+      IndexSchema schema = null == searcher ? core.getLatestSchema() : searcher.getSchema();
       // Get the field's analyzer
-      if (fieldTypeName != null && core.getSchema().getFieldTypeNoEx(fieldTypeName) != null) {
-        FieldType fieldType = core.getSchema().getFieldTypes().get(fieldTypeName);
+      if (fieldTypeName != null && schema.getFieldTypeNoEx(fieldTypeName) != null) {
+        FieldType fieldType = schema.getFieldTypes().get(fieldTypeName);
         // Do index-time analysis using the given fieldType's analyzer
         RAMDirectory ramDir = new RAMDirectory();
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/SolrSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/SolrSpellChecker.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/SolrSpellChecker.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/SolrSpellChecker.java Tue Apr 23 14:29:10 2013
@@ -29,6 +29,7 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.component.SpellCheckMergeData;
 import org.apache.solr.schema.FieldType;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.search.SolrIndexSearcher;
 
 import java.io.IOException;
@@ -63,12 +64,13 @@ public abstract class SolrSpellChecker {
       name = DEFAULT_DICTIONARY_NAME;
     }
     field = (String)config.get(FIELD);
-    if (field != null && core.getSchema().getFieldTypeNoEx(field) != null)  {
-      analyzer = core.getSchema().getFieldType(field).getQueryAnalyzer();
+    IndexSchema schema = core.getLatestSchema();
+    if (field != null && schema.getFieldTypeNoEx(field) != null)  {
+      analyzer = schema.getFieldType(field).getQueryAnalyzer();
     }
     fieldTypeName = (String) config.get(FIELD_TYPE);
-    if (core.getSchema().getFieldTypes().containsKey(fieldTypeName))  {
-      FieldType fieldType = core.getSchema().getFieldTypes().get(fieldTypeName);
+    if (schema.getFieldTypes().containsKey(fieldTypeName))  {
+      FieldType fieldType = schema.getFieldTypes().get(fieldTypeName);
       analyzer = fieldType.getQueryAnalyzer();
     }
     if (analyzer == null)   {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingLookupFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingLookupFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingLookupFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingLookupFactory.java Tue Apr 23 14:29:10 2013
@@ -77,7 +77,7 @@ public class AnalyzingLookupFactory exte
     if (fieldTypeName == null) {
       throw new IllegalArgumentException("Error in configuration: " + QUERY_ANALYZER + " parameter is mandatory");
     }
-    FieldType ft = core.getSchema().getFieldTypeByName(fieldTypeName.toString());
+    FieldType ft = core.getLatestSchema().getFieldTypeByName(fieldTypeName.toString());
     Analyzer indexAnalyzer = ft.getAnalyzer();
     Analyzer queryAnalyzer = ft.getQueryAnalyzer();
     

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/FuzzyLookupFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/FuzzyLookupFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/FuzzyLookupFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/spelling/suggest/fst/FuzzyLookupFactory.java Tue Apr 23 14:29:10 2013
@@ -67,7 +67,7 @@ public class FuzzyLookupFactory extends 
       throw new IllegalArgumentException("Error in configuration: " + AnalyzingLookupFactory.QUERY_ANALYZER + " parameter is mandatory");
     }
     // retrieve index and query analyzers for the field
-    FieldType ft = core.getSchema().getFieldTypeByName(fieldTypeName.toString());
+    FieldType ft = core.getLatestSchema().getFieldTypeByName(fieldTypeName.toString());
     Analyzer indexAnalyzer = ft.getAnalyzer();
     Analyzer queryAnalyzer = ft.getQueryAnalyzer();
     

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java Tue Apr 23 14:29:10 2013
@@ -195,7 +195,7 @@ public final class DefaultSolrCoreState 
   
   protected SolrIndexWriter createMainIndexWriter(SolrCore core, String name) throws IOException {
     return SolrIndexWriter.create(name, core.getNewIndexDir(),
-        core.getDirectoryFactory(), false, core.getSchema(),
+        core.getDirectoryFactory(), false, core.getLatestSchema(),
         core.getSolrConfig().indexConfig, core.getDeletionPolicy(), core.getCodec());
   }
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java Tue Apr 23 14:29:10 2013
@@ -51,6 +51,7 @@ import org.apache.solr.request.LocalSolr
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.FunctionRangeQuery;
 import org.apache.solr.search.QParser;
@@ -157,6 +158,7 @@ public class DirectUpdateHandler2 extend
       }
       
       try {
+        IndexSchema schema = cmd.getReq().getSchema();
         
         if (cmd.overwrite) {
           
@@ -396,7 +398,7 @@ public class DirectUpdateHandler2 extend
       RefCounted<IndexWriter> iw = solrCoreState.getIndexWriter(core);
       try {
         IndexWriter writer = iw.get();
-        writer.updateDocument(idTerm, luceneDocument, core.getSchema()
+        writer.updateDocument(idTerm, luceneDocument, cmd.getReq().getSchema()
             .getAnalyzer());
         
         for (Query q : dbqList) {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java Tue Apr 23 14:29:10 2013
@@ -17,8 +17,6 @@
 
 package org.apache.solr.update;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
 import org.apache.lucene.document.Document;
@@ -38,143 +36,6 @@ import org.apache.solr.schema.SchemaFiel
 
 // Not thread safe - by design.  Create a new builder for each thread.
 public class DocumentBuilder {
-  private final IndexSchema schema;
-  private Document doc;
-  private HashMap<String,String> map;
-
-  public DocumentBuilder(IndexSchema schema) {
-    this.schema = schema;
-  }
-
-  public void startDoc() {
-    doc = new Document();
-    map = new HashMap<String,String>();
-  }
-
-  protected void addSingleField(SchemaField sfield, String val, float boost) {
-    //System.out.println("###################ADDING FIELD "+sfield+"="+val);
-
-    // we don't check for a null val ourselves because a solr.FieldType
-    // might actually want to map it to something.  If createField()
-    // returns null, then we don't store the field.
-    List<IndexableField> fields = sfield.createFields(val, boost);
-    if (!fields.isEmpty()) {
-      if (!sfield.multiValued()) {
-        String oldValue = map.put(sfield.getName(), val);
-        if (oldValue != null) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "ERROR: multiple values encountered for non multiValued field " + sfield.getName()
-                  + ": first='" + oldValue + "' second='" + val + "'");
-        }
-      }
-      // Add each field
-      for (IndexableField field : fields) {
-        doc.add((Field) field);
-      }
-    }
-
-  }
-
-  /**
-   * Add the specified {@link org.apache.solr.schema.SchemaField} to the document.  Does not invoke the copyField mechanism.
-   * @param sfield The {@link org.apache.solr.schema.SchemaField} to add
-   * @param val The value to add
-   * @param boost The boost factor
-   *
-   * @see #addField(String, String)
-   * @see #addField(String, String, float)
-   * @see #addSingleField(org.apache.solr.schema.SchemaField, String, float)
-   */
-  public void addField(SchemaField sfield, String val, float boost) {
-    addSingleField(sfield,val,boost);
-  }
-
-  /**
-   * Add the Field and value to the document, invoking the copyField mechanism
-   * @param name The name of the field
-   * @param val The value to add
-   *
-   * @see #addField(String, String, float)
-   * @see #addField(org.apache.solr.schema.SchemaField, String, float)
-   * @see #addSingleField(org.apache.solr.schema.SchemaField, String, float)
-   */
-  public void addField(String name, String val) {
-    addField(name, val, 1.0f);
-  }
-
-  /**
-   * Add the Field and value to the document with the specified boost, invoking the copyField mechanism
-   * @param name The name of the field.
-   * @param val The value to add
-   * @param boost The boost
-   *
-   * @see #addField(String, String)
-   * @see #addField(org.apache.solr.schema.SchemaField, String, float)
-   * @see #addSingleField(org.apache.solr.schema.SchemaField, String, float)
-   *
-   */
-  public void addField(String name, String val, float boost) {
-    SchemaField sfield = schema.getFieldOrNull(name);
-    if (sfield != null) {
-      addField(sfield,val,boost);
-    }
-
-    // Check if we should copy this field to any other fields.
-    // This could happen whether it is explicit or not.
-    final List<CopyField> copyFields = schema.getCopyFieldsList(name);
-    if (copyFields != null) {
-      for(CopyField cf : copyFields) {
-        addSingleField(cf.getDestination(), cf.getLimitedValue( val ), boost);
-      }
-    }
-
-    // error if this field name doesn't match anything
-    if (sfield==null && (copyFields==null || copyFields.size()==0)) {
-      throw new SolrException( SolrException.ErrorCode.BAD_REQUEST,"ERROR:unknown field '" + name + "'");
-    }
-  }
-
-  public void endDoc() {
-  }
-
-  // specific to this type of document builder
-  public Document getDoc() throws IllegalArgumentException {
-    
-    // Check for all required fields -- Note, all fields with a
-    // default value are defacto 'required' fields.  
-    List<String> missingFields = null;
-    for (SchemaField field : schema.getRequiredFields()) {
-      if (doc.getField(field.getName() ) == null) {
-        if (field.getDefaultValue() != null) {
-          addField(doc, field, field.getDefaultValue(), 1.0f);
-        } else {
-          if (missingFields==null) {
-            missingFields = new ArrayList<String>(1);
-          }
-          missingFields.add(field.getName());
-        }
-      }
-    }
-  
-    if (missingFields != null) {
-      StringBuilder builder = new StringBuilder();
-      // add the uniqueKey if possible
-      if( schema.getUniqueKeyField() != null ) {
-        String n = schema.getUniqueKeyField().getName();
-        String v = doc.getField( n ).stringValue();
-        builder.append( "Document ["+n+"="+v+"] " );
-      }
-      builder.append("missing required fields: " );
-      for (String field : missingFields) {
-        builder.append(field);
-        builder.append(" ");
-      }
-      throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, builder.toString());
-    }
-    
-    Document ret = doc; doc=null;
-    return ret;
-  }
-
 
   private static void addField(Document doc, SchemaField field, Object val, float boost) {
     if (val instanceof IndexableField) {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java Tue Apr 23 14:29:10 2013
@@ -57,8 +57,8 @@ public class SolrIndexSplitter {
   int currPartition = 0;
 
   public SolrIndexSplitter(SplitIndexCommand cmd) {
-    field = cmd.getReq().getSchema().getUniqueKeyField();
     searcher = cmd.getReq().getSearcher();
+    field = searcher.getSchema().getUniqueKeyField();
     ranges = cmd.ranges;
     paths = cmd.paths;
     cores = cmd.cores;
@@ -109,7 +109,7 @@ public class SolrIndexSplitter {
         SolrCore core = searcher.getCore();
         String path = paths.get(partitionNumber);
         iw = SolrIndexWriter.create("SplittingIndexWriter"+partitionNumber + (ranges != null ? " " + ranges.get(partitionNumber) : ""), path,
-                                    core.getDirectoryFactory(), true, core.getSchema(),
+                                    core.getDirectoryFactory(), true, core.getLatestSchema(),
                                     core.getSolrConfig().indexConfig, core.getDeletionPolicy(), core.getCodec());
       }
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/UpdateHandler.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/UpdateHandler.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/UpdateHandler.java Tue Apr 23 14:29:10 2013
@@ -27,7 +27,6 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrEventListener;
 import org.apache.solr.core.SolrInfoMBean;
 import org.apache.solr.schema.FieldType;
-import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.slf4j.Logger;
@@ -45,7 +44,6 @@ public abstract class UpdateHandler impl
   protected final static Logger log = LoggerFactory.getLogger(UpdateHandler.class);
 
   protected final SolrCore core;
-  protected final IndexSchema schema;
 
   protected final SchemaField idField;
   protected final FieldType idFieldType;
@@ -125,8 +123,7 @@ public abstract class UpdateHandler impl
   
   public UpdateHandler(SolrCore core, UpdateLog updateLog)  {
     this.core=core;
-    schema = core.getSchema();
-    idField = schema.getUniqueKeyField();
+    idField = core.getLatestSchema().getUniqueKeyField();
     idFieldType = idField!=null ? idField.getType() : null;
     parseEventListeners();
     PluginInfo ulogPluginInfo = core.getSolrConfig().getPluginInfo(UpdateLog.class.getName());

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/VersionInfo.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/VersionInfo.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/VersionInfo.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/VersionInfo.java Tue Apr 23 14:29:10 2013
@@ -27,7 +27,6 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.util.BitUtil;
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.core.SolrCore;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.SolrIndexSearcher;
@@ -79,9 +78,9 @@ public class VersionInfo {
 
   public VersionInfo(UpdateLog ulog, int nBuckets) {
     this.ulog = ulog;
-    SolrCore core = ulog.uhandler.core;
-    versionField = getAndCheckVersionField(core.getSchema());
-    idField = core.getSchema().getUniqueKeyField();
+    IndexSchema schema = ulog.uhandler.core.getLatestSchema(); 
+    versionField = getAndCheckVersionField(schema);
+    idField = schema.getUniqueKeyField();
     buckets = new VersionBucket[ BitUtil.nextHighestPowerOfTwo(nBuckets) ];
     for (int i=0; i<buckets.length; i++) {
       buckets[i] = new VersionBucket();

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java Tue Apr 23 14:29:10 2013
@@ -17,17 +17,12 @@
 package org.apache.solr.update.processor;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.HashSet;
 
-import org.apache.solr.schema.IndexSchema;
-
 import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.util.plugin.SolrCoreAware;
 
 import org.apache.solr.common.util.NamedList;
@@ -36,15 +31,13 @@ import org.apache.solr.common.SolrInputF
 import org.apache.solr.common.SolrInputDocument;
 
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
-import static org.apache.solr.common.SolrException.ErrorCode.*;
+import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR;
 
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 
 import org.apache.solr.update.AddUpdateCommand;
 
-import org.apache.solr.update.processor.FieldMutatingUpdateProcessorFactory;
 import org.apache.solr.update.processor.FieldMutatingUpdateProcessorFactory.SelectorParams;
 import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSelector;
 
@@ -200,12 +193,10 @@ public class CloneFieldUpdateProcessorFa
   @Override
   public void inform(final SolrCore core) {
     
-    final IndexSchema schema = core.getSchema();
-
     srcSelector = 
       FieldMutatingUpdateProcessor.createFieldNameSelector
       (core.getResourceLoader(),
-       core.getSchema(),
+       core,
        srcInclusions.fieldName,
        srcInclusions.typeName,
        srcInclusions.typeClass,
@@ -217,7 +208,7 @@ public class CloneFieldUpdateProcessorFa
         (srcSelector,
          FieldMutatingUpdateProcessor.createFieldNameSelector
          (core.getResourceLoader(),
-          core.getSchema(),
+          core,
           exc.fieldName,
           exc.typeName,
           exc.typeClass,

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java Tue Apr 23 14:29:10 2013
@@ -95,10 +95,10 @@ public final class ConcatFieldUpdateProc
   public FieldMutatingUpdateProcessor.FieldNameSelector 
     getDefaultSelector(final SolrCore core) {
 
-    final IndexSchema schema = core.getSchema();
     return new FieldMutatingUpdateProcessor.FieldNameSelector() {
       @Override
       public boolean shouldMutate(final String fieldName) {
+        final IndexSchema schema = core.getLatestSchema();
 
         // first check type since it should be fastest
         FieldType type = schema.getFieldTypeNoEx(fieldName);

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Tue Apr 23 14:29:10 2013
@@ -57,6 +57,7 @@ import org.apache.solr.handler.component
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.update.CommitUpdateCommand;
@@ -685,6 +686,7 @@ public class DistributedUpdateProcessor 
       oldDoc.remove(VERSION_FIELD);
     }
 
+    IndexSchema schema = cmd.getReq().getSchema();
     for (SolrInputField sif : sdoc.values()) {
       Object val = sif.getValue();
       if (val instanceof Map) {
@@ -706,7 +708,7 @@ public class DistributedUpdateProcessor 
             } else {
               // TODO: fieldtype needs externalToObject?
               String oldValS = numericField.getFirstValue().toString();
-              SchemaField sf = cmd.getReq().getSchema().getField(sif.getName());
+              SchemaField sf = schema.getField(sif.getName());
               BytesRef term = new BytesRef();
               sf.getType().readableToIndexed(oldValS, term);
               Object oldVal = sf.getType().toObject(sf, term);

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java Tue Apr 23 14:29:10 2013
@@ -18,27 +18,21 @@
 package org.apache.solr.update.processor;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
 
-import static org.apache.solr.common.SolrException.ErrorCode.*;
+import static org.apache.solr.common.SolrException.ErrorCode.BAD_REQUEST;
+import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR;
 
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
-import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.FieldType;
 
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.AddUpdateCommand;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -197,7 +191,7 @@ public abstract class FieldMutatingUpdat
    */
   public static FieldNameSelector createFieldNameSelector
     (final SolrResourceLoader loader,
-     final IndexSchema schema,
+     final SolrCore core,
      final Set<String> fields,
      final Set<String> typeNames,
      final Collection<String> typeClasses,
@@ -223,25 +217,24 @@ public abstract class FieldMutatingUpdat
       return defSelector;
     }
     
-    return new ConfigurableFieldNameSelector
-      (schema, fields, typeNames, classes, regexes); 
+    return new ConfigurableFieldNameSelector(core, fields, typeNames, classes, regexes); 
   }
   
   private static final class ConfigurableFieldNameSelector 
     implements FieldNameSelector {
 
-    final IndexSchema schema;
+    final SolrCore core;
     final Set<String> fields;
     final Set<String> typeNames;
     final Collection<Class> classes;
     final Collection<Pattern> regexes;
 
-    private ConfigurableFieldNameSelector(final IndexSchema schema,
+    private ConfigurableFieldNameSelector(final SolrCore core,
                                           final Set<String> fields,
                                           final Set<String> typeNames,
                                           final Collection<Class> classes,
                                           final Collection<Pattern> regexes) {
-      this.schema = schema;
+      this.core = core;
       this.fields = fields;
       this.typeNames = typeNames;
       this.classes = classes;
@@ -260,7 +253,7 @@ public abstract class FieldMutatingUpdat
       
       // do not consider it an error if the fieldName has no type
       // there might be another processor dealing with it later
-      FieldType t = schema.getFieldTypeNoEx(fieldName);
+      FieldType t =  core.getLatestSchema().getFieldTypeNoEx(fieldName);
       if (null != t) {
         if (! (typeNames.isEmpty() || typeNames.contains(t.getTypeName())) ) {
           return false;

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java Tue Apr 23 14:29:10 2013
@@ -17,7 +17,6 @@
 
 package org.apache.solr.update.processor;
 
-import java.io.IOException;
 import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -32,11 +31,6 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.common.SolrException;
 import static org.apache.solr.common.SolrException.ErrorCode.*;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.update.AddUpdateCommand;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.FieldType;
 import org.apache.solr.util.plugin.SolrCoreAware;
 
 
@@ -199,12 +193,10 @@ public abstract class FieldMutatingUpdat
   @Override
   public void inform(final SolrCore core) {
     
-    final IndexSchema schema = core.getSchema();
-
     selector = 
       FieldMutatingUpdateProcessor.createFieldNameSelector
       (core.getResourceLoader(),
-       core.getSchema(),
+       core,
        inclusions.fieldName,
        inclusions.typeName,
        inclusions.typeClass,
@@ -216,7 +208,7 @@ public abstract class FieldMutatingUpdat
         (selector,
          FieldMutatingUpdateProcessor.createFieldNameSelector
          (core.getResourceLoader(),
-          core.getSchema(),
+          core,
           exc.fieldName,
           exc.typeName,
           exc.typeClass,

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java Tue Apr 23 14:29:10 2013
@@ -22,7 +22,6 @@ import org.apache.solr.schema.IndexSchem
 import org.apache.solr.schema.FieldType;
 
 import org.apache.solr.common.SolrInputField;
-import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 
@@ -71,11 +70,10 @@ public final class IgnoreFieldUpdateProc
   public FieldMutatingUpdateProcessor.FieldNameSelector 
     getDefaultSelector(final SolrCore core) {
 
-    final IndexSchema schema = core.getSchema();
     return new FieldMutatingUpdateProcessor.FieldNameSelector() {
       @Override
       public boolean shouldMutate(final String fieldName) {
-
+        final IndexSchema schema = core.getLatestSchema();
         FieldType type = schema.getFieldTypeNoEx(fieldName);
         return (null == type);
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/PreAnalyzedUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/PreAnalyzedUpdateProcessorFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/PreAnalyzedUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/PreAnalyzedUpdateProcessorFactory.java Tue Apr 23 14:29:10 2013
@@ -125,7 +125,7 @@ public class PreAnalyzedUpdateProcessorF
     if (parserImpl != null) {
       args.put(PreAnalyzedField.PARSER_IMPL, parserImpl);
     }
-    parser.init(core.getSchema(), args);
+    parser.init(core.getLatestSchema(), args);
   }  
 }
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java Tue Apr 23 14:29:10 2013
@@ -75,7 +75,7 @@ public class SignatureUpdateProcessorFac
 
   @Override
   public void inform(SolrCore core) {
-    final SchemaField field = core.getSchema().getFieldOrNull(getSignatureField());
+    final SchemaField field = core.getLatestSchema().getFieldOrNull(getSignatureField());
     if (null == field) {
       throw new SolrException
         (ErrorCode.SERVER_ERROR,

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java Tue Apr 23 14:29:10 2013
@@ -19,8 +19,13 @@ package org.apache.solr.util;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexableField;
-import org.apache.lucene.search.*;
+import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.search.BooleanQuery;
+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.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
@@ -38,10 +43,27 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.search.*;
+import org.apache.solr.search.CacheRegenerator;
+import org.apache.solr.search.DocIterator;
+import org.apache.solr.search.DocList;
+import org.apache.solr.search.DocSet;
+import org.apache.solr.search.FieldParams;
+import org.apache.solr.search.QParser;
+import org.apache.solr.search.QueryParsing;
+import org.apache.solr.search.ReturnFields;
+import org.apache.solr.search.SolrCache;
+import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrQueryParser;
+import org.apache.solr.search.SyntaxError;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.regex.Pattern;
 import java.lang.reflect.Method;
 import java.lang.reflect.InvocationTargetException;
@@ -152,7 +174,7 @@ public class SolrPluginUtils {
           fieldFilter.add(field);
 
         // fetch unique key if one exists.
-        SchemaField keyField = req.getSearcher().getSchema().getUniqueKeyField();
+        SchemaField keyField = searcher.getSchema().getUniqueKeyField();
         if(null != keyField)
           fieldFilter.add(keyField.getName());
       }
@@ -270,7 +292,7 @@ public class SolrPluginUtils {
   {
     if (dbgResults) {
       SolrIndexSearcher searcher = req.getSearcher();
-      IndexSchema schema = req.getSchema();
+      IndexSchema schema = searcher.getSchema();
       boolean explainStruct = req.getParams().getBool(CommonParams.EXPLAIN_STRUCT, false);
 
       NamedList<Explanation> explain = getExplanations(query, results, searcher, schema);

Modified: lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog-managed-schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog-managed-schema.xml?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog-managed-schema.xml (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog-managed-schema.xml Tue Apr 23 14:29:10 2013
@@ -64,29 +64,6 @@
     </updateLog>
   </updateHandler>
 
-  <updateRequestProcessorChain name="dedupe">
-    <processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory">
-      <bool name="enabled">true</bool>
-      <bool name="overwriteDupes">true</bool>
-      <str name="fields">v_t,t_field</str>
-      <str name="signatureClass">org.apache.solr.update.processor.TextProfileSignature</str>
-    </processor>
-    <processor class="solr.RunUpdateProcessorFactory" />
-  </updateRequestProcessorChain>
-  <updateRequestProcessorChain name="stored_sig">
-    <!-- this chain is valid even though the signature field is not
-         indexed, because we are not asking for dups to be overwritten
-      -->
-    <processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory">
-      <bool name="enabled">true</bool>
-      <str name="signatureField">non_indexed_signature_sS</str>
-      <bool name="overwriteDupes">false</bool>
-      <str name="fields">v_t,t_field</str>
-      <str name="signatureClass">org.apache.solr.update.processor.TextProfileSignature</str>
-    </processor>
-    <processor class="solr.RunUpdateProcessorFactory" />
-  </updateRequestProcessorChain>
-
   <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
 
   <updateRequestProcessorChain name="distrib-dup-test-chain-explicit">

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java?rev=1470979&r1=1470978&r2=1470979&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java Tue Apr 23 14:29:10 2013
@@ -43,7 +43,7 @@ public class MinimalSchemaTest extends S
        a uniqueKey field and defeat the point of the tests
     */
     assertNull("UniqueKey Field isn't null", 
-               h.getCore().getSchema().getUniqueKeyField());
+               h.getCore().getLatestSchema().getUniqueKeyField());
 
     lrf.args.put(CommonParams.VERSION,"2.2");