pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / xml-query-parser / src / demo / java / org / apache / lucene / xmlparser / webdemo / FormBasedXmlQueryDemo.java
diff --git a/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/demo/java/org/apache/lucene/xmlparser/webdemo/FormBasedXmlQueryDemo.java b/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/demo/java/org/apache/lucene/xmlparser/webdemo/FormBasedXmlQueryDemo.java
new file mode 100644 (file)
index 0000000..e13e7d4
--- /dev/null
@@ -0,0 +1,152 @@
+/**
+ * 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.lucene.xmlparser.webdemo;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.index.CorruptIndexException;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.xmlparser.CorePlusExtensionsParser;
+import org.apache.lucene.xmlparser.QueryTemplateManager;
+
+public class FormBasedXmlQueryDemo extends HttpServlet {
+
+       private QueryTemplateManager queryTemplateManager;
+       private CorePlusExtensionsParser xmlParser;
+       private IndexSearcher searcher;
+       private Analyzer analyzer=new StandardAnalyzer(org.apache.lucene.util.Version.LUCENE_CURRENT);
+
+       @Override
+       public void init(ServletConfig config) throws ServletException {
+               super.init(config);
+               try {
+                       openExampleIndex();
+
+                       //load servlet configuration settings
+                       String xslFile=config.getInitParameter("xslFile");
+                       String defaultStandardQueryParserField = config.getInitParameter("defaultStandardQueryParserField");
+
+
+                       //Load and cache choice of XSL query template using QueryTemplateManager
+                       queryTemplateManager=new QueryTemplateManager(
+                                       getServletContext().getResourceAsStream("/WEB-INF/"+xslFile));
+
+                       //initialize an XML Query Parser for use by all threads
+                       xmlParser=new CorePlusExtensionsParser(defaultStandardQueryParserField,analyzer);
+               } catch (Exception e) {
+                       throw new ServletException("Error loading query template",e);
+               }
+       }
+
+       @Override
+       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+               //Take all completed form fields and add to a Properties object
+               Properties completedFormFields=new Properties();
+               Enumeration pNames = request.getParameterNames();
+               while(pNames.hasMoreElements()){
+                       String propName=(String) pNames.nextElement();
+                       String value=request.getParameter(propName);
+                       if((value!=null)&&(value.trim().length()>0)){
+                               completedFormFields.setProperty(propName, value);
+                       }
+               }
+
+               try{
+
+                       //Create an XML query by populating template with given user criteria
+                       org.w3c.dom.Document xmlQuery=queryTemplateManager.getQueryAsDOM(completedFormFields);
+
+                       //Parse the XML to produce a Lucene query
+                       Query query=xmlParser.getQuery(xmlQuery.getDocumentElement());
+
+                       //Run the query
+                       TopDocs topDocs = searcher.search(query,10);
+
+                       //and package the results and forward to JSP
+                       if(topDocs!=null)       {
+                               ScoreDoc[] sd = topDocs.scoreDocs;
+                               Document[] results=new Document[sd.length];
+                               for (int i = 0; i < results.length; i++) {
+                                       results[i]=searcher.doc(sd[i].doc);
+                                       request.setAttribute("results", results);
+                               }
+                       }
+                       RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp");
+                       dispatcher.forward(request,response);
+               }
+               catch(Exception e){
+                       throw new ServletException("Error processing query",e);
+               }
+       }
+
+       private void openExampleIndex() throws CorruptIndexException, IOException {
+
+               //Create a RAM-based index from our test data file
+               RAMDirectory rd=new RAMDirectory();
+               IndexWriter writer=new IndexWriter (rd,analyzer,IndexWriter.MaxFieldLength.LIMITED);
+               InputStream dataIn=getServletContext().getResourceAsStream("/WEB-INF/data.tsv");
+               BufferedReader br = new BufferedReader(new InputStreamReader(dataIn));
+               String line = br.readLine();
+               while(line!=null)
+               {
+                       line=line.trim();
+                       if(line.length()>0)
+                       {
+                               //parse row and create a document
+                               StringTokenizer st=new StringTokenizer(line,"\t");
+                               Document doc=new Document();
+                               doc.add(new Field("location",st.nextToken(),Field.Store.YES,
+                                               Field.Index.ANALYZED_NO_NORMS));
+                               doc.add(new Field("salary",st.nextToken(),Field.Store.YES,
+                                               Field.Index.ANALYZED_NO_NORMS));
+                               doc.add(new Field("type",st.nextToken(),Field.Store.YES,
+                                               Field.Index.ANALYZED_NO_NORMS));
+                               doc.add(new Field("description",st.nextToken(),Field.Store.YES,
+                                               Field.Index.ANALYZED));
+                               writer.addDocument(doc);
+                       }
+                       line=br.readLine();
+               }
+               writer.close();
+
+               //open searcher
+               searcher=new IndexSearcher(rd, true);
+       }
+}