Author: tommaso
Date: Tue Feb 24 16:09:05 2015
New Revision: 1662001

URL: http://svn.apache.org/r1662001
Log:
OAK-2526 - persisted solr server configuration support

Added:
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerConfigurationProvider.java
   (with props)
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServersObserver.java
   (with props)
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/NodeStateSolrServersObserverService.java
   (with props)
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/OakSolrServer.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/FullTextSolrSearchTest.java
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationDefaults.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/query/SolrQueryIndexProvider.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/SolrServerRegistry.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-osgi/pom.xml

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/FullTextSolrSearchTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/FullTextSolrSearchTest.java?rev=1662001&r1=1662000&r2=1662001&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/FullTextSolrSearchTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/FullTextSolrSearchTest.java
 Tue Feb 24 16:09:05 2015
@@ -22,6 +22,7 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.StringReader;
+import javax.annotation.Nonnull;
 import javax.jcr.Repository;
 
 import org.apache.commons.io.FileUtils;
@@ -36,13 +37,13 @@ import org.apache.jackrabbit.oak.plugins
 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.RemoteSolrServerConfiguration;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServersObserver;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.index.SolrIndexEditorProvider;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndexProvider;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.server.EmbeddedSolrServerProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.util.SolrIndexInitializer;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
-import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
 import org.slf4j.Logger;
