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