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 yo...@apache.org on 2006/07/18 23:52:07 UTC

svn commit: r423263 - in /incubator/solr/trunk/src: java/org/apache/solr/analysis/ java/org/apache/solr/request/ java/org/apache/solr/search/ java/org/apache/solr/search/function/ java/org/apache/solr/util/ test/org/apache/solr/ test/org/apache/solr/ut...

Author: yonik
Date: Tue Jul 18 14:52:05 2006
New Revision: 423263

URL: http://svn.apache.org/viewvc?rev=423263&view=rev
Log:
set svn:eol-style native

Modified:
    incubator/solr/trunk/src/java/org/apache/solr/analysis/BufferedTokenStream.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/KeywordTokenizerFactory.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/RemoveDuplicatesTokenFilter.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/RemoveDuplicatesTokenFilterFactory.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/SolrAnalyzer.java   (contents, props changed)
    incubator/solr/trunk/src/java/org/apache/solr/request/DisMaxRequestHandler.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/request/JSONResponseWriter.java   (contents, props changed)
    incubator/solr/trunk/src/java/org/apache/solr/request/PythonResponseWriter.java   (contents, props changed)
    incubator/solr/trunk/src/java/org/apache/solr/request/RubyResponseWriter.java   (contents, props changed)
    incubator/solr/trunk/src/java/org/apache/solr/request/TextResponseWriter.java   (contents, props changed)
    incubator/solr/trunk/src/java/org/apache/solr/search/PrefixFilter.java   (contents, props changed)
    incubator/solr/trunk/src/java/org/apache/solr/search/function/MaxFloatFunction.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/util/AbstractSolrTestCase.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/util/SolrPluginUtils.java   (props changed)
    incubator/solr/trunk/src/java/org/apache/solr/util/TestHarness.java   (props changed)
    incubator/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java   (props changed)
    incubator/solr/trunk/src/test/org/apache/solr/ConvertedLegacyTest.java   (props changed)
    incubator/solr/trunk/src/test/org/apache/solr/DisMaxRequestHandlerTest.java   (props changed)
    incubator/solr/trunk/src/test/org/apache/solr/OutputWriterTest.java   (props changed)
    incubator/solr/trunk/src/test/org/apache/solr/SampleTest.java   (props changed)
    incubator/solr/trunk/src/test/org/apache/solr/util/SolrPluginUtilsTest.java   (props changed)
    incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServletRequest.java   (contents, props changed)
    incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrUpdateServlet.java   (contents, props changed)

Propchange: incubator/solr/trunk/src/java/org/apache/solr/analysis/BufferedTokenStream.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/analysis/KeywordTokenizerFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/analysis/RemoveDuplicatesTokenFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/analysis/RemoveDuplicatesTokenFilterFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/java/org/apache/solr/analysis/SolrAnalyzer.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/analysis/SolrAnalyzer.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/analysis/SolrAnalyzer.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/analysis/SolrAnalyzer.java Tue Jul 18 14:52:05 2006
@@ -1,19 +1,19 @@
-package org.apache.solr.analysis;
-
-import org.apache.lucene.analysis.Analyzer;
-
-/**
- * @author yonik
- * @version $Id$
- */
-public abstract class SolrAnalyzer extends Analyzer {
-  int posIncGap=0;
-  
-  public void setPositionIncrementGap(int gap) {
-    posIncGap=gap;
-  }
-
-  public int getPositionIncrementGap(String fieldName) {
-    return posIncGap;
-  }
-}
+package org.apache.solr.analysis;
+
+import org.apache.lucene.analysis.Analyzer;
+
+/**
+ * @author yonik
+ * @version $Id$
+ */
+public abstract class SolrAnalyzer extends Analyzer {
+  int posIncGap=0;
+  
+  public void setPositionIncrementGap(int gap) {
+    posIncGap=gap;
+  }
+
+  public int getPositionIncrementGap(String fieldName) {
+    return posIncGap;
+  }
+}

