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 2014/04/05 06:32:32 UTC

svn commit: r1584959 - in /lucene/dev/branches/branch_4x: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/core/ solr/core/src/java/org/apache/solr/rest/ solr/core/src/java/org/apache/solr/rest/schema/ solr/core/src/java/org/apache/solr/rest/sche...

Author: sarowe
Date: Sat Apr  5 04:32:30 2014
New Revision: 1584959

URL: http://svn.apache.org/r1584959
Log:
SOLR-5653: Create a RestManager to provide REST API endpoints for reconfigurable plugins (merged trunk r1576939 and r1576942)

Added:
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/BaseSolrResource.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/BaseSolrResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/DELETEable.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/DELETEable.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/ManagedResource.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/ManagedResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/ManagedResourceObserver.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/ManagedResourceObserver.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/ManagedResourceStorage.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/ManagedResourceStorage.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/RestManager.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/RestManager.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/SolrConfigRestApi.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/SolrConfigRestApi.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/SolrSchemaRestApi.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/SolrSchemaRestApi.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/analysis/
      - copied from r1576939, lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/schema/analysis/
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/TestManagedResource.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/test/org/apache/solr/rest/TestManagedResource.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/TestRestManager.java
      - copied unchanged from r1576939, lucene/dev/trunk/solr/core/src/test/org/apache/solr/rest/TestRestManager.java
Removed:
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/SolrRestApi.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseSchemaResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/DefaultSchemaResource.java
Modified:
    lucene/dev/branches/branch_4x/   (props changed)
    lucene/dev/branches/branch_4x/solr/   (props changed)
    lucene/dev/branches/branch_4x/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_4x/solr/core/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrConfig.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldTypeResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/DefaultSearchFieldResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaNameResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaSimilarityResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaVersionResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserDefaultOperatorResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/UniqueKeyFieldResource.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
    lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/SolrRestletTestBase.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSerializedLuceneMatchVersion.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaAddField.java
    lucene/dev/branches/branch_4x/solr/solrj/   (props changed)
    lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
    lucene/dev/branches/branch_4x/solr/test-framework/   (props changed)
    lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java
    lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestHarness.java
    lucene/dev/branches/branch_4x/solr/webapp/   (props changed)
    lucene/dev/branches/branch_4x/solr/webapp/web/WEB-INF/web.xml

Modified: lucene/dev/branches/branch_4x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/CHANGES.txt?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/solr/CHANGES.txt Sat Apr  5 04:32:30 2014
@@ -114,6 +114,9 @@ New Features
 * SOLR-5829: Allow ExpandComponent to accept query and filter query parameters
   (Joel Bernstein)
 
+* SOLR-5653: Create a RestManager to provide REST API endpoints for
+  reconfigurable plugins. (Tim Potter, Steve Rowe)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrConfig.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrConfig.java Sat Apr  5 04:32:30 2014
@@ -27,6 +27,7 @@ import org.apache.solr.handler.component
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.QueryResponseWriter;
 import org.apache.solr.response.transform.TransformerFactory;
+import org.apache.solr.rest.RestManager;
 import org.apache.solr.schema.IndexSchemaFactory;
 import org.apache.solr.search.CacheConfig;
 import org.apache.solr.search.FastLRUCache;
@@ -147,7 +148,7 @@ public class SolrConfig extends Config {
       throw new SolrException(ErrorCode.SERVER_ERROR, "Error loading solr config from " + resource, e);
     }
   }
-  
+
    /** Creates a configuration instance from a resource loader, a configuration name and a stream.
    * If the stream is null, the resource loader will open the configuration stream.
    * If the stream is not null, no attempt to load the resource will occur (the name is not used).
@@ -287,7 +288,7 @@ public class SolrConfig extends Config {
      loadPluginInfo(UpdateLog.class,"updateHandler/updateLog");
      loadPluginInfo(IndexSchemaFactory.class,"schemaFactory",
                     REQUIRE_CLASS);
-
+     loadPluginInfo(RestManager.class, "restManager");
      updateHandlerInfo = loadUpdatehandlerInfo();
      
      multipartUploadLimitKB = getInt( 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrCore.java Sat Apr  5 04:32:30 2014
@@ -64,6 +64,9 @@ import org.apache.solr.response.SchemaXm
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.response.XMLResponseWriter;
 import org.apache.solr.response.transform.TransformerFactory;
+import org.apache.solr.rest.ManagedResourceStorage;
+import org.apache.solr.rest.RestManager;
+import org.apache.solr.rest.ManagedResourceStorage.StorageIO;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.IndexSchemaFactory;
@@ -174,6 +177,12 @@ public final class SolrCore implements S
 
   public long getStartTime() { return startTime; }
 
+  private RestManager restManager;
+  
+  public RestManager getRestManager() {
+    return restManager;
+  }
+  
   static int boolean_query_max_clause_count = Integer.MIN_VALUE;
   // only change the BooleanQuery maxClauseCount once for ALL cores...
   void booleanQueryMaxClauseCount()  {
@@ -187,7 +196,6 @@ public final class SolrCore implements S
     }
   }
 
-  
   /**
    * The SolrResourceLoader used to load all resources for this core.
    * @since solr 1.3
@@ -833,6 +841,9 @@ public final class SolrCore implements S
         if (iwRef != null) iwRef.decref();
       }
       
+      // Initialize the RestManager
+      restManager = initRestManager();
+            
       // Finally tell anyone who wants to know
       resourceLoader.inform(resourceLoader);
       resourceLoader.inform(this); // last call before the latch is released.
@@ -2294,6 +2305,43 @@ public final class SolrCore implements S
           "update your config to use <string name='facet.sort'>.");
     }
   } 
+  
+  /**
+   * Creates and initializes a RestManager based on configuration args in solrconfig.xml.
+   * RestManager provides basic storage support for managed resource data, such as to
+   * persist stopwords to ZooKeeper if running in SolrCloud mode.
+   */
+  @SuppressWarnings("unchecked")
+  protected RestManager initRestManager() throws SolrException {
+    
+    PluginInfo restManagerPluginInfo = 
+        getSolrConfig().getPluginInfo(RestManager.class.getName());
+        
+    NamedList<String> initArgs = null;
+    RestManager mgr = null;
+    if (restManagerPluginInfo != null) {
+      if (restManagerPluginInfo.className != null) {
+        mgr = resourceLoader.newInstance(restManagerPluginInfo.className, RestManager.class);
+      }
+      
+      if (restManagerPluginInfo.initArgs != null) {
+        initArgs = (NamedList<String>)restManagerPluginInfo.initArgs;        
+      }
+    }
+    
+    if (mgr == null) 
+      mgr = new RestManager();
+    
+    if (initArgs == null)
+      initArgs = new NamedList<>();
+                                
+    String collection = coreDescriptor.getCollectionName();
+    StorageIO storageIO = 
+        ManagedResourceStorage.newStorageIO(collection, resourceLoader, initArgs);    
+    mgr.init(resourceLoader, initArgs, storageIO);
+    
+    return mgr;
+  }
 
   public CoreDescriptor getCoreDescriptor() {
     return coreDescriptor;

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java Sat Apr  5 04:32:30 2014
@@ -33,6 +33,7 @@ import org.apache.solr.handler.component
 import org.apache.solr.handler.component.ShardHandlerFactory;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.QueryResponseWriter;
+import org.apache.solr.rest.RestManager;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.ManagedIndexSchemaFactory;
 import org.apache.solr.schema.SimilarityFactory;
@@ -81,7 +82,11 @@ public class SolrResourceLoader implemen
 
   static final String project = "solr";
   static final String base = "org.apache" + "." + project;
-  static final String[] packages = {"","analysis.","schema.","handler.","search.","update.","core.","response.","request.","update.processor.","util.", "spelling.", "handler.component.", "handler.dataimport.", "spelling.suggest.", "spelling.suggest.fst." };
+  static final String[] packages = {
+      "", "analysis.", "schema.", "handler.", "search.", "update.", "core.", "response.", "request.",
+      "update.processor.", "util.", "spelling.", "handler.component.", "handler.dataimport.",
+      "spelling.suggest.", "spelling.suggest.fst.", "rest.schema.analysis."
+  };
 
   protected URLClassLoader classLoader;
   private final String instanceDir;
@@ -96,7 +101,20 @@ public class SolrResourceLoader implemen
   private final Properties coreProperties;
 
   private volatile boolean live;
-
+  
+  // Provide a registry so that managed resources can register themselves while the XML configuration
+  // documents are being parsed ... after all are registered, they are asked by the RestManager to
+  // initialize themselves. This two-step process is required because not all resources are available
+  // (such as the SolrZkClient) when XML docs are being parsed.    
+  private RestManager.Registry managedResourceRegistry;
+  
+  public synchronized RestManager.Registry getManagedResourceRegistry() {
+    if (managedResourceRegistry == null) {
+      managedResourceRegistry = new RestManager.Registry();      
+    }
+    return managedResourceRegistry; 
+  }
+  
   /**
    * <p>
    * This loader will delegate to the context classloader when possible,

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldResource.java Sat Apr  5 04:32:30 2014
@@ -18,6 +18,7 @@ package org.apache.solr.rest.schema;
 
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.restlet.resource.ResourceException;
@@ -28,7 +29,7 @@ import java.util.LinkedHashSet;
 /**
  * Base class for Schema Field and DynamicField requests.
  */
-abstract class BaseFieldResource extends BaseSchemaResource {
+abstract class BaseFieldResource extends BaseSolrResource {
   protected static final String INCLUDE_DYNAMIC_PARAM = "includeDynamic";
   private static final String DYNAMIC_BASE = "dynamicBase";
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldTypeResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldTypeResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldTypeResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/BaseFieldTypeResource.java Sat Apr  5 04:32:30 2014
@@ -18,6 +18,7 @@ package org.apache.solr.rest.schema;
  */
 
 import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.resource.ResourceException;
@@ -27,7 +28,7 @@ import java.util.List;
 /**
  * Base class for the FieldType resource classes.
  */
-abstract class BaseFieldTypeResource extends BaseSchemaResource {
+abstract class BaseFieldTypeResource extends BaseSolrResource {
   private boolean showDefaults;
 
   protected BaseFieldTypeResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/DefaultSearchFieldResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/DefaultSearchFieldResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/DefaultSearchFieldResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/DefaultSearchFieldResource.java Sat Apr  5 04:32:30 2014
@@ -18,6 +18,7 @@ package org.apache.solr.rest.schema;
 
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
@@ -29,7 +30,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema/defaultsearchfield
  */
-public class DefaultSearchFieldResource extends BaseSchemaResource implements GETable {
+public class DefaultSearchFieldResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(DefaultSearchFieldResource.class);
 
   public DefaultSearchFieldResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaNameResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaNameResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaNameResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaNameResource.java Sat Apr  5 04:32:30 2014
@@ -17,6 +17,7 @@ package org.apache.solr.rest.schema;
  */
 
 import org.apache.solr.common.SolrException;
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
@@ -28,7 +29,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema/name
  */
-public class SchemaNameResource extends BaseSchemaResource implements GETable {
+public class SchemaNameResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(SchemaNameResource.class);
    
   public SchemaNameResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaResource.java Sat Apr  5 04:32:30 2014
@@ -16,6 +16,7 @@ package org.apache.solr.rest.schema;
  * limitations under the License.
  */
 
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
@@ -26,7 +27,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema
  */
-public class SchemaResource extends BaseSchemaResource implements GETable {
+public class SchemaResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(SchemaResource.class);
 
   public SchemaResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaSimilarityResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaSimilarityResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaSimilarityResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaSimilarityResource.java Sat Apr  5 04:32:30 2014
@@ -16,8 +16,8 @@ package org.apache.solr.rest.schema;
  * limitations under the License.
  */
 
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
-import org.apache.solr.rest.SolrRestApi;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
 import org.restlet.resource.ResourceException;
@@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema/similarity
  */
-public class SchemaSimilarityResource extends BaseSchemaResource implements GETable {
+public class SchemaSimilarityResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(SchemaSimilarityResource.class);
 
   public SchemaSimilarityResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaVersionResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaVersionResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaVersionResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SchemaVersionResource.java Sat Apr  5 04:32:30 2014
@@ -16,8 +16,8 @@ package org.apache.solr.rest.schema;
  * limitations under the License.
  */
 
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
-import org.apache.solr.rest.SolrRestApi;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
 import org.restlet.resource.ResourceException;
@@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema/version
  */
-public class SchemaVersionResource extends BaseSchemaResource implements GETable {
+public class SchemaVersionResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(SchemaVersionResource.class);
 
   public SchemaVersionResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserDefaultOperatorResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserDefaultOperatorResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserDefaultOperatorResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserDefaultOperatorResource.java Sat Apr  5 04:32:30 2014
@@ -16,6 +16,7 @@ package org.apache.solr.rest.schema;
  * limitations under the License.
  */
 
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
@@ -27,7 +28,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema/solrqueryparser/defaultoperator
  */
-public class SolrQueryParserDefaultOperatorResource extends BaseSchemaResource implements GETable {
+public class SolrQueryParserDefaultOperatorResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(SolrQueryParserDefaultOperatorResource.class);
 
   public SolrQueryParserDefaultOperatorResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/SolrQueryParserResource.java Sat Apr  5 04:32:30 2014
@@ -17,6 +17,7 @@ package org.apache.solr.rest.schema;
  */
 
 import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
@@ -28,7 +29,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema/solrqueryparser
  */
-public class SolrQueryParserResource extends BaseSchemaResource implements GETable {
+public class SolrQueryParserResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(SolrQueryParserResource.class);
 
   public SolrQueryParserResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/UniqueKeyFieldResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/UniqueKeyFieldResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/UniqueKeyFieldResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/rest/schema/UniqueKeyFieldResource.java Sat Apr  5 04:32:30 2014
@@ -16,6 +16,7 @@ package org.apache.solr.rest.schema;
  * limitations under the License.
  */
 
+import org.apache.solr.rest.BaseSolrResource;
 import org.apache.solr.rest.GETable;
 import org.apache.solr.schema.IndexSchema;
 import org.restlet.representation.Representation;
@@ -27,7 +28,7 @@ import org.slf4j.LoggerFactory;
 /**
  * This class responds to requests at /solr/(corename)/schema/uniquekey
  */
-public class UniqueKeyFieldResource extends BaseSchemaResource implements GETable {
+public class UniqueKeyFieldResource extends BaseSolrResource implements GETable {
   private static final Logger log = LoggerFactory.getLogger(UniqueKeyFieldResource.class);
   
   public UniqueKeyFieldResource() {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java Sat Apr  5 04:32:30 2014
@@ -20,6 +20,7 @@ package org.apache.solr.servlet;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
 import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpHead;
@@ -353,8 +354,9 @@ public class SolrDispatchFilter extends 
           // get or create/cache the parser for the core
           SolrRequestParsers parser = config.getRequestParsers();
 
-          // Handle /schema/* paths via Restlet
-          if( path.startsWith("/schema") ) {
+          // Handle /schema/* and /config/* paths via Restlet
+          if( path.equals("/schema") || path.startsWith("/schema/")
+              || path.equals("/config") || path.startsWith("/config/")) {
             solrReq = parser.parse(core, path, req);
             SolrRequestInfo.setRequestInfo(new SolrRequestInfo(solrReq, new SolrQueryResponse()));
             if( path.equals(req.getServletPath()) ) {
@@ -525,6 +527,9 @@ public class SolrDispatchFilter extends 
         entityRequest.setEntity(entity);
         method = entityRequest;
       }
+      else if ("DELETE".equals(req.getMethod())) {
+        method = new HttpDelete(urlstr);
+      }
       else {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
           "Unexpected method type: " + req.getMethod());

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=1584959&r1=1584958&r2=1584959&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 Sat Apr  5 04:32:30 2014
@@ -666,7 +666,9 @@ public class SolrRequestParsers 
     {
       String method = req.getMethod().toUpperCase(Locale.ROOT);
       if ("GET".equals(method) || "HEAD".equals(method) 
-          || ("PUT".equals(method) && req.getRequestURI().contains("/schema"))) {
+          || (("PUT".equals(method) || "DELETE".equals(method))
+              && (req.getRequestURI().contains("/schema")
+                  || req.getRequestURI().contains("/config")))) {
         return parseQueryString(req.getQueryString());
       }
       if ("POST".equals( method ) ) {

Modified: lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/solrconfig.xml Sat Apr  5 04:32:30 2014
@@ -570,5 +570,13 @@
     <processor class="solr.RunUpdateProcessorFactory" />
   </updateRequestProcessorChain>  
 
+  <restManager>
+    <!-- 
+    IMPORTANT: Due to the Lucene SecurityManager, tests can only write to their runtime directory or below.
+    But its easier to just keep everything in memory for testing so no remnants are left behind.
+    -->
+    <str name="storageIO">org.apache.solr.rest.ManagedResourceStorage$InMemoryStorageIO</str>
+  </restManager>
+
 </config>
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/SolrRestletTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/SolrRestletTestBase.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/SolrRestletTestBase.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/SolrRestletTestBase.java Sat Apr  5 04:32:30 2014
@@ -24,13 +24,26 @@ import org.restlet.ext.servlet.ServerSer
 import java.util.SortedMap;
 import java.util.TreeMap;
 
+/**
+ * Base class for Solr Restlet-based tests. Creates test harness,
+ * including "extra" servlets for all Solr Restlet Application subclasses.
+ */
 abstract public class SolrRestletTestBase extends RestTestBase {
+
+  /**
+   * Creates test harness, including "extra" servlets for all
+   * Solr Restlet Application subclasses.
+   */
   @BeforeClass
   public static void init() throws Exception {
     final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
-    final ServletHolder solrRestApi = new ServletHolder("SolrRestApi", ServerServlet.class);
-    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrRestApi");
-    extraServlets.put(solrRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
+    final ServletHolder solrSchemaRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
+    solrSchemaRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
+    extraServlets.put(solrSchemaRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
+
+    final ServletHolder solrConfigRestApi = new ServletHolder("SolrConfigRestApi", ServerServlet.class);
+    solrConfigRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrConfigRestApi");
+    extraServlets.put(solrConfigRestApi, "/config/*");
 
     createJettyAndHarness(TEST_HOME(), "solrconfig.xml", "schema-rest.xml", "/solr", true, extraServlets);
   }

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java Sat Apr  5 04:32:30 2014
@@ -31,8 +31,8 @@ public class TestClassNameShortening ext
   @BeforeClass
   public static void init() throws Exception {
     final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
-    final ServletHolder solrRestApi = new ServletHolder("SolrRestApi", ServerServlet.class);
-    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrRestApi");
+    final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
+    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
     extraServlets.put(solrRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
 
     createJettyAndHarness(TEST_HOME(), "solrconfig-minimal.xml", "schema-class-name-shortening-on-serialization.xml", 

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java Sat Apr  5 04:32:30 2014
@@ -46,8 +46,8 @@ public class TestManagedSchemaFieldResou
     FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
     
     final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
-    final ServletHolder solrRestApi = new ServletHolder("SolrRestApi", ServerServlet.class);
-    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrRestApi");
+    final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
+    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
     extraServlets.put(solrRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
 
     System.setProperty("managed.schema.mutable", "true");

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSerializedLuceneMatchVersion.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSerializedLuceneMatchVersion.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSerializedLuceneMatchVersion.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSerializedLuceneMatchVersion.java Sat Apr  5 04:32:30 2014
@@ -31,8 +31,8 @@ public class TestSerializedLuceneMatchVe
   @BeforeClass
   public static void init() throws Exception {
     final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
-    final ServletHolder solrRestApi = new ServletHolder("SolrRestApi", ServerServlet.class);
-    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrRestApi");
+    final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
+    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
     extraServlets.put(solrRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
 
     createJettyAndHarness(TEST_HOME(), "solrconfig-minimal.xml", "schema-rest-lucene-match-version.xml",

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaAddField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaAddField.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaAddField.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaAddField.java Sat Apr  5 04:32:30 2014
@@ -58,8 +58,8 @@ public class TestCloudManagedSchemaAddFi
   @Override
   public SortedMap<ServletHolder,String> getExtraServlets() {
     final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
-    final ServletHolder solrRestApi = new ServletHolder("SolrRestApi", ServerServlet.class);
-    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrRestApi");
+    final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
+    solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
     extraServlets.put(solrRestApi, "/schema/*");  // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
     return extraServlets;
   }

Modified: lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java (original)
+++ lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java Sat Apr  5 04:32:30 2014
@@ -81,6 +81,31 @@ public class NamedList<T> implements Clo
   }
 
   /**
+   * Creates a NamedList instance containing the "name,value" pairs contained in the
+   * Map.
+   *
+   * <p>
+   * Modifying the contents of the Map after calling this constructor may change
+   * the NamedList (in future versions of Solr), but this is not guaranteed and should
+   * not be relied upon.  To modify the NamedList, refer to {@link #add(String, Object)}
+   * or {@link #remove(String)}.
+   * </p>
+   *
+   * @param nameValueMap the name value pairs
+   */
+  public NamedList(Map<String,? extends T> nameValueMap) {
+    if (null == nameValueMap) {
+      nvPairs = new ArrayList<>();
+    } else {
+      nvPairs = new ArrayList<>(nameValueMap.size());
+      for (Map.Entry<String,? extends T> ent : nameValueMap.entrySet()) {
+        nvPairs.add(ent.getKey());
+        nvPairs.add(ent.getValue());
+      }
+    }
+  }
+
+  /**
    * Creates an instance backed by an explicitly specified list of
    * pairwise names/values.
    *
@@ -528,6 +553,30 @@ public class NamedList<T> implements Clo
    *           not a Boolean or a String.
    */
   public Boolean removeBooleanArg(final String name) {
+    Boolean bool = getBooleanArg(name);
+    if (null != bool) {
+      remove(name);
+    }
+    return bool;
+  }
+
+  /**
+   * Used for getting a boolean argument from a NamedList object.  If the name
+   * is not present, returns null.  If there is more than one value with that
+   * name, or if the value found is not a Boolean or a String, throws an
+   * exception.  If there is only one value present and it is a Boolean or a
+   * String, the value is returned as a Boolean.  The NamedList is not
+   * modified. See {@link #remove(String)}, {@link #removeAll(String)}
+   * and {@link #removeConfigArgs(String)} for additional ways of gathering
+   * configuration information from a NamedList.
+   *
+   * @param name The key to look up in the NamedList.
+   * @return The boolean value found.
+   * @throws SolrException
+   *           If multiple values are found for the name or the value found is
+   *           not a Boolean or a String.
+   */
+  public Boolean getBooleanArg(final String name) {
     Boolean bool;
     List<T> values = getAll(name);
     if (0 == values.size()) {
@@ -544,12 +593,11 @@ public class NamedList<T> implements Clo
       bool = Boolean.parseBoolean(o.toString());
     } else {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-          "'" + name + "' must have type 'bool' or 'str'; found " + o.getClass());
+          "'" + name + "' must have type Boolean or CharSequence; found " + o.getClass());
     }
-    remove(name);
     return bool;
   }
-  
+
   /**
    * Used for getting one or many arguments from NamedList objects that hold
    * configuration parameters. Finds all entries in the NamedList that match

Modified: lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java (original)
+++ lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java Sat Apr  5 04:32:30 2014
@@ -422,8 +422,73 @@ abstract public class RestTestBase exten
       }
     }
   }
+  
+  /**
+   * Deletes a resource and then matches some JSON test expressions against the 
+   * response using the default double delta tolerance.
+   * @see org.apache.solr.JSONTestUtil#DEFAULT_DELTA
+   * @see #assertJDelete(String,double,String...)
+   */
+  public static void assertJDelete(String request, String... tests) throws Exception {
+    assertJDelete(request, JSONTestUtil.DEFAULT_DELTA, tests);
+  }
+
+  /**
+   * Deletes a resource and then matches some JSON test expressions against the 
+   * response using the specified double delta tolerance.
+   */
+  public static void assertJDelete(String request, double delta, String... tests) throws Exception {
+    int queryStartPos = request.indexOf('?');
+    String query;
+    String path;
+    if (-1 == queryStartPos) {
+      query = "";
+      path = request;
+    } else {
+      query = request.substring(queryStartPos + 1);
+      path = request.substring(0, queryStartPos);
+    }
+    query = setParam(query, "wt", "json");
+    request = path + '?' + setParam(query, "indent", "on");
+
+    String response;
+    boolean failed = true;
+    try {
+      response = restTestHarness.delete(request);
+      failed = false;
+    } finally {
+      if (failed) {
+        log.error("REQUEST FAILED: " + request);
+      }
+    }
 
+    for (String test : tests) {
+      if (null == test || 0 == test.length()) continue;
+      String testJSON = json(test);
 
+      try {
+        failed = true;
+        String err = JSONTestUtil.match(response, testJSON, delta);
+        failed = false;
+        if (err != null) {
+          log.error("query failed JSON validation. error=" + err +
+              "\n expected =" + testJSON +
+              "\n response = " + response +
+              "\n request = " + request + "\n"
+          );
+          throw new RuntimeException(err);
+        }
+      } finally {
+        if (failed) {
+          log.error("JSON query validation threw an exception." +
+              "\n expected =" + testJSON +
+              "\n response = " + response +
+              "\n request = " + request + "\n"
+          );
+        }
+      }
+    }
+  }
 
   /**
    * Insures that the given param is included in the query with the given value.

Modified: lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestHarness.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestHarness.java?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestHarness.java (original)
+++ lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/util/RestTestHarness.java Sat Apr  5 04:32:30 2014
@@ -24,6 +24,7 @@ import javax.xml.xpath.XPathExpressionEx
 
 import org.apache.http.HttpEntity;
 import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.client.methods.HttpPut;
@@ -111,6 +112,18 @@ public class RestTestHarness extends Bas
   }
 
   /**
+   * Processes a DELETE request using a URL path (with no context path) + optional query params,
+   * e.g. "/schema/analysis/protwords/english", and returns the response content.
+   *
+   * @param request the URL path and optional query params
+   * @return The response to the DELETE request
+   */
+  public String delete(String request) throws IOException {
+    HttpDelete httpDelete = new HttpDelete(getBaseURL() + request);
+    return getResponse(httpDelete);
+  }
+
+  /**
    * Processes a POST request using a URL path (with no context path) + optional query params,
    * e.g. "/schema/fields/newfield", PUTs the given content, and returns the response content.
    *
@@ -161,7 +174,10 @@ public class RestTestHarness extends Bas
       throw new RuntimeException(e);
     }
   }
-  
+
+  /**
+   * Executes the given request and returns the response.
+   */
   private String getResponse(HttpUriRequest request) throws IOException {
     HttpEntity entity = null;
     try {

Modified: lucene/dev/branches/branch_4x/solr/webapp/web/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/webapp/web/WEB-INF/web.xml?rev=1584959&r1=1584958&r2=1584959&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/webapp/web/WEB-INF/web.xml (original)
+++ lucene/dev/branches/branch_4x/solr/webapp/web/WEB-INF/web.xml Sat Apr  5 04:32:30 2014
@@ -131,7 +131,16 @@
     <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
     <init-param>
       <param-name>org.restlet.application</param-name>
-      <param-value>org.apache.solr.rest.SolrRestApi</param-value>
+      <param-value>org.apache.solr.rest.SolrSchemaRestApi</param-value>
+    </init-param>
+  </servlet>
+
+  <servlet>
+    <servlet-name>SolrConfigRestApi</servlet-name>
+    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
+    <init-param>
+      <param-name>org.restlet.application</param-name>
+      <param-value>org.apache.solr.rest.SolrConfigRestApi</param-value>
     </init-param>
   </servlet>
   
@@ -168,6 +177,11 @@
     <url-pattern>/schema/*</url-pattern>
   </servlet-mapping>
   
+  <servlet-mapping>
+    <servlet-name>SolrConfigRestApi</servlet-name>
+    <url-pattern>/config/*</url-pattern>
+  </servlet-mapping>
+  
   <mime-mapping>
     <extension>.xsl</extension>
     <!-- per http://www.w3.org/TR/2006/PR-xslt20-20061121/ -->