@@ -68,6 +69,7 @@ public class FullTextSolrSearchTest exte
                 @Override
                 public Jcr customize(Oak oak) {
                     OakSolrConfigurationProvider configurationProvider = new 
OakSolrConfigurationProvider() {
+                        @Nonnull
                         public OakSolrConfiguration getConfiguration() {
                             return new DefaultSolrConfiguration() {
                                 @Override
@@ -79,7 +81,7 @@ public class FullTextSolrSearchTest exte
                     };
                     SolrQueryIndexProvider solrPRovider = new 
SolrQueryIndexProvider(serverProvider, configurationProvider);
                     oak.with((Observer) solrPRovider)
-                        .with((QueryIndexProvider) solrPRovider)
+                        .with(new NodeStateSolrServersObserver())
                         .with(new SolrIndexEditorProvider(serverProvider, 
configurationProvider))
                         .with(new SolrIndexInitializer(false));
                     return new Jcr(oak);

Modified: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationDefaults.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationDefaults.java?rev=1662001&r1=1662000&r2=1662001&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationDefaults.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationDefaults.java
 Tue Feb 24 16:09:05 2015
@@ -42,7 +42,7 @@ public class SolrServerConfigurationDefa
     public static final String DESC_FIELD_NAME = "path_des";
     public static final String ANC_FIELD_NAME = "path_anc";
     public static final String CATCHALL_FIELD = "catch_all";
-    public static final int ROWS = 50;
+    public static final int ROWS = Integer.MAX_VALUE;
     public static final boolean PROPERTY_RESTRICTIONS = false;
     public static final boolean PATH_RESTRICTIONS = false;
     public static final boolean PRIMARY_TYPES = false;

Added: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerConfigurationProvider.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/NodeStateSolrServerConfigurationProvider.java?rev=1662001&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerConfigurationProvider.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServerConfigurationProvider.java
 Tue Feb 24 16:09:05 2015
@@ -0,0 +1,112 @@
+/*
+ * 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.configuration.nodestate;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.EmbeddedSolrServerConfiguration;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.RemoteSolrServerConfiguration;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationDefaults;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationProvider;
+import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+public class NodeStateSolrServerConfigurationProvider implements 
SolrServerConfigurationProvider {
+
+    private final NodeState nodeState;
+
+    public NodeStateSolrServerConfigurationProvider(NodeState nodeState) {
+        this.nodeState = nodeState;
+        if (!nodeState.hasProperty(Properties.SERVER_TYPE)) {
+            throw new IllegalArgumentException("missing property " + 
Properties.SERVER_TYPE + " in " + nodeState);
+        }
+    }
+
+    private int getIntValueFor(String propertyName, int defaultValue) {
+        long value = defaultValue;
+        PropertyState property = nodeState.getProperty(propertyName);
+        if (property != null) {
+            value = property.getValue(Type.LONG);
+        }
+        return (int) value;
+    }
+
+    private String getStringValueFor(String propertyName, String defaultValue) 
{
+        String value = defaultValue;
+        PropertyState property = nodeState.getProperty(propertyName);
+        if (property != null) {
+            value = property.getValue(Type.STRING);
+        }
+        return value;
+    }
+
+    @Nonnull
+    @Override
+    public SolrServerConfiguration<SolrServerProvider> 
getSolrServerConfiguration() {
+        String type = getStringValueFor(Properties.SERVER_TYPE, null);
+        if ("embedded".equalsIgnoreCase(type)) {
+            String solrHomePath = getStringValueFor(Properties.SOLRHOME_PATH, 
SolrServerConfigurationDefaults.SOLR_HOME_PATH);
+            String coreName = getStringValueFor(Properties.CORE_NAME, 
SolrServerConfigurationDefaults.CORE_NAME);
+            String context = getStringValueFor(Properties.CONTEXT, null);
+            Integer httpPort = 
Integer.valueOf(getStringValueFor(Properties.HTTP_PORT, "0"));
+
+            if (context != null && httpPort > 0) {
+                return (SolrServerConfiguration) new 
EmbeddedSolrServerConfiguration(solrHomePath, coreName)
+                        .withHttpConfiguration(context, httpPort);
+            } else {
+                return (SolrServerConfiguration) new 
EmbeddedSolrServerConfiguration(solrHomePath, coreName);
+            }
+        } else if ("remote".equalsIgnoreCase(type)) {
+            String solrZkHost = getStringValueFor(Properties.ZK_HOST, null);
+            String solrCollection = getStringValueFor(Properties.COLLECTION, 
SolrServerConfigurationDefaults.COLLECTION);
+            int solrReplicationFactor = 
getIntValueFor(Properties.REPLICATION_FACTOR, 
SolrServerConfigurationDefaults.REPLICATION_FACTOR);
+            String solrConfDir = 
getStringValueFor(Properties.CONFIGURATION_DIRECTORY, 
SolrServerConfigurationDefaults.CONFIGURATION_DIRECTORY);
+            String solrHttpUrls = getStringValueFor(Properties.HTTP_URL, 
SolrServerConfigurationDefaults.HTTP_URL);
+            int solrShardsNo = getIntValueFor(Properties.SHARDS_NO, 
SolrServerConfigurationDefaults.SHARDS_NO);
+
+            return (SolrServerConfiguration) new 
RemoteSolrServerConfiguration(solrZkHost, solrCollection, solrShardsNo,
+                    solrReplicationFactor, solrConfDir, solrHttpUrls);
+        } else {
+            throw new RuntimeException("unexpected Solr server type: " + type);
+        }
+    }
+
+    /**
+     * Properties that may be retrieved from the configuration {@link 
org.apache.jackrabbit.oak.spi.state.NodeState}.
+     */
+    public final class Properties {
+        public static final String SERVER_TYPE = "solrServerType";
+
+        // --> embedded solr server properties <--
+        public static final String SOLRHOME_PATH = "solrHomePath";
+        public static final String CONTEXT = "solrContext";
+        public static final String HTTP_PORT = "httpPort";
+        public static final String CORE_NAME = "coreName";
+
+        // --> remote solr server properties <--
+        public static final String ZK_HOST = "zkHost";
+        public static final String COLLECTION = "collection";
+        public static final String REPLICATION_FACTOR = "replicationFactor";
+        public static final String CONFIGURATION_DIRECTORY = 
"configurationDirectory";
+        public static final String HTTP_URL = "httpUrl";
+        public static final String SHARDS_NO = "shardsNo";
+    }
+
+}

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

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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -17,16 +17,10 @@
 package org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate;
 
 import java.io.IOException;
-import javax.annotation.Nonnull;
 
 import com.google.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
-import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.EmbeddedSolrServerConfiguration;
-import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.RemoteSolrServerConfiguration;
-import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration;
-import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationDefaults;
-import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.solr.client.solrj.SolrServer;
@@ -66,7 +60,7 @@ public class NodeStateSolrServerProvider
     private void checkProviderInitialization() throws IllegalAccessException, 
java.lang.reflect.InvocationTargetException, InstantiationException {
         synchronized (nodeState) {
             if (provider == null) {
-                this.provider = new 
NodeStateSolrServerConfigurationProvider().getSolrServerConfiguration().getProvider();
+                this.provider = new 
NodeStateSolrServerConfigurationProvider(nodeState).getSolrServerConfiguration().getProvider();
             }
         }
     }
@@ -89,60 +83,6 @@ public class NodeStateSolrServerProvider
         return provider.getSearchingSolrServer();
     }
 
-    private class NodeStateSolrServerConfigurationProvider implements 
SolrServerConfigurationProvider {
-        @Nonnull
-        @Override
-        public SolrServerConfiguration<SolrServerProvider> 
getSolrServerConfiguration() {
-            String type = getStringValueFor(Properties.SERVER_TYPE, 
"embedded");
-            if ("embedded".equalsIgnoreCase(type)) {
-                String solrHomePath = 
getStringValueFor(Properties.SOLRHOME_PATH, 
SolrServerConfigurationDefaults.SOLR_HOME_PATH);
-                String coreName = getStringValueFor(Properties.CORE_NAME, 
SolrServerConfigurationDefaults.CORE_NAME);
-                String context = getStringValueFor(Properties.CONTEXT, null);
-                Integer httpPort = 
Integer.valueOf(getStringValueFor(Properties.HTTP_PORT, "0"));
-
-                if (context != null && httpPort > 0) {
-                    return (SolrServerConfiguration) new 
EmbeddedSolrServerConfiguration(solrHomePath, coreName)
-                            .withHttpConfiguration(context, httpPort);
-                } else {
-                    return (SolrServerConfiguration) new 
EmbeddedSolrServerConfiguration(solrHomePath, coreName);
-                }
-            } else if ("remote".equalsIgnoreCase(type)) {
-                String solrZkHost = getStringValueFor(Properties.ZK_HOST, 
null);
-                String solrCollection = 
getStringValueFor(Properties.COLLECTION, 
SolrServerConfigurationDefaults.COLLECTION);
-                int solrReplicationFactor = 
getIntValueFor(Properties.REPLICATION_FACTOR, 
SolrServerConfigurationDefaults.REPLICATION_FACTOR);
-                String solrConfDir = 
getStringValueFor(Properties.CONFIGURATION_DIRECTORY, 
SolrServerConfigurationDefaults.CONFIGURATION_DIRECTORY);
-                String solrHttpUrls = getStringValueFor(Properties.HTTP_URL, 
SolrServerConfigurationDefaults.HTTP_URL);
-                int solrShardsNo = getIntValueFor(Properties.SHARDS_NO, 
SolrServerConfigurationDefaults.SHARDS_NO);
-
-                return (SolrServerConfiguration) new 
RemoteSolrServerConfiguration(solrZkHost, solrCollection, solrShardsNo,
-                        solrReplicationFactor, solrConfDir, solrHttpUrls);
-            } else {
-                throw new RuntimeException("unexpected Solr server type: " + 
type);
-            }
-        }
-    }
-
-
-    /**
-     * Properties that may be retrieved from the configuration {@link 
org.apache.jackrabbit.oak.spi.state.NodeState}.
-     */
-    public final class Properties {
-        public static final String SERVER_TYPE = "serverType";
-
-        // --> embedded solr server properties <--
-        public static final String SOLRHOME_PATH = "solrHomePath";
-        public static final String CONTEXT = "solrContext";
-        public static final String HTTP_PORT = "httpPort";
-        public static final String CORE_NAME = "coreName";
-
-        // --> remote solr server properties <--
-        public static final String ZK_HOST = "zkHost";
-        public static final String COLLECTION = "collection";
-        public static final String REPLICATION_FACTOR = "replicationFactor";
-        public static final String CONFIGURATION_DIRECTORY = 
"configurationDirectory";
-        public static final String HTTP_URL = "httpUrl";
-        public static final String SHARDS_NO = "shardsNo";
-    }
 
     @Override
     public void close() throws IOException {

Added: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServersObserver.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/NodeStateSolrServersObserver.java?rev=1662001&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServersObserver.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/nodestate/NodeStateSolrServersObserver.java
 Tue Feb 24 16:09:05 2015
@@ -0,0 +1,139 @@
+/*
+ * 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.configuration.nodestate;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration;
+import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
+import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerRegistry;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.DiffObserver;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
+import org.apache.solr.client.solrj.SolrServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An {@link org.apache.jackrabbit.oak.spi.commit.Observer} looking for 
changes on persisted Solr server configuration nodes.
+ * If any change is done there, the related {@link 
org.apache.solr.client.solrj.SolrServer}s are shutdown and unregistered
+ * from the {@link 
org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerRegistry}
+ */
+public class NodeStateSolrServersObserver extends DiffObserver {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Override
+    protected NodeStateDiff getRootDiff(@Nonnull NodeState before, @Nonnull 
NodeState after, @Nullable CommitInfo info) {
+        return new ChangingSolrServersNodeStateDiff(after);
+    }
+
+    private void shutdownRegisteredSolrServers(NodeState nodeState) {
+        log.debug("shutting down servers at {}", nodeState);
+        NodeStateSolrServerConfigurationProvider 
nodeStateSolrServerConfigurationProvider = new 
NodeStateSolrServerConfigurationProvider(nodeState);
+        SolrServerConfiguration<SolrServerProvider> solrServerConfiguration = 
nodeStateSolrServerConfigurationProvider.getSolrServerConfiguration();
+        SolrServer searchingSolrServer = 
SolrServerRegistry.get(solrServerConfiguration, 
SolrServerRegistry.Strategy.SEARCHING);
+        if (searchingSolrServer != null) {
+            searchingSolrServer.shutdown();
+            log.debug("searching SolrServer shut down");
+            SolrServerRegistry.unregister(solrServerConfiguration, 
SolrServerRegistry.Strategy.SEARCHING);
+        }
+
+        SolrServer indexingSolrServer = 
SolrServerRegistry.get(solrServerConfiguration, 
SolrServerRegistry.Strategy.INDEXING);
+        if (indexingSolrServer != null) {
+            indexingSolrServer.shutdown();
+            log.debug("indexing SolrServer shut down");
+            SolrServerRegistry.unregister(solrServerConfiguration, 
SolrServerRegistry.Strategy.INDEXING);
+        }
+    }
+
+    private class ChangingSolrServersNodeStateDiff implements NodeStateDiff {
+        private final NodeState nodeState;
+        private final String name;
+
+        public ChangingSolrServersNodeStateDiff(NodeState after) {
+            nodeState = after;
+            name = "";
+        }
+
+        public ChangingSolrServersNodeStateDiff(NodeState nodeState, String 
name) {
+            this.nodeState = nodeState;
+            this.name = name;
+        }
+
+        @Override
+        public boolean propertyAdded(PropertyState after) {
+            if (isSolrServerNode(name, nodeState)) {
+                shutdownRegisteredSolrServers(nodeState);
+            }
+            return true;
+        }
+
+        @Override
+        public boolean propertyChanged(PropertyState before, PropertyState 
after) {
+            if (isSolrServerNode(name, nodeState)) {
+                shutdownRegisteredSolrServers(nodeState);
+            }
+            return true;
+        }
+
+        @Override
+        public boolean propertyDeleted(PropertyState before) {
+            if (isSolrServerNode(name, nodeState)) {
+                shutdownRegisteredSolrServers(nodeState);
+            }
+            return true;
+        }
+
+        @Override
+        public boolean childNodeAdded(String name, NodeState after) {
+            return true;
+        }
+
+        @Override
+        public boolean childNodeChanged(String name, NodeState before, 
NodeState after) {
+            if (isSolrServerNode(name, before)) {
+                shutdownRegisteredSolrServers(before);
+            }
+            return after.compareAgainstBaseState(before, new 
ChangingSolrServersNodeStateDiff(after, this.name + "/" + name));
+        }
+
+        @Override
+        public boolean childNodeDeleted(String name, NodeState before) {
+            if (isSolrServerNode(name, before)) { // look if the deleted node 
was a server node
+                shutdownRegisteredSolrServers(before);
+            } else { //look among child nodes if there was a server node
+                for (String childNodeName : before.getChildNodeNames()) {
+                    NodeState childNodeState = 
before.getChildNode(childNodeName);
+                    if (isSolrServerNode(childNodeName, childNodeState)) {
+                        shutdownRegisteredSolrServers(childNodeState);
+                        break;
+                    }
+                }
+            }
+            return true;
+        }
+
+        private boolean isSolrServerNode(String name, NodeState nodeState) {
+            return "server".equals(name) && 
nodeState.hasProperty("solrServerType");
+        }
+
+    }
+}

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

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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -23,9 +23,11 @@ import org.apache.jackrabbit.oak.plugins
 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.SolrServerConfigurationProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServerConfigurationProvider;
 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.OakSolrServer;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -60,15 +62,20 @@ public class SolrIndexEditorProvider imp
             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);
+            try {
+                // if index definition contains a persisted configuration, use 
that
+                if (isPersistedConfiguration(definition)) {
+                    NodeState nodeState = definition.getNodeState();
+                    OakSolrConfiguration configuration = new 
OakSolrNodeStateConfiguration(nodeState);
+                    SolrServerConfigurationProvider configurationProvider = 
new 
NodeStateSolrServerConfigurationProvider(definition.getChildNode("server").getNodeState());
+                    SolrServer solrServer = new 
OakSolrServer(configurationProvider);
+                    editor = getEditor(configuration, solrServer, callback, 
definition);
+                } else { // otherwise use the default configuration providers 
(e.g. defined via code or OSGi)
+                    OakSolrConfiguration configuration = 
oakSolrConfigurationProvider.getConfiguration();
+                    editor = getEditor(configuration, 
solrServerProvider.getIndexingSolrServer(), callback, definition);
+                }
+            } catch (Exception e) {
+                log.warn("could not get Solr index editor from {}", 
definition.getNodeState(), e);
             }
         }
         return editor;