Propchange: incubator/solr/trunk/src/java/org/apache/solr/analysis/SolrAnalyzer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/request/DisMaxRequestHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/java/org/apache/solr/request/JSONResponseWriter.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/request/JSONResponseWriter.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/request/JSONResponseWriter.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/request/JSONResponseWriter.java Tue Jul 18 14:52:05 2006
@@ -1,703 +1,703 @@
-package org.apache.solr.request;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Fieldable;
-import org.apache.solr.schema.SchemaField;
-import org.apache.solr.schema.TextField;
-import org.apache.solr.search.DocIterator;
-import org.apache.solr.search.DocList;
-import org.apache.solr.util.NamedList;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.*;
-
-/**
- * @author yonik
- * @version $Id$
- */
-
-public class JSONResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_JSON_UTF8="text/x-json;charset=UTF-8";
-
-
-  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
-    JSONWriter w = new JSONWriter(writer, req, rsp);
-    w.writeResponse();
-  }
-
-  public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
-    // using the text/plain allows this to be viewed in the browser easily
-    return CONTENT_TYPE_TEXT_UTF8;
-  }
-}
-
-
-class JSONWriter extends TextResponseWriter {
-
-  // cache the calendar instance in case we are writing many dates...
-  private Calendar cal;
-
-  private String namedListStyle;
-
-  private static final String JSON_NL_STYLE="json.nl";
-  private static final String JSON_NL_MAP="map";
-  private static final String JSON_NL_ARROFARR="arrarr";
-  private static final String JSON_NL_ARROFMAP="arrmap";
-
-
-  public JSONWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
-    super(writer, req, rsp);
-    namedListStyle = req.getParam(JSON_NL_STYLE);
-    namedListStyle = namedListStyle==null ? JSON_NL_MAP : namedListStyle.intern();
-  }
-
-  public void writeResponse() throws IOException {
-    int qtime=(int)(rsp.getEndTime() - req.getStartTime());
-    NamedList nl = new NamedList();
-    HashMap header = new HashMap(1);
-    header.put("qtime",qtime);
-    nl.add("header", header);
-    nl.addAll(rsp.getValues());
-    // give the main response a name it it doesn't have one
-    if (nl.size()>1 && nl.getVal(1) instanceof DocList && nl.getName(1)==null) {
-      nl.setName(1,"response");
-    }
-    writeNamedList(null, nl);
-  }
-
-  protected void writeKey(String fname, boolean needsEscaping) throws IOException {
-    writeStr(null, fname, needsEscaping);
-    writer.write(':');
-  }
-
-  // Represents a NamedList directly as a JSON Object (essentially a Map)
-  // more natural but potentially problematic since order is not maintained and keys
-  // can't be repeated.
-  protected void writeNamedListAsMap(String name, NamedList val) throws IOException {
-    int sz = val.size();
-    writer.write('{');
-    incLevel();
-
-    // In JSON objects (maps) we can't have null keys or duplicates...
-    // map null to "" and append a qualifier to duplicates.
-    //
-    // a=123,a=456 will be mapped to {a=1,a__1=456}
-    // Disad: this is ambiguous since a real key could be called a__1
-    //
-    // Another possible mapping could aggregate multiple keys to an array:
-    // a=123,a=456 maps to a=[123,456]
-    // Disad: this is ambiguous with a real single value that happens to be an array
-    //
-    // Both of these mappings have ambiguities.
-    HashMap<String,Integer> repeats = new HashMap<String,Integer>(4);
-
-    boolean first=true;
-    for (int i=0; i<sz; i++) {
-      String key = val.getName(i);
-      if (key==null) key="";
-
-      if (first) {
-        first=false;
-        repeats.put(key,0);
-      } else {
-        writer.write(',');
-
-        Integer repeatCount = repeats.get(key);
-        if (repeatCount==null) {
-          repeats.put(key,0);
-        } else {
-          String newKey = key;
-          int newCount = repeatCount;
-          do {  // avoid generated key clashing with a real key
-            newKey = key + ' ' + (++newCount);
-            repeatCount = repeats.get(newKey);
-          } while (repeatCount != null);
-
-          repeats.put(key,newCount);
-          key = newKey;
-        }
-      }
-
-      indent();
-      writeKey(key, true);
-      writeVal(key,val.getVal(i));
-    }
-
-    decLevel();
-    writer.write('}');
-  }
-
-  // Represents a NamedList directly as an array of JSON objects...
-  // NamedList("a"=1,"b"=2,null=3) => [{"a":1},{"b":2},3]
-  protected void writeNamedListAsArrMap(String name, NamedList val) throws IOException {
-    int sz = val.size();
-    indent();
-    writer.write('[');
-    incLevel();
-
-    boolean first=true;
-    for (int i=0; i<sz; i++) {
-      String key = val.getName(i);
-
-      if (first) {
-        first=false;
-      } else {
-        writer.write(',');
-      }
-
-      indent();
-
-      if (key==null) {
-        writeVal(null,val.getVal(i));
-      } else {
-        writer.write('{');
-        writeKey(key, true);
-        writeVal(key,val.getVal(i));
-        writer.write('}');
-      }
-
-    }
-
-    decLevel();
-    writer.write(']');
-  }
-
-  // Represents a NamedList directly as an array of JSON objects...
-  // NamedList("a"=1,"b"=2,null=3) => [["a",1],["b",2],[null,3]]
-  protected void writeNamedListAsArrArr(String name, NamedList val) throws IOException {
-    int sz = val.size();
-    indent();
-    writer.write('[');
-    incLevel();
-
-    boolean first=true;
-    for (int i=0; i<sz; i++) {
-      String key = val.getName(i);
-
-      if (first) {
-        first=false;
-      } else {
-        writer.write(',');
-      }
-
-      indent();
-
-      /*** if key is null, just write value???
-      if (key==null) {
-        writeVal(null,val.getVal(i));
-      } else {
-     ***/
-
-        writer.write('[');
-        incLevel();
-        writeStr(null,key,true);
-        writer.write(',');
-        writeVal(key,val.getVal(i));
-        decLevel();
-        writer.write(']');
-
-
-    }
-
-    decLevel();
-    writer.write(']');
-  }
-
-
-  public void writeNamedList(String name, NamedList val) throws IOException {
-    if (namedListStyle==JSON_NL_ARROFMAP) {
-      writeNamedListAsArrMap(name,val);
-    } else if (namedListStyle==JSON_NL_ARROFARR) {
-      writeNamedListAsArrArr(name,val);
-    } else {
-      writeNamedListAsMap(name,val);
-    }
-  }
-
-
-  private static class MultiValueField {
-    final SchemaField sfield;
-    final ArrayList<Fieldable> fields;
-    MultiValueField(SchemaField sfield, Fieldable firstVal) {
-      this.sfield = sfield;
-      this.fields = new ArrayList<Fieldable>(4);
-      this.fields.add(firstVal);
-    }
-  }
-
-  public void writeDoc(String name, Collection<Fieldable> fields, Set<String> returnFields, Map pseudoFields) throws IOException {
-    writer.write('{');
-    incLevel();
-
-    HashMap<String, MultiValueField> multi = new HashMap<String, MultiValueField>();
-
-    boolean first=true;
-
-    for (Fieldable ff : fields) {
-      String fname = ff.name();
-      if (returnFields!=null && !returnFields.contains(fname)) {
-        continue;
-      }
-
-      // if the field is multivalued, it may have other values further on... so
-      // build up a list for each multi-valued field.
-      SchemaField sf = schema.getField(fname);
-      if (sf.multiValued()) {
-        MultiValueField mf = multi.get(fname);
-        if (mf==null) {
-          mf = new MultiValueField(sf, ff);
-          multi.put(fname, mf);
-        } else {
-          mf.fields.add(ff);
-        }
-      } else {
-        // not multi-valued, so write it immediately.
-        if (first) {
-          first=false;
-        } else {
-          writer.write(',');
-        }
-        indent();
-        writeKey(fname,true);
-        sf.write(this, fname, ff);
-      }
-    }
-
-    for(MultiValueField mvf : multi.values()) {
-      if (first) {
-        first=false;
-      } else {
-        writer.write(',');
-      }
-
-      indent();
-      writeKey(mvf.sfield.getName(), true);
-
-      boolean indentArrElems=false;
-      if (doIndent) {
-        // heuristic... TextField is probably the only field type likely to be long enough
-        // to warrant indenting individual values.
-        indentArrElems = (mvf.sfield.getType() instanceof TextField);
-      }
-
-      writer.write('[');
-      boolean firstArrElem=true;
-      incLevel();
-
-      for (Fieldable ff : mvf.fields) {
-        if (firstArrElem) {
-          firstArrElem=false;
-        } else {
-          writer.write(',');
-        }
-        if (indentArrElems) indent();
-        mvf.sfield.write(this, null, ff);
-      }
-      writer.write(']');
-      decLevel();
-    }
-
-    if (pseudoFields !=null && pseudoFields.size()>0) {
-      writeMap(null,pseudoFields,true,first);
-    }
-
-    decLevel();
-    writer.write('}');
-  }
-
-  // reusable map to store the "score" pseudo-field.
-  // if a Doc can ever contain another doc, this optimization would have to go.
-  private final HashMap scoreMap = new HashMap(1);
-
-  public void writeDoc(String name, Document doc, Set<String> returnFields, float score, boolean includeScore) throws IOException {
-    Map other = null;
-    if (includeScore) {
-      other = scoreMap;
-      scoreMap.put("score",score);
-    }
-    writeDoc(name, (List<Fieldable>)(doc.getFields()), returnFields, other);
-  }
-
-  public void writeDocList(String name, DocList ids, Set<String> fields, Map otherFields) throws IOException {
-    boolean includeScore=false;
-    if (fields!=null) {
-      includeScore = fields.contains("score");
-      if (fields.size()==0 || (fields.size()==1 && includeScore) || fields.contains("*")) {
-        fields=null;  // null means return all stored fields
-      }
-    }
-
-    int sz=ids.size();
-
-    writer.write('{');
-    incLevel();
-    writeKey("numFound",false);
-    writeInt(null,ids.matches());
-    writer.write(',');
-    writeKey("start",false);
-    writeInt(null,ids.offset());
-
-    if (includeScore) {
-      writer.write(',');
-      writeKey("maxScore",false);
-      writeFloat(null,ids.maxScore());
-    }
-    writer.write(',');
-    // indent();
-    writeKey("docs",false);
-    writer.write('[');
-
-    incLevel();
-    boolean first=true;
-
-    DocIterator iterator = ids.iterator();
-    for (int i=0; i<sz; i++) {
-      int id = iterator.nextDoc();
-      Document doc = searcher.doc(id);
-
-      if (first) {
-        first=false;
-      } else {
-        writer.write(',');
-      }
-      indent();
-      writeDoc(null, doc, fields, (includeScore ? iterator.score() : 0.0f), includeScore);
-    }
-    decLevel();
-    writer.write(']');
-
-    if (otherFields !=null) {
-      writeMap(null, otherFields, true, false);
-    }
-
-    decLevel();
-    indent();
-    writer.write('}');
-  }
-
-
-
-
-  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
-    writer.write('"');
-    // it might be more efficient to use a stringbuilder or write substrings
-    // if writing chars to the stream is slow.
-    if (needsEscaping) {
-      for (int i=0; i<val.length(); i++) {
-        char ch = val.charAt(i);
-        switch(ch) {
-          case '"':
-          case '\\':
-            writer.write('\\');
-            writer.write(ch);
-            break;
-            /*** the following are not required to be escaped
-             case '\r':
-             case '\n':
-             case '\t':
-             case '\b':
-             case '\f':
-             case '/':
-             ***/
-          default: writer.write(ch);
-        }
-      }
-    } else {
-      writer.write(val);
-    }
-    writer.write('"');
-  }
-
-
-  public void writeMap(String name, Map val, boolean excludeOuter, boolean isFirstVal) throws IOException {
-    if (!excludeOuter) {
-      writer.write('{');
-      incLevel();
-      isFirstVal=true;
-    }
-
-    for (Map.Entry entry : (Set<Map.Entry>)val.entrySet()) {
-      Object e = entry.getKey();
-      String k = e==null ? null : e.toString();
-      Object v = entry.getValue();
-
-      if (isFirstVal) {
-        isFirstVal=false;
-      } else {
-        writer.write(',');
-      }
-
-      indent();
-      writeKey(k,true);
-      writeVal(k,v);
-    }
-
-    if (!excludeOuter) {
-      decLevel();
-      writer.write('}');
-    }
-  }
-
-
-  public void writeArray(String name, Object[] val) throws IOException {
-    writeArray(name, Arrays.asList(val));
-  }
-
-  public void writeArray(String name, Collection val) throws IOException {
-    writer.write('[');
-    int sz = val.size();
-    incLevel();
-    boolean first=true;
-    for (Object o : val) {
-      if (first) {
-        first=false;
-      } else {
-        writer.write(',');
-      }
-      if (sz>0) indent();
-      writeVal(null, o);
-    }
-    decLevel();
-    writer.write(']');
-  }
-
-  //
-  // Primitive types
-  //
-  public void writeNull(String name) throws IOException {
-    writeStr(name,"null",false);
-  }
-
-  public void writeInt(String name, String val) throws IOException {
-    writer.write(val);
-  }
-
-  public void writeLong(String name, String val) throws IOException {
-    writer.write(val);
-  }
-
-  public void writeBool(String name, String val) throws IOException {
-    writer.write(val);
-  }
-
-  public void writeFloat(String name, String val) throws IOException {
-    writer.write(val);
-  }
-
-  public void writeDouble(String name, String val) throws IOException {
-    writer.write(val);
-  }
-
-  // TODO: refactor this out to a DateUtils class or something...
-  public void writeDate(String name, Date val) throws IOException {
-    // using a stringBuilder for numbers can be nice since
-    // a temporary string isn't used (it's added directly to the
-    // builder's buffer.
-
-    StringBuilder sb = new StringBuilder();
-    if (cal==null) cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
-    cal.setTime(val);
-
-    int i = cal.get(Calendar.YEAR);
-    sb.append(i);
-    sb.append('-');
-    i = cal.get(Calendar.MONTH) + 1;  // 0 based, so add 1
-    if (i<10) sb.append('0');
-    sb.append(i);
-    sb.append('-');
-    i=cal.get(Calendar.DAY_OF_MONTH);
-    if (i<10) sb.append('0');
-    sb.append(i);
-    sb.append('T');
-    i=cal.get(Calendar.HOUR_OF_DAY); // 24 hour time format
-    if (i<10) sb.append('0');
-    sb.append(i);
-    sb.append(':');
-    i=cal.get(Calendar.MINUTE);
-    if (i<10) sb.append('0');
-    sb.append(i);
-    sb.append(':');
-    i=cal.get(Calendar.SECOND);
-    if (i<10) sb.append('0');
-    sb.append(i);
-    i=cal.get(Calendar.MILLISECOND);
-    if (i != 0) {
-      sb.append('.');
-      if (i<100) sb.append('0');
-      if (i<10) sb.append('0');
-      sb.append(i);
-
-      // handle canonical format specifying fractional
-      // seconds shall not end in '0'.  Given the slowness of
-      // integer div/mod, simply checking the last character
-      // is probably the fastest way to check.
-      int lastIdx = sb.length()-1;
-      if (sb.charAt(lastIdx)=='0') {
-        lastIdx--;
-        if (sb.charAt(lastIdx)=='0') {
-          lastIdx--;
-        }
-        sb.setLength(lastIdx+1);
-      }
-
-    }
-    sb.append('Z');
-    writeDate(name, sb.toString());
-  }
-
-  public void writeDate(String name, String val) throws IOException {
-    writeStr(name, val, false);
-  }
-
-  protected static void unicodeEscape(Appendable sb, int ch) throws IOException {
-    String str = Integer.toHexString(ch & 0xffff);
-    switch (str.length()) {
-      case 1: sb.append("\\u000"); break;
-      case 2: sb.append("\\u00"); break;
-      case 3: sb.append("\\u0");  break;
-      default: sb.append("\\u");  break;
-    }
-    sb.append(str);
-  }
-
-}
-
-class PythonWriter extends JSONWriter {
-  public PythonWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
-    super(writer, req, rsp);
-  }
-
-  @Override
-  public void writeNull(String name) throws IOException {
-    writer.write("None");
-  }
-
-  @Override
-  public void writeBool(String name, boolean val) throws IOException {
-    writer.write(val ? "True" : "False");
-  }
-
-  @Override
-  public void writeBool(String name, String val) throws IOException {
-    writeBool(name,val.charAt(0)=='t');
-  }
-
-  /* optionally use a unicode python string if necessary */
-  @Override
-  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
-    if (!needsEscaping) {
-      writer.write('\'');
-      writer.write(val);
-      writer.write('\'');
-      return;
-    }
-
-    // use python unicode strings...
-    // python doesn't tolerate newlines in strings in it's eval(), so we must escape them.
-
-    StringBuilder sb = new StringBuilder(val.length());
-    boolean needUnicode=false;
-
-    for (int i=0; i<val.length(); i++) {
-      char ch = val.charAt(i);
-      switch(ch) {
-        case '\'':
-        case '\\': sb.append('\\'); sb.append(ch); break;
-        case '\r': sb.append("\\r"); break;
-        case '\n': sb.append("\\n"); break;
-          default:
-            // we don't strictly have to escape these chars, but it will probably increase
-            // portability to stick to visible ascii
-            if (ch<' ' || ch>127) {
-              unicodeEscape(sb, ch);
-              needUnicode=true;
-            } else {
-              sb.append(ch);
-            }
-        }
-      }
-
-    writer.write( needUnicode ? "u'" : "'");
-    writer.append(sb);
-    writer.write('\'');
-  }
-
-  /*
-  old version that always used unicode
-  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
-    // use python unicode strings...
-    // python doesn't tolerate newlines in strings in it's eval(), so we must escape them.
-    writer.write("u'");
-    // it might be more efficient to use a stringbuilder or write substrings
-    // if writing chars to the stream is slow.
-    if (needsEscaping) {
-      for (int i=0; i<val.length(); i++) {
-        char ch = val.charAt(i);
-        switch(ch) {
-          case '\'':
-          case '\\': writer.write('\\'); writer.write(ch); break;
-          case '\r': writer.write("\\r"); break;
-          case '\n': writer.write("\\n"); break;
-          default:
-            // we don't strictly have to escape these chars, but it will probably increase
-            // portability to stick to visible ascii
-            if (ch<' ' || ch>127) {
-              unicodeChar(ch);
-            } else {
-              writer.write(ch);
-            }
-        }
-      }
-    } else {
-      writer.write(val);
-    }
-    writer.write('\'');
-  }
-  */
-
-}
-
-
-class RubyWriter extends JSONWriter {
-  public RubyWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
-    super(writer, req, rsp);
-  }
-
-  @Override
-  public void writeNull(String name) throws IOException {
-    writer.write("nil");
-  }
-
-  @Override
-  protected void writeKey(String fname, boolean needsEscaping) throws IOException {
-    writeStr(null, fname, needsEscaping);
-    writer.write("=>");
-  }
-
-  @Override
-  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
-    // Ruby doesn't do unicode escapes... so let the servlet container write raw UTF-8
-    // bytes into the string.
-    //
-    // Use single quoted strings for safety since no evaluation is done within them.
-    // Also, there are very few escapes recognized in a singe quoted string, so
-    // only escape the backspace and single quote.
-    writer.write('\'');
-    // it might be more efficient to use a stringbuilder or write substrings
-    // if writing chars to the stream is slow.
-    if (needsEscaping) {
-      for (int i=0; i<val.length(); i++) {
-        char ch = val.charAt(i);
-        switch(ch) {
-          case '\'':
-          case '\\': writer.write('\\'); writer.write(ch); break;
-          default: writer.write(ch); break;
-        }
-      }
-    } else {
-      writer.write(val);
-    }
-    writer.write('\'');
-  }
+package org.apache.solr.request;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Fieldable;
+import org.apache.solr.schema.SchemaField;
+import org.apache.solr.schema.TextField;
+import org.apache.solr.search.DocIterator;
+import org.apache.solr.search.DocList;
+import org.apache.solr.util.NamedList;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.*;
+
+/**
+ * @author yonik
+ * @version $Id$
+ */
+
+public class JSONResponseWriter implements QueryResponseWriter {
+  static String CONTENT_TYPE_JSON_UTF8="text/x-json;charset=UTF-8";
+
+
+  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
+    JSONWriter w = new JSONWriter(writer, req, rsp);
+    w.writeResponse();
+  }
+
+  public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
+    // using the text/plain allows this to be viewed in the browser easily
+    return CONTENT_TYPE_TEXT_UTF8;
+  }
+}
+
+
+class JSONWriter extends TextResponseWriter {
+
+  // cache the calendar instance in case we are writing many dates...
+  private Calendar cal;
+
+  private String namedListStyle;
+
+  private static final String JSON_NL_STYLE="json.nl";
+  private static final String JSON_NL_MAP="map";
+  private static final String JSON_NL_ARROFARR="arrarr";
+  private static final String JSON_NL_ARROFMAP="arrmap";
+
+
+  public JSONWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
+    super(writer, req, rsp);
+    namedListStyle = req.getParam(JSON_NL_STYLE);
+    namedListStyle = namedListStyle==null ? JSON_NL_MAP : namedListStyle.intern();
+  }
+
+  public void writeResponse() throws IOException {
+    int qtime=(int)(rsp.getEndTime() - req.getStartTime());
+    NamedList nl = new NamedList();
+    HashMap header = new HashMap(1);
+    header.put("qtime",qtime);
+    nl.add("header", header);
+    nl.addAll(rsp.getValues());
+    // give the main response a name it it doesn't have one
+    if (nl.size()>1 && nl.getVal(1) instanceof DocList && nl.getName(1)==null) {
+      nl.setName(1,"response");
+    }
+    writeNamedList(null, nl);
+  }
+
+  protected void writeKey(String fname, boolean needsEscaping) throws IOException {
+    writeStr(null, fname, needsEscaping);
+    writer.write(':');
+  }
+
+  // Represents a NamedList directly as a JSON Object (essentially a Map)
+  // more natural but potentially problematic since order is not maintained and keys
+  // can't be repeated.
+  protected void writeNamedListAsMap(String name, NamedList val) throws IOException {
+    int sz = val.size();
+    writer.write('{');
+    incLevel();
+
+    // In JSON objects (maps) we can't have null keys or duplicates...
+    // map null to "" and append a qualifier to duplicates.
+    //
+    // a=123,a=456 will be mapped to {a=1,a__1=456}
+    // Disad: this is ambiguous since a real key could be called a__1
+    //
+    // Another possible mapping could aggregate multiple keys to an array:
+    // a=123,a=456 maps to a=[123,456]
+    // Disad: this is ambiguous with a real single value that happens to be an array
+    //
+    // Both of these mappings have ambiguities.
+    HashMap<String,Integer> repeats = new HashMap<String,Integer>(4);
+
+    boolean first=true;
+    for (int i=0; i<sz; i++) {
+      String key = val.getName(i);
+      if (key==null) key="";
+
+      if (first) {
+        first=false;
+        repeats.put(key,0);
+      } else {
+        writer.write(',');
+
+        Integer repeatCount = repeats.get(key);
+        if (repeatCount==null) {
+          repeats.put(key,0);
+        } else {
+          String newKey = key;
+          int newCount = repeatCount;
+          do {  // avoid generated key clashing with a real key
+            newKey = key + ' ' + (++newCount);
+            repeatCount = repeats.get(newKey);
+          } while (repeatCount != null);
+
+          repeats.put(key,newCount);
+          key = newKey;
+        }
+      }
+
+      indent();
+      writeKey(key, true);
+      writeVal(key,val.getVal(i));
+    }
+
+    decLevel();
+    writer.write('}');
+  }
+
+  // Represents a NamedList directly as an array of JSON objects...
+  // NamedList("a"=1,"b"=2,null=3) => [{"a":1},{"b":2},3]
+  protected void writeNamedListAsArrMap(String name, NamedList val) throws IOException {
+    int sz = val.size();
+    indent();
+    writer.write('[');
+    incLevel();
+
+    boolean first=true;
+    for (int i=0; i<sz; i++) {
+      String key = val.getName(i);
+
+      if (first) {
+        first=false;
+      } else {
+        writer.write(',');
+      }
+
+      indent();
+
+      if (key==null) {
+        writeVal(null,val.getVal(i));
+      } else {
+        writer.write('{');
+        writeKey(key, true);
+        writeVal(key,val.getVal(i));
+        writer.write('}');
+      }
+
+    }
+
+    decLevel();
+    writer.write(']');
+  }
+
+  // Represents a NamedList directly as an array of JSON objects...
+  // NamedList("a"=1,"b"=2,null=3) => [["a",1],["b",2],[null,3]]
+  protected void writeNamedListAsArrArr(String name, NamedList val) throws IOException {
+    int sz = val.size();
+    indent();
+    writer.write('[');
+    incLevel();
+
+    boolean first=true;
+    for (int i=0; i<sz; i++) {
+      String key = val.getName(i);
+
+      if (first) {
+        first=false;
+      } else {
+        writer.write(',');
+      }
+
+      indent();
+
+      /*** if key is null, just write value???
+      if (key==null) {
+        writeVal(null,val.getVal(i));
+      } else {
+     ***/
+
+        writer.write('[');
+        incLevel();
+        writeStr(null,key,true);
+        writer.write(',');
+        writeVal(key,val.getVal(i));
+        decLevel();
+        writer.write(']');
+
+
+    }
+
+    decLevel();
+    writer.write(']');
+  }
+
+
+  public void writeNamedList(String name, NamedList val) throws IOException {
+    if (namedListStyle==JSON_NL_ARROFMAP) {
+      writeNamedListAsArrMap(name,val);
+    } else if (namedListStyle==JSON_NL_ARROFARR) {
+      writeNamedListAsArrArr(name,val);
+    } else {
+      writeNamedListAsMap(name,val);
+    }
+  }
+
+
+  private static class MultiValueField {
+    final SchemaField sfield;
+    final ArrayList<Fieldable> fields;
+    MultiValueField(SchemaField sfield, Fieldable firstVal) {
+      this.sfield = sfield;
+      this.fields = new ArrayList<Fieldable>(4);
+      this.fields.add(firstVal);
+    }
+  }
+
+  public void writeDoc(String name, Collection<Fieldable> fields, Set<String> returnFields, Map pseudoFields) throws IOException {
+    writer.write('{');
+    incLevel();
+
+    HashMap<String, MultiValueField> multi = new HashMap<String, MultiValueField>();
+
+    boolean first=true;
+
+    for (Fieldable ff : fields) {
+      String fname = ff.name();
+      if (returnFields!=null && !returnFields.contains(fname)) {
+        continue;
+      }
+
+      // if the field is multivalued, it may have other values further on... so
+      // build up a list for each multi-valued field.
+      SchemaField sf = schema.getField(fname);
+      if (sf.multiValued()) {
+        MultiValueField mf = multi.get(fname);
+        if (mf==null) {
+          mf = new MultiValueField(sf, ff);
+          multi.put(fname, mf);
+        } else {
+          mf.fields.add(ff);
+        }
+      } else {
+        // not multi-valued, so write it immediately.
+        if (first) {
+          first=false;
+        } else {
+          writer.write(',');
+        }
+        indent();
+        writeKey(fname,true);
+        sf.write(this, fname, ff);
+      }
+    }
+
+    for(MultiValueField mvf : multi.values()) {
+      if (first) {
+        first=false;
+      } else {
+        writer.write(',');
+      }
+
+      indent();
+      writeKey(mvf.sfield.getName(), true);
+
+      boolean indentArrElems=false;
+      if (doIndent) {
+        // heuristic... TextField is probably the only field type likely to be long enough
+        // to warrant indenting individual values.
+        indentArrElems = (mvf.sfield.getType() instanceof TextField);
+      }
+
+      writer.write('[');
+      boolean firstArrElem=true;
+      incLevel();
+
+      for (Fieldable ff : mvf.fields) {
+        if (firstArrElem) {
+          firstArrElem=false;
+        } else {
+          writer.write(',');
+        }
+        if (indentArrElems) indent();
+        mvf.sfield.write(this, null, ff);
+      }
+      writer.write(']');
+      decLevel();
+    }
+
+    if (pseudoFields !=null && pseudoFields.size()>0) {
+      writeMap(null,pseudoFields,true,first);
+    }
+
+    decLevel();
+    writer.write('}');
+  }
+
+  // reusable map to store the "score" pseudo-field.
+  // if a Doc can ever contain another doc, this optimization would have to go.
+  private final HashMap scoreMap = new HashMap(1);
+
+  public void writeDoc(String name, Document doc, Set<String> returnFields, float score, boolean includeScore) throws IOException {
+    Map other = null;
+    if (includeScore) {
+      other = scoreMap;
+      scoreMap.put("score",score);
+    }
+    writeDoc(name, (List<Fieldable>)(doc.getFields()), returnFields, other);
+  }
+
+  public void writeDocList(String name, DocList ids, Set<String> fields, Map otherFields) throws IOException {
+    boolean includeScore=false;
+    if (fields!=null) {
+      includeScore = fields.contains("score");
+      if (fields.size()==0 || (fields.size()==1 && includeScore) || fields.contains("*")) {
+        fields=null;  // null means return all stored fields
+      }
+    }
+
+    int sz=ids.size();
+
+    writer.write('{');
+    incLevel();
+    writeKey("numFound",false);
+    writeInt(null,ids.matches());
+    writer.write(',');
+    writeKey("start",false);
+    writeInt(null,ids.offset());
+
+    if (includeScore) {
+      writer.write(',');
+      writeKey("maxScore",false);
+      writeFloat(null,ids.maxScore());
+    }
+    writer.write(',');
+    // indent();
+    writeKey("docs",false);
+    writer.write('[');
+
+    incLevel();
+    boolean first=true;
+
+    DocIterator iterator = ids.iterator();
+    for (int i=0; i<sz; i++) {
+      int id = iterator.nextDoc();
+      Document doc = searcher.doc(id);
+
+      if (first) {
+        first=false;
+      } else {
+        writer.write(',');
+      }
+      indent();
+      writeDoc(null, doc, fields, (includeScore ? iterator.score() : 0.0f), includeScore);
+    }
+    decLevel();
+    writer.write(']');
+
+    if (otherFields !=null) {
+      writeMap(null, otherFields, true, false);
+    }
+
+    decLevel();
+    indent();
+    writer.write('}');
+  }
+
+
+
+
+  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
+    writer.write('"');
+    // it might be more efficient to use a stringbuilder or write substrings
+    // if writing chars to the stream is slow.
+    if (needsEscaping) {
+      for (int i=0; i<val.length(); i++) {
+        char ch = val.charAt(i);
+        switch(ch) {
+          case '"':
+          case '\\':
+            writer.write('\\');
+            writer.write(ch);
+            break;
+            /*** the following are not required to be escaped
+             case '\r':
+             case '\n':
+             case '\t':
+             case '\b':
+             case '\f':
+             case '/':
+             ***/
+          default: writer.write(ch);
+        }
+      }
+    } else {
+      writer.write(val);
+    }
+    writer.write('"');
+  }
+
+
+  public void writeMap(String name, Map val, boolean excludeOuter, boolean isFirstVal) throws IOException {
+    if (!excludeOuter) {
+      writer.write('{');
+      incLevel();
+      isFirstVal=true;
+    }
+
+    for (Map.Entry entry : (Set<Map.Entry>)val.entrySet()) {
+      Object e = entry.getKey();
+      String k = e==null ? null : e.toString();
+      Object v = entry.getValue();
+
+      if (isFirstVal) {
+        isFirstVal=false;
+      } else {
+        writer.write(',');
+      }
+
+      indent();
+      writeKey(k,true);
+      writeVal(k,v);
+    }
+
+    if (!excludeOuter) {
+      decLevel();
+      writer.write('}');
+    }
+  }
+
+
+  public void writeArray(String name, Object[] val) throws IOException {
+    writeArray(name, Arrays.asList(val));
+  }
+
+  public void writeArray(String name, Collection val) throws IOException {
+    writer.write('[');
+    int sz = val.size();
+    incLevel();
+    boolean first=true;
+    for (Object o : val) {
+      if (first) {
+        first=false;
+      } else {
+        writer.write(',');
+      }
+      if (sz>0) indent();
+      writeVal(null, o);
+    }
+    decLevel();
+    writer.write(']');
+  }
+
+  //
+  // Primitive types
+  //
+  public void writeNull(String name) throws IOException {
+    writeStr(name,"null",false);
+  }
+
+  public void writeInt(String name, String val) throws IOException {
+    writer.write(val);
+  }
+
+  public void writeLong(String name, String val) throws IOException {
+    writer.write(val);
+  }
+
+  public void writeBool(String name, String val) throws IOException {
+    writer.write(val);
+  }
+
+  public void writeFloat(String name, String val) throws IOException {
+    writer.write(val);
+  }
+
+  public void writeDouble(String name, String val) throws IOException {
+    writer.write(val);
+  }
+
+  // TODO: refactor this out to a DateUtils class or something...
+  public void writeDate(String name, Date val) throws IOException {
+    // using a stringBuilder for numbers can be nice since
+    // a temporary string isn't used (it's added directly to the
+    // builder's buffer.
+
+    StringBuilder sb = new StringBuilder();
+    if (cal==null) cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
+    cal.setTime(val);
+
+    int i = cal.get(Calendar.YEAR);
+    sb.append(i);
+    sb.append('-');
+    i = cal.get(Calendar.MONTH) + 1;  // 0 based, so add 1
+    if (i<10) sb.append('0');
+    sb.append(i);
+    sb.append('-');
+    i=cal.get(Calendar.DAY_OF_MONTH);
+    if (i<10) sb.append('0');
+    sb.append(i);
+    sb.append('T');
+    i=cal.get(Calendar.HOUR_OF_DAY); // 24 hour time format
+    if (i<10) sb.append('0');
+    sb.append(i);
+    sb.append(':');
+    i=cal.get(Calendar.MINUTE);
+    if (i<10) sb.append('0');
+    sb.append(i);
+    sb.append(':');
+    i=cal.get(Calendar.SECOND);
+    if (i<10) sb.append('0');
+    sb.append(i);
+    i=cal.get(Calendar.MILLISECOND);
+    if (i != 0) {
+      sb.append('.');
+      if (i<100) sb.append('0');
+      if (i<10) sb.append('0');
+      sb.append(i);
+
+      // handle canonical format specifying fractional
+      // seconds shall not end in '0'.  Given the slowness of
+      // integer div/mod, simply checking the last character
+      // is probably the fastest way to check.
+      int lastIdx = sb.length()-1;
+      if (sb.charAt(lastIdx)=='0') {
+        lastIdx--;
+        if (sb.charAt(lastIdx)=='0') {
+          lastIdx--;
+        }
+        sb.setLength(lastIdx+1);
+      }
+
+    }
+    sb.append('Z');
+    writeDate(name, sb.toString());
+  }
+
+  public void writeDate(String name, String val) throws IOException {
+    writeStr(name, val, false);
+  }
+
+  protected static void unicodeEscape(Appendable sb, int ch) throws IOException {
+    String str = Integer.toHexString(ch & 0xffff);
+    switch (str.length()) {
+      case 1: sb.append("\\u000"); break;
+      case 2: sb.append("\\u00"); break;
+      case 3: sb.append("\\u0");  break;
+      default: sb.append("\\u");  break;
+    }
+    sb.append(str);
+  }
+
+}
+
+class PythonWriter extends JSONWriter {
+  public PythonWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
+    super(writer, req, rsp);
+  }
+
+  @Override
+  public void writeNull(String name) throws IOException {
+    writer.write("None");
+  }
+
+  @Override
+  public void writeBool(String name, boolean val) throws IOException {
+    writer.write(val ? "True" : "False");
+  }
+
+  @Override
+  public void writeBool(String name, String val) throws IOException {
+    writeBool(name,val.charAt(0)=='t');
+  }
+
+  /* optionally use a unicode python string if necessary */
+  @Override
+  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
+    if (!needsEscaping) {
+      writer.write('\'');
+      writer.write(val);
+      writer.write('\'');
+      return;
+    }
+
+    // use python unicode strings...
+    // python doesn't tolerate newlines in strings in it's eval(), so we must escape them.
+
+    StringBuilder sb = new StringBuilder(val.length());
+    boolean needUnicode=false;
+
+    for (int i=0; i<val.length(); i++) {
+      char ch = val.charAt(i);
+      switch(ch) {
+        case '\'':
+        case '\\': sb.append('\\'); sb.append(ch); break;
+        case '\r': sb.append("\\r"); break;
+        case '\n': sb.append("\\n"); break;
+          default:
+            // we don't strictly have to escape these chars, but it will probably increase
+            // portability to stick to visible ascii
+            if (ch<' ' || ch>127) {
+              unicodeEscape(sb, ch);
+              needUnicode=true;
+            } else {
+              sb.append(ch);
+            }
+        }
+      }
+
+    writer.write( needUnicode ? "u'" : "'");
+    writer.append(sb);
+    writer.write('\'');
+  }
+
+  /*
+  old version that always used unicode
+  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
+    // use python unicode strings...
+    // python doesn't tolerate newlines in strings in it's eval(), so we must escape them.
+    writer.write("u'");
+    // it might be more efficient to use a stringbuilder or write substrings
+    // if writing chars to the stream is slow.
+    if (needsEscaping) {
+      for (int i=0; i<val.length(); i++) {
+        char ch = val.charAt(i);
+        switch(ch) {
+          case '\'':
+          case '\\': writer.write('\\'); writer.write(ch); break;
+          case '\r': writer.write("\\r"); break;
+          case '\n': writer.write("\\n"); break;
+          default:
+            // we don't strictly have to escape these chars, but it will probably increase
+            // portability to stick to visible ascii
+            if (ch<' ' || ch>127) {
+              unicodeChar(ch);
+            } else {
+              writer.write(ch);
+            }
+        }
+      }
+    } else {
+      writer.write(val);
+    }
+    writer.write('\'');
+  }
+  */
+
+}
+
+
+class RubyWriter extends JSONWriter {
+  public RubyWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
+    super(writer, req, rsp);
+  }
+
+  @Override
+  public void writeNull(String name) throws IOException {
+    writer.write("nil");
+  }
+
+  @Override
+  protected void writeKey(String fname, boolean needsEscaping) throws IOException {
+    writeStr(null, fname, needsEscaping);
+    writer.write("=>");
+  }
+
+  @Override
+  public void writeStr(String name, String val, boolean needsEscaping) throws IOException {
+    // Ruby doesn't do unicode escapes... so let the servlet container write raw UTF-8
+    // bytes into the string.
+    //
+    // Use single quoted strings for safety since no evaluation is done within them.
+    // Also, there are very few escapes recognized in a singe quoted string, so
+    // only escape the backspace and single quote.
+    writer.write('\'');
+    // it might be more efficient to use a stringbuilder or write substrings
+    // if writing chars to the stream is slow.
+    if (needsEscaping) {
+      for (int i=0; i<val.length(); i++) {
+        char ch = val.charAt(i);
+        switch(ch) {
+          case '\'':
+          case '\\': writer.write('\\'); writer.write(ch); break;
+          default: writer.write(ch); break;
+        }
+      }
+    } else {
+      writer.write(val);
+    }
+    writer.write('\'');
+  }
 }

