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/02 15:24:19 UTC

svn commit: r1463524 [1/2] - in /jackrabbit/oak/trunk: oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/ oak-solr-core/src/main/resources/solr/ oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/serv...

Author: tommaso
Date: Tue Apr  2 13:24:19 2013
New Revision: 1463524

URL: http://svn.apache.org/r1463524
Log:
OAK-735 - move DefaultOakSolrProvider and OakSolrNodeStateConfiguration to oak-solr-embedded

Added:
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/FixedNodeStateConfiguration.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfiguration.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProviderTest.java   (with props)
    jackrabbit/oak/trunk/oak-solr-embedded/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfigurationTest.java   (with props)
Removed:
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/server/
    jackrabbit/oak/trunk/oak-solr-core/src/main/resources/solr/
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/server/
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/protwords.txt
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/stopwords.txt
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/synonyms.txt
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/EmbeddedSolrServerProvider.java
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/schema.xml
    jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/solrconfig.xml

Modified: jackrabbit/oak/trunk/oak-solr-embedded/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/pom.xml?rev=1463524&r1=1463523&r2=1463524&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/pom.xml Tue Apr  2 13:24:19 2013
@@ -145,12 +145,6 @@
       <artifactId>lucene-core</artifactId>
       <version>${solr.version}</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-codecs</artifactId>
-      <version>${solr.version}</version>
-    </dependency>
-
 
     <dependency>
       <groupId>org.apache.felix</groupId>
@@ -309,6 +303,12 @@
       <scope>runtime</scope>
     </dependency>
 
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
 </project>