@@ -78,18 +85,17 @@ public class SolrIndexEditorProvider imp
         return definition.hasChildNode("server");
     }
 
-    private SolrIndexEditor getEditor(OakSolrConfiguration configuration, 
SolrServerProvider solrServerProvider,
+    private SolrIndexEditor getEditor(OakSolrConfiguration configuration, 
SolrServer solrServer,
                                       IndexUpdateCallback callback, 
NodeBuilder definition) {
         SolrIndexEditor editor = null;
         try {
-            SolrServer solrServer = solrServerProvider.getIndexingSolrServer();
-            if (solrServer != null) {
+            if (solrServer != null && 0 == solrServer.ping().getStatus()) {
                 editor = new SolrIndexEditor(
                         solrServer,
                         configuration, callback);
             } else {
                 if (log.isWarnEnabled()) {
-                    log.warn("null SolrServer provided, cannot index {}", 
definition);
+                    log.warn("no SolrServer provided, cannot index {}", 
definition);
                 }
             }
         } catch (Exception e) {

Added: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/NodeStateSolrServersObserverService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/NodeStateSolrServersObserverService.java?rev=1662001&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/NodeStateSolrServersObserverService.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/NodeStateSolrServersObserverService.java
 Tue Feb 24 16:09:05 2015
@@ -0,0 +1,42 @@
+/*
+ * 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.osgi;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServersObserver;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.Observer;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * An OSGi service for {@link 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServersObserver}
+ */
+@Component(immediate = true)
+@Service(value = Observer.class)
+public class NodeStateSolrServersObserverService implements Observer {
+
+    private final NodeStateSolrServersObserver nodeStateSolrServersObserver = 
new NodeStateSolrServersObserver();
+
+    @Override
+    public void contentChanged(@Nonnull NodeState root, @Nullable CommitInfo 
info) {
+        nodeStateSolrServersObserver.contentChanged(root, info);
+    }
+}

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

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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -84,7 +84,6 @@ public class SolrQueryIndexProviderServi
             }
 
             
regs.add(componentContext.getBundleContext().registerService(QueryIndexProvider.class.getName(),
 solrQueryIndexProvider, null));
-            
regs.add(componentContext.getBundleContext().registerService(Observer.class.getName(),
 solrQueryIndexProvider, null));
         }
     }
 

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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -26,8 +26,12 @@ import org.apache.jackrabbit.oak.api.Typ
 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.SolrServerConfiguration;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationProvider;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServerConfigurationProvider;
 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.OakSolrServer;
 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;
@@ -45,7 +49,7 @@ import static org.apache.jackrabbit.oak.
 /**
  * {@link QueryIndexProvider} for {@link SolrQueryIndex}
  */
-public class SolrQueryIndexProvider implements QueryIndexProvider, Observer {
+public class SolrQueryIndexProvider implements QueryIndexProvider {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -80,17 +84,17 @@ public class SolrQueryIndexProvider impl
                 try {
                     if (isPersistedConfiguration(definition)) {
                         OakSolrConfiguration configuration = new 
OakSolrNodeStateConfiguration(definition);
-                        SolrServerProvider serverProvider = new 
NodeStateSolrServerProvider(definition.getChildNode("server"));
+                        SolrServerConfigurationProvider 
solrServerConfigurationProvider = new 
NodeStateSolrServerConfigurationProvider(definition.getChildNode("server"));
+                        SolrServer solrServer = new 
OakSolrServer(solrServerConfigurationProvider);
                         // 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);
+                        addQueryIndex(tempIndexes, name, solrServer, 
configuration);
                     } else { // otherwise use the default configuration 
providers
                         OakSolrConfiguration configuration = 
oakSolrConfigurationProvider.getConfiguration();
-                        addQueryIndex(tempIndexes, name, solrServerProvider, 
configuration);
+                        addQueryIndex(tempIndexes, name, 
solrServerProvider.getSearchingSolrServer(), configuration);
                     }
                 } catch (Exception e) {
-                    log.warn("could not get Solr query index from node {}", 
name);
+                    log.warn("could not get Solr query index from node {}", 
name, e);
                 }
-                // TODO : need to add index tracking capabilities in order to 
shutdown SolrServer in case the server node gets deleted
             }
         }
         return tempIndexes;
@@ -100,9 +104,8 @@ public class SolrQueryIndexProvider impl
         return definition.hasChildNode("server");
     }
 
