pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / xml-query-parser / src / java / org / apache / lucene / xmlparser / QueryTemplateManager.java
diff --git a/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/QueryTemplateManager.java b/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/QueryTemplateManager.java
new file mode 100644 (file)
index 0000000..575188b
--- /dev/null
@@ -0,0 +1,210 @@
+package org.apache.lucene.xmlparser;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Properties;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * 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.
+ */
+/**
+ * Provides utilities for turning query form input (such as from a web page or Swing gui) into 
+ * Lucene XML queries by using XSL templates.  This approach offers a convenient way of externalizing 
+ * and changing how user input is turned into Lucene queries. 
+ * Database applications often adopt similar practices by externalizing SQL in template files that can
+ * be easily changed/optimized by a DBA.  
+ * The static methods can be used on their own or by creating an instance of this class you can store and 
+ * re-use compiled stylesheets for fast use (e.g. in a server environment)
+ */
+public class QueryTemplateManager
+{
+       static DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
+       static TransformerFactory tFactory = TransformerFactory.newInstance();
+
+       HashMap<String,Templates> compiledTemplatesCache=new HashMap<String,Templates>();
+       Templates defaultCompiledTemplates=null;
+
+       
+       public QueryTemplateManager()
+       {
+               
+       }
+       public QueryTemplateManager(InputStream xslIs) throws TransformerConfigurationException, ParserConfigurationException, SAXException, IOException
+       {
+               addDefaultQueryTemplate(xslIs);
+       }
+       public void addDefaultQueryTemplate(InputStream xslIs) throws TransformerConfigurationException, ParserConfigurationException, SAXException, IOException
+       {
+               defaultCompiledTemplates=getTemplates(xslIs);
+       }
+       public void addQueryTemplate(String name, InputStream xslIs) throws TransformerConfigurationException, ParserConfigurationException, SAXException, IOException
+       {
+               compiledTemplatesCache.put(name,getTemplates(xslIs));
+       }
+       public String getQueryAsXmlString(Properties formProperties,String queryTemplateName) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+               Templates ts= compiledTemplatesCache.get(queryTemplateName);
+               return getQueryAsXmlString(formProperties, ts);
+       }
+       
+       public Document getQueryAsDOM(Properties formProperties,String queryTemplateName) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+               Templates ts= compiledTemplatesCache.get(queryTemplateName);
+               return getQueryAsDOM(formProperties, ts);
+       }
+       public String getQueryAsXmlString(Properties formProperties) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+               return getQueryAsXmlString(formProperties, defaultCompiledTemplates);
+       }
+       
+       public Document getQueryAsDOM(Properties formProperties) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+               return getQueryAsDOM(formProperties, defaultCompiledTemplates);
+       }
+       
+       
+       /**
+        * Fast means of constructing query using a precompiled stylesheet  
+        */             
+       public static String getQueryAsXmlString(Properties formProperties, Templates template) throws SAXException, IOException, ParserConfigurationException, TransformerException 
+       {
+               ByteArrayOutputStream baos=new ByteArrayOutputStream();
+               StreamResult result=new StreamResult(baos);
+               transformCriteria(formProperties,template,result);
+               return baos.toString();                 
+       }
+       
+       /**
+        * Slow means of constructing query parsing a stylesheet from an input stream  
+        */             
+       public static String getQueryAsXmlString(Properties formProperties, InputStream xslIs) throws SAXException, IOException, ParserConfigurationException, TransformerException 
+       {
+               ByteArrayOutputStream baos=new ByteArrayOutputStream();
+               StreamResult result=new StreamResult(baos);
+               transformCriteria(formProperties,xslIs,result);
+               return baos.toString();                 
+       }
+                       
+
+       /**
+        * Fast means of constructing query using a cached,precompiled stylesheet  
+        */     
+       public static Document getQueryAsDOM(Properties formProperties, Templates template) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+               DOMResult result=new DOMResult();
+               transformCriteria(formProperties,template,result);
+               return (Document)result.getNode();
+       }
+
+       
+       /**
+        * Slow means of constructing query - parses stylesheet from input stream 
+        */
+       public static Document getQueryAsDOM(Properties formProperties, InputStream xslIs) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+               DOMResult result=new DOMResult();
+               transformCriteria(formProperties,xslIs,result);
+               return (Document)result.getNode();
+       }
+       
+       
+       
+       
+       /**
+        * Slower transformation using an uncompiled stylesheet (suitable for development environment)
+        */
+       public static void transformCriteria(Properties formProperties, InputStream xslIs, Result result) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+        dbf.setNamespaceAware(true);       
+               DocumentBuilder builder = dbf.newDocumentBuilder();
+               org.w3c.dom.Document xslDoc = builder.parse(xslIs);
+               DOMSource ds = new DOMSource(xslDoc);
+               
+               Transformer transformer =null;
+               synchronized (tFactory)
+               {
+                       transformer = tFactory.newTransformer(ds);                      
+               }
+               transformCriteria(formProperties,transformer,result);
+       }
+       
+       /**
+        * Fast transformation using a pre-compiled stylesheet (suitable for production environments)
+        */
+       public static void transformCriteria(Properties formProperties, Templates template, Result result) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+               transformCriteria(formProperties,template.newTransformer(),result);
+       }
+       
+       
+       
+       public static void transformCriteria(Properties formProperties, Transformer transformer, Result result) throws SAXException, IOException, ParserConfigurationException, TransformerException
+       {
+        dbf.setNamespaceAware(true);
+        
+           //Create an XML document representing the search index document.
+               DocumentBuilder db = dbf.newDocumentBuilder ();
+               org.w3c.dom.Document doc = db.newDocument ();
+               Element root = doc.createElement ("Document");
+               doc.appendChild (root);
+               
+               Enumeration keysEnum = formProperties.keys();
+               while(keysEnum.hasMoreElements())
+               {
+                   String propName=(String) keysEnum.nextElement();
+                   String value=formProperties.getProperty(propName);
+               if((value!=null)&&(value.length()>0))
+               {
+                   DOMUtils.insertChild(root,propName,value);                          
+               }
+               }               
+               //Use XSLT to to transform into an XML query string using the  queryTemplate
+               DOMSource xml=new DOMSource(doc);
+               transformer.transform(xml,result);              
+       }
+       
+       /**
+        * Parses a query stylesheet for repeated use
+        */
+       public static Templates getTemplates(InputStream xslIs) throws ParserConfigurationException, SAXException, IOException, TransformerConfigurationException  
+       {
+        dbf.setNamespaceAware(true);       
+               DocumentBuilder builder = dbf.newDocumentBuilder();
+               org.w3c.dom.Document xslDoc = builder.parse(xslIs);
+               DOMSource ds = new DOMSource(xslDoc);
+               return tFactory.newTemplates(ds);
+       }
+}