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();