Propchange: incubator/solr/trunk/src/java/org/apache/solr/request/JSONResponseWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/java/org/apache/solr/request/PythonResponseWriter.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/request/PythonResponseWriter.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/request/PythonResponseWriter.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/request/PythonResponseWriter.java Tue Jul 18 14:52:05 2006
@@ -1,17 +1,17 @@
-package org.apache.solr.request;
-
-import java.io.Writer;
-import java.io.IOException;
-
-public class PythonResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_PYTHON_ASCII="text/x-python;charset=US-ASCII";
-
-  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
-    PythonWriter w = new PythonWriter(writer, req, rsp);
-    w.writeResponse();
-  }
-
-  public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
-    return CONTENT_TYPE_TEXT_ASCII;
-  }
-}
+package org.apache.solr.request;
+
+import java.io.Writer;
+import java.io.IOException;
+
+public class PythonResponseWriter implements QueryResponseWriter {
+  static String CONTENT_TYPE_PYTHON_ASCII="text/x-python;charset=US-ASCII";
+
+  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
+    PythonWriter w = new PythonWriter(writer, req, rsp);
+    w.writeResponse();
+  }
+
+  public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
+    return CONTENT_TYPE_TEXT_ASCII;
+  }
+}

Propchange: incubator/solr/trunk/src/java/org/apache/solr/request/PythonResponseWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/java/org/apache/solr/request/RubyResponseWriter.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/request/RubyResponseWriter.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/request/RubyResponseWriter.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/request/RubyResponseWriter.java Tue Jul 18 14:52:05 2006
@@ -1,17 +1,17 @@
-package org.apache.solr.request;
-
-import java.io.Writer;
-import java.io.IOException;
-
-public class RubyResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_RUBY_UTF8="text/x-ruby;charset=UTF-8";
-
-  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
-    RubyWriter w = new RubyWriter(writer, req, rsp);
-    w.writeResponse();
-  }
-
-  public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
-    return CONTENT_TYPE_TEXT_UTF8;
-  }
-}
+package org.apache.solr.request;
+
+import java.io.Writer;
+import java.io.IOException;
+
+public class RubyResponseWriter implements QueryResponseWriter {
+  static String CONTENT_TYPE_RUBY_UTF8="text/x-ruby;charset=UTF-8";
+
+  public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
+    RubyWriter w = new RubyWriter(writer, req, rsp);
+    w.writeResponse();
+  }
+
+  public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
+    return CONTENT_TYPE_TEXT_UTF8;
+  }
+}

