Author: yonik
Date: Sat Aug 11 06:01:09 2007
New Revision: 564920

URL: http://svn.apache.org/viewvc?view=rev&rev=564920
Log:
SOLR-196: php response writers

Added:
    lucene/solr/trunk/src/java/org/apache/solr/request/PHPResponseWriter.java   
(with props)
    
lucene/solr/trunk/src/java/org/apache/solr/request/PHPSerializedResponseWriter.java
   (with props)

Added: lucene/solr/trunk/src/java/org/apache/solr/request/PHPResponseWriter.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/request/PHPResponseWriter.java?view=auto&rev=564920
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/request/PHPResponseWriter.java 
(added)
+++ lucene/solr/trunk/src/java/org/apache/solr/request/PHPResponseWriter.java 
Sat Aug 11 06:01:09 2007
@@ -0,0 +1,105 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.request;
+
+import java.io.Writer;
+import java.io.IOException;
+
+import org.apache.solr.common.util.NamedList;
+
+public class PHPResponseWriter implements QueryResponseWriter {
+  static String CONTENT_TYPE_PHP_UTF8="text/x-php;charset=UTF-8";
+
+  public void init(NamedList n) {
+    /* NOOP */
+  }
+  
+ public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) 
throws IOException {
+    PHPWriter w = new PHPWriter(writer, req, rsp);
+    w.writeResponse();
+  }
+
+  public String getContentType(SolrQueryRequest request, SolrQueryResponse 
response) {
+    return CONTENT_TYPE_TEXT_UTF8;
+  }
+}
+
+class PHPWriter extends JSONWriter {
+  public PHPWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) 
{
+    super(writer, req, rsp);
+  }
+  
+  @Override
+  public void writeNamedList(String name, NamedList val) throws IOException {
+    writeNamedListAsMapMangled(name,val);
+  }
+
+  @Override
+  public void writeMapOpener(int size) throws IOException {
+    writer.write("array(");
+  }
+
+  @Override
+  public void writeMapCloser() throws IOException {
+    writer.write(')');
+  }
+
+  @Override
+  public void writeArrayOpener(int size) throws IOException {
+    writer.write("array(");
+  }
+
+  @Override
+  public void writeArrayCloser() throws IOException {
+    writer.write(')');
+  }
+
+  @Override
+  public void writeNull(String name) throws IOException {
+    writer.write("null");
+  }
+
+  @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 {
+    if (needsEscaping) {
+      StringBuilder sb = new StringBuilder(val.length());
+      sb.append('\'');
+      for (int i=0; i<val.length(); i++) {
+        char ch = val.charAt(i);
+        switch (ch) {
+          case '\'':
+          case '\\': sb.append('\\'); sb.append(ch); break;
+          default:
+            sb.append(ch);
+        }
+      }
+      sb.append('\'');
+      writer.append(sb);
+    } else {
+      writer.write('\'');
+      writer.write(val);
+      writer.write('\'');
+    }
+  }
+}

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

Propchange: 
lucene/solr/trunk/src/java/org/apache/solr/request/PHPResponseWriter.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
lucene/solr/trunk/src/java/org/apache/solr/request/PHPResponseWriter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: 
lucene/solr/trunk/src/java/org/apache/solr/request/PHPSerializedResponseWriter.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/request/PHPSerializedResponseWriter.java?view=auto&rev=564920
==============================================================================
--- 
lucene/solr/trunk/src/java/org/apache/solr/request/PHPSerializedResponseWriter.java
 (added)
+++ 
lucene/solr/trunk/src/java/org/apache/solr/request/PHPSerializedResponseWriter.java
 Sat Aug 11 06:01:09 2007
@@ -0,0 +1,269 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.request;
+
+import java.io.Writer;
+import java.io.IOException;
+import java.util.*;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Fieldable;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.schema.SchemaField;
+import org.apache.solr.search.DocIterator;
+import org.apache.solr.search.DocList;
+import org.apache.solr.search.SolrIndexSearcher;
+
+/**
+ * A description of the PHP serialization format can be found here:
+ * http://www.hurring.com/scott/code/perl/serialize/
+ */
+
+public class PHPSerializedResponseWriter implements QueryResponseWriter {
+  static String CONTENT_TYPE_PHP_UTF8="text/x-php-serialized;charset=UTF-8";
+
+  public void init(NamedList n) {
+    /* NOOP */
+  }
+  
+ public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) 
throws IOException {
+    PHPSerializedWriter w = new PHPSerializedWriter(writer, req, rsp);
+    w.writeResponse();
+  }
+
+  public String getContentType(SolrQueryRequest request, SolrQueryResponse 
response) {
+    return CONTENT_TYPE_TEXT_UTF8;
+  }
+}
+
+class PHPSerializedWriter extends JSONWriter {
+  public PHPSerializedWriter(Writer writer, SolrQueryRequest req, 
SolrQueryResponse rsp) {
+    super(writer, req, rsp);
+    // never indent serialized PHP data
+    doIndent = false;
+  }
+
+  public void writeResponse() throws IOException {
+    writeNamedList(null, rsp.getValues());
+  }
+  
+  @Override
+  public void writeNamedList(String name, NamedList val) throws IOException {
+    writeNamedListAsMapMangled(name,val);
+  }
+  
+  @Override
+  public void writeDoc(String name, Collection<Fieldable> fields, Set<String> 
returnFields, Map pseudoFields) throws IOException {
+    ArrayList<Fieldable> single = new ArrayList<Fieldable>();
+    HashMap<String, MultiValueField> multi = new HashMap<String, 
MultiValueField>();
+
+    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 {
+        single.add(ff);
+      }
+    }
+
+    // obtain number of fields in doc
+    writeArrayOpener(single.size() + multi.size() + ((pseudoFields!=null) ? 
pseudoFields.size() : 0));
+
+    // output single value fields
+    for(Fieldable ff : single) {
+      SchemaField sf = schema.getField(ff.name());
+      writeKey(ff.name(),true);
+      sf.write(this, ff.name(), ff);
+    }
+    
+    // output multi value fields
+    for(MultiValueField mvf : multi.values()) {
+      writeKey(mvf.sfield.getName(), true);
+      writeArrayOpener(mvf.fields.size());
+      int i = 0;
+      for (Fieldable ff : mvf.fields) {
+        writeKey(i++, false);
+        mvf.sfield.write(this, null, ff);
+      }
+      writeArrayCloser();
+    }
+
+    // output pseudo fields
+    if (pseudoFields !=null && pseudoFields.size()>0) {
+      writeMap(null,pseudoFields,true,false);
+    }
+    writeArrayCloser();
+  }
+  
+  @Override
+  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();
+
+    writeMapOpener(includeScore ? 4 : 3);
+    writeKey("numFound",false);
+    writeInt(null,ids.matches());
+    writeKey("start",false);
+    writeInt(null,ids.offset());
+
+    if (includeScore) {
+      writeKey("maxScore",false);
+      writeFloat(null,ids.maxScore());
+    }
+    writeKey("docs",false);
+    writeArrayOpener(sz);
+
+    SolrIndexSearcher searcher = req.getSearcher();
+    DocIterator iterator = ids.iterator();
+    for (int i=0; i<sz; i++) {
+      int id = iterator.nextDoc();
+      Document doc = searcher.doc(id, fields);
+      writeKey(i, false);
+      writeDoc(null, doc, fields, (includeScore ? iterator.score() : 0.0f), 
includeScore);
+    }
+    writeMapCloser();
+
+    if (otherFields !=null) {
+      writeMap(null, otherFields, true, false);
+    }
+
+    writeMapCloser();
+  }
+  
+  @Override
+  public void writeArray(String name, Object[] val) throws IOException {
+    writeMapOpener(val.length);
+    for(int i=0; i < val.length; i++) {
+      writeKey(i, false);
+      writeVal(String.valueOf(i), val[i]);
+    }
+    writeMapCloser();
+  }
+
+  @Override
+  public void writeArray(String name, Iterator val) throws IOException {
+    ArrayList vals = new ArrayList();
+    while( val.hasNext() ) {
+      vals.add(val.next());
+    }
+    writeArray(name, vals.toArray());
+  }
+  
+  @Override
+  public void writeMapOpener(int size) throws IOException, 
IllegalArgumentException {
+       // negative size value indicates that something has gone wrong
+       if (size < 0) {
+               throw new IllegalArgumentException("Map size must not be 
negative");
+       }
+    writer.write("a:"+size+":{");
+  }
+  
+  @Override
+  public void writeMapSeparator() throws IOException {
+    /* NOOP */
+  }
+
+  @Override
+  public void writeMapCloser() throws IOException {
+    writer.write('}');
+  }
+
+  @Override
+  public void writeArrayOpener(int size) throws IOException, 
IllegalArgumentException {
+       // negative size value indicates that something has gone wrong
+       if (size < 0) {
+               throw new IllegalArgumentException("Array size must not be 
negative");
+       }
+    writer.write("a:"+size+":{");
+  }
+
+  @Override  
+  public void writeArraySeparator() throws IOException {
+    /* NOOP */
+  }
+
+  @Override
+  public void writeArrayCloser() throws IOException {
+    writer.write('}');
+  }
+  
+  @Override
+  public void writeNull(String name) throws IOException {
+    writer.write("N;");
+  }
+
+  @Override
+  protected void writeKey(String fname, boolean needsEscaping) throws 
IOException {
+    writeStr(null, fname, needsEscaping);
+  }
+  void writeKey(int val, boolean needsEscaping) throws IOException {
+    writeInt(null, String.valueOf(val));
+  }
+
+  @Override
+  public void writeBool(String name, boolean val) throws IOException {
+    writer.write(val ? "b:1;" : "b:0;");
+  }
+  
+  @Override
+  public void writeInt(String name, String val) throws IOException {
+    writer.write("i:"+val+";");
+  }
+  
+  @Override
+  public void writeLong(String name, String val) throws IOException {
+    writeInt(name,val);
+  }
+
+  @Override
+  public void writeFloat(String name, String val) throws IOException {
+    writeDouble(name,val);
+  }
+
+  @Override
+  public void writeDouble(String name, String val) throws IOException {
+    writer.write("d:"+val+";");
+  }
+
+  @Override
+  public void writeStr(String name, String val, boolean needsEscaping) throws 
IOException {
+    // serialized PHP strings don't need to be escaped at all, however the 
+    // string size reported needs be the number of bytes rather than chars.
+    writer.write("s:"+val.getBytes("UTF8").length+":\""+val+"\";");
+  }
+}

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

Propchange: 
lucene/solr/trunk/src/java/org/apache/solr/request/PHPSerializedResponseWriter.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
lucene/solr/trunk/src/java/org/apache/solr/request/PHPSerializedResponseWriter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL


Reply via email to