You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2014/03/13 16:21:00 UTC

svn commit: r1577192 [1/2] - in /jackrabbit/oak/trunk: ./ oak-solr-core/ oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/ oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/ oak-solr-co...

Author: tommaso
Date: Thu Mar 13 15:20:59 2014
New Revision: 1577192

URL: http://svn.apache.org/r1577192
Log:
OAK-1537 - merge oak-solr-* into oak-solr-core

Added:
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/EmbeddedSolrServerConfigurationProvider.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/OakSolrConfigurationProviderService.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/RemoteSolrServerConfigurationProvider.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/RemoteSolrServerProvider.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationTest.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/server/
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProviderTest.java   (with props)
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/server/RemoteSolrServerProviderIT.java   (with props)
Removed:
    jackrabbit/oak/trunk/oak-solr-embedded/
    jackrabbit/oak/trunk/oak-solr-remote/
Modified:
    jackrabbit/oak/trunk/oak-solr-core/pom.xml
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/OakSolrNodeStateConfiguration.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfiguration.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationProvider.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/package-info.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.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/SolrQueryIndex.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/package-info.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/util/package-info.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/resources/solr/oak/conf/schema.xml
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/FixedNodeStateConfigurationTest.java
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/UpToDateNodeStateConfigurationTest.java
    jackrabbit/oak/trunk/pom.xml

Modified: jackrabbit/oak/trunk/oak-solr-core/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/pom.xml?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-solr-core/pom.xml Thu Mar 13 15:20:59 2014
@@ -17,282 +17,186 @@
    limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd ">
-  <modelVersion>4.0.0</modelVersion>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd ">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.jackrabbit</groupId>
+        <artifactId>oak-parent</artifactId>
+        <version>0.19-SNAPSHOT</version>
+        <relativePath>../oak-parent/pom.xml</relativePath>
+    </parent>
+
+    <artifactId>oak-solr-core</artifactId>
+    <name>Oak Solr core</name>
+    <description>Oak support for Apache Solr indexing and search</description>
+    <packaging>bundle</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.jackrabbit.oak.plugins.index.solr.configuration,
+                            org.apache.jackrabbit.oak.plugins.index.solr.index,
+                            org.apache.jackrabbit.oak.plugins.index.solr.query,
+                            org.apache.jackrabbit.oak.plugins.index.solr.server,
+                            org.apache.jackrabbit.oak.plugins.index.solr.util
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                        <configuration>
+                            <includes>
+                                <include>**/*IT.java</include>
+                            </includes>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <!-- TEST -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-core</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-mk</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>log4j-over-slf4j</artifactId>
+            <optional>true</optional>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <optional>true</optional>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>1.9.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.lucene</groupId>
+            <artifactId>lucene-test-framework</artifactId>
+            <version>4.7.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.lucene</groupId>
+            <artifactId>lucene-core</artifactId>
+            <version>4.7.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.lucene</groupId>
+            <artifactId>lucene-analyzers-common</artifactId>
+            <version>4.7.0</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>jsr305</artifactId>
+        </dependency>
+        <!-- Optional OSGi dependencies, used only when running within OSGi -->
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-core</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- Solr -->
+        <dependency>
+            <groupId>org.apache.solr</groupId>
+            <artifactId>solr-core</artifactId>
+            <version>${lucene.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-jdk14</artifactId>
+                </exclusion>
+            </exclusions>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.solr</groupId>
+            <artifactId>solr-solrj</artifactId>
+            <version>${lucene.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>biz.aQute.bnd</groupId>
+            <artifactId>bndlib</artifactId>
+            <scope>provided</scope>
+        </dependency>
 
-  <parent>
-    <groupId>org.apache.jackrabbit</groupId>
-    <artifactId>oak-parent</artifactId>
-    <version>0.19-SNAPSHOT</version>
-    <relativePath>../oak-parent/pom.xml</relativePath>
-  </parent>
-
-  <artifactId>oak-solr-core</artifactId>
-  <name>Oak Solr core</name>
-  <description>Oak support for Apache Solr indexing and search</description>
-  <packaging>bundle</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <configuration>
-          <instructions>
-            <Export-Package>
-              org.apache.jackrabbit.oak.plugins.index.solr.configuration,
-              org.apache.jackrabbit.oak.plugins.index.solr.index,
-              org.apache.jackrabbit.oak.plugins.index.solr.query,
-              org.apache.jackrabbit.oak.plugins.index.solr.server,
-              org.apache.jackrabbit.oak.plugins.index.solr.util
-            </Export-Package>
-              <_exportcontents>
-                  org.apache.solr.*;version=${solr.version},
-              </_exportcontents>
-              <Import-Package>
-                  org.slf4j.impl;resolution:=optional,
-                  com.ibm.icu.*;resolution:=optional,
-                  org.apache.log4j.jmx;resolution:=optional,
-                  org.apache.log4j.spi;resolution:=optional,
-                  org.jboss.netty.*;resolution:=optional,
-                  jline.*;resolution:=optional,
-                  org.eclipse.jetty.*;resolution:=optional,
-                  javax.servlet.*; version="[2.5.0,4.0.0)",
-                  org.tartarus.snowball;resolution:=optional,
-                  org.restlet;resolution:=optional,
-                  org.restlet.*;resolution:=optional,
-                  org.apache.hadoop.*;resolution:=optional,
-                  com.carrotsearch.hppc.*;resolution:=optional,
-                  com.googlecode.concurrentlinkedhashmap.*;resolution:=optional,
-                  com.spatial4j.core.*;resolution:=optional,
-                  org.apache.log4j.*;resolution:=optional,
-                  org.apache.zookeeper.server.quorum.flexible.*;resolution:=optional,
-                  org.joda.time.*;resolution:=optional,
-                  org.apache.lucene.queries.*;resolution:=optional,
-                  org.apache.lucene.queryparser.*;resolution:=optional,
-                  org.apache.lucene.search.grouping.*;resolution:=optional,
-                  org.apache.lucene.search.highlight.*;resolution:=optional,
-                  org.apache.lucene.search.postingshighlight.*;resolution:=optional,
-                  org.apache.lucene.search.spell.*;resolution:=optional,
-                  org.apache.lucene.search.suggest.*;resolution:=optional,
-                  org.apache.lucene.search.vectorhighlight.*;resolution:=optional,
-                  org.apache.lucene.spatial.*;resolution:=optional,
-                  *
-              </Import-Package>
-              <DynamicImport-Package>*</DynamicImport-Package>
-              <Embed-Dependency>solr-solrj,solr-core,org.noggit</Embed-Dependency>
-          </instructions>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-scr-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>integration-test</goal>
-              <goal>verify</goal>
-            </goals>
-            <configuration>
-              <includes>
-                <include>**/*IT.java</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <!-- TEST -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>oak-core</artifactId>
-      <version>${project.version}</version>
-      <classifier>tests</classifier>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <version>2.5</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>oak-mk</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>log4j-over-slf4j</artifactId>
-      <optional>true</optional>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jcl-over-slf4j</artifactId>
-      <optional>true</optional>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>1.9.5</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-test-framework</artifactId>
-      <version>4.7.0</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>4.7.0</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>4.7.0</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-    </dependency>
-    <!-- Optional OSGi dependencies, used only when running within OSGi -->
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.core</artifactId>
-      <scope>provided</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.compendium</artifactId>
-      <scope>provided</scope>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>oak-core</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-      <dependency>
-          <groupId>org.apache.solr</groupId>
-          <artifactId>solr-core</artifactId>
-          <version>${solr.version}</version>
-          <scope>runtime</scope>
-          <exclusions>
-              <exclusion>
-                  <groupId>org.slf4j</groupId>
-                  <artifactId>slf4j-jdk14</artifactId>
-              </exclusion>
-          </exclusions>
-      </dependency>
-      <dependency>
-          <groupId>org.apache.solr</groupId>
-          <artifactId>solr-solrj</artifactId>
-          <version>${solr.version}</version>
-      </dependency>
-      <dependency>
-          <groupId>org.noggit</groupId>
-          <artifactId>noggit</artifactId>
-          <version>0.5</version>
-          <scope>runtime</scope>
-      </dependency>
-
-    <!-- sorlj dependencies needed for OSGi deployments -->
-    <dependency>
-      <groupId>org.apache.zookeeper</groupId>
-      <artifactId>zookeeper</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.jms</groupId>
-          <artifactId>jms</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jmx</groupId>
-          <artifactId>jmxri</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jdmk</groupId>
-          <artifactId>jmxtools</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-      </exclusions>
-      <version>3.3.6</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>jline</groupId>
-      <artifactId>jline</artifactId>
-      <version>0.9.1</version>
-      <scope>runtime</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>4.2.6</version>
-      <scope>runtime</scope>
-      <optional>true</optional>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpmime</artifactId>
-      <version>4.2.6</version>
-      <scope>runtime</scope>
-      <optional>true</optional>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.apache.felix.scr.annotations</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>biz.aQute.bnd</groupId>
-      <artifactId>bndlib</artifactId>
-      <scope>provided</scope>
-    </dependency>
-
-  </dependencies>
+    </dependencies>
 
 </project>

Added: 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=1577192&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java (added)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/EmbeddedSolrServerConfiguration.java Thu Mar 13 15:20:59 2014
@@ -0,0 +1,99 @@
+/*
+ * 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;
+
+import org.apache.jackrabbit.oak.plugins.index.solr.server.EmbeddedSolrServerProvider;
+
+/**
+ * Configuration parameters for starting a {@link org.apache.solr.client.solrj.SolrServer}
+ */
+public class EmbeddedSolrServerConfiguration extends SolrServerConfiguration<EmbeddedSolrServerProvider> {
+
+    private final String solrHomePath;
+    private final String solrConfigPath;
+    private final String coreName;
+    private HttpConfiguration httpConfiguration;
+
+    public EmbeddedSolrServerConfiguration(String solrHomePath, String solrConfigPath, String coreName) {
+        this.solrHomePath = solrHomePath;
+        this.solrConfigPath = solrConfigPath;
+        this.coreName = coreName;
+    }
+
+    public EmbeddedSolrServerConfiguration withHttpConfiguration(String context, Integer httpPort) {
+        if (context != null && context.length() > 0 && httpPort != null && httpPort > 0) {
+            this.httpConfiguration = new HttpConfiguration(context, httpPort);
+        }
+        return this;
+    }
+
+    /**
+     * get the Solr home path where all the configuration files are stored
+     *
+     * @return a <code>String</code> representing a path to the Solr home.
+     */
+    public String getSolrHomePath() {
+        return solrHomePath;
+    }
+
+    /**
+     * get the name of the main Solr configuration file (solr.xml for multicore
+     * deployments or solrconfig.xml for single core deployments).
+     *
+     * @return a <code>String</code> representing a path to the main Solr config file.
+     */
+    public String getSolrConfigPath() {
+        return solrConfigPath;
+    }
+
+    /**
+     * get the default core name to use for the Solr server
+     *
+     * @return a <code>String</code> representing the core name
+     */
+    public String getCoreName() {
+        return coreName;
+    }
+
+    /**
+     * get the {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.EmbeddedSolrServerConfiguration.HttpConfiguration} holding parameters for enabling Solr
+     * server with HTTP bindings
+     *
+     * @return a {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.EmbeddedSolrServerConfiguration.HttpConfiguration} or <code>null</code> if not set
+     */
+    public HttpConfiguration getHttpConfiguration() {
+        return httpConfiguration;
+    }
+
+    public class HttpConfiguration {
+        private String context;
+        private Integer httpPort;
+
+        HttpConfiguration(String context, Integer httpPort) {
+            this.context = context;
+            this.httpPort = httpPort;
+        }
+
+        public String getContext() {
+            return context;
+        }
+
+        public Integer getHttpPort() {
+            return httpPort;
+        }
+    }
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/OakSolrNodeStateConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/OakSolrNodeStateConfiguration.java?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/OakSolrNodeStateConfiguration.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/OakSolrNodeStateConfiguration.java Thu Mar 13 15:20:59 2014
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.index.solr.server.EmbeddedSolrServerProvider;
 import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
@@ -30,7 +31,7 @@ import org.apache.jackrabbit.oak.spi.sta
  * Subclasses of this should at least provide the {@link org.apache.jackrabbit.oak.spi.state.NodeState} which holds
  * the configuration.
  */
-public abstract class OakSolrNodeStateConfiguration implements OakSolrConfiguration, SolrServerConfigurationProvider {
+public abstract class OakSolrNodeStateConfiguration implements OakSolrConfiguration, SolrServerConfigurationProvider<EmbeddedSolrServerProvider> {
 
     /**
      * get the {@link org.apache.jackrabbit.oak.spi.state.NodeState} which contains the properties for the Oak -
@@ -50,11 +51,6 @@ public abstract class OakSolrNodeStateCo
     }
 
     @Override
-    public String getFieldForPropertyRestriction(Filter.PropertyRestriction propertyRestriction) {
-        return null;
-    }
-
-    @Override
     public String getPathField() {
         return getStringValueFor(Properties.PATH_FIELD, SolrServerConfigurationDefaults.PATH_FIELD_NAME);
     }
@@ -94,6 +90,11 @@ public abstract class OakSolrNodeStateCo
     }
 
     @Override
+    public String getFieldForPropertyRestriction(Filter.PropertyRestriction propertyRestriction) {
+        return null;
+    }
+
+    @Override
     public CommitPolicy getCommitPolicy() {
         return CommitPolicy.valueOf(getStringValueFor(Properties.COMMIT_POLICY, CommitPolicy.SOFT.toString()));
     }
@@ -114,7 +115,7 @@ public abstract class OakSolrNodeStateCo
     }
 
     @Override
-    public SolrServerConfiguration getSolrServerConfiguration() {
+    public SolrServerConfiguration<EmbeddedSolrServerProvider> getSolrServerConfiguration() {
         String solrHomePath = getStringValueFor(Properties.SOLRHOME_PATH, SolrServerConfigurationDefaults.SOLR_HOME_PATH);
         String solrConfigPath = getStringValueFor(Properties.SOLRCONFIG_PATH, SolrServerConfigurationDefaults.SOLR_CONFIG_PATH);
         String coreName = getStringValueFor(Properties.CORE_NAME, SolrServerConfigurationDefaults.CORE_NAME);
@@ -122,7 +123,7 @@ public abstract class OakSolrNodeStateCo
         String context = getStringValueFor(Properties.CONTEXT, SolrServerConfigurationDefaults.CONTEXT);
         Integer httpPort = Integer.valueOf(getStringValueFor(Properties.HTTP_PORT, SolrServerConfigurationDefaults.HTTP_PORT));
 
-        return new SolrServerConfiguration(solrHomePath,
+        return new EmbeddedSolrServerConfiguration(solrHomePath,
                 solrConfigPath, coreName).withHttpConfiguration(context, httpPort);
     }
 

Added: 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=1577192&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java (added)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/RemoteSolrServerConfiguration.java Thu Mar 13 15:20:59 2014
@@ -0,0 +1,65 @@
+/*
+ * 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;
+
+import org.apache.jackrabbit.oak.plugins.index.solr.server.RemoteSolrServerProvider;
+
+/**
+ * {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration} for the {@link org.apache.jackrabbit.oak.plugins.index.solr.server.RemoteSolrServerProvider}
+ */
+public class RemoteSolrServerConfiguration extends SolrServerConfiguration<RemoteSolrServerProvider> {
+
+    private final String solrConfDir;
+    private final String[] solrHttpUrls;
+    private final String solrZkHost;
+    private final String solrCollection;
+    private final int solrShardsNo;
+    private final int solrReplicationFactor;
+
+    public RemoteSolrServerConfiguration(String solrZkHost, String solrCollection, int solrShardsNo, int solrReplicationFactor, String solrConfDir, String... solrHttpUrls) {
+        this.solrHttpUrls = solrHttpUrls;
+        this.solrZkHost = solrZkHost;
+        this.solrCollection = solrCollection;
+        this.solrShardsNo = solrShardsNo;
+        this.solrConfDir = solrConfDir;
+        this.solrReplicationFactor = solrReplicationFactor;
+    }
+
+    public String[] getSolrHttpUrls() {
+        return solrHttpUrls;
+    }
+
+    public String getSolrZkHost() {
+        return solrZkHost;
+    }
+
+    public String getSolrCollection() {
+        return solrCollection;
+    }
+
+    public int getSolrShardsNo() {
+        return solrShardsNo;
+    }
+
+    public int getSolrReplicationFactor() {
+        return solrReplicationFactor;
+    }
+
+    public String getSolrConfDir() {
+        return solrConfDir;
+    }
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfiguration.java?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfiguration.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfiguration.java Thu Mar 13 15:20:59 2014
@@ -16,82 +16,50 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.configuration;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
+
 /**
  * Configuration parameters for starting a {@link org.apache.solr.client.solrj.SolrServer}
  */
-public class SolrServerConfiguration {
+public abstract class SolrServerConfiguration<S extends SolrServerProvider> {
 
-    private final String solrHomePath;
-    private final String solrConfigPath;
-    private final String coreName;
-    private HttpConfiguration httpConfiguration;
-
-    public SolrServerConfiguration(String solrHomePath, String solrConfigPath, String coreName) {
-        this.solrHomePath = solrHomePath;
-        this.solrConfigPath = solrConfigPath;
-        this.coreName = coreName;
-    }
+    private final Type type;
+    private volatile Constructor<?> constructor;
 
-    public SolrServerConfiguration withHttpConfiguration(String context, Integer httpPort) {
-        if (context != null && context.length() > 0 && httpPort != null && httpPort > 0) {
-            this.httpConfiguration = new HttpConfiguration(context, httpPort);
+    protected SolrServerConfiguration() {
+        Type superclass = getClass().getGenericSuperclass();
+        if (superclass instanceof Class) {
+            throw new RuntimeException("Missing type parameter.");
         }
-        return this;
-    }
-
-    /**
-     * get the Solr home path where all the configuration files are stored
-     *
-     * @return a <code>String</code> representing a path to the Solr home.
-     */
-    public String getSolrHomePath() {
-        return solrHomePath;
+        this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
     }
 
-    /**
-     * get the name of the main Solr configuration file (solr.xml for multicore
-     * deployments or solrconfig.xml for single core deployments).
-     *
-     * @return a <code>String</code> representing a path to the main Solr config file.
-     */
-    public String getSolrConfigPath() {
-        return solrConfigPath;
+    public Type getType() {
+        return this.type;
     }
 
-    /**
-     * get the default core name to use for the Solr server
-     *
-     * @return a <code>String</code> representing the core name
-     */
-    public String getCoreName() {
-        return coreName;
-    }
-
-    /**
-     * get the {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration.HttpConfiguration} holding parameters for enabling Solr
-     * server with HTTP bindings
-     *
-     * @return a {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration.HttpConfiguration} or <code>null</code> if not set
-     */
-    public HttpConfiguration getHttpConfiguration() {
-        return httpConfiguration;
-    }
-
-    public class HttpConfiguration {
-        private String context;
-        private Integer httpPort;
-
-        HttpConfiguration(String context, Integer httpPort) {
-            this.context = context;
-            this.httpPort = httpPort;
-        }
-
-        public String getContext() {
-            return context;
-        }
-
-        public Integer getHttpPort() {
-            return httpPort;
+    public S newInstance()
+            throws NoSuchMethodException, IllegalAccessException,
+            InvocationTargetException, InstantiationException {
+        if (constructor == null) {
+            Class<?> rawType = type instanceof Class<?>
+                    ? (Class<?>) type
+                    : (Class<?>) ((ParameterizedType) type).getRawType();
+            Constructor<?>[] constructors = rawType.getConstructors();
+            for (Constructor<?> c: constructors) {
+                if (c.getParameterTypes().length == 1 && c.getParameterTypes()[0].equals(this.getClass())) {
+                    constructor = c;
+                }
+            }
+            if (constructor == null) {
+                throw new InstantiationException("missing constructor SolrServerProvider(SolrServerConfiguration) for type "+ rawType);
+            }
         }
+        return (S) constructor.newInstance(this); // TODO : each SolrServerProvider impl. is forced to have a constructor with a SolrServerConfiguration, fix?
     }
+
 }

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationProvider.java?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationProvider.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/SolrServerConfigurationProvider.java Thu Mar 13 15:20:59 2014
@@ -16,16 +16,18 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.configuration;
 
+import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
+
 /**
  * {@link org.apache.solr.client.solrj.SolrServer} configuration provider.
  */
-public interface SolrServerConfigurationProvider {
+public interface SolrServerConfigurationProvider<S extends SolrServerProvider> {
 
     /**
-     * Provide a {@lin SolrServerConfiguration} to be used to initialize a specific
+     * Provide a {@link SolrServerConfiguration} to be used to initialize a specific
      * {@link org.apache.solr.client.solrj.SolrServer} implementation.
      *
      * @return the {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration} holding the configuration parameters
      */
-    public SolrServerConfiguration getSolrServerConfiguration();
+    public SolrServerConfiguration<S> getSolrServerConfiguration();
 }

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/package-info.java?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/configuration/package-info.java Thu Mar 13 15:20:59 2014
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("0.16")
+@Version("0.17")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.plugins.index.solr.configuration;
 

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java Thu Mar 13 15:20:59 2014
@@ -23,8 +23,8 @@ import org.apache.jackrabbit.oak.api.Typ
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditor;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
+import org.apache.jackrabbit.oak.plugins.index.solr.configuration.CommitPolicy;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
-import org.apache.jackrabbit.oak.plugins.index.solr.util.OakSolrUtils;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -111,8 +111,7 @@ public class SolrIndexEditor implements 
 
         if (parent == null) {
             try {
-                OakSolrUtils.commitByPolicy(
-                        solrServer,  configuration.getCommitPolicy());
+                commitByPolicy(solrServer, configuration.getCommitPolicy());
             } catch (SolrServerException e) {
                 throw new CommitFailedException(
                         "Solr", 3, "Failed to commit changes to Solr", e);
@@ -123,6 +122,22 @@ public class SolrIndexEditor implements 
         }
     }
 
+    private void commitByPolicy(SolrServer solrServer, CommitPolicy commitPolicy) throws IOException, SolrServerException {
+        switch (commitPolicy) {
+            case HARD: {
+                solrServer.commit();
+                break;
+            }
+            case SOFT: {
+                solrServer.commit(false, false, true);
+                break;
+            }
+            case AUTO: {
+                break;
+            }
+        }
+    }
+
     @Override
     public void propertyAdded(PropertyState after) {
         propertiesChanged = true;

Added: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/EmbeddedSolrServerConfigurationProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/EmbeddedSolrServerConfigurationProvider.java?rev=1577192&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/EmbeddedSolrServerConfigurationProvider.java (added)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/EmbeddedSolrServerConfigurationProvider.java Thu Mar 13 15:20:59 2014
@@ -0,0 +1,96 @@
+/*
+ * 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 java.io.File;
+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.Service;
+import org.apache.jackrabbit.oak.plugins.index.solr.configuration.EmbeddedSolrServerConfiguration;
+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.EmbeddedSolrServerProvider;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * An OSGi service {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationProvider}
+ */
+@Component(metatype = true, immediate = true,
+        label = "Oak Solr embedded server configuration")
+@Service(value = SolrServerConfigurationProvider.class)
+@Property(name = "name", value = "embedded", propertyPrivate = true)
+public class EmbeddedSolrServerConfigurationProvider implements SolrServerConfigurationProvider<EmbeddedSolrServerProvider> {
+
+    @Property(value = SolrServerConfigurationDefaults.SOLR_HOME_PATH)
+    private static final String SOLR_HOME_PATH = "solr.home.path";
+
+    @Property(value = SolrServerConfigurationDefaults.CORE_NAME)
+    private static final String SOLR_CORE_NAME = "solr.core.name";
+
+    @Property(value = SolrServerConfigurationDefaults.SOLR_CONFIG_PATH)
+    private static final String SOLR_CONFIG_FILE = "solr.config.path";
+
+    @Property(value = SolrServerConfigurationDefaults.HTTP_PORT)
+    private static final String SOLR_HTTP_PORT = "solr.http.port";
+
+    @Property(value = SolrServerConfigurationDefaults.CONTEXT)
+    private static final String SOLR_CONTEXT = "solr.context";
+
+    private String solrHome;
+    private String solrConfigFile;
+    private String solrCoreName;
+
+    private Integer solrHttpPort;
+    private String solrContext;
+
+    private SolrServerConfiguration<EmbeddedSolrServerProvider> solrServerConfiguration;
+
+
+    @Activate
+    protected void activate(ComponentContext componentContext) throws Exception {
+        solrHome = String.valueOf(componentContext.getProperties().get(SOLR_HOME_PATH));
+        File file = new File(solrHome);
+        if (!file.exists()) {
+            assert file.createNewFile();
+        }
+        solrConfigFile = String.valueOf(componentContext.getProperties().get(SOLR_CONFIG_FILE));
+        solrCoreName = String.valueOf(componentContext.getProperties().get(SOLR_CORE_NAME));
+
+        solrHttpPort = Integer.valueOf(String.valueOf(componentContext.getProperties().get(SOLR_HTTP_PORT)));
+        solrContext = String.valueOf(componentContext.getProperties().get(SOLR_CONTEXT));
+
+        solrServerConfiguration = new EmbeddedSolrServerConfiguration(solrHome, solrConfigFile, solrCoreName).
+                withHttpConfiguration(solrContext, solrHttpPort);
+    }
+
+    @Deactivate
+    protected void deactivate() throws Exception {
+        solrHome = null;
+        solrHttpPort = null;
+        solrConfigFile = null;
+        solrCoreName = null;
+        solrContext = null;
+    }
+
+    @Override
+    public SolrServerConfiguration<EmbeddedSolrServerProvider> getSolrServerConfiguration() {
+        return solrServerConfiguration;
+    }
+}

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

Added: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/OakSolrConfigurationProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/OakSolrConfigurationProviderService.java?rev=1577192&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/OakSolrConfigurationProviderService.java (added)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/OakSolrConfigurationProviderService.java Thu Mar 13 15:20:59 2014
@@ -0,0 +1,145 @@
+/*
+ * 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 org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.PropertyOption;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.plugins.index.solr.configuration.CommitPolicy;
+import org.apache.jackrabbit.oak.plugins.index.solr.configuration.DefaultSolrConfiguration;
+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.spi.query.Filter;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * OSGi service for {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider}
+ */
+@Component(label = "Oak Solr indexing / search configuration", metatype = true, immediate = true)
+@Service(OakSolrConfigurationProvider.class)
+public class OakSolrConfigurationProviderService implements OakSolrConfigurationProvider {
+
+    private static final String DEFAULT_DESC_FIELD = "path_des";
+    private static final String DEFAULT_CHILD_FIELD = "path_child";
+    private static final String DEFAULT_PARENT_FIELD = "path_anc";
+    private static final String DEFAULT_PATH_FIELD = "path_exact";
+    private static final String DEFAULT_CATCHALL_FIELD = "catch_all";
+
+    @Property(value = DEFAULT_DESC_FIELD, label = "field for descendants search")
+    private static final String PATH_DESCENDANTS_FIELD = "path.desc.field";
+
+    @Property(value = DEFAULT_CHILD_FIELD, label = "field for children search")
+    private static final String PATH_CHILDREN_FIELD = "path.child.field";
+
+    @Property(value = DEFAULT_PARENT_FIELD, label = "field for parent search")
+    private static final String PATH_PARENT_FIELD = "path.parent.field";
+
+    @Property(value = DEFAULT_PATH_FIELD, label = "field for path search")
+    private static final String PATH_EXACT_FIELD = "path.exact.field";
+
+    @Property(value = DEFAULT_CATCHALL_FIELD,label = "catch all field")
+    private static final String CATCH_ALL_FIELD = "catch.all.field";
+
+    @Property(options = {
+            @PropertyOption(name = "HARD",
+                    value = "Hard commit"
+            ),
+            @PropertyOption(name = "SOFT",
+                    value = "Soft commit"
+            ),
+            @PropertyOption(name = "AUTO",
+                    value = "Auto commit"
+            )},
+            value = "SOFT"
+    )
+    private static final String COMMIT_POLICY = "commit.policy";
+
+    private String pathChildrenFieldName;
+    private String pathParentFieldName;
+    private String pathDescendantsFieldName;
+    private String pathExactFieldName;
+    private String catchAllField;
+    private CommitPolicy commitPolicy;
+
+    private OakSolrConfiguration oakSolrConfiguration;
+
+  @Activate
+    protected void activate(ComponentContext componentContext) throws Exception {
+        pathChildrenFieldName = String.valueOf(componentContext.getProperties().get(PATH_CHILDREN_FIELD));
+        pathParentFieldName = String.valueOf(componentContext.getProperties().get(PATH_PARENT_FIELD));
+        pathExactFieldName = String.valueOf(componentContext.getProperties().get(PATH_EXACT_FIELD));
+        pathDescendantsFieldName = String.valueOf(componentContext.getProperties().get(PATH_DESCENDANTS_FIELD));
+        catchAllField = String.valueOf(componentContext.getProperties().get(CATCH_ALL_FIELD));
+        commitPolicy = CommitPolicy.valueOf(String.valueOf(componentContext.getProperties().get(COMMIT_POLICY)));
+    }
+
+    @Override
+    public OakSolrConfiguration getConfiguration() {
+        if (oakSolrConfiguration == null) {
+            // extend DefaultOakSolrConfiguration
+            oakSolrConfiguration = new DefaultSolrConfiguration() {
+
+                @Override
+                public String getPathField() {
+                    return pathExactFieldName;
+                }
+
+                @Override
+                public String getFieldForPathRestriction(Filter.PathRestriction pathRestriction) {
+                    String fieldName = null;
+                    switch (pathRestriction) {
+                        case ALL_CHILDREN: {
+                            fieldName = pathDescendantsFieldName;
+                            break;
+                        }
+                        case DIRECT_CHILDREN: {
+                            fieldName = pathChildrenFieldName;
+                            break;
+                        }
+                        case EXACT: {
+                            fieldName = pathExactFieldName;
+                            break;
+                        }
+                        case PARENT: {
+                            fieldName = pathParentFieldName;
+                            break;
+                        }
+                        case NO_RESTRICTION:
+                            break;
+                        default:
+                            break;
+
+                    }
+                    return fieldName;
+                }
+
+                @Override
+                public CommitPolicy getCommitPolicy() {
+                    return commitPolicy;
+                }
+
+                @Override
+                public String getCatchAllField() {
+                    return catchAllField;
+                }
+            };
+        }
+        return oakSolrConfiguration;
+    }
+}

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

Added: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/RemoteSolrServerConfigurationProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/RemoteSolrServerConfigurationProvider.java?rev=1577192&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/RemoteSolrServerConfigurationProvider.java (added)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/RemoteSolrServerConfigurationProvider.java Thu Mar 13 15:20:59 2014
@@ -0,0 +1,96 @@
+/*
+ * 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 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.Service;
+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.SolrServerConfigurationProvider;
+import org.apache.jackrabbit.oak.plugins.index.solr.server.RemoteSolrServerProvider;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * {@link org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider} for remote Solr installations.
+ */
+@Component(metatype = true, immediate = true, label = "Oak Solr remote server configuration")
+@Service(SolrServerConfigurationProvider.class)
+@Property(name = "name", value = "remote", propertyPrivate = true)
+public class RemoteSolrServerConfigurationProvider implements SolrServerConfigurationProvider<RemoteSolrServerProvider> {
+
+    private static final String DEFAULT_COLLECTION = "oak";
+    private static final String DEFAULT_HTTP_URL = "";
+    private static final String DEFAULT_ZK_HOST = "";
+    private static final int DEFAULT_SHARDS_NO = 2;
+    private static final int DEFAULT_REPLICATION_FACTOR = 2;
+
+    @Property(value = DEFAULT_HTTP_URL, label = "Solr HTTP URL")
+    private static final String SOLR_HTTP_URL = "solr.http.url";
+
+    @Property(value = DEFAULT_ZK_HOST, label = "ZooKeeper host")
+    private static final String SOLR_ZK_HOST = "solr.zk.host";
+
+    @Property(value = DEFAULT_COLLECTION, label = "Solr collection")
+    private static final String SOLR_COLLECTION = "solr.collection";
+
+    @Property(intValue = DEFAULT_SHARDS_NO, label = "No. of collection shards")
+    private static final String SOLR_SHARDS_NO = "solr.shards.no";
+
+    @Property(intValue = DEFAULT_REPLICATION_FACTOR, label = "Replication factor")
+    private static final String SOLR_REPLICATION_FACTOR = "solr.replication.factor";
+
+    @Property(value = "", label = "Solr configuration directory")
+    private static final String SOLR_CONF_DIR = "solr.conf.dir";
+
+    private String solrHttpUrl;
+    private String solrZkHost;
+    private String solrCollection;
+    private int solrShardsNo;
+    private int solrReplicationFactor;
+    private String solrConfDir;
+    private RemoteSolrServerConfiguration remoteSolrServerConfiguration;
+
+    @Activate
+    protected void activate(ComponentContext componentContext) throws Exception {
+        solrHttpUrl = String.valueOf(componentContext.getProperties().get(SOLR_HTTP_URL));
+        solrZkHost = String.valueOf(componentContext.getProperties().get(SOLR_ZK_HOST));
+        solrCollection = String.valueOf(componentContext.getProperties().get(SOLR_COLLECTION));
+        solrShardsNo = Integer.valueOf(componentContext.getProperties().get(SOLR_SHARDS_NO).toString());
+        solrReplicationFactor = Integer.valueOf(componentContext.getProperties().get(SOLR_REPLICATION_FACTOR).toString());
+        solrConfDir = String.valueOf(componentContext.getProperties().get(SOLR_CONF_DIR));
+        remoteSolrServerConfiguration = new RemoteSolrServerConfiguration(solrZkHost, solrCollection, solrShardsNo, solrReplicationFactor, solrConfDir, solrHttpUrl);
+    }
+
+    @Deactivate
+    protected void deactivate() throws Exception {
+        solrHttpUrl = null;
+        solrZkHost = null;
+        solrCollection = null;
+        solrShardsNo = 0;
+        solrReplicationFactor = 0;
+        solrConfDir = null;
+    }
+
+
+    @Override
+    public SolrServerConfiguration<RemoteSolrServerProvider> getSolrServerConfiguration() {
+        return remoteSolrServerConfiguration;
+    }
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java Thu Mar 13 15:20:59 2014
@@ -33,32 +33,29 @@ import org.apache.jackrabbit.oak.spi.sta
 
 /**
  * Osgi Service that provides Solr based {@link org.apache.jackrabbit.oak.plugins.index.IndexEditor}s
- * 
+ *
  * @see org.apache.jackrabbit.oak.plugins.index.solr.index.SolrIndexEditorProvider
  * @see org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider
  */
 @Component(metatype = false, immediate = true)
 @Service(value = IndexEditorProvider.class)
 public class SolrIndexEditorProviderService implements IndexEditorProvider {
-    
+
     @Reference
     private SolrServerProvider solrServerProvider;
 
     @Reference
     private OakSolrConfigurationProvider oakSolrConfigurationProvider;
 
-    private SolrIndexEditorProvider solrIndexEditorProvider;
-
     @Override
     @CheckForNull
-    public Editor getIndexEditor(@Nonnull String type, @Nonnull NodeBuilder definition, 
-                    @Nonnull NodeState root, @Nonnull IndexUpdateCallback callback) throws CommitFailedException {
-        Editor indexEditor = null;
-        if (solrServerProvider != null && oakSolrConfigurationProvider != null && solrIndexEditorProvider == null) {
-            solrIndexEditorProvider = new SolrIndexEditorProvider(solrServerProvider, oakSolrConfigurationProvider);
-            indexEditor = solrIndexEditorProvider.getIndexEditor(type, definition, root, callback);
+    public Editor getIndexEditor(@Nonnull String type, @Nonnull NodeBuilder definition,
+                                 @Nonnull NodeState root, @Nonnull IndexUpdateCallback callback) throws CommitFailedException {
+        if (solrServerProvider != null && oakSolrConfigurationProvider != null) {
+            return new SolrIndexEditorProvider(solrServerProvider,
+                    oakSolrConfigurationProvider).getIndexEditor(type, definition, root, callback);
+        } else {
+            return null;
         }
-        return indexEditor;
     }
-
 }

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=1577192&r1=1577191&r2=1577192&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 Thu Mar 13 15:20:59 2014
@@ -31,7 +31,7 @@ import org.apache.jackrabbit.oak.spi.sta
 
 /**
  * Osgi Service that provides Solr based {@link org.apache.jackrabbit.oak.spi.query.QueryIndex}es
- * 
+ *
  * @see org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndexProvider
  * @see QueryIndexProvider
  */
@@ -45,19 +45,15 @@ public class SolrQueryIndexProviderServi
     @Reference
     private OakSolrConfigurationProvider oakSolrConfigurationProvider;
 
-    private SolrQueryIndexProvider solrQueryIndexProvider;
-
     @Override
     @Nonnull
     public List<? extends QueryIndex> getQueryIndexes(NodeState nodeState) {
-        List<? extends QueryIndex> queryIndexes = new ArrayList<QueryIndex>();
-        if (solrServerProvider != null && oakSolrConfigurationProvider != null
-                        && solrQueryIndexProvider == null) {
-            solrQueryIndexProvider = new SolrQueryIndexProvider(solrServerProvider,
-                            oakSolrConfigurationProvider);
-            queryIndexes = solrQueryIndexProvider.getQueryIndexes(nodeState);
+        if (solrServerProvider != null && oakSolrConfigurationProvider != null) {
+            return new SolrQueryIndexProvider(solrServerProvider,
+                    oakSolrConfigurationProvider).getQueryIndexes(nodeState);
+        } else {
+            return new ArrayList<QueryIndex>();
         }
-        return queryIndexes;
     }
 
 }

Added: 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=1577192&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java (added)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrServerProviderService.java Thu Mar 13 15:20:59 2014
@@ -0,0 +1,132 @@
+package org.apache.jackrabbit.oak.plugins.index.solr.osgi;
+
+import java.util.HashMap;
+import java.util.Map;
+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.PropertyOption;
+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.References;
+import org.apache.felix.scr.annotations.Service;
+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.server.SolrServerProvider;
+import org.apache.solr.client.solrj.SolrServer;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * OSGi service for {@link org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider}
+ */
+@Component(metatype = true, label = "Oak Solr server provider", immediate = true)
+@References({
+        @Reference(name = "solrServerConfigurationProvider",
+                referenceInterface = SolrServerConfigurationProvider.class,
+                cardinality = ReferenceCardinality.MANDATORY_MULTIPLE,
+                policy = ReferencePolicy.DYNAMIC,
+                bind = "bindSolrServerConfigurationProvider",
+                unbind = "unbindSolrServerConfigurationProvider",
+                updated = "updateSolrServerConfigurationProvider"
+        )
+})
+@Service(SolrServerProvider.class)
+public class SolrServerProviderService implements SolrServerProvider {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Property(options = {
+            @PropertyOption(name = "none",
+                    value = "None"
+            ),
+            @PropertyOption(name = "embedded",
+                    value = "Embedded Solr"
+            ),
+            @PropertyOption(name = "remote",
+                    value = "Remote Solr"
+            )},
+            value = "none"
+    )
+    private static final String SERVER_TYPE = "server.type";
+
+    private final Map<String, SolrServerConfigurationProvider> solrServerConfigurationProviders = new HashMap<String, SolrServerConfigurationProvider>();
+
+    private String serverType;
+
+    private SolrServer cachedSolrServer;
+
+    private SolrServerConfiguration cachedSolrServerConfiguration;
+
+    @Activate
+    protected void activate(ComponentContext context) throws Exception {
+        serverType = String.valueOf(context.getProperties().get(SERVER_TYPE));
+    }
+
+    @Deactivate
+    protected void deactivate() throws Exception {
+        solrServerConfigurationProviders.clear();
+        if (cachedSolrServer != null) {
+            try {
+                cachedSolrServer.shutdown();
+            } catch (Exception e) {
+                log.error("could not correctly shutdown Solr {} server {}", serverType, cachedSolrServer);
+            } finally {
+                cachedSolrServer = null;
+            }
+        }
+    }
+
+    protected void bindSolrServerConfigurationProvider(final SolrServerConfigurationProvider solrServerConfigurationProvider, Map<String, Object> properties) {
+        synchronized (solrServerConfigurationProviders) {
+            String name = String.valueOf(properties.get("name"));
+            solrServerConfigurationProviders.put(name, solrServerConfigurationProvider);
+        }
+    }
+
+    protected void unbindSolrServerConfigurationProvider(final SolrServerConfigurationProvider solrServerConfigurationProvider, Map<String, Object> properties) {
+        synchronized (solrServerConfigurationProviders) {
+            String name = String.valueOf(properties.get("name"));
+            solrServerConfigurationProviders.remove(name);
+        }
+    }
+
+    protected void updatedSolrServerConfigurationProvider(final SolrServerConfigurationProvider solrServerConfigurationProvider, Map<String, Object> properties) {
+        synchronized (solrServerConfigurationProviders) {
+            String name = String.valueOf(properties.get("name"));
+            solrServerConfigurationProviders.put(name, solrServerConfigurationProvider);
+        }
+    }
+
+    @Override
+    public SolrServer getSolrServer() throws Exception {
+        SolrServer solrServer = null;
+        synchronized (solrServerConfigurationProviders) {
+            if (serverType != null && !"none".equals(serverType)) {
+                SolrServerConfigurationProvider solrServerConfigurationProvider = solrServerConfigurationProviders.get(serverType);
+                try {
+                    if (solrServerConfigurationProvider != null) {
+                        SolrServerConfiguration solrServerConfiguration = solrServerConfigurationProvider.getSolrServerConfiguration();
+                        if (solrServerConfiguration != cachedSolrServerConfiguration) {
+                            SolrServerProvider solrServerProvider = solrServerConfiguration.newInstance();
+                            cachedSolrServerConfiguration = solrServerConfiguration;
+                            if (cachedSolrServer != null) {
+                                cachedSolrServer.shutdown();
+                            }
+                            cachedSolrServer = solrServerProvider.getSolrServer();
+                        } else {
+                            solrServer = cachedSolrServer;
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("could not get a SolrServerProvider of type {}, {}", serverType, e);
+                }
+            }
+        }
+        return solrServer;
+    }
+
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java?rev=1577192&r1=1577191&r2=1577192&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java Thu Mar 13 15:20:59 2014
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.util.Collection;
 import javax.annotation.CheckForNull;
+import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
@@ -68,7 +69,8 @@ public class SolrQueryIndex implements F
 
     @Override
     public double getCost(Filter filter, NodeState root) {
-        if (filter.getFullTextConstraint() == null && filter.getFulltextConditions() == null) {
+        if (filter.getFullTextConstraint() == null && filter.getFulltextConditions() == null ||
+                (filter.getPropertyRestrictions() != null && filter.getPropertyRestrictions().size() == 1 && filter.getPropertyRestriction(JcrConstants.JCR_UUID) != null)) {
             return Double.POSITIVE_INFINITY;
         }
         int cost = 10;
@@ -213,10 +215,13 @@ public class SolrQueryIndex implements F
 
     private void setDefaults(SolrQuery solrQuery) {
         solrQuery.setParam("q.op", "AND");
-        solrQuery.setParam("df", configuration.getCatchAllField());
+        String catchAllField = configuration.getCatchAllField();
+        if (catchAllField != null && catchAllField.length() > 0) {
+            solrQuery.setParam("df", catchAllField);
+        }
 
         // TODO : can we handle this better? e.g. with deep paging support?
-        solrQuery.setParam("rows", String.valueOf(Integer.MAX_VALUE));
+        solrQuery.setParam("rows", "100000");
     }
 
     private static String createRangeQuery(String first, String last, boolean firstIncluding, boolean lastIncluding) {

Added: 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=1577192&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java (added)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/EmbeddedSolrServerProvider.java Thu Mar 13 15:20:59 2014
@@ -0,0 +1,215 @@
+/*
+ * 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.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import org.apache.jackrabbit.oak.commons.IOUtils;
+import org.apache.jackrabbit.oak.plugins.index.solr.configuration.EmbeddedSolrServerConfiguration;
+import org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfigurationDefaults;
+import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.client.solrj.impl.HttpSolrServer;
+import org.apache.solr.core.CoreContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Default implementation of {@link org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider} which uses an
+ * {@link EmbeddedSolrServer} configured as per passed {@link org.apache.jackrabbit.oak.plugins.index.solr.configuration.SolrServerConfiguration}.
+ */
+public class EmbeddedSolrServerProvider implements SolrServerProvider {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private final EmbeddedSolrServerConfiguration solrServerConfiguration;
+
+    public EmbeddedSolrServerProvider(EmbeddedSolrServerConfiguration solrServerConfiguration) {
+        this.solrServerConfiguration = solrServerConfiguration;
+    }
+
+    private SolrServer solrServer;
+
+    private SolrServer createSolrServer() throws Exception {
+
+        String solrHomePath = solrServerConfiguration.getSolrHomePath();
+        String coreName = solrServerConfiguration.getCoreName();
+        String solrConfigPath = solrServerConfiguration.getSolrConfigPath();
+        EmbeddedSolrServerConfiguration.HttpConfiguration httpConfiguration = solrServerConfiguration.getHttpConfiguration();
+
+
+        if (solrConfigPath != null && solrHomePath != null && coreName != null) {
+            checkSolrConfiguration(solrHomePath, solrConfigPath, coreName);
+            if (httpConfiguration != null) {
+                if (log.isInfoEnabled()) {
+                    log.info("starting embedded Solr server with http bindings");
+                }
+                ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+                Thread.currentThread().setContextClassLoader(JettySolrRunner.class.getClassLoader());
+
+                Integer httpPort = httpConfiguration.getHttpPort();
+                String context = httpConfiguration.getContext();
+                JettySolrRunner jettySolrRunner = null;
+                try {
+                    jettySolrRunner = new JettySolrRunner(solrHomePath, context, httpPort, "solrconfig.xml", "schema.xml", true);
+                    if (log.isInfoEnabled()) {
+                        log.info("Jetty runner instantiated");
+                    }
+                    jettySolrRunner.start(true);
+                    if (log.isInfoEnabled()) {
+                        log.info("Jetty runner started");
+                    }
+                } catch (Exception t) {
+                    if (log.isErrorEnabled()) {
+                        log.error("an error has occurred while starting Solr Jetty", t);
+                    }
+                } finally {
+                    if (jettySolrRunner != null && !jettySolrRunner.isRunning()) {
+                        try {
+                            jettySolrRunner.stop();
+                            if (log.isInfoEnabled()) {
+                                log.info("Jetty runner stopped");
+                            }
+                        } catch (Exception e) {
+                            if (log.isErrorEnabled()) {
+                                log.error("error while stopping the Jetty runner", e);
+                            }
+                        }
+                    }
+                    Thread.currentThread().setContextClassLoader(classLoader);
+                }
+                if (log.isInfoEnabled()) {
+                    log.info("starting HTTP Solr server");
+                }
+                HttpSolrServer httpSolrServer = new HttpSolrServer(new StringBuilder(
+                        SolrServerConfigurationDefaults.LOCAL_BASE_URL).append(':')
+                        .append(httpPort).append(context)
+                        .append('/').append(coreName)
+                        .toString());
+                return httpSolrServer;
+            } else {
+                ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+                Thread.currentThread().setContextClassLoader(CoreContainer.class.getClassLoader());
+
+                CoreContainer coreContainer = new CoreContainer(solrHomePath);
+                try {
+                    coreContainer.load();
+                } finally {
+                    Thread.currentThread().setContextClassLoader(classLoader);
+                }
+
+                EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, coreName);
+                if (server.ping().getStatus() == 0) {
+                    return server;
+                } else {
+                    throw new IOException("the embedded Solr server is not alive");
+                }
+            }
+        } else {
+            throw new Exception("SolrServer configuration proprties not set");
+        }
+    }
+
+    private void checkSolrConfiguration(String solrHomePath, String solrConfigPath, String coreName) throws IOException {
+
+        // check if solrHomePath exists
+        File solrHomePathFile = new File(solrHomePath);
+        if (!solrHomePathFile.exists()) {
+            if (!solrHomePathFile.mkdirs()) {
+                throw new IOException("could not create solrHomePath directory");
+            } else {
+                // 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 coreDir = solrHomePath + "/" + coreName + "/conf/";
+                copy("/solr/oak/conf/currency.xml", coreDir);
+                copy("/solr/oak/conf/schema.xml", coreDir);
+                copy("/solr/oak/conf/solrconfig.xml", coreDir);
+            }
+        } else if (!solrHomePathFile.isDirectory()) {
+            throw new IOException("a non directory file with the specified name already exists for the given solrHomePath '"+solrHomePath);
+        }
+
+        // TODO : improve this check
+        // check if solrConfigPath exists
+//        File solrConfigPathFile = new File(solrConfigPath);
+//        if (!solrConfigPathFile.exists()) {
+//            if (solrConfigPathFile.createNewFile()) {
+//                copy("/solr/solr.xml", solrConfigPathFile.getAbsolutePath());
+//            }
+//        }
+
+        // check if the a core with the given coreName exists
+        // TODO : improve this check
+        String[] files = new File(solrHomePath).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 {
+        String fileName = dir + resource.substring(resource.lastIndexOf("/"));
+        File outputFile = new File(fileName);
+        if (outputFile.createNewFile()) {
+            InputStream inputStream = null;
+            FileOutputStream outputStream = null;
+            try {
+                inputStream = getClass().getResourceAsStream(resource);
+                outputStream = new FileOutputStream(outputFile);
+                IOUtils.copy(inputStream, outputStream);
+            } finally {
+                if (inputStream != null) {
+                    try {
+                        inputStream.close();
+                    } catch (Exception e) {
+                        // do nothing
+                    }
+                }
+                if (outputStream != null) {
+                    try {
+                        outputStream.close();
+                    } catch (Exception e) {
+                        // do nothing
+                    }
+                }
+            }
+        }
+
+    }
+
+    @Override
+    public SolrServer getSolrServer() throws Exception {
+        synchronized (this) {
+            if (solrServer == null) {
+                solrServer = createSolrServer();
+            }
+        }
+        return solrServer;
+    }
+
+}

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