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 2013/04/05 14:36:37 UTC

svn commit: r1464953 - in /jackrabbit/oak/trunk/oak-solr-embedded: ./ src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/ src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/

Author: tommaso
Date: Fri Apr  5 12:36:36 2013
New Revision: 1464953

URL: http://svn.apache.org/r1464953
Log:
OAK-735 - merged former way of initialing ESS with the DOSP, added SolrServerConfiguration and factored out defaults, added a unified OSGi service SolrServerProvider for OakSolrConfigurationProvider

Added:
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrProviderService.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OsgiSolrServerConfigurationProvider.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfiguration.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationDefaults.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationProvider.java   (with props)
Removed:
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrServerProvider.java
Modified:
    jackrabbit/oak/trunk/oak-solr-embedded/pom.xml
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfiguration.java
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfigurationProvider.java
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProviderTest.java
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfigurationTest.java

Modified: jackrabbit/oak/trunk/oak-solr-embedded/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/pom.xml?rev=1464953&r1=1464952&r2=1464953&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/pom.xml Fri Apr  5 12:36:36 2013
@@ -308,6 +308,16 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>log4j-over-slf4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>jcl-over-slf4j</artifactId>
+      <scope>test</scope>
+    </dependency>
 
   </dependencies>
 

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java?rev=1464953&r1=1464952&r2=1464953&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java Fri Apr  5 12:36:36 2013
@@ -23,55 +23,77 @@ import java.io.InputStream;
 import java.util.Arrays;
 
 import org.apache.jackrabbit.mk.util.IOUtils;
-import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfiguration;
-import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfigurationProvider;
+import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrUtils;
 import org.apache.jackrabbit.oak.plugins.index.solr.SolrServerProvider;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
 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;
 
 /**
- * Default implementation of {@link SolrServerProvider} and {@link OakSolrConfigurationProvider}
- * which hides an {@link EmbeddedSolrServer} configured as per passed {@link NodeState}
- * properties.
+ * Default implementation of {@link SolrServerProvider} which uses an
+ * {@link EmbeddedSolrServer} configured as per passed {@link SolrServerConfiguration}.
  */
-public class DefaultOakSolrProvider implements SolrServerProvider, OakSolrConfigurationProvider {
+public class DefaultOakSolrProvider implements SolrServerProvider {
 
-    private final OakSolrNodeStateConfiguration oakSolrConfiguration;
+    private final SolrServerConfiguration solrServerConfiguration;
 
-    public DefaultOakSolrProvider(NodeState configurationNodeState) {
-        this.oakSolrConfiguration = new FixedNodeStateConfiguration(configurationNodeState);
-    }
-
-    public DefaultOakSolrProvider(NodeStore store, String path) {
-        this.oakSolrConfiguration = new UpToDateNodeStateConfiguration(store, path);
+    public DefaultOakSolrProvider(SolrServerConfiguration solrServerConfiguration) {
+        this.solrServerConfiguration = solrServerConfiguration;
     }
 
     private SolrServer solrServer;
 
     private SolrServer createSolrServer() throws Exception {
 
-        String solrHomePath = oakSolrConfiguration.getSolrHomePath();
-        String coreName = oakSolrConfiguration.getCoreName();
-        String solrConfigPath = oakSolrConfiguration.getSolrConfigPath();
+        String solrHomePath = solrServerConfiguration.getSolrHomePath();
+        String coreName = solrServerConfiguration.getCoreName();
+        String solrConfigPath = solrServerConfiguration.getSolrConfigPath();
+        SolrServerConfiguration.HttpConfiguration httpConfiguration = solrServerConfiguration.getHttpConfiguration();
 
-        if (solrConfigPath != null && solrHomePath != null && coreName != null) {
 
+        if (solrConfigPath != null && solrHomePath != null && coreName != null) {
             checkSolrConfiguration(solrHomePath, solrConfigPath, coreName);
+            if (httpConfiguration != null) {
+                ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+                Thread.currentThread().setContextClassLoader(JettySolrRunner.class.getClassLoader());
+
+                Integer httpPort = httpConfiguration.getHttpPort();
+                String context = httpConfiguration.getContext();
+                try {
+                    JettySolrRunner jettySolrRunner = new JettySolrRunner(solrHomePath, context, httpPort, "solrconfig.xml", "schema.xml", true);
+                    jettySolrRunner.start(true);
+                } finally {
+                    Thread.currentThread().setContextClassLoader(classLoader);
+                }
+                HttpSolrServer httpSolrServer = new HttpSolrServer(new StringBuilder(SolrServerConfigurationDefaults.LOCAL_BASE_URL)
+                        .append(':').append(httpPort).append(coreName).toString());
+                if (OakSolrUtils.checkServerAlive(httpSolrServer)) {
+                    return httpSolrServer;
+                } else {
+                    throw new IOException("the spawn HTTP Solr server is not alive");
+                }
 
-            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-            Thread.currentThread().setContextClassLoader(CoreContainer.class.getClassLoader());
 
-            CoreContainer coreContainer = new CoreContainer(solrHomePath);
-            try {
-                coreContainer.load(solrHomePath, new File(solrConfigPath));
-            } finally {
-                Thread.currentThread().setContextClassLoader(classLoader);
-            }
+            } else {
+                ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+                Thread.currentThread().setContextClassLoader(CoreContainer.class.getClassLoader());
+
+                CoreContainer coreContainer = new CoreContainer(solrHomePath);
+                try {
+                    coreContainer.load(solrHomePath, new File(solrConfigPath));
+                } finally {
+                    Thread.currentThread().setContextClassLoader(classLoader);
+                }
 
-            return new EmbeddedSolrServer(coreContainer, coreName);
+                EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, coreName);
+                if (OakSolrUtils.checkServerAlive(server)) {
+                    return server;
+                } else {
+                    throw new IOException("the embedded Solr server is not alive");
+                }
+            }
         } else {
             throw new Exception("SolrServer configuration proprties not set");
         }
@@ -157,8 +179,4 @@ public class DefaultOakSolrProvider impl
         return solrServer;
     }
 
-    @Override
-    public OakSolrConfiguration getConfiguration() {
-        return oakSolrConfiguration;
-    }
 }

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfiguration.java?rev=1464953&r1=1464952&r2=1464953&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfiguration.java (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfiguration.java Fri Apr  5 12:36:36 2013
@@ -28,11 +28,6 @@ import org.apache.jackrabbit.oak.spi.que
  */
 public class EmbeddedSolrConfiguration implements OakSolrConfiguration {
 
-    private static final String PATH_FIELD_NAME = "path";
-    private static final String CHILD_FIELD_NAME = "path_child";
-    private static final String DESC_FIELD_NAME = "path_desc";
-    private static final String ANC_FIELD_NAME = "path_anc";
-
     @Override
     public String getFieldNameFor(Type<?> propertyType) {
         if (Type.BINARIES.equals(propertyType) || Type.BINARY.equals(propertyType)) {
@@ -44,7 +39,7 @@ public class EmbeddedSolrConfiguration i
 
     @Override
     public String getPathField() {
-        return PATH_FIELD_NAME;
+        return SolrServerConfigurationDefaults.PATH_FIELD_NAME;
     }
 
     @Override
@@ -52,19 +47,19 @@ public class EmbeddedSolrConfiguration i
         String fieldName = null;
         switch (pathRestriction) {
             case ALL_CHILDREN: {
-                fieldName = DESC_FIELD_NAME;
+                fieldName = SolrServerConfigurationDefaults.DESC_FIELD_NAME;
                 break;
             }
             case DIRECT_CHILDREN: {
-                fieldName = CHILD_FIELD_NAME;
+                fieldName = SolrServerConfigurationDefaults.CHILD_FIELD_NAME;
                 break;
             }
             case EXACT: {
-                fieldName = PATH_FIELD_NAME;
+                fieldName = SolrServerConfigurationDefaults.PATH_FIELD_NAME;
                 break;
             }
             case PARENT: {
-                fieldName = ANC_FIELD_NAME;
+                fieldName = SolrServerConfigurationDefaults.ANC_FIELD_NAME;
                 break;
             }
 
@@ -84,6 +79,6 @@ public class EmbeddedSolrConfiguration i
 
     @Override
     public String getCoreName() {
-        return "oak";
+        return SolrServerConfigurationDefaults.CORE_NAME;
     }
 }

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfigurationProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfigurationProvider.java?rev=1464953&r1=1464952&r2=1464953&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfigurationProvider.java (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrConfigurationProvider.java Fri Apr  5 12:36:36 2013
@@ -16,19 +16,23 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.embedded;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfiguration;
 import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfigurationProvider;
 
 /**
  * An {@link OakSolrConfigurationProvider} for the embedded Solr server
  */
-@Component(immediate = true)
-@Service(OakSolrConfigurationProvider.class)
 public class EmbeddedSolrConfigurationProvider implements OakSolrConfigurationProvider {
 
-    private final OakSolrConfiguration embeddedConfiguration = new EmbeddedSolrConfiguration();
+    private final OakSolrConfiguration embeddedConfiguration;
+
+    public EmbeddedSolrConfigurationProvider() {
+        embeddedConfiguration = new EmbeddedSolrConfiguration();
+    }
+
+    public EmbeddedSolrConfigurationProvider(OakSolrConfiguration embeddedConfiguration) {
+        this.embeddedConfiguration = embeddedConfiguration;
+    }
 
     @Override
     public OakSolrConfiguration getConfiguration() {

Added: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrProviderService.java?rev=1464953&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrProviderService.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrProviderService.java Fri Apr  5 12:36:36 2013
@@ -0,0 +1,81 @@
+/*
+ * 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.embedded;
+
+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.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.felix.scr.annotations.Services;
+import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfiguration;
+import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfigurationProvider;
+import org.apache.jackrabbit.oak.plugins.index.solr.SolrServerProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.solr.client.solrj.SolrServer;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * OSGi service for the embedded Solr server module.
+ */
+@Component
+@Services({
+        @Service(value = SolrServerProvider.class),
+        @Service(value = OakSolrConfigurationProvider.class)
+})
+public class EmbeddedSolrProviderService implements SolrServerProvider, OakSolrConfigurationProvider {
+
+
+    @Property(value = "/oak:index/solrIdx", name = "configuration path",
+            description = "path to node holding Solr configuration")
+    private static final String CONFIGURATION_PATH = "solr.configuration.node.path";
+
+    @Reference
+    private NodeStore nodeStore;
+
+    @Reference
+    private SolrServerConfigurationProvider solrServerConfigurationProvider;
+
+    private OakSolrConfigurationProvider oakSolrConfigurationProvider;
+
+    private SolrServerProvider solrServerProvider;
+
+    @Activate
+    public void activate(ComponentContext context) throws Exception {
+        try {
+            // try reading configuration from the configured repository path
+            UpToDateNodeStateConfiguration nodeStateConfiguration = new UpToDateNodeStateConfiguration(nodeStore, String.valueOf(
+                    context.getProperties().get(CONFIGURATION_PATH)));
+            solrServerProvider = new DefaultOakSolrProvider(nodeStateConfiguration.getSolrServerConfiguration());
+            oakSolrConfigurationProvider = new EmbeddedSolrConfigurationProvider(nodeStateConfiguration);
+        } catch (Exception e) {
+            // use the default config and the OSGi based server configuration
+            solrServerProvider = new DefaultOakSolrProvider(solrServerConfigurationProvider.getSolrServerConfiguration());
+            oakSolrConfigurationProvider = new EmbeddedSolrConfigurationProvider();
+        }
+    }
+
+    @Override
+    public OakSolrConfiguration getConfiguration() {
+        return oakSolrConfigurationProvider.getConfiguration();
+    }
+
+    @Override
+    public SolrServer getSolrServer() throws Exception {
+        return solrServerProvider.getSolrServer();
+    }
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java?rev=1464953&r1=1464952&r2=1464953&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java Fri Apr  5 12:36:36 2013
@@ -32,7 +32,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 {
+public abstract class OakSolrNodeStateConfiguration extends EmbeddedSolrConfiguration implements OakSolrConfiguration, SolrServerConfigurationProvider {
 
     /**
      * get the {@link org.apache.jackrabbit.oak.spi.state.NodeState} which contains the properties for the Oak -
@@ -43,17 +43,8 @@ public abstract class OakSolrNodeStateCo
     protected abstract NodeState getConfigurationNodeState();
 
     @Override
-    public String getFieldNameFor(Type<?> propertyType) {
-        if (Type.BINARIES.equals(propertyType) || Type.BINARY.equals(propertyType)) {
-            // TODO : use Tika / SolrCell here
-            return propertyType.toString() + "_bin";
-        }
-        return null;
-    }
-
-    @Override
     public String getPathField() {
-        return getStringValueFor(Properties.PATH_FIELD, "path_exact");
+        return getStringValueFor(Properties.PATH_FIELD, SolrServerConfigurationDefaults.PATH_FIELD_NAME);
     }
 
     @Override
@@ -61,19 +52,19 @@ public abstract class OakSolrNodeStateCo
         String fieldName = null;
         switch (pathRestriction) {
             case ALL_CHILDREN: {
-                fieldName = getStringValueFor(Properties.DESCENDANTS_FIELD, "path_des");
+                fieldName = getStringValueFor(Properties.DESCENDANTS_FIELD, SolrServerConfigurationDefaults.DESC_FIELD_NAME);
                 break;
             }
             case DIRECT_CHILDREN: {
-                fieldName = getStringValueFor(Properties.CHILDREN_FIELD, "path_child");
+                fieldName = getStringValueFor(Properties.CHILDREN_FIELD, SolrServerConfigurationDefaults.CHILD_FIELD_NAME);
                 break;
             }
             case EXACT: {
-                fieldName = getStringValueFor(Properties.PATH_FIELD, "path_exact");
+                fieldName = getStringValueFor(Properties.PATH_FIELD, SolrServerConfigurationDefaults.PATH_FIELD_NAME);
                 break;
             }
             case PARENT: {
-                fieldName = getStringValueFor(Properties.PARENT_FIELD, "path_anc");
+                fieldName = getStringValueFor(Properties.PARENT_FIELD, SolrServerConfigurationDefaults.ANC_FIELD_NAME);
                 break;
             }
 
@@ -82,26 +73,13 @@ 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.HARD.toString()));
-    }
-
-    public String getSolrHomePath() {
-        return getStringValueFor(Properties.SOLRHOME_PATH, "./");
-    }
-
-    public String getSolrConfigPath() {
-        return getStringValueFor(Properties.SOLRCONFIG_PATH, "./solr.xml");
+        return CommitPolicy.valueOf(getStringValueFor(Properties.COMMIT_POLICY, CommitPolicy.SOFT.toString()));
     }
 
     @Override
     public String getCoreName() {
-        return getStringValueFor(Properties.CORE_NAME, "oak");
+        return getStringValueFor(Properties.CORE_NAME, SolrServerConfigurationDefaults.CORE_NAME);
     }
 
     protected String getStringValueFor(String propertyName, String defaultValue) {
@@ -119,6 +97,12 @@ public abstract class OakSolrNodeStateCo
         return value;
     }
 
+    @Override
+    public SolrServerConfiguration getSolrServerConfiguration() {
+        return new SolrServerConfiguration(getStringValueFor(Properties.SOLRHOME_PATH, SolrServerConfigurationDefaults.SOLR_HOME_PATH),
+                getStringValueFor(Properties.SOLRCONFIG_PATH, SolrServerConfigurationDefaults.SOLR_CONFIG_PATH), getCoreName());
+    }
+
     /**
      * Properties that may be retrieved from the configuration {@link org.apache.jackrabbit.oak.spi.state.NodeState}.
      */

Added: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OsgiSolrServerConfigurationProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OsgiSolrServerConfigurationProvider.java?rev=1464953&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OsgiSolrServerConfigurationProvider.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OsgiSolrServerConfigurationProvider.java Fri Apr  5 12:36:36 2013
@@ -0,0 +1,94 @@
+/*
+ * 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.embedded;
+
+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.embedded.SolrServerConfiguration;
+import org.apache.jackrabbit.oak.plugins.index.solr.embedded.SolrServerConfigurationDefaults;
+import org.apache.jackrabbit.oak.plugins.index.solr.embedded.SolrServerConfigurationProvider;
+import org.apache.solr.client.solrj.SolrServer;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * An OSGi service {@link SolrServerConfigurationProvider}
+ */
+@Component
+@Service(value = SolrServerConfigurationProvider.class)
+public class OsgiSolrServerConfigurationProvider implements SolrServerConfigurationProvider {
+
+    @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";
+
+    private static SolrServer solrServer;
+
+    private String solrHome;
+    private String solrConfigFile;
+    private String solrCoreName;
+
+    private Integer solrHttpPort;
+
+    private SolrServerConfiguration 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)));
+        // TODO : add the possibility to inject solrconfig and schema files
+
+        solrServerConfiguration = new SolrServerConfiguration(solrHome, solrConfigFile, solrCoreName);
+    }
+
+    @Deactivate
+    protected void deactivate() throws Exception {
+        solrHome = null;
+        solrHttpPort = null;
+        solrConfigFile = null;
+        solrCoreName = null;
+        if (solrServer != null) {
+            solrServer.shutdown();
+            solrServer = null;
+        }
+    }
+
+    @Override
+    public SolrServerConfiguration getSolrServerConfiguration() {
+        return solrServerConfiguration;
+    }
+}

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

Added: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfiguration.java?rev=1464953&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfiguration.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfiguration.java Fri Apr  5 12:36:36 2013
@@ -0,0 +1,95 @@
+/*
+ * 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.embedded;
+
+/**
+ * Configuration parameters for starting a {@link org.apache.solr.client.solrj.SolrServer}
+ */
+public class SolrServerConfiguration {
+
+    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;
+    }
+
+    public SolrServerConfiguration withHttpConfiguration(String context, Integer httpPort) {
+        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 HttpConfiguration} holding parameters for enabling Solr
+     * server with HTTP bindings
+     *
+     * @return a {@link HttpConfiguration} or <code>null</code> if not set
+     */
+    public HttpConfiguration getHttpConfiguration() {
+        return httpConfiguration;
+    }
+
+    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-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfiguration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationDefaults.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationDefaults.java?rev=1464953&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationDefaults.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationDefaults.java Fri Apr  5 12:36:36 2013
@@ -0,0 +1,37 @@
+/*
+ * 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.embedded;
+
+/**
+ * Defaults for embedded Solr server configurations.
+ */
+public class SolrServerConfigurationDefaults {
+
+    public static final String SOLR_HOME_PATH = "./";
+    public static final String SOLR_CONFIG_PATH = "./solr.xml";
+    public static final String CORE_NAME = "oak";
+
+    public static final String HTTP_PORT = "8983";
+    public static final String LOCAL_BASE_URL = "http://127.0.0.1";
+    public static final String CONTEXT = "/solr";
+
+    public static final String PATH_FIELD_NAME = "path_exact";
+    public static final String CHILD_FIELD_NAME = "path_child";
+    public static final String DESC_FIELD_NAME = "path_desc";
+    public static final String ANC_FIELD_NAME = "path_anc";
+
+}

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

Added: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationProvider.java?rev=1464953&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationProvider.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/SolrServerConfigurationProvider.java Fri Apr  5 12:36:36 2013
@@ -0,0 +1,31 @@
+/*
+ * 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.embedded;
+
+/**
+ * {@link org.apache.solr.client.solrj.SolrServer} configuration provider.
+ */
+public interface SolrServerConfigurationProvider {
+
+    /**
+     * Provide a {@lin SolrServerConfiguration} to be used to initialize a specific
+     * {@link org.apache.solr.client.solrj.SolrServer} implementation.
+     *
+     * @return the {@link SolrServerConfiguration} holding the configuration parameters
+     */
+    public SolrServerConfiguration getSolrServerConfiguration();
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProviderTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProviderTest.java?rev=1464953&r1=1464952&r2=1464953&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProviderTest.java (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProviderTest.java Fri Apr  5 12:36:36 2013
@@ -16,14 +16,10 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.solr.embedded;
 
-import org.apache.jackrabbit.oak.spi.query.PropertyValues;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.solr.client.solrj.SolrServer;
 import org.junit.Test;
 
 import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 /**
  * Testcase for {@link DefaultOakSolrProvider}
@@ -31,16 +27,10 @@ import static org.mockito.Mockito.when;
 public class DefaultOakSolrProviderTest {
 
     @Test
-    public void testSolrServerInitializationWithoutConfigurationFiles() throws Exception {
-        NodeState nodeState = mock(NodeState.class);
-        when(nodeState.exists()).thenReturn(true);
-        when(nodeState.getProperty(OakSolrNodeStateConfiguration.Properties.CORE_NAME)).
-                thenReturn(PropertyValues.create(PropertyValues.newString("oak")));
-        when(nodeState.getProperty(OakSolrNodeStateConfiguration.Properties.SOLRHOME_PATH)).
-                thenReturn(PropertyValues.create(PropertyValues.newString("target/solr")));
-        when(nodeState.getProperty(OakSolrNodeStateConfiguration.Properties.SOLRCONFIG_PATH)).
-                thenReturn(PropertyValues.create(PropertyValues.newString("target/solr/solr.xml")));
-        DefaultOakSolrProvider defaultOakSolrProvider = new DefaultOakSolrProvider(nodeState);
+    public void testSolrServerInitialization() throws Exception {
+        SolrServerConfiguration solrServerConfiguration = new SolrServerConfiguration("target/solr",
+                "target/solr/solr.xml", "oak");
+        DefaultOakSolrProvider defaultOakSolrProvider = new DefaultOakSolrProvider(solrServerConfiguration);
         SolrServer solrServer = defaultOakSolrProvider.getSolrServer();
         assertNotNull(solrServer);
     }

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfigurationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfigurationTest.java?rev=1464953&r1=1464952&r2=1464953&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfigurationTest.java (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfigurationTest.java Fri Apr  5 12:36:36 2013
@@ -13,7 +13,7 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertNull;
 
 /**
- * Testcase for {@link org.apache.jackrabbit.oak.plugins.index.solr.server.UpToDateNodeStateConfiguration}
+ * Testcase for {@link UpToDateNodeStateConfiguration}
  */
 public class UpToDateNodeStateConfigurationTest {
 
@@ -40,7 +40,7 @@ public class UpToDateNodeStateConfigurat
     public void testNonExistingPath() throws Exception {
         String path = "some/path/to/oak:index/solrIdx";
         UpToDateNodeStateConfiguration upToDateNodeStateConfiguration = new UpToDateNodeStateConfiguration(store, path);
-        assertNull(upToDateNodeStateConfiguration.getSolrConfigPath());
+        assertNull(upToDateNodeStateConfiguration.getCoreName());
     }
 
     @Test