You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by eh...@apache.org on 2006/04/21 19:10:15 UTC
svn commit: r395950 - in /incubator/solr/trunk/src:
java/org/apache/solr/request/XMLWriter.java
java/org/apache/solr/util/XML.java
test/org/apache/solr/BasicFunctionalityTest.java
Author: ehatcher
Date: Fri Apr 21 10:10:12 2006
New Revision: 395950
URL: http://svn.apache.org/viewcvs?rev=395950&view=rev
Log:
add escaping of attribute values
Modified:
incubator/solr/trunk/src/java/org/apache/solr/request/XMLWriter.java
incubator/solr/trunk/src/java/org/apache/solr/util/XML.java
incubator/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java
Modified: incubator/solr/trunk/src/java/org/apache/solr/request/XMLWriter.java
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/java/org/apache/solr/request/XMLWriter.java?rev=395950&r1=395949&r2=395950&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/request/XMLWriter.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/request/XMLWriter.java Fri Apr 21 10:10:12 2006
@@ -166,7 +166,7 @@
writer.write(' ');
writer.write(name);
writer.write("=\"");
- writer.write(val);
+ XML.escapeAttributeValue(val, writer);
writer.write('"');
}
}
@@ -177,12 +177,11 @@
writer.write('<');
writer.write(tag);
if (name!=null) {
- writer.write(" name=\"");
- writer.write(name);
+ writeAttr("name", name);
if (closeTag) {
- writer.write("\"/>");
+ writer.write("/>");
} else {
- writer.write("\">");
+ writer.write(">");
}
} else {
if (closeTag) {
Modified: incubator/solr/trunk/src/java/org/apache/solr/util/XML.java
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/java/org/apache/solr/util/XML.java?rev=395950&r1=395949&r2=395950&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/util/XML.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/util/XML.java Fri Apr 21 10:10:12 2006
@@ -34,6 +34,10 @@
private static final String[] chardata_escapes=
{"#0;","#1;","#2;","#3;","#4;","#5;","#6;","#7;","#8;",null,null,"#11;","#12;",null,"#14;","#15;","#16;","#17;","#18;","#19;","#20;","#21;","#22;","#23;","#24;","#25;","#26;","#27;","#28;","#29;","#30;","#31;",null,null,null,null,null,null,"&",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"<"};
+ private static final String[] attribute_escapes=
+ {"#0;","#1;","#2;","#3;","#4;","#5;","#6;","#7;","#8;",null,null,"#11;","#12;",null,"#14;","#15;","#16;","#17;","#18;","#19;","#20;","#21;","#22;","#23;","#24;","#25;","#26;","#27;","#28;","#29;","#30;","#31;",null,null,""",null,null,null,"&",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"<"};
+
+
/*****************************************
#Simple python script used to generate the escape table above. -YCS
@@ -71,42 +75,14 @@
* @throws IOException
*/
public static void escapeCharData(String str, Writer out) throws IOException {
- int start=0;
- // "n" was used for counting the chars added to out...
- // removed cause it wasn't really useful so far.
- // int n=0;
+ escape(str, out, chardata_escapes);
+ }
- for (int i=start; i<str.length(); i++) {
- char ch = str.charAt(i);
- // since I already received the char, what if I put it into
- // a char array and wrote that to the stream instead of the
- // string? (would cause extra GC though)
- String subst=null;
- if (ch<chardata_escapes.length) {
- subst=chardata_escapes[ch];
- }
- if (subst != null) {
- if (start<i) {
- // out.write(str.substring(start,i));
- out.write(str, start, i-start);
- // n+=i-start;
- }
- out.write(subst);
- // n+=subst.length();
- start=i+1;
- }
- }
- if (start==0) {
- out.write(str);
- // n += str.length();
- } else if (start<str.length()) {
- // out.write(str.substring(start));
- out.write(str, start, str.length()-start);
- // n += str.length()-start;
- }
- // return n;
+ public static void escapeAttributeValue(String str, Writer out) throws IOException {
+ escape(str, out, attribute_escapes);
}
+
public final static void writeXML(Writer out, String tag, String val) throws IOException {
out.write('<');
out.write(tag);
@@ -151,7 +127,7 @@
out.write(' ');
out.write(attrs[i++].toString());
out.write("=\"");
- out.write(attrs[i].toString());
+ escapeAttributeValue(attrs[i].toString(), out);
out.write("\"");
}
if (val == null) {
@@ -163,5 +139,43 @@
out.write(tag);
out.write('>');
}
+ }
+
+
+ private static void escape(String str, Writer out, String[] escapes) throws IOException {
+ int start=0;
+ // "n" was used for counting the chars added to out...
+ // removed cause it wasn't really useful so far.
+ // int n=0;
+
+ for (int i=start; i<str.length(); i++) {
+ char ch = str.charAt(i);
+ // since I already received the char, what if I put it into
+ // a char array and wrote that to the stream instead of the
+ // string? (would cause extra GC though)
+ String subst=null;
+ if (ch<escapes.length) {
+ subst=escapes[ch];
+ }
+ if (subst != null) {
+ if (start<i) {
+ // out.write(str.substring(start,i));
+ out.write(str, start, i-start);
+ // n+=i-start;
+ }
+ out.write(subst);
+ // n+=subst.length();
+ start=i+1;
+ }
+ }
+ if (start==0) {
+ out.write(str);
+ // n += str.length();
+ } else if (start<str.length()) {
+ // out.write(str.substring(start));
+ out.write(str, start, str.length()-start);
+ // n += str.length()-start;
+ }
+ // return n;
}
}
Modified: incubator/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=395950&r1=395949&r2=395950&view=diff
==============================================================================
--- incubator/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ incubator/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java Fri Apr 21 10:10:12 2006
@@ -18,6 +18,14 @@
import org.apache.solr.request.*;
import org.apache.solr.util.*;
+import org.w3c.dom.Document;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
/**
* Tests some basic functionality of Solr while demonstrating good
@@ -25,9 +33,9 @@
*/
public class BasicFunctionalityTest extends AbstractSolrTestCase {
- public String getSchemaFile() { return "schema.xml"; }
+ public String getSchemaFile() { return "schema.xml"; }
public String getSolrConfigFile() { return "solrconfig.xml"; }
-
+
public void setUp() throws Exception {
// if you override setUp or tearDown, you better call
// the super classes version
@@ -54,13 +62,13 @@
adoc("id", "42", "val_s", "aa;bb"));
assertU("does commit work?",
commit());
-
+
assertQ("backslash escaping semicolon",
req("id:42 AND val_s:aa\\;bb")
,"//*[@numFound='1']"
,"//int[@name='id'][.='42']"
);
-
+
assertQ("quote escaping semicolon",
req("id:42 AND val_s:\"aa;bb\"")
,"//*[@numFound='1']"
@@ -77,9 +85,9 @@
assertQ(req("id:42")
,"//*[@numFound='0']"
);
-
+
// test allowDups default of false
-
+
assertU(adoc("id", "42", "val_s", "AAA"));
assertU(adoc("id", "42", "val_s", "BBB"));
assertU(commit());
@@ -138,16 +146,30 @@
assertQ(req("id:[0 TO 99]")
,"//*[@numFound='2']"
);
-
+
}
+ public void testXMLWriter() throws Exception {
+
+ SolrQueryResponse rsp = new SolrQueryResponse();
+ rsp.add("\"quoted\"", "\"value\"");
+
+ StringWriter writer = new StringWriter(32000);
+ XMLWriter.writeResponse(writer,req("foo"),rsp);
+
+ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ builder.parse(new ByteArrayInputStream
+ (writer.toString().getBytes("UTF-8")));
+ }
+
+
// /** this doesn't work, but if it did, this is how we'd test it. */
// public void testOverwriteFalse() {
-
+
// assertU(adoc("id", "overwrite", "val_s", "AAA"));
// assertU(commit());
-
+
// assertU(add(doc("id", "overwrite", "val_s", "BBB")
// ,"allowDups", "false"
// ,"overwriteCommitted","false"
@@ -159,6 +181,6 @@
// ,"//str[.='AAA']"
// );
// }
-
-
+
+
}