Propchange: incubator/solr/trunk/src/java/org/apache/solr/request/RubyResponseWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/java/org/apache/solr/request/TextResponseWriter.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/request/TextResponseWriter.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/request/TextResponseWriter.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/request/TextResponseWriter.java Tue Jul 18 14:52:05 2006
@@ -1,194 +1,194 @@
-package org.apache.solr.request;
-
-import org.apache.lucene.document.Document;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.search.DocList;
-import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.util.NamedList;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Map;
-import java.util.Set;
-
-/** Base class for text-oriented response writers.
- *
- * @author yonik
- * @version $Id$
- */
-public abstract class TextResponseWriter {
-  protected final Writer writer;
-  protected final IndexSchema schema;
-  protected final SolrIndexSearcher searcher;
-  protected final SolrQueryRequest req;
-  protected final SolrQueryResponse rsp;
-
-  // the default set of fields to return for each document
-  protected Set<String> returnFields;
-
-  protected int level;
-  protected boolean doIndent;
-
-
-  public TextResponseWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
-    this.writer = writer;
-    this.schema = req.getSchema();
-    this.searcher = req.getSearcher();
-    this.req = req;
-    this.rsp = rsp;
-    String indent = req.getParam("indent");
-    if (indent != null && !"".equals(indent) && !"off".equals(indent)) {
-      doIndent=true;
-    }
-    returnFields = rsp.getReturnFields();
-  }
-
-  /** returns the Writer that the response is being written to */
-  public Writer getWriter() { return writer; }
-
-  // use a combination of tabs and spaces to minimize the size of an indented response.
-  private static final String[] indentArr = new String[] {
-    "\n",
-    "\n ",
-    "\n  ",
-    "\n\t",
-    "\n\t ",
-    "\n\t  ",  // could skip this one (the only 3 char seq)
-    "\n\t\t",
-    "\n\t\t "};
-
-  public void indent() throws IOException {
-     if (doIndent) indent(level);
-  }
-
-  public void indent(int lev) throws IOException {
-    int arrsz = indentArr.length-1;
-    // power-of-two intent array (gratuitous optimization :-)
-    String istr = indentArr[lev & (indentArr.length-1)];
-    writer.write(istr);
-  }
-
-  //
-  // Functions to manipulate the current logical nesting level.
-  // Any indentation will be partially based on level.
-  //
-  public void setLevel(int level) { this.level = level; }
-  public int level() { return level; }
-  public int incLevel() { return ++level; }
-  public int decLevel() { return --level; }
-  public void setIndent(boolean doIndent) {
-    this.doIndent = doIndent;
-  }
-
-
-  public abstract void writeNamedList(String name, NamedList val) throws IOException;
-
-  public void writeVal(String name, Object val) throws IOException {
-
-    // if there get to be enough types, perhaps hashing on the type
-    // to get a handler might be faster (but types must be exact to do that...)
-
-    // go in order of most common to least common
-    if (val==null) {
-      writeNull(name);
-    } else if (val instanceof String) {
-      writeStr(name, val.toString(), true);
-      // micro-optimization... using toString() avoids a cast first
-    } else if (val instanceof Integer) {
-      writeInt(name, val.toString());
-    } else if (val instanceof Boolean) {
-      writeBool(name, val.toString());
-    } else if (val instanceof Long) {
-      writeLong(name, val.toString());
-    } else if (val instanceof Date) {
-      writeDate(name,(Date)val);
-    } else if (val instanceof Float) {
-      // we pass the float instead of using toString() because
-      // it may need special formatting. same for double.
-      writeFloat(name, ((Float)val).floatValue());
-    } else if (val instanceof Double) {
-      writeDouble(name, ((Double)val).doubleValue());
-    } else if (val instanceof Document) {
-      writeDoc(name, (Document)val, returnFields, 0.0f, false);
-    } else if (val instanceof DocList) {
-      // requires access to IndexReader
-      writeDocList(name, (DocList)val, returnFields,null);
-    // }
-    // else if (val instanceof DocSet) {
-    // how do we know what fields to read?
-    // todo: have a DocList/DocSet wrapper that
-    // restricts the fields to write...?
-    } else if (val instanceof Map) {
-      writeMap(name, (Map)val, false, true);
-    } else if (val instanceof NamedList) {
-      writeNamedList(name, (NamedList)val);
-    } else if (val instanceof Collection) {
-      writeArray(name,(Collection)val);
-    } else if (val instanceof Object[]) {
-      writeArray(name,(Object[])val);
-    } else {
-      // default... for debugging only
-      writeStr(name, val.getClass().getName() + ':' + val.toString(), true);
-    }
-  }
-
-  // names are passed when writing primitives like writeInt to allow many different
-  // types of formats, including those where the name may come after the value (like
-  // some XML formats).
-
-  public abstract void writeDoc(String name, Document doc, Set<String> returnFields, float score, boolean includeScore) throws IOException;
-
-  public abstract void writeDocList(String name, DocList ids, Set<String> fields, Map otherFields) throws IOException;
-
-  public abstract void writeStr(String name, String val, boolean needsEscaping) throws IOException;
-
-  public abstract void writeMap(String name, Map val, boolean excludeOuter, boolean isFirstVal) throws IOException;
-
-  public abstract void writeArray(String name, Object[] val) throws IOException;
-
-  public abstract void writeArray(String name, Collection val) throws IOException;
-
-  public abstract void writeNull(String name) throws IOException;
-
-  /** if this form of the method is called, val is the Java string form of an int */
-  public abstract void writeInt(String name, String val) throws IOException;
-
-  public void writeInt(String name, int val) throws IOException {
-    writeInt(name,Integer.toString(val));
-  }
-
-  /** if this form of the method is called, val is the Java string form of a long */
-  public abstract void writeLong(String name, String val) throws IOException;
-
-  public  void writeLong(String name, long val) throws IOException {
-    writeLong(name,Long.toString(val));
-  }
-
-  /** if this form of the method is called, val is the Java string form of a boolean */
-  public abstract void writeBool(String name, String val) throws IOException;
-
-  public void writeBool(String name, boolean val) throws IOException {
-    writeBool(name,Boolean.toString(val));
-  }
-
-  /** if this form of the method is called, val is the Java string form of a float */
-  public abstract void writeFloat(String name, String val) throws IOException;
-
-  public void writeFloat(String name, float val) throws IOException {
-    writeFloat(name,Float.toString(val));
-  }
-
-  /** if this form of the method is called, val is the Java string form of a double */
-  public abstract void writeDouble(String name, String val) throws IOException;
-
-  public void writeDouble(String name, double val) throws IOException {
-    writeDouble(name,Double.toString(val));
-  }
-
-  public abstract void writeDate(String name, Date val) throws IOException;
-
-  /** if this form of the method is called, val is the Solr ISO8601 based date format */
-  public abstract void writeDate(String name, String val) throws IOException;
-}
+package org.apache.solr.request;
+
+import org.apache.lucene.document.Document;
+import org.apache.solr.schema.IndexSchema;
+import org.apache.solr.search.DocList;
+import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.util.NamedList;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
+
+/** Base class for text-oriented response writers.
+ *
+ * @author yonik
+ * @version $Id$
+ */
+public abstract class TextResponseWriter {
+  protected final Writer writer;
+  protected final IndexSchema schema;
+  protected final SolrIndexSearcher searcher;
+  protected final SolrQueryRequest req;
+  protected final SolrQueryResponse rsp;
+
+  // the default set of fields to return for each document
+  protected Set<String> returnFields;
+
+  protected int level;
+  protected boolean doIndent;
+
+
+  public TextResponseWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
+    this.writer = writer;
+    this.schema = req.getSchema();
+    this.searcher = req.getSearcher();
+    this.req = req;
+    this.rsp = rsp;
+    String indent = req.getParam("indent");
+    if (indent != null && !"".equals(indent) && !"off".equals(indent)) {
+      doIndent=true;
+    }
+    returnFields = rsp.getReturnFields();
+  }
+
+  /** returns the Writer that the response is being written to */
+  public Writer getWriter() { return writer; }
+
+  // use a combination of tabs and spaces to minimize the size of an indented response.
+  private static final String[] indentArr = new String[] {
+    "\n",
+    "\n ",
+    "\n  ",
+    "\n\t",
+    "\n\t ",
+    "\n\t  ",  // could skip this one (the only 3 char seq)
+    "\n\t\t",
+    "\n\t\t "};
+
+  public void indent() throws IOException {
+     if (doIndent) indent(level);
+  }
+
+  public void indent(int lev) throws IOException {
+    int arrsz = indentArr.length-1;
+    // power-of-two intent array (gratuitous optimization :-)
+    String istr = indentArr[lev & (indentArr.length-1)];
+    writer.write(istr);
+  }
+
+  //
+  // Functions to manipulate the current logical nesting level.
+  // Any indentation will be partially based on level.
+  //
+  public void setLevel(int level) { this.level = level; }
+  public int level() { return level; }
+  public int incLevel() { return ++level; }
+  public int decLevel() { return --level; }
+  public void setIndent(boolean doIndent) {
+    this.doIndent = doIndent;
+  }
+
+
+  public abstract void writeNamedList(String name, NamedList val) throws IOException;
+
+  public void writeVal(String name, Object val) throws IOException {
+
+    // if there get to be enough types, perhaps hashing on the type
+    // to get a handler might be faster (but types must be exact to do that...)
+
+    // go in order of most common to least common
+    if (val==null) {
+      writeNull(name);
+    } else if (val instanceof String) {
+      writeStr(name, val.toString(), true);
+      // micro-optimization... using toString() avoids a cast first
+    } else if (val instanceof Integer) {
+      writeInt(name, val.toString());
+    } else if (val instanceof Boolean) {
+      writeBool(name, val.toString());
+    } else if (val instanceof Long) {
+      writeLong(name, val.toString());
+    } else if (val instanceof Date) {
+      writeDate(name,(Date)val);
+    } else if (val instanceof Float) {
+      // we pass the float instead of using toString() because
+      // it may need special formatting. same for double.
+      writeFloat(name, ((Float)val).floatValue());
+    } else if (val instanceof Double) {
+      writeDouble(name, ((Double)val).doubleValue());
+    } else if (val instanceof Document) {
+      writeDoc(name, (Document)val, returnFields, 0.0f, false);
+    } else if (val instanceof DocList) {
+      // requires access to IndexReader
+      writeDocList(name, (DocList)val, returnFields,null);
+    // }
+    // else if (val instanceof DocSet) {
+    // how do we know what fields to read?
+    // todo: have a DocList/DocSet wrapper that
+    // restricts the fields to write...?
+    } else if (val instanceof Map) {
+      writeMap(name, (Map)val, false, true);
+    } else if (val instanceof NamedList) {
+      writeNamedList(name, (NamedList)val);
+    } else if (val instanceof Collection) {
+      writeArray(name,(Collection)val);
+    } else if (val instanceof Object[]) {
+      writeArray(name,(Object[])val);
+    } else {
+      // default... for debugging only
+      writeStr(name, val.getClass().getName() + ':' + val.toString(), true);
+    }
+  }
+
+  // names are passed when writing primitives like writeInt to allow many different
+  // types of formats, including those where the name may come after the value (like
+  // some XML formats).
+
+  public abstract void writeDoc(String name, Document doc, Set<String> returnFields, float score, boolean includeScore) throws IOException;
+
+  public abstract void writeDocList(String name, DocList ids, Set<String> fields, Map otherFields) throws IOException;
+
+  public abstract void writeStr(String name, String val, boolean needsEscaping) throws IOException;
+
+  public abstract void writeMap(String name, Map val, boolean excludeOuter, boolean isFirstVal) throws IOException;
+
+  public abstract void writeArray(String name, Object[] val) throws IOException;
+
+  public abstract void writeArray(String name, Collection val) throws IOException;
+
+  public abstract void writeNull(String name) throws IOException;
+
+  /** if this form of the method is called, val is the Java string form of an int */
+  public abstract void writeInt(String name, String val) throws IOException;
+
+  public void writeInt(String name, int val) throws IOException {
+    writeInt(name,Integer.toString(val));
+  }
+
+  /** if this form of the method is called, val is the Java string form of a long */
+  public abstract void writeLong(String name, String val) throws IOException;
+
+  public  void writeLong(String name, long val) throws IOException {
+    writeLong(name,Long.toString(val));
+  }
+
+  /** if this form of the method is called, val is the Java string form of a boolean */
+  public abstract void writeBool(String name, String val) throws IOException;
+
+  public void writeBool(String name, boolean val) throws IOException {
+    writeBool(name,Boolean.toString(val));
+  }
+
+  /** if this form of the method is called, val is the Java string form of a float */
+  public abstract void writeFloat(String name, String val) throws IOException;
+
+  public void writeFloat(String name, float val) throws IOException {
+    writeFloat(name,Float.toString(val));
+  }
+
+  /** if this form of the method is called, val is the Java string form of a double */
+  public abstract void writeDouble(String name, String val) throws IOException;
+
+  public void writeDouble(String name, double val) throws IOException {
+    writeDouble(name,Double.toString(val));
+  }
+
+  public abstract void writeDate(String name, Date val) throws IOException;
+
+  /** if this form of the method is called, val is the Solr ISO8601 based date format */
+  public abstract void writeDate(String name, String val) throws IOException;
+}

Propchange: incubator/solr/trunk/src/java/org/apache/solr/request/TextResponseWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/java/org/apache/solr/search/PrefixFilter.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/search/PrefixFilter.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/search/PrefixFilter.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/search/PrefixFilter.java Tue Jul 18 14:52:05 2006
@@ -1,79 +1,79 @@
-package org.apache.solr.search;
-
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.TermEnum;
-import org.apache.lucene.index.TermDocs;
-
-import java.util.BitSet;
-import java.io.IOException;
-
-/**
- * @author yonik
- * @version $Id$
- */
-public class PrefixFilter extends Filter {
-  protected final Term prefix;
-
-  PrefixFilter(Term prefix) {
-    this.prefix = prefix;
-  }
-
-  Term getPrefix() { return prefix; }
-
-  public BitSet bits(IndexReader reader) throws IOException {
-    final BitSet bitSet = new BitSet(reader.maxDoc());
-    new PrefixGenerator(prefix) {
-      public void handleDoc(int doc) {
-        bitSet.set(doc);
-      }
-    }.generate(reader);
-    return bitSet;
-  }
-}
-
-// keep this protected until I decide if it's a good way
-// to separate id generation from collection (or should
-// I just reuse hitcollector???)
-interface IdGenerator {
-  public void generate(IndexReader reader) throws IOException;
-  public void handleDoc(int doc);
-}
-
-
-abstract class PrefixGenerator implements IdGenerator {
-  protected final Term prefix;
-
-  PrefixGenerator(Term prefix) {
-    this.prefix = prefix;
-  }
-
-  public void generate(IndexReader reader) throws IOException {
-    TermEnum enumerator = reader.terms(prefix);
-    TermDocs termDocs = reader.termDocs();
-
-    try {
-
-      String prefixText = prefix.text();
-      String prefixField = prefix.field();
-      do {
-        Term term = enumerator.term();
-        if (term != null &&
-            term.text().startsWith(prefixText) &&
-            term.field() == prefixField)
-        {
-          termDocs.seek(term);
-          while (termDocs.next()) {
-            handleDoc(termDocs.doc());
-          }
-        } else {
-          break;
-        }
-      } while (enumerator.next());
-    } finally {
-      termDocs.close();
-      enumerator.close();
-    }
-  }
-}
+package org.apache.solr.search;
+
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.TermEnum;
+import org.apache.lucene.index.TermDocs;
+
+import java.util.BitSet;
+import java.io.IOException;
+
+/**
+ * @author yonik
+ * @version $Id$
+ */
+public class PrefixFilter extends Filter {
+  protected final Term prefix;
+
+  PrefixFilter(Term prefix) {
+    this.prefix = prefix;
+  }
+
+  Term getPrefix() { return prefix; }
+
+  public BitSet bits(IndexReader reader) throws IOException {
+    final BitSet bitSet = new BitSet(reader.maxDoc());
+    new PrefixGenerator(prefix) {
+      public void handleDoc(int doc) {
+        bitSet.set(doc);
+      }
+    }.generate(reader);
+    return bitSet;
+  }
+}
+
+// keep this protected until I decide if it's a good way
+// to separate id generation from collection (or should
+// I just reuse hitcollector???)
+interface IdGenerator {
+  public void generate(IndexReader reader) throws IOException;
+  public void handleDoc(int doc);
+}
+
+
+abstract class PrefixGenerator implements IdGenerator {
+  protected final Term prefix;
+
+  PrefixGenerator(Term prefix) {
+    this.prefix = prefix;
+  }
+
+  public void generate(IndexReader reader) throws IOException {
+    TermEnum enumerator = reader.terms(prefix);
+    TermDocs termDocs = reader.termDocs();
+
+    try {
+
+      String prefixText = prefix.text();
+      String prefixField = prefix.field();
+      do {
+        Term term = enumerator.term();
+        if (term != null &&
+            term.text().startsWith(prefixText) &&
+            term.field() == prefixField)
+        {
+          termDocs.seek(term);
+          while (termDocs.next()) {
+            handleDoc(termDocs.doc());
+          }
+        } else {
+          break;
+        }
+      } while (enumerator.next());
+    } finally {
+      termDocs.close();
+      enumerator.close();
+    }
+  }
+}

Propchange: incubator/solr/trunk/src/java/org/apache/solr/search/PrefixFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/search/function/MaxFloatFunction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/util/AbstractSolrTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/util/SolrPluginUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/java/org/apache/solr/util/TestHarness.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/test/org/apache/solr/ConvertedLegacyTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/test/org/apache/solr/DisMaxRequestHandlerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/test/org/apache/solr/OutputWriterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/test/org/apache/solr/SampleTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/solr/trunk/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServletRequest.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServletRequest.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServletRequest.java (original)
+++ incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServletRequest.java Tue Jul 18 14:52:05 2006
@@ -1,61 +1,61 @@
-package org.apache.solr.servlet;
-
-import org.apache.solr.request.SolrQueryRequestBase;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.util.StrUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author yonik
- * @version $Id$
- */
-class SolrServletRequest extends SolrQueryRequestBase {
-
-  final HttpServletRequest req;
-
-  public SolrServletRequest(SolrCore core, HttpServletRequest req) {
-    super(core);
-    this.req = req;
-  }
-
-  public String getParam(String name) {
-    return req.getParameter(name);
-  }
-
-  public String[] getParams(String name) {
-    return req.getParameterValues(name);
-  }
-
-
-  public String getParamString() {
-    StringBuilder sb = new StringBuilder(128);
-    try {
-      boolean first=true;
-
-      for (Map.Entry<String,String[]> entry : (Set<Map.Entry<String,String[]>>)req.getParameterMap().entrySet()) {
-        String key = entry.getKey();
-        String[] valarr = entry.getValue();
-
-        for (String val : valarr) {
-          if (!first) sb.append('&');
-          first=false;
-          sb.append(key);
-          sb.append('=');
-          StrUtils.partialURLEncodeVal(sb, val==null ? "" : val);
-        }
-      }
-    }
-    catch (Exception e) {
-      // should never happen... we only needed this because
-      // partialURLEncodeVal can throw an IOException, but it
-      // never will when adding to a StringBuilder.
-      throw new RuntimeException(e);
-    }
-
-    return sb.toString();
-  }
-
-}
+package org.apache.solr.servlet;
+
+import org.apache.solr.request.SolrQueryRequestBase;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.util.StrUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author yonik
+ * @version $Id$
+ */
+class SolrServletRequest extends SolrQueryRequestBase {
+
+  final HttpServletRequest req;
+
+  public SolrServletRequest(SolrCore core, HttpServletRequest req) {
+    super(core);
+    this.req = req;
+  }
+
+  public String getParam(String name) {
+    return req.getParameter(name);
+  }
+
+  public String[] getParams(String name) {
+    return req.getParameterValues(name);
+  }
+
+
+  public String getParamString() {
+    StringBuilder sb = new StringBuilder(128);
+    try {
+      boolean first=true;
+
+      for (Map.Entry<String,String[]> entry : (Set<Map.Entry<String,String[]>>)req.getParameterMap().entrySet()) {
+        String key = entry.getKey();
+        String[] valarr = entry.getValue();
+
+        for (String val : valarr) {
+          if (!first) sb.append('&');
+          first=false;
+          sb.append(key);
+          sb.append('=');
+          StrUtils.partialURLEncodeVal(sb, val==null ? "" : val);
+        }
+      }
+    }
+    catch (Exception e) {
+      // should never happen... we only needed this because
+      // partialURLEncodeVal can throw an IOException, but it
+      // never will when adding to a StringBuilder.
+      throw new RuntimeException(e);
+    }
+
+    return sb.toString();
+  }
+
+}

Propchange: incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServletRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrUpdateServlet.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrUpdateServlet.java?rev=423263&r1=423262&r2=423263&view=diff
==============================================================================
--- incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrUpdateServlet.java (original)
+++ incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrUpdateServlet.java Tue Jul 18 14:52:05 2006
@@ -1,54 +1,54 @@
-package org.apache.solr.servlet;/**
- * Copyright 2006 The Apache Software Foundation
- *
- * Licensed 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.
- */
-
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.SolrException;
-import org.apache.solr.request.XMLResponseWriter;
-import org.apache.solr.request.SolrQueryResponse;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.ServletException;
-import java.util.logging.Logger;
-import java.io.IOException;
-import java.io.BufferedReader;
-import java.io.PrintWriter;
-
-/**
- * @author yonik
- * @version $Id$
- */
-public class SolrUpdateServlet extends HttpServlet {
-  final Logger log = Logger.getLogger(SolrUpdateServlet.class.getName());
-  private SolrCore core;
-  private static String CONTENT_TYPE="text/xml;charset=UTF-8";
-
-  XMLResponseWriter xmlResponseWriter;
-
-  public void init() throws ServletException
-  {
-    core = SolrCore.getSolrCore();
-    log.info("SolrUpdateServlet.init() done");
-  }
-
-  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-    BufferedReader requestReader = request.getReader();
-    response.setContentType(CONTENT_TYPE);
-    PrintWriter responseWriter = response.getWriter();
-    core.update(requestReader, responseWriter);
-  }
-}
+package org.apache.solr.servlet;/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed 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.
+ */
+
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrException;
+import org.apache.solr.request.XMLResponseWriter;
+import org.apache.solr.request.SolrQueryResponse;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
+import java.util.logging.Logger;
+import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.PrintWriter;
+
+/**
+ * @author yonik
+ * @version $Id$
+ */
+public class SolrUpdateServlet extends HttpServlet {
+  final Logger log = Logger.getLogger(SolrUpdateServlet.class.getName());
+  private SolrCore core;
+  private static String CONTENT_TYPE="text/xml;charset=UTF-8";
+
+  XMLResponseWriter xmlResponseWriter;
+
+  public void init() throws ServletException
+  {
+    core = SolrCore.getSolrCore();
+    log.info("SolrUpdateServlet.init() done");
+  }
+
+  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+    BufferedReader requestReader = request.getReader();
+    response.setContentType(CONTENT_TYPE);
+    PrintWriter responseWriter = response.getWriter();
+    core.update(requestReader, responseWriter);
+  }
+}

Propchange: incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrUpdateServlet.java
------------------------------------------------------------------------------
    svn:eol-style = native