-    private void addQueryIndex(List<QueryIndex> tempIndexes, String name, 
SolrServerProvider solrServerProvider, OakSolrConfiguration configuration) {
+    private void addQueryIndex(List<QueryIndex> tempIndexes, String name, 
SolrServer solrServer, 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(
@@ -122,9 +125,4 @@ public class SolrQueryIndexProvider impl
         }
     }
 
-    @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/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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -52,17 +52,7 @@ 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);
+        log.info("creating new embedded solr server with config: {}", 
solrServerConfiguration);
 
         String solrHomePath = solrServerConfiguration.getSolrHomePath();
         String coreName = solrServerConfiguration.getCoreName();
@@ -125,7 +115,6 @@ 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");
@@ -161,7 +150,6 @@ public class EmbeddedSolrServerProvider
                 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);
@@ -265,15 +253,9 @@ 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();
+            if (solrServer != null) {
+                solrServer.shutdown();
+            }
         } catch (Exception e) {
             // do nothing
         }

Added: 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/OakSolrServer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/OakSolrServer.java?rev=1662001&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/OakSolrServer.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/OakSolrServer.java
 Tue Feb 24 16:09:05 2015
@@ -0,0 +1,78 @@
+/*
+ * 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.io.IOException;
+import javax.annotation.Nonnull;
+
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationProvider;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.common.util.NamedList;
+
+/**
+ * An Oak {@link org.apache.solr.client.solrj.SolrServer}, caching a {@link 
org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider}
+ * for dispatching requests to indexing or searching specialized {@link 
org.apache.solr.client.solrj.SolrServer}s.
+ */
+public class OakSolrServer extends SolrServer {
+
+    private final SolrServerConfiguration solrServerConfiguration;
+    private final SolrServerProvider solrServerProvider;
+
+    public OakSolrServer(@Nonnull SolrServerConfigurationProvider 
solrServerConfigurationProvider) {
+        this.solrServerConfiguration = 
solrServerConfigurationProvider.getSolrServerConfiguration();
+        try {
+            this.solrServerProvider = solrServerConfiguration.getProvider();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public NamedList<Object> request(SolrRequest request) throws 
SolrServerException, IOException {
+        try {
+
+            SolrServer server = getServer(request);
+            return server.request(request);
+
+        } catch (Exception e) {
+            throw new SolrServerException(e);
+        }
+    }
+
+    private synchronized SolrServer getServer(SolrRequest request) throws 
Exception {
+        boolean isIndex = request.getPath().contains("/update");
+        SolrServerRegistry.Strategy strategy = isIndex ? 
SolrServerRegistry.Strategy.INDEXING : SolrServerRegistry.Strategy.SEARCHING;
+        SolrServer solrServer = 
SolrServerRegistry.get(solrServerConfiguration, strategy);
+        if (solrServer == null) {
+            solrServer = isIndex ? solrServerProvider.getIndexingSolrServer() 
: solrServerProvider.getSearchingSolrServer();
+            SolrServerRegistry.register(solrServerConfiguration, solrServer, 
strategy);
+        }
+        return solrServer;
+    }
+
+    @Override
+    public void shutdown() {
+        try {
+            solrServerProvider.close();
+        } catch (IOException e) {
+            // do nothing
+        }
+    }
+}

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

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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -43,7 +43,8 @@ public class RemoteSolrServerProvider im
 
     private final RemoteSolrServerConfiguration remoteSolrServerConfiguration;
 
-    private SolrServer solrServer;
+    private SolrServer searchingSolrServer;
+    private SolrServer indexingSolrServer;
 
     public RemoteSolrServerProvider(RemoteSolrServerConfiguration 
remoteSolrServerConfiguration) {
         this.remoteSolrServerConfiguration = remoteSolrServerConfiguration;
@@ -53,17 +54,8 @@ public class RemoteSolrServerProvider im
     @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) {
+        SolrServer solrServer = null;
+        if (remoteSolrServerConfiguration.getSolrZkHost() != null && 
remoteSolrServerConfiguration.getSolrZkHost().length() > 0) {
             try {
                 solrServer = initializeWithCloudSolrServer();
             } catch (Exception e) {
@@ -80,34 +72,20 @@ 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;
     }
 
     @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);
+            server = new ConcurrentUpdateSolrServer(url, 1000, 
Runtime.getRuntime().availableProcessors());
         }
-
         return server;
     }
 
@@ -227,15 +205,12 @@ public class RemoteSolrServerProvider im
     @Override
     public void close() throws IOException {
         try {
-            getSolrServer().shutdown();
-        } catch (Exception e) {
-            // do nothing
-        } try {
-            getIndexingSolrServer().shutdown();
+            searchingSolrServer.shutdown();
         } catch (Exception e) {
             // do nothing
-        } try {
-            getSearchingSolrServer().shutdown();
+        }
+        try {
+            indexingSolrServer.shutdown();
         } catch (Exception e) {
             // do nothing
         }

Modified: 
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=1662001&r1=1662000&r2=1662001&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/SolrServerRegistry.java
 Tue Feb 24 16:09:05 2015
@@ -63,7 +63,22 @@ public class SolrServerRegistry {
         return null;
     }
 
-    enum Strategy {
+    public static void unregister(SolrServerConfiguration<SolrServerProvider> 
configuration, @Nonnull Strategy strategy) {
+        switch (strategy) {
+            case INDEXING:
+                synchronized (indexingServerRegistry) {
+                    indexingServerRegistry.remove(configuration.toString());
+                }
+                break;
+            case SEARCHING:
+                synchronized (searchingServerRegistry) {
+                    searchingServerRegistry.remove(configuration.toString());
+                }
+                break;
+        }
+    }
+
+    public enum Strategy {
         INDEXING,
         SEARCHING
     }

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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -29,6 +29,7 @@ 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.nodestate.NodeStateSolrServersObserver;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.index.SolrIndexEditorProvider;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndexProvider;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.server.EmbeddedSolrServerProvider;
@@ -92,6 +93,7 @@ public class SolrOakRepositoryStub exten
         OakSolrConfigurationProvider oakSolrConfigurationProvider = new 
DefaultSolrConfigurationProvider(configuration);
         jcr.with(new SolrIndexInitializer(false))
                 .with(AggregateIndexProvider.wrap(new 
SolrQueryIndexProvider(solrServerProvider, oakSolrConfigurationProvider)))
+                .with(new NodeStateSolrServersObserver())
                 .with(new SolrIndexEditorProvider(solrServerProvider, 
oakSolrConfigurationProvider));
     }
 }

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=1662001&r1=1662000&r2=1662001&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
 Tue Feb 24 16:09:05 2015
@@ -24,6 +24,7 @@ import org.apache.jackrabbit.oak.api.Con
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
+import 
org.apache.jackrabbit.oak.plugins.index.solr.configuration.nodestate.NodeStateSolrServersObserver;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.index.SolrIndexEditorProvider;
 import 
org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.util.SolrIndexInitializer;
@@ -61,8 +62,8 @@ public abstract class SolrBaseTest {
         Oak oak = new Oak().with(new InitialContent())
                 .with(new OpenSecurityProvider())
                 .with(new SolrIndexInitializer(false)) // synchronous
-                .with((QueryIndexProvider) new 
SolrQueryIndexProvider(provider, provider))
-                .with((Observer) new SolrQueryIndexProvider(provider, 
provider))
+                .with(new SolrQueryIndexProvider(provider, provider))
+                .with(new NodeStateSolrServersObserver())
                 .with(new SolrIndexEditorProvider(provider, provider));
         repository = oak
                 .createContentRepository();

Modified: jackrabbit/oak/trunk/oak-solr-osgi/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-osgi/pom.xml?rev=1662001&r1=1662000&r2=1662001&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-osgi/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-solr-osgi/pom.xml Tue Feb 24 16:09:05 2015
@@ -57,15 +57,15 @@
                             *
                         </Import-Package>
                         
<Embed-Dependency>*;scope=runtime;inline=true</Embed-Dependency>
-                        
<Service-Component>OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr
-                            
.osgi.SolrQueryIndexProviderService.xml,OSGI-INF/org.apache.jackrabbit.
-                            
oak.plugins.index.solr.osgi.SolrServerProviderService.xml,OSGI-I
-                            
NF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.SolrIndexEditorPro
-                            
viderService.xml,OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.
-                            
osgi.EmbeddedSolrServerConfigurationProvider.xml,OSGI-INF/org.apache.ja
-                            
ckrabbit.oak.plugins.index.solr.osgi.RemoteSolrServerConfigurationProvi
-                            
der.xml,OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.OakS
-                            
olrConfigurationProviderService.xml</Service-Component>
+                        <Service-Component>
+                            
OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.SolrQueryIndexProviderService.xml,
+                            
OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.SolrServerProviderService.xml,
+                            
OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.SolrIndexEditorProviderService.xml,
+                            
OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.EmbeddedSolrServerConfigurationProvider.xml,
+                            
OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.RemoteSolrServerConfigurationProvider.xml,
+                            
OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.OakSolrConfigurationProviderService.xml,
+                            
OSGI-INF/org.apache.jackrabbit.oak.plugins.index.solr.osgi.NodeStateSolrServersObserverService.xml
+                        </Service-Component>
                     </instructions>
                 </configuration>
             </plugin>


Reply via email to