Author: tommaso
Date: Fri Mar 28 09:28:57 2014
New Revision: 1582648

URL: http://svn.apache.org/r1582648
Log:
OAK-1635 - correctly escaping deleted paths in SolrIndexEditor

Modified:
    
jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java

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=1582648&r1=1582647&r2=1582648&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
 Fri Mar 28 09:28:57 2014
@@ -31,6 +31,8 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.common.SolrInputDocument;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import static org.apache.jackrabbit.oak.commons.PathUtils.concat;
 
@@ -39,6 +41,8 @@ import static org.apache.jackrabbit.oak.
  */
 public class SolrIndexEditor implements IndexEditor {
 
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
     /** Parent editor, or {@code null} if this is the root editor. */
     private final SolrIndexEditor parent;
 
@@ -167,12 +171,14 @@ public class SolrIndexEditor implements 
     @Override
     public Editor childNodeDeleted(String name, NodeState before)
             throws CommitFailedException {
-        // TODO: Proper escaping
-        String path = PathUtils.concat(getPath(), name).replace("/", "\\/");
-
+        String path = partialEscape(PathUtils.concat(getPath(), 
name)).toString();
         try {
-            solrServer.deleteByQuery(String.format(
-                    "%s:%s*", configuration.getPathField(), path));
+          String formattedQuery = String.format(
+                  "%s:%s*", configuration.getPathField(), path);
+          if (log.isDebugEnabled()) {
+              log.debug("deleting by query {}", formattedQuery);
+          }
+          solrServer.deleteByQuery(formattedQuery);
             updateCallback.indexUpdate();
         } catch (SolrServerException e) {
             throw new CommitFailedException(
@@ -185,6 +191,21 @@ public class SolrIndexEditor implements 
         return null; // no need to recurse down the removed subtree
     }
 
+    private static CharSequence partialEscape(CharSequence s) {
+      StringBuilder sb = new StringBuilder();
+      for (int i = 0; i < s.length(); i++) {
+        char c = s.charAt(i);
+        if (c == '\\' || c == '!' || c == '(' || c == ')' ||
+                c == ':' || c == '^' || c == '[' || c == ']' || c == '/' ||
+                c == '{' || c == '}' || c == '~' || c == '*' || c == '?' ||
+                c == '-' || c == ' ') {
+          sb.append('\\');
+        }
+        sb.append(c);
+      }
+      return sb;
+    }
+
     private SolrInputDocument docFromState(NodeState state) {
         SolrInputDocument inputDocument = new SolrInputDocument();
         String path = getPath();


Reply via email to