View Javadoc

1    /*
2    * Copyright 2001,2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.apache.commons.scaffold.lucene;
18  
19  
20  import java.util.ArrayList;
21  import java.util.Collection;
22  import java.util.Enumeration;
23  import java.util.HashMap;
24  
25  import org.apache.commons.beanutils.BeanUtils;
26  import org.apache.commons.scaffold.lang.PopulateException;
27  
28  import org.apache.lucene.document.Document;
29  import org.apache.lucene.document.Field;
30  import org.apache.lucene.search.Hits;
31  
32  
33   /**
34    * General purpose utility methods related to Hits
35    *
36    * @author Craig R. McClanahan
37    * @author Ted Husted
38    * @version $Revision: 155464 $ $Date: 2005-02-26 13:26:54 +0000 (Sat, 26 Feb 2005) $
39    */
40   public class SearchUtils {
41  
42      /**
43       * Populate the properties of the specified JavaBean from the specified
44       * Lucene document, based on matching each parameter name against the
45       * corresponding JavaBeans "property setter" methods in the bean's class.
46       * See <code>BeanUtils.CopyProperites</code> for more about automatic 
47       * conversion between types.
48       *
49       * @param bean The JavaBean whose properties are to be set
50       * @param document The Lucene document whose parameters are to be used
51       * to populate bean properties
52       * @exception PopulateException if an exception is thrown while setting
53       * property values
54       */
55      public static void populate(
56              Object bean,
57              Document document)
58          throws PopulateException {
59  
60          // Build a list of relevant fields and values
61          HashMap properties = new HashMap();
62  
63          // Iterator of field names
64          Enumeration fields = document.fields();
65  
66          while (fields.hasMoreElements()) {
67              Field field = (Field) fields.nextElement();
68              properties.put(field.name(),field.stringValue());
69          }
70  
71          // Set the corresponding properties of our bean
72          try {
73              BeanUtils.copyProperties(bean, properties);
74          } catch (Throwable t) {
75              throw new PopulateException(t);
76          }
77  
78      } // end populate()
79  
80  
81      /**
82        * Return a ArrayList of hits by looping and calling populate.
83        * No assumptions are made about fields in document. Each is
84        * processed with a separate call to populate. Whatever fields
85        * in each document that match the target bean will be
86        * transferred.
87        *
88        * @param hits The Hits whose documents are to be used
89        * to populate bean properties
90        * @param target An instance of the bean to populate
91        * @exception PopulateException if an exception is thrown while setting
92        * property values, populating the bean, or accessing the Hits
93        */
94       public static Collection getCollection(
95              Object target,
96              Hits hits)
97          throws PopulateException {
98  
99          // Use ArrayList to maintain sequence
100         ArrayList list = new ArrayList();
101 
102         // Acquire target class
103         Class factory = target.getClass();
104 
105         try {
106             // Scroll to each document; populate bean, and add to list
107             for (int i=0; i<hits.length(); ++i) {
108                 Object bean = factory.newInstance();
109                 Document doc = hits.doc(i);
110                 populate(bean,doc);
111                 list.add(bean);
112             }
113         } catch (Throwable t) {
114             throw new PopulateException(t);
115         }
116         return ((Collection) list);
117 
118     } // end getCollection()
119 
120 } // end SearchUtils
121