Author: tommaso
Date: Wed Feb 18 17:12:00 2015
New Revision: 1660682

URL: http://svn.apache.org/r1660682
Log:
OAK-2526 - adding capabilities to use persisted solr config, SolrServers get 
cached by SolrServerProviders

Added:
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerProvider.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/DefaultSolrServerProvider.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/RemoteSolrServerProvider.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerProvider.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/util/SolrIndexInitializer.java
    
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java
    
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/SolrBaseTest.java
    
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java
    
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/DefaultAnalyzersConfigurationTest.java
    
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorTest.java

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java
 Wed Feb 18 17:12:00 2015
@@ -83,7 +83,22 @@ public class EmbeddedSolrServerConfigura
         public Integer getHttpPort() {
             return httpPort;
         }
-    }
 
+        @Override
+        public String toString() {
+            return "HttpConfiguration{" +
+                    "context='" + context + '\'' +
+                    ", httpPort=" + httpPort +
+                    '}';
+        }
+    }
 
+    @Override
+    public String toString() {
+        return "EmbeddedSolrServerConfiguration{" +
+                "solrHomePath='" + solrHomePath + '\'' +
+                ", coreName='" + coreName + '\'' +
+                ", httpConfiguration=" + httpConfiguration +
+                '}';
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java
 Wed Feb 18 17:12:00 2015
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.configuration;
 
+import java.util.Arrays;
+
 import 
org.apache.jackrabbit.oak.plugins.index.solr.server.RemoteSolrServerProvider;
 
 /**
@@ -63,4 +65,16 @@ public class RemoteSolrServerConfigurati
     public String getSolrConfDir() {
         return solrConfDir;
     }
+
+    @Override
+    public String toString() {
+        return "RemoteSolrServerConfiguration{" +
+                "solrConfDir='" + solrConfDir + '\'' +
+                ", solrHttpUrls=" + Arrays.toString(solrHttpUrls) +
+                ", solrZkHost='" + solrZkHost + '\'' +
+                ", solrCollection='" + solrCollection + '\'' +
+                ", solrShardsNo=" + solrShardsNo +
+                ", solrReplicationFactor=" + solrReplicationFactor +
+                '}';
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerProvider.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerProvider.java
 Wed Feb 18 17:12:00 2015
@@ -145,6 +145,23 @@ public class NodeStateSolrServerProvider
     }
 
     @Override
+    public void close() throws IOException {
+        try {
+            getSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getIndexingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getSearchingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        }
+    }
+
+    @Override
     public String toString() {
         return "NodeStateSolrServerProvider{" +
                 "nodeStateChildren=" + 
Iterables.toString(nodeState.getChildNodeNames()) +

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
 Wed Feb 18 17:12:00 2015
@@ -21,7 +21,10 @@ import javax.annotation.Nonnull;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServerProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.OakSolrNodeStateConfiguration;
 import org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndex;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
@@ -45,8 +48,8 @@ public class SolrIndexEditorProvider imp
     private final OakSolrConfigurationProvider oakSolrConfigurationProvider;
 
     public SolrIndexEditorProvider(
-            SolrServerProvider solrServerProvider,
-            OakSolrConfigurationProvider oakSolrConfigurationProvider) {
+            @Nonnull SolrServerProvider solrServerProvider,
+            @Nonnull OakSolrConfigurationProvider 
oakSolrConfigurationProvider) {
         this.solrServerProvider = solrServerProvider;
         this.oakSolrConfigurationProvider = oakSolrConfigurationProvider;
     }
@@ -55,31 +58,46 @@ public class SolrIndexEditorProvider imp
     public Editor getIndexEditor(
             @Nonnull String type, @Nonnull NodeBuilder definition, @Nonnull 
NodeState root, @Nonnull IndexUpdateCallback callback)
             throws CommitFailedException {
+        SolrIndexEditor editor = null;
+        if (SolrQueryIndex.TYPE.equals(type)) {
+            // if index definition contains a persisted configuration, use that
+            if (isPersistedConfiguration(definition)) {
+                NodeState nodeState = definition.getNodeState();
+                OakSolrConfiguration configuration = new 
OakSolrNodeStateConfiguration(nodeState);
+                SolrServerProvider serverProvider = new 
NodeStateSolrServerProvider(nodeState.getChildNode("server"));
+                editor = getEditor(configuration, serverProvider, callback, 
definition);
+            } else { // otherwise use the default configuration providers 
(e.g. defined via code or OSGi)
+                OakSolrConfiguration configuration = 
oakSolrConfigurationProvider.getConfiguration();
+                editor = getEditor(configuration, solrServerProvider, 
callback, definition);
+            }
+        }
+        return editor;
+    }
+
+    private boolean isPersistedConfiguration(NodeBuilder definition) {
+        return definition.hasChildNode("server");
+    }
 
-        if (SolrQueryIndex.TYPE.equals(type)
-                && isConfigurationOk()) {
-            try {
-              SolrServer solrServer = 
solrServerProvider.getIndexingSolrServer();
-              if (solrServer != null) {
-                  return new SolrIndexEditor(
+    private SolrIndexEditor getEditor(OakSolrConfiguration configuration, 
SolrServerProvider solrServerProvider,
+                                      IndexUpdateCallback callback, 
NodeBuilder definition) {
+        SolrIndexEditor editor = null;
+        try {
+            SolrServer solrServer = solrServerProvider.getIndexingSolrServer();
+            if (solrServer != null) {
+                editor = new SolrIndexEditor(
                         solrServer,
-                        oakSolrConfigurationProvider.getConfiguration(), 
callback);
-              } else {
-                  if (log.isWarnEnabled()) {
-                      log.warn("null SolrServer provided, cannot index {}", 
definition);
-                  }
-              }
-            } catch (Exception e) {
-                if (log.isErrorEnabled()) {
-                    log.error("unable to create SolrIndexEditor", e);
+                        configuration, callback);
+            } else {
+                if (log.isWarnEnabled()) {
+                    log.warn("null SolrServer provided, cannot index {}", 
definition);
                 }
             }
+        } catch (Exception e) {
+            if (log.isErrorEnabled()) {
+                log.error("unable to create SolrIndexEditor", e);
+            }
         }
-        return null;
-    }
-
-    private boolean isConfigurationOk() {
-        return solrServerProvider != null && oakSolrConfigurationProvider != 
null;
+        return editor;
     }
 
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrQueryIndexProviderService.java
 Wed Feb 18 17:12:00 2015
@@ -16,27 +16,27 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.osgi;
 
-import java.util.ArrayList;
 import java.util.List;
-import javax.annotation.Nonnull;
 
+import com.google.common.collect.Lists;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.ReferencePolicyOption;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.commons.PropertiesUtil;
 import 
org.apache.jackrabbit.oak.plugins.index.aggregate.AggregateIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrIndexTracker;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
-import org.apache.jackrabbit.oak.spi.query.QueryIndex;
+import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,13 +48,14 @@ import org.slf4j.LoggerFactory;
  * @see QueryIndexProvider
  */
 @Component(metatype = true, immediate = true, label = "Oak Solr Query index 
provider configuration")
-@Service(value = QueryIndexProvider.class)
-public class SolrQueryIndexProviderService implements QueryIndexProvider {
+public class SolrQueryIndexProviderService {
 
     private static final boolean QUERY_TIME_AGGREGATION_DEFAULT = false;
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    private final List<ServiceRegistration> regs = Lists.newArrayList();
+
     @Reference
     private SolrServerProvider solrServerProvider;
 
@@ -71,25 +72,28 @@ public class SolrQueryIndexProviderServi
             description = "enable query time aggregation for Solr index")
     private static final String QUERY_TIME_AGGREGATION = "query.aggregation";
 
-    private boolean queryTimeAggregation;
-
     @Activate
     protected void activate(ComponentContext componentContext) {
         Object value = 
componentContext.getProperties().get(QUERY_TIME_AGGREGATION);
-        queryTimeAggregation = PropertiesUtil.toBoolean(value, 
QUERY_TIME_AGGREGATION_DEFAULT);
-    }
-
-    @Override
-    @Nonnull
-    public List<? extends QueryIndex> getQueryIndexes(NodeState nodeState) {
+        boolean queryTimeAggregation = PropertiesUtil.toBoolean(value, 
QUERY_TIME_AGGREGATION_DEFAULT);
         if (solrServerProvider != null && oakSolrConfigurationProvider != 
null) {
-            SolrQueryIndexProvider solrQueryIndexProvider = new 
SolrQueryIndexProvider(solrServerProvider,
+            QueryIndexProvider solrQueryIndexProvider = new 
SolrQueryIndexProvider(solrServerProvider,
                     oakSolrConfigurationProvider, nodeAggregator);
             log.debug("creating Solr query index provider {} query time 
aggregation", queryTimeAggregation ? "with" : "without");
-            return queryTimeAggregation ? 
AggregateIndexProvider.wrap(solrQueryIndexProvider).getQueryIndexes(nodeState) :
-                    solrQueryIndexProvider.getQueryIndexes(nodeState);
-        } else {
-            return new ArrayList<QueryIndex>();
+            if (queryTimeAggregation) {
+                solrQueryIndexProvider = 
AggregateIndexProvider.wrap(solrQueryIndexProvider);
+            }
+
+            
regs.add(componentContext.getBundleContext().registerService(QueryIndexProvider.class.getName(),
 solrQueryIndexProvider, null));
+            
regs.add(componentContext.getBundleContext().registerService(Observer.class.getName(),
 solrQueryIndexProvider, null));
+        }
+    }
+
+    @Deactivate
+    protected void deactivate() {
+
+        for (ServiceRegistration registration : regs) {
+            registration.unregister();
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java
 Wed Feb 18 17:12:00 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.osgi;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import javax.annotation.CheckForNull;
@@ -87,10 +88,11 @@ public class SolrServerProviderService i
     @Deactivate
     protected void deactivate() throws Exception {
         solrServerConfigurationProviders.clear();
-        shutdownSolrServers();
+        close();
     }
 
-    private void shutdownSolrServers() {
+    @Override
+    public void close() throws IOException {
         if (cachedSolrServer != null) {
             try {
                 cachedSolrServer.shutdown();
@@ -124,7 +126,11 @@ public class SolrServerProviderService i
         synchronized (solrServerConfigurationProviders) {
             String name = String.valueOf(properties.get("name"));
             solrServerConfigurationProviders.put(name, 
solrServerConfigurationProvider);
-            shutdownSolrServers();
+            try {
+                close();
+            } catch (IOException e) {
+                // do nothing
+            }
         }
     }
 
@@ -132,7 +138,11 @@ public class SolrServerProviderService i
         synchronized (solrServerConfigurationProviders) {
             String name = String.valueOf(properties.get("name"));
             solrServerConfigurationProviders.remove(name);
-            shutdownSolrServers();
+            try {
+                close();
+            } catch (IOException e) {
+                // do nothing
+            }
         }
     }
 
@@ -140,7 +150,11 @@ public class SolrServerProviderService i
         synchronized (solrServerConfigurationProviders) {
             String name = String.valueOf(properties.get("name"));
             solrServerConfigurationProviders.put(name, 
solrServerConfigurationProvider);
-            shutdownSolrServers();
+            try {
+                close();
+            } catch (IOException e) {
+                // do nothing
+            }
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndexProvider.java
 Wed Feb 18 17:12:00 2015
@@ -19,11 +19,18 @@ package org.apache.jackrabbit.oak.plugin
 import java.util.ArrayList;
 import java.util.List;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServerProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.OakSolrNodeStateConfiguration;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
@@ -38,9 +45,9 @@ import static org.apache.jackrabbit.oak.
 /**
  * {@link QueryIndexProvider} for {@link SolrQueryIndex}
  */
-public class SolrQueryIndexProvider implements QueryIndexProvider {
+public class SolrQueryIndexProvider implements QueryIndexProvider, Observer {
 
-    private final Logger log = 
LoggerFactory.getLogger(SolrQueryIndexProvider.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     private final SolrServerProvider solrServerProvider;
 
@@ -48,14 +55,14 @@ public class SolrQueryIndexProvider impl
 
     private final NodeAggregator aggregator;
 
-    public SolrQueryIndexProvider(SolrServerProvider solrServerProvider, 
OakSolrConfigurationProvider oakSolrConfigurationProvider,
-                                  NodeAggregator nodeAggregator) {
+    public SolrQueryIndexProvider(@Nonnull SolrServerProvider 
solrServerProvider, @Nonnull OakSolrConfigurationProvider 
oakSolrConfigurationProvider,
+                                  @Nullable NodeAggregator nodeAggregator) {
         this.oakSolrConfigurationProvider = oakSolrConfigurationProvider;
         this.solrServerProvider = solrServerProvider;
         this.aggregator = nodeAggregator;
     }
 
-    public SolrQueryIndexProvider(SolrServerProvider solrServerProvider, 
OakSolrConfigurationProvider oakSolrConfigurationProvider) {
+    public SolrQueryIndexProvider(@Nonnull SolrServerProvider 
solrServerProvider, @Nonnull OakSolrConfigurationProvider 
oakSolrConfigurationProvider) {
         this(solrServerProvider, oakSolrConfigurationProvider, null);
     }
 
@@ -64,39 +71,60 @@ public class SolrQueryIndexProvider impl
     public List<? extends QueryIndex> getQueryIndexes(NodeState nodeState) {
 
         List<QueryIndex> tempIndexes = new ArrayList<QueryIndex>();
-        if (solrServerProvider == null || oakSolrConfigurationProvider == 
null) {
-            return tempIndexes;
-        }
         NodeState definitions = nodeState.getChildNode(INDEX_DEFINITIONS_NAME);
         for (ChildNodeEntry entry : definitions.getChildNodeEntries()) {
             NodeState definition = entry.getNodeState();
+            String name = entry.getName();
             PropertyState type = definition.getProperty(TYPE_PROPERTY_NAME);
-            if (type != null
-                    && SolrQueryIndex.TYPE.equals(type.getValue(Type.STRING))) 
{
+            if (type != null && 
SolrQueryIndex.TYPE.equals(type.getValue(Type.STRING))) {
                 try {
-                    SolrServer solrServer = 
solrServerProvider.getSearchingSolrServer();
-                    // the query engine should be returned only if the server 
is alive, otherwise other indexes should be used
-                    if (solrServer != null && 0 == 
solrServer.ping().getStatus()) {
-                        tempIndexes.add(new AdvancedSolrQueryIndex(
-                                entry.getName(),
-                                solrServer,
-                                
oakSolrConfigurationProvider.getConfiguration(),
-                                aggregator));
-                    }
-                    else {
-                        if (log.isWarnEnabled()) {
-                            log.warn("cannot create Solr query index as 
SolrServer {} is unreachable", solrServer);
-                        }
+                    if (isPersistedConfiguration(definition)) {
+                        OakSolrConfiguration configuration = new 
OakSolrNodeStateConfiguration(definition);
+                        SolrServerProvider serverProvider = new 
NodeStateSolrServerProvider(definition.getChildNode("server"));
+                        // if it does not already exist I need to register an 
observer that updates / closes this SolrServerProvider when the node is 
updated/removed
+                        addQueryIndex(tempIndexes, name, serverProvider, 
configuration);
+                    } else { // otherwise use the default configuration 
providers
+                        OakSolrConfiguration configuration = 
oakSolrConfigurationProvider.getConfiguration();
+                        addQueryIndex(tempIndexes, name, solrServerProvider, 
configuration);
                     }
                 } catch (Exception e) {
-                    if (log.isErrorEnabled()) {
-                        log.error("unable to create Solr query index at " + 
entry.getName(), e);
-                    }
+                    log.warn("could not get Solr query index from node {}", 
name);
                 }
-
+                // TODO : need to add index tracking capabilities in order to 
shutdown SolrServer in case the server node gets deleted
             }
         }
         return tempIndexes;
     }
 
+    private boolean isPersistedConfiguration(NodeState definition) {
+        return definition.hasChildNode("server");
+    }
+
+    private void addQueryIndex(List<QueryIndex> tempIndexes, String name, 
SolrServerProvider solrServerProvider, OakSolrConfiguration configuration) {
+        try {
+            SolrServer solrServer = 
solrServerProvider.getSearchingSolrServer();
+            // the query engine should be returned only if the server is 
alive, otherwise other indexes should be used
+            if (solrServer != null && 0 == solrServer.ping().getStatus()) {
+                tempIndexes.add(new AdvancedSolrQueryIndex(
+                        name,
+                        solrServer,
+                        configuration,
+                        aggregator));
+            } else {
+                if (log.isWarnEnabled()) {
+                    log.warn("cannot create Solr query index as SolrServer {} 
is unreachable", solrServer);
+                }
+            }
+        } catch (Exception e) {
+            if (log.isErrorEnabled()) {
+                log.error("unable to create Solr query index at " + name, e);
+            }
+        }
+    }
+
+    @Override
+    public void contentChanged(@Nonnull NodeState root, @Nullable CommitInfo 
info) {
+        // TODO : check if any change has been done on a persisted SSP
+    }
+
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/DefaultSolrServerProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/DefaultSolrServerProvider.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/DefaultSolrServerProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/DefaultSolrServerProvider.java
 Wed Feb 18 17:12:00 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.server;
 
+import java.io.IOException;
 import javax.annotation.CheckForNull;
 
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationDefaults;
@@ -57,4 +58,21 @@ public class DefaultSolrServerProvider i
                 SolrServerConfigurationDefaults.HTTP_PORT + 
SolrServerConfigurationDefaults.CONTEXT +
                 '/' + SolrServerConfigurationDefaults.CORE_NAME;
     }
+
+    @Override
+    public void close() throws IOException {
+        try {
+            getSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getIndexingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getSearchingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        }
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java
 Wed Feb 18 17:12:00 2015
@@ -52,6 +52,18 @@ public class EmbeddedSolrServerProvider
 
     private SolrServer createSolrServer() throws Exception {
 
+        SolrServer cachedEntry = 
SolrServerRegistry.get(solrServerConfiguration, 
SolrServerRegistry.Strategy.SEARCHING);
+
+        try {
+            if (cachedEntry != null && 0 == cachedEntry.ping().getStatus()) {
+                return cachedEntry;
+            }
+        } catch (Exception e) {
+            log.warn("cached entry is shut down, creating new one");
+        }
+
+        log.warn("creating new embedded solr server with config: {}", 
solrServerConfiguration);
+
         String solrHomePath = solrServerConfiguration.getSolrHomePath();
         String coreName = solrServerConfiguration.getCoreName();
         EmbeddedSolrServerConfiguration.HttpConfiguration httpConfiguration = 
solrServerConfiguration.getHttpConfiguration();
@@ -113,6 +125,7 @@ public class EmbeddedSolrServerProvider
 
                 EmbeddedSolrServer server = new 
EmbeddedSolrServer(coreContainer, coreName);
                 if (server.ping().getStatus() == 0) {
+                    SolrServerRegistry.register(solrServerConfiguration, 
server, SolrServerRegistry.Strategy.SEARCHING);
                     return server;
                 } else {
                     throw new IOException("the embedded Solr server is not 
alive");
@@ -124,9 +137,11 @@ public class EmbeddedSolrServerProvider
     }
 
     private void checkSolrConfiguration(String solrHomePath, String coreName) 
throws IOException {
+        File solrHomePathFile = new File(solrHomePath);
+
+        log.info("checking configuration at {}", 
solrHomePathFile.getAbsolutePath());
 
         // check if solrHomePath exists
-        File solrHomePathFile = new File(solrHomePath);
         if (!solrHomePathFile.exists()) {
             if (!solrHomePathFile.mkdirs()) {
                 throw new IOException("could not create solrHomePath 
directory");
@@ -134,30 +149,41 @@ public class EmbeddedSolrServerProvider
                 // copy all the needed files to the just created directory
                 copy("/solr/solr.xml", solrHomePath);
                 copy("/solr/zoo.cfg", solrHomePath);
-                if (!new File(solrHomePath + "/" + coreName + 
"/conf").mkdirs()) {
-                    throw new IOException("could not create nested core 
directory in solrHomePath");
-                }
-                String solrCoreDir = solrHomePath + "/" + coreName;
-                copy("/solr/oak/core.properties", solrCoreDir);
-                String coreConfDir = solrCoreDir + "/conf/";
-                copy("/solr/oak/conf/currency.xml", coreConfDir);
-                copy("/solr/oak/conf/schema.xml", coreConfDir);
-                copy("/solr/oak/conf/solrconfig.xml", coreConfDir);
+
             }
         } else if (!solrHomePathFile.isDirectory()) {
             throw new IOException("a non directory file with the specified 
name already exists for the given solrHomePath '" + solrHomePath);
         }
 
+        File solrCorePathFile = new File(solrHomePathFile, coreName);
+        if (!solrCorePathFile.exists()) {
+            if (!new File(solrCorePathFile, "conf").mkdirs()) {
+                throw new IOException("could not create nested core directory 
in solrHomePath/solrCoreName/conf");
+            }
+            String solrCoreDir = solrCorePathFile.getAbsolutePath();
+//            copy("/solr/oak/core.properties", solrCoreDir);
+            File coreProperties = new File(new File(solrCoreDir), 
"core.properties");
+            assert coreProperties.createNewFile();
+            FileOutputStream out = new FileOutputStream(coreProperties);
+            IOUtils.writeBytes(out, ("name=" + coreName).getBytes());
+            out.flush();
+            out.close();
+
+            String coreConfDir = solrCoreDir + "/conf/";
+            copy("/solr/oak/conf/currency.xml", coreConfDir);
+            copy("/solr/oak/conf/schema.xml", coreConfDir);
+            copy("/solr/oak/conf/solrconfig.xml", coreConfDir);
+        } else if (!solrCorePathFile.isDirectory()) {
+            throw new IOException("a non directory file with the specified 
name already exists for the given Solr core path'" + 
solrCorePathFile.getAbsolutePath());
+        }
+
         // check if the a core with the given coreName exists
-        // TODO : improve this check
-        String[] files = new File(solrHomePath).list();
+        String[] files = solrHomePathFile.list();
         Arrays.sort(files);
         if (Arrays.binarySearch(files, coreName) < 0) {
             throw new IOException("could not find a directory with the 
coreName '" + coreName
                     + "' in the solrHomePath '" + solrHomePath + "'");
         }
-
-
     }
 
     private void copy(String resource, String dir) throws IOException {
@@ -235,4 +261,21 @@ public class EmbeddedSolrServerProvider
             }
         }
     }
+
+    @Override
+    public void close() throws IOException {
+        try {
+            getSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getIndexingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getSearchingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        }
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/RemoteSolrServerProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/RemoteSolrServerProvider.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/RemoteSolrServerProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/RemoteSolrServerProvider.java
 Wed Feb 18 17:12:00 2015
@@ -52,6 +52,17 @@ public class RemoteSolrServerProvider im
     @CheckForNull
     @Override
     public SolrServer getSolrServer() throws Exception {
+
+        SolrServer cachedEntry = 
SolrServerRegistry.get(remoteSolrServerConfiguration, 
SolrServerRegistry.Strategy.SEARCHING);
+
+        try {
+            if (cachedEntry != null && 0 == cachedEntry.ping().getStatus()) {
+                return cachedEntry;
+            }
+        } catch (Exception e) {
+            log.warn("cached entry is shut down, creating new one");
+        }
+
         if (solrServer == null && 
remoteSolrServerConfiguration.getSolrZkHost() != null && 
remoteSolrServerConfiguration.getSolrZkHost().length() > 0) {
             try {
                 solrServer = initializeWithCloudSolrServer();
@@ -69,6 +80,8 @@ public class RemoteSolrServerProvider im
         }
         if (solrServer == null) {
             throw new IOException("could not connect to any remote Solr 
server");
+        } else {
+            SolrServerRegistry.register(remoteSolrServerConfiguration, 
solrServer, SolrServerRegistry.Strategy.SEARCHING);
         }
         return solrServer;
     }
@@ -76,11 +89,23 @@ public class RemoteSolrServerProvider im
     @CheckForNull
     @Override
     public SolrServer getIndexingSolrServer() throws Exception {
+
+        SolrServer cachedEntry = 
SolrServerRegistry.get(remoteSolrServerConfiguration, 
SolrServerRegistry.Strategy.INDEXING);
+
+        try {
+            if (cachedEntry != null && 0 == cachedEntry.ping().getStatus()) {
+                return cachedEntry;
+            }
+        } catch (Exception e) {
+            log.warn("cached entry is shut down, creating new one");
+        }
+
         SolrServer server = getSolrServer();
 
         if (server instanceof HttpSolrServer) {
             String url = ((HttpSolrServer) server).getBaseURL();
             server = new ConcurrentUpdateSolrServer(url, 1000, 4);
+            SolrServerRegistry.register(remoteSolrServerConfiguration, 
solrServer, SolrServerRegistry.Strategy.INDEXING);
         }
 
         return server;
@@ -198,4 +223,21 @@ public class RemoteSolrServerProvider im
             throw new SolrServerException(e);
         }
     }
+
+    @Override
+    public void close() throws IOException {
+        try {
+            getSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getIndexingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        } try {
+            getSearchingSolrServer().shutdown();
+        } catch (Exception e) {
+            // do nothing
+        }
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerProvider.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerProvider.java
 Wed Feb 18 17:12:00 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.server;
 
+import java.io.Closeable;
 import javax.annotation.CheckForNull;
 
 import org.apache.solr.client.solrj.SolrServer;
@@ -23,7 +24,7 @@ import org.apache.solr.client.solrj.Solr
 /**
  * Provider of {@link org.apache.solr.client.solrj.SolrServer}s instances
  */
-public interface SolrServerProvider {
+public interface SolrServerProvider extends Closeable {
 
     /**
      * provides an already initialized {@link 
org.apache.solr.client.solrj.SolrServer} to be used for either searching or

Added: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java?rev=1660682&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java
 Wed Feb 18 17:12:00 2015
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.solr.server;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration;
+import org.apache.solr.client.solrj.SolrServer;
+
+/**
+ * A registry for {@link org.apache.solr.client.solrj.SolrServer}s
+ */
+public class SolrServerRegistry {
+
+    private static final Map<String, SolrServer> searchingServerRegistry = new 
HashMap<String, SolrServer>();
+    private static final Map<String, SolrServer> indexingServerRegistry = new 
HashMap<String, SolrServer>();
+
+    public static void register(@Nonnull SolrServerConfiguration 
configuration, @Nonnull SolrServer solrServer,
+                                @Nonnull Strategy strategy) {
+        switch (strategy) {
+            case INDEXING:
+                synchronized (indexingServerRegistry) {
+                    indexingServerRegistry.put(configuration.toString(), 
solrServer);
+                }
+                break;
+            case SEARCHING:
+                synchronized (searchingServerRegistry) {
+                    searchingServerRegistry.put(configuration.toString(), 
solrServer);
+                }
+                break;
+        }
+    }
+
+    @CheckForNull
+    public static SolrServer get(@Nonnull SolrServerConfiguration 
configuration, @Nonnull Strategy strategy) {
+        switch (strategy) {
+            case INDEXING:
+                synchronized (indexingServerRegistry) {
+                    return 
indexingServerRegistry.get(configuration.toString());
+                }
+            case SEARCHING:
+                synchronized (searchingServerRegistry) {
+                    return 
searchingServerRegistry.get(configuration.toString());
+                }
+        }
+        return null;
+    }
+
+    enum Strategy {
+        INDEXING,
+        SEARCHING
+    }
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/util/SolrIndexInitializer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/util/SolrIndexInitializer.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/util/SolrIndexInitializer.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/util/SolrIndexInitializer.java
 Wed Feb 18 17:12:00 2015
@@ -21,8 +21,12 @@ import javax.annotation.Nonnull;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
+import org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndex;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+import static 
org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
 
 /**
  * A {@link org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer} for 
Solr index
@@ -99,4 +103,8 @@ public class SolrIndexInitializer implem
 
         }
     }
+
+    public static boolean isSolrIndexNode(NodeState node) {
+        return SolrQueryIndex.TYPE.equals(node.getString(TYPE_PROPERTY_NAME));
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/jcr/SolrOakRepositoryStub.java
 Wed Feb 18 17:12:00 2015
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.jcr;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Properties;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -53,6 +54,11 @@ public class SolrOakRepositoryStub exten
             throw new RuntimeException();
         }
         SolrServerProvider solrServerProvider = new SolrServerProvider() {
+            @Override
+            public void close() throws IOException {
+
+            }
+
             @CheckForNull
             @Override
             public SolrServer getSolrServer() throws Exception {

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/SolrBaseTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/SolrBaseTest.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/SolrBaseTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/SolrBaseTest.java
 Wed Feb 18 17:12:00 2015
@@ -30,6 +30,8 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
 import org.apache.jackrabbit.oak.spi.commit.EditorHook;
+import org.apache.jackrabbit.oak.spi.commit.Observer;
+import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.solr.client.solrj.SolrServer;
@@ -59,7 +61,8 @@ public abstract class SolrBaseTest {
         Oak oak = new Oak().with(new InitialContent())
                 .with(new OpenSecurityProvider())
                 .with(new SolrIndexInitializer(false)) // synchronous
-                .with(new SolrQueryIndexProvider(provider, provider))
+                .with((QueryIndexProvider) new 
SolrQueryIndexProvider(provider, provider))
+                .with((Observer) new SolrQueryIndexProvider(provider, 
provider))
                 .with(new SolrIndexEditorProvider(provider, provider));
         repository = oak
                 .createContentRepository();

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java
 Wed Feb 18 17:12:00 2015
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.plugins.index.solr;
 
 import java.io.File;
+import java.io.IOException;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -25,12 +26,9 @@ import org.apache.jackrabbit.oak.plugins
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.EmbeddedSolrServerConfiguration;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
-import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.server.EmbeddedSolrServerProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
 import org.apache.solr.client.solrj.SolrServer;
-import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
-import org.apache.solr.core.CoreContainer;
 
 import static org.junit.Assert.assertTrue;
 
@@ -114,4 +112,8 @@ public class TestUtils
         return configuration;
     }
 
+    @Override
+    public void close() throws IOException {
+
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/DefaultAnalyzersConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/DefaultAnalyzersConfigurationTest.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/DefaultAnalyzersConfigurationTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/DefaultAnalyzersConfigurationTest.java
 Wed Feb 18 17:12:00 2015
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.regex.Pattern;
+
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.BaseTokenStreamTestCase;
 import org.apache.lucene.analysis.TokenStream;

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorTest.java?rev=1660682&r1=1660681&r2=1660682&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorTest.java
 Wed Feb 18 17:12:00 2015
@@ -46,7 +46,6 @@ public class SolrIndexEditorTest {
 
     @Test
     public void testIndexedProperties() throws Exception {
-        NodeBuilder builder = mock(NodeBuilder.class);
         SolrServer solrServer = TestUtils.createSolrServer();
         OakSolrConfiguration configuration = TestUtils.getTestConfiguration();
         IndexUpdateCallback callback = mock(IndexUpdateCallback.class);


Reply via email to