Added: 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=1463524&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/DefaultOakSolrProvider.java Tue Apr  2 13:24:19 2013
@@ -0,0 +1,164 @@
+/*
+ * 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 java.io.FileOutputStream;
+import java.io.IOException;
+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.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.core.CoreContainer;
+
+/**
+ * Default implementation of {@link SolrServerProvider} and {@link OakSolrConfigurationProvider}
+ * which hides an {@link EmbeddedSolrServer} configured as per passed {@link NodeState}
+ * properties.
+ */
+public class DefaultOakSolrProvider implements SolrServerProvider, OakSolrConfigurationProvider {
+
+    private final OakSolrNodeStateConfiguration oakSolrConfiguration;
+
+    public DefaultOakSolrProvider(NodeState configurationNodeState) {
+        this.oakSolrConfiguration = new FixedNodeStateConfiguration(configurationNodeState);
+    }
+
+    public DefaultOakSolrProvider(NodeStore store, String path) {
+        this.oakSolrConfiguration = new UpToDateNodeStateConfiguration(store, path);
+    }
+
+    private SolrServer solrServer;
+
+    private SolrServer createSolrServer() throws Exception {
+
+        String solrHomePath = oakSolrConfiguration.getSolrHomePath();
+        String coreName = oakSolrConfiguration.getCoreName();
+        String solrConfigPath = oakSolrConfiguration.getSolrConfigPath();
+
+        if (solrConfigPath != null && solrHomePath != null && coreName != null) {
+
+            checkSolrConfiguration(solrHomePath, solrConfigPath, coreName);
+
+            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);
+        } 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 + "/oak/conf").mkdirs()) {
+                    throw new IOException("could not create nested core directory in solrHomePath");
+                }
+                String coreDir = solrHomePath + "/oak/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");
+        }
+
+        File solrConfigPathFile = new File(solrConfigPath);
+        // check if solrConfigPath exists
+        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 given coreName in the 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 {
+        if (solrServer == null) {
+            solrServer = createSolrServer();
+        }
+        return solrServer;
+    }
+
+    @Override
+    public OakSolrConfiguration getConfiguration() {
+        return oakSolrConfiguration;
+    }
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrServerProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrServerProvider.java?rev=1463524&r1=1463523&r2=1463524&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrServerProvider.java (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/EmbeddedSolrServerProvider.java Tue Apr  2 13:24:19 2013
@@ -42,7 +42,7 @@ import org.xml.sax.SAXException;
 /**
  * {@link SolrServerProvider} which (spawns if needed and) exposes an embedded Solr server
  */
-@Component(metatype = true, immediate = true)
+@Component
 @Service(SolrServerProvider.class)
 public class EmbeddedSolrServerProvider implements SolrServerProvider {
 

Added: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/FixedNodeStateConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/FixedNodeStateConfiguration.java?rev=1463524&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/FixedNodeStateConfiguration.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/FixedNodeStateConfiguration.java Tue Apr  2 13:24:19 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;
+
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * A {@link OakSolrNodeStateConfiguration} whose {@link org.apache.jackrabbit.oak.spi.state.NodeState} is given once
+ * and never updated so that the configuration is fixed.
+ */
+public class FixedNodeStateConfiguration extends OakSolrNodeStateConfiguration {
+
+    private final NodeState configurationNodeState;
+
+    public FixedNodeStateConfiguration(NodeState configurationNodeState) {
+        this.configurationNodeState = configurationNodeState;
+    }
+
+    @Override
+    protected NodeState getConfigurationNodeState() {
+        return configurationNodeState;
+    }
+}

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

Added: 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=1463524&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/OakSolrNodeStateConfiguration.java Tue Apr  2 13:24:19 2013
@@ -0,0 +1,138 @@
+/*
+ * 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.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.index.solr.CommitPolicy;
+import org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfiguration;
+import org.apache.jackrabbit.oak.spi.query.Filter;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * An {@link org.apache.jackrabbit.oak.plugins.index.solr.OakSolrConfiguration} specified via a given {@link org.apache.jackrabbit.oak.spi.state.NodeState}.
+ * For each of the supported properties a default is provided if either the
+ * property doesn't exist in the node or if the value is <code>null</code> or
+ * empty <code>String</code>.
+ * <p/>
+ * 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 {
+
+    /**
+     * get the {@link org.apache.jackrabbit.oak.spi.state.NodeState} which contains the properties for the Oak -
+     * Solr configuration.
+     *
+     * @return a {@link org.apache.jackrabbit.oak.spi.state.NodeState} for the Solr configuration or <code>null</code>
+     *         if such a {@link org.apache.jackrabbit.oak.spi.state.NodeState} doesn't exist.
+     */
+    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");
+    }
+
+    @Override
+    public String getFieldForPathRestriction(Filter.PathRestriction pathRestriction) {
+        String fieldName = null;
+        switch (pathRestriction) {
+            case ALL_CHILDREN: {
+                fieldName = getStringValueFor(Properties.DESCENDANTS_FIELD, "path_des");
+                break;
+            }
+            case DIRECT_CHILDREN: {
+                fieldName = getStringValueFor(Properties.CHILDREN_FIELD, "path_child");
+                break;
+            }
+            case EXACT: {
+                fieldName = getStringValueFor(Properties.PATH_FIELD, "path_exact");
+                break;
+            }
+            case PARENT: {
+                fieldName = getStringValueFor(Properties.PARENT_FIELD, "path_anc");
+                break;
+            }
+
+        }
+        return fieldName;
+    }
+
+    @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");
+    }
+
+    @Override
+    public String getCoreName() {
+        return getStringValueFor(Properties.CORE_NAME, "oak");
+    }
+
+    protected String getStringValueFor(String propertyName, String defaultValue) {
+        String value = null;
+        NodeState configurationNodeState = getConfigurationNodeState();
+        if (configurationNodeState != null) {
+            PropertyState property = configurationNodeState.getProperty(propertyName);
+            if (property != null) {
+                value = property.getValue(Type.STRING);
+            }
+            if (value == null || value.length() == 0) {
+                value = defaultValue;
+            }
+        }
+        return value;
+    }
+
+    /**
+     * Properties that may be retrieved from the configuration {@link org.apache.jackrabbit.oak.spi.state.NodeState}.
+     */
+    public final class Properties {
+
+        public static final String SOLRHOME_PATH = "solrHomePath";
+        public static final String SOLRCONFIG_PATH = "solrConfigPath";
+        public static final String CORE_NAME = "coreName";
+        public static final String PATH_FIELD = "pathField";
+        public static final String PARENT_FIELD = "parentField";
+        public static final String CHILDREN_FIELD = "childrenField";
+        public static final String DESCENDANTS_FIELD = "descendantsField";
+        public static final String COMMIT_POLICY = "commitPolicy";
+
+    }
+}

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

Added: jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfiguration.java?rev=1463524&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfiguration.java (added)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/embedded/UpToDateNodeStateConfiguration.java Tue Apr  2 13:24:19 2013
@@ -0,0 +1,47 @@
+/*
+ * 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.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+
+/**
+ * A {@link OakSolrNodeStateConfiguration} whose {@link org.apache.jackrabbit.oak.spi.state.NodeState} is retrieved
+ * via the {@link org.apache.jackrabbit.oak.spi.state.NodeStore} and a given <code>String</code> path.
+ */
+public class UpToDateNodeStateConfiguration extends OakSolrNodeStateConfiguration {
+
+    private final NodeStore store;
+    private final String path;
+
+    public UpToDateNodeStateConfiguration(NodeStore store, String path) {
+        this.store = store;
+        this.path = path;
+    }
+
+    @Override
+    protected NodeState getConfigurationNodeState() {
+        NodeState currentState = store.getRoot();
+        for (String child : path.split("/")) {
+            currentState = currentState.getChildNode(child);
+            if (currentState == null) {
+                break;
+            }
+        }
+        return currentState;
+    }
+}

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

Modified: jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/schema.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/schema.xml?rev=1463524&r1=1463523&r2=1463524&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/schema.xml (original)
+++ jackrabbit/oak/trunk/oak-solr-embedded/src/main/resources/solr/oak/conf/schema.xml Tue Apr  2 13:24:19 2013
@@ -16,131 +16,131 @@
  limitations under the License.
 -->
 <schema name="minimal" version="1.5">
-    <types>
-        <fieldType name="string" class="solr.StrField"/>
-        <fieldType name="descendent_path" class="solr.TextField">
-            <analyzer type="index">
-                <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
-            </analyzer>
-            <analyzer type="query">
-                <tokenizer class="solr.KeywordTokenizerFactory" />
-            </analyzer>
-        </fieldType>
-        <fieldType name="children_path" class="solr.TextField">
-            <analyzer type="index">
-                <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" skip="1" reverse="true" />
-                <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
-            </analyzer>
-            <analyzer type="query">
-                <tokenizer class="solr.KeywordTokenizerFactory" />
-                <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
-            </analyzer>
-        </fieldType>
-        <fieldType name="parent_path" class="solr.TextField">
-            <analyzer type="index">
-                <tokenizer class="solr.KeywordTokenizerFactory" />
-                <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
-            </analyzer>
-            <analyzer type="query">
-                <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" skip="1" reverse="true"/>
-                <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
-            </analyzer>
-        </fieldType>
-        <fieldType name="text_keepcase" class="solr.TextField" positionIncrementGap="100">
-            <analyzer type="index">
-                <tokenizer class="solr.StandardTokenizerFactory"/>
-            </analyzer>
-            <analyzer type="query">
-                <tokenizer class="solr.StandardTokenizerFactory"/>
-            </analyzer>
-        </fieldType>
-        <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
-            <analyzer type="index">
-                <tokenizer class="solr.StandardTokenizerFactory"/>
-                <filter class="solr.LowerCaseFilterFactory"/>
-            </analyzer>
-            <analyzer type="query">
-                <tokenizer class="solr.StandardTokenizerFactory"/>
-                <filter class="solr.LowerCaseFilterFactory"/>
-            </analyzer>
-        </fieldType>
-
-        <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
-
-        <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
-        <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
-        <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
-        <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
-
-        <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
-        <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
-        <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
-        <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
-        <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
-
-        <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
-
-        <fieldtype name="binary" class="solr.BinaryField"/>
-
-        <fieldType name="pint" class="solr.IntField"/>
-        <fieldType name="plong" class="solr.LongField"/>
-        <fieldType name="pfloat" class="solr.FloatField"/>
-        <fieldType name="pdouble" class="solr.DoubleField"/>
-        <fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>
-
-        <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
-
-        <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
-
-        <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
-                   geo="true" distErrPct="0.025" maxDistErr="0.000009" units="degrees" />
-
-        <fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD" currencyConfig="currency.xml" />
-        <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField"/>
-    </types>
-    <fields>
-        <field name="path_exact" type="string" indexed="true" stored="true"/>
-        <field name="path_child" type="children_path" indexed="true" stored="false"/>
-        <field name="path_anc" type="parent_path" indexed="true" stored="false"/>
-        <field name="path_des" type="descendent_path" indexed="true" stored="false"/>
-        <field name="ignored" type="ignored" multiValued="true"/>
-        <field name="catch_all" type="text_general" indexed="true" stored="false" multiValued="true"/>
-        <field name="_version_" type="long" indexed="true" stored="true"/>
-
-        <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
-        <dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
-        <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
-        <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>
-        <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
-        <dynamicField name="*_ls" type="long"   indexed="true"  stored="true"  multiValued="true"/>
-        <dynamicField name="*_t"  type="text_general"    indexed="true"  stored="true"/>
-        <dynamicField name="*_txt" type="text_general"   indexed="true"  stored="true" multiValued="true"/>
-        <dynamicField name="*_b"  type="boolean" indexed="true" stored="true"/>
-        <dynamicField name="*_bs" type="boolean" indexed="true" stored="true"  multiValued="true"/>
-        <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
-        <dynamicField name="*_fs" type="float"  indexed="true"  stored="true"  multiValued="true"/>
-        <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
-        <dynamicField name="*_ds" type="double" indexed="true"  stored="true"  multiValued="true"/>
-
-        <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false" />
-
-        <dynamicField name="*_dt"  type="date"    indexed="true"  stored="true"/>
-        <dynamicField name="*_dts" type="date"    indexed="true"  stored="true" multiValued="true"/>
-        <dynamicField name="*_p"  type="location" indexed="true" stored="true"/>
-
-        <dynamicField name="*_ti" type="tint"    indexed="true"  stored="true"/>
-        <dynamicField name="*_tl" type="tlong"   indexed="true"  stored="true"/>
-        <dynamicField name="*_tf" type="tfloat"  indexed="true"  stored="true"/>
-        <dynamicField name="*_td" type="tdouble" indexed="true"  stored="true"/>
-        <dynamicField name="*_tdt" type="tdate"  indexed="true"  stored="true"/>
-
-        <dynamicField name="*_pi"  type="pint"    indexed="true"  stored="true"/>
-        <dynamicField name="*_c"   type="currency" indexed="true"  stored="true"/>
-        <dynamicField name="*" type="text_keepcase" indexed="true" stored="true" multiValued="true"/>
-    </fields>
-    <uniqueKey>path_exact</uniqueKey>
-    <copyField source="path_exact" dest="path_anc"/>
-    <copyField source="path_exact" dest="path_des"/>
-    <copyField source="path_exact" dest="path_child"/>
-    <copyField source="*" dest="catch_all"/>
+  <types>
+    <fieldType name="string" class="solr.StrField"/>
+    <fieldType name="descendent_path" class="solr.TextField">
+      <analyzer type="index">
+        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.KeywordTokenizerFactory" />
+      </analyzer>
+    </fieldType>
+    <fieldType name="children_path" class="solr.TextField">
+      <analyzer type="index">
+        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" skip="1" reverse="true" />
+        <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.KeywordTokenizerFactory" />
+        <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
+      </analyzer>
+    </fieldType>
+    <fieldType name="parent_path" class="solr.TextField">
+      <analyzer type="index">
+        <tokenizer class="solr.KeywordTokenizerFactory" />
+        <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" skip="1" reverse="true"/>
+        <filter class="solr.PatternReplaceFilterFactory" pattern="/" replacement="" replace="all"/>
+      </analyzer>
+    </fieldType>
+    <fieldType name="text_keepcase" class="solr.TextField" positionIncrementGap="100">
+      <analyzer type="index">
+        <tokenizer class="solr.StandardTokenizerFactory"/>
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.StandardTokenizerFactory"/>
+      </analyzer>
+    </fieldType>
+    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
+      <analyzer type="index">
+        <tokenizer class="solr.StandardTokenizerFactory"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.StandardTokenizerFactory"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+      </analyzer>
+    </fieldType>
+
+    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
+
+    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
+    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
+    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
+    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
+
+    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
+    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
+    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
+    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
+    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
+
+    <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
+
+    <fieldtype name="binary" class="solr.BinaryField"/>
+
+    <fieldType name="pint" class="solr.IntField"/>
+    <fieldType name="plong" class="solr.LongField"/>
+    <fieldType name="pfloat" class="solr.FloatField"/>
+    <fieldType name="pdouble" class="solr.DoubleField"/>
+    <fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>
+
+    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
+
+    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
+
+    <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
+               geo="true" distErrPct="0.025" maxDistErr="0.000009" units="degrees" />
+
+    <fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD" currencyConfig="currency.xml" />
+    <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField"/>
+  </types>
+  <fields>
+    <field name="path_exact" type="string" indexed="true" stored="true"/>
+    <field name="path_child" type="children_path" indexed="true" stored="false"/>
+    <field name="path_anc" type="parent_path" indexed="true" stored="false"/>
+    <field name="path_des" type="descendent_path" indexed="true" stored="false"/>
+    <field name="ignored" type="ignored" multiValued="true"/>
+    <field name="catch_all" type="text_general" indexed="true" stored="false" multiValued="true"/>
+    <field name="_version_" type="long" indexed="true" stored="true"/>
+
+    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
+    <dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
+    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
+    <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
+    <dynamicField name="*_ls" type="long"   indexed="true"  stored="true"  multiValued="true"/>
+    <dynamicField name="*_t"  type="text_general"    indexed="true"  stored="true"/>
+    <dynamicField name="*_txt" type="text_general"   indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="*_b"  type="boolean" indexed="true" stored="true"/>
+    <dynamicField name="*_bs" type="boolean" indexed="true" stored="true"  multiValued="true"/>
+    <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
+    <dynamicField name="*_fs" type="float"  indexed="true"  stored="true"  multiValued="true"/>
+    <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
+    <dynamicField name="*_ds" type="double" indexed="true"  stored="true"  multiValued="true"/>
+
+    <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false" />
+
+    <dynamicField name="*_dt"  type="date"    indexed="true"  stored="true"/>
+    <dynamicField name="*_dts" type="date"    indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="*_p"  type="location" indexed="true" stored="true"/>
+
+    <dynamicField name="*_ti" type="tint"    indexed="true"  stored="true"/>
+    <dynamicField name="*_tl" type="tlong"   indexed="true"  stored="true"/>
+    <dynamicField name="*_tf" type="tfloat"  indexed="true"  stored="true"/>
+    <dynamicField name="*_td" type="tdouble" indexed="true"  stored="true"/>
+    <dynamicField name="*_tdt" type="tdate"  indexed="true"  stored="true"/>
+
+    <dynamicField name="*_pi"  type="pint"    indexed="true"  stored="true"/>
+    <dynamicField name="*_c"   type="currency" indexed="true"  stored="true"/>
+    <dynamicField name="*" type="text_keepcase" indexed="true" stored="true" multiValued="true"/>
+  </fields>
+  <uniqueKey>path_exact</uniqueKey>
+  <copyField source="path_exact" dest="path_anc"/>
+  <copyField source="path_exact" dest="path_des"/>
+  <copyField source="path_exact" dest="path_child"/>
+  <copyField source="*" dest="catch_all"/>
 </schema>