1   package com.atlassian.bonnie.search.extractor;
2   
3   import com.atlassian.bonnie.search.BaseDocumentBuilder;
4   import com.atlassian.bonnie.search.MockLuceneIndexableObject;
5   import com.atlassian.bonnie.search.MockLuceneIndexableObjectSubclass;
6   import junit.framework.TestCase;
7   import org.apache.lucene.document.Document;
8   import org.apache.lucene.document.Field;
9   
10  import java.util.ArrayList;
11  import java.util.Date;
12  import java.util.List;
13  
14  public class TestXmlConfiguredExtractor extends TestCase
15  {
16      private static final String DEFAULT_SEARCHABLE_FIELD = "contentBody";
17      private XmlConfiguredExtractor extractor;
18  
19      protected void setUp() throws Exception
20      {
21          super.setUp();
22  
23          extractor = new XmlConfiguredExtractor();
24      }
25  
26      public void testUnconfiguredClass()
27      {
28          MockLuceneIndexableObject obj = new MockLuceneIndexableObjectSubclass();
29          populateWithTestData(obj);
30          Document doc = makeDocument(obj, new StringBuffer());
31  
32          assertNull(doc.get("keywordField"));
33          assertNull(doc.get("textField"));
34          assertNull(doc.get("unIndexedField"));
35          assertNull(doc.get("unStoredField"));
36          assertNull(doc.get(BaseDocumentBuilder.FieldName.CONTENT_BODY));
37      }
38  
39      public void testCreateDocument() throws Exception
40      {
41          MockLuceneIndexableObject obj = new MockLuceneIndexableObject();
42          populateWithTestData(obj);
43          Document doc = makeDocument(obj, new StringBuffer());
44  
45          assertEquals(obj.getKeywordAttr(), doc.get("keywordField"));
46          assertEquals("" + obj.getTextAttr(), doc.get("textField"));
47          assertEquals("" + obj.getUnIndexedAttr(), doc.get("unIndexedField"));
48          assertEquals("" + obj.getUnStoredAttr(), doc.get("unStoredField"));
49          assertEquals("" + obj.getTextAttr(), doc.get(BaseDocumentBuilder.FieldName.CONTENT_BODY));
50  
51          assertCollectionFieldTypes(doc);
52      }
53  
54      public void testNoDefaultSearchableText() throws Exception
55      {
56          MockLuceneIndexableObject obj = new MockLuceneIndexableObject();
57          populateWithTestData(obj);
58          StringBuffer extractedText = new StringBuffer();
59          Document doc = makeDocument(obj, extractedText);
60  
61          assertEquals(0, extractedText.length());
62      }
63  
64      public void testDateAsDefaultSearchableText() throws Exception
65      {
66          DateAppendedMock obj = new DateAppendedMock();
67          populateWithTestData(obj);
68          Date now = new Date();
69          obj.setDateAttr(now);
70  
71          StringBuffer extractedText = new StringBuffer();
72          makeDocument(obj, extractedText);
73  
74          assertTrue(extractedText.length() > 0);
75      }
76  
77      public void testStringAsDefaultSearchableText() throws Exception
78      {
79          StringAppendedMock obj = new StringAppendedMock();
80          populateWithTestData(obj);
81  
82          StringBuffer extractedText = new StringBuffer();
83          makeDocument(obj, extractedText);
84  
85          assertEquals("113", extractedText.toString());
86      }
87  
88      public void testCollectionAsDefaultSearchableText() throws Exception
89      {
90          CollectionAppendedMock obj = new CollectionAppendedMock();
91          populateWithTestData(obj);
92  
93          StringBuffer extractedText = new StringBuffer();
94          makeDocument(obj, extractedText);
95  
96          assertEquals("Goat 3", extractedText.toString());
97      }
98  
99      public void testArrayAsDefaultSearchableText() throws Exception
100     {
101         ArrayAppendedMock obj = new ArrayAppendedMock();
102         populateWithTestData(obj);
103 
104         StringBuffer extractedText = new StringBuffer();
105         makeDocument(obj, extractedText);
106 
107         assertEquals("1 2 3 4 5", extractedText.toString());
108     }
109 
110     public void testMultipleAttributesAsDefaultSearchableText() throws Exception
111     {
112         MultiAttrAppendedMock obj = new MultiAttrAppendedMock();
113         populateWithTestData(obj);
114 
115         StringBuffer extractedText = new StringBuffer();
116         makeDocument(obj, extractedText);
117 
118         assertEquals("1 2 3 4 5,Fish 4", extractedText.toString());
119     }
120 
121     private Document makeDocument(MockLuceneIndexableObject obj, StringBuffer extractedText)
122     {
123         Document doc = new Document();
124         extractor.addFields(doc, extractedText, obj);
125 
126         if (extractedText.length() > 0)
127             doc.add(new Field(DEFAULT_SEARCHABLE_FIELD, extractedText.toString(), Field.Store.YES, Field.Index.TOKENIZED));
128 
129         return doc;
130     }
131 
132     private void assertCollectionFieldTypes(Document doc)
133     {
134         String[] listValues = doc.getValues("listField");
135         assertEquals(2, listValues.length);
136         assertEquals("Goat", listValues[0]);
137         assertEquals("3", listValues[1]);
138 
139         String[] objArrValues = doc.getValues("objArrayField");
140         assertEquals(2, objArrValues.length);
141         assertEquals("Fish", objArrValues[0]);
142         assertEquals("4", objArrValues[1]);
143 
144         String[] intArrValues = doc.getValues("intArrayField");
145         assertEquals(5, intArrValues.length);
146         assertEquals("1", intArrValues[0]);
147         assertEquals("2", intArrValues[1]);
148         assertEquals("3", intArrValues[2]);
149         assertEquals("4", intArrValues[3]);
150         assertEquals("5", intArrValues[4]);
151     }
152 
153     private void populateWithTestData(MockLuceneIndexableObject obj)
154     {
155         obj.setHandleAttr(111);
156         obj.setKeywordAttr("112");
157         obj.setTextAttr(113);
158         obj.setUnIndexedAttr(114);
159         obj.setUnStoredAttr(115);
160         obj.setIntArrayAttr(new int[] { 1, 2, 3, 4, 5 });
161         obj.setObjArrayAttr(new Object[] { "Fish", new Integer(4) });
162         List myList = new ArrayList();
163         myList.add("Goat");
164         myList.add(new Integer(3));
165         obj.setListAttr(myList);
166     }
167 
168     public static class DateAppendedMock extends MockLuceneIndexableObject
169     {
170         Date dateAttr;
171 
172         public Date getDateAttr()
173         {
174             return dateAttr;
175         }
176 
177         public void setDateAttr(Date dateAttr)
178         {
179             this.dateAttr = dateAttr;
180         }
181     }
182 
183     public static class StringAppendedMock extends MockLuceneIndexableObject
184     {
185         // no content needed, just a new configuration file.
186     }
187 
188     public static class CollectionAppendedMock extends MockLuceneIndexableObject
189     {
190         // no content needed
191     }
192 
193     public static class ArrayAppendedMock extends MockLuceneIndexableObject
194     {
195         // no content needed
196     }
197 
198     public static class MultiAttrAppendedMock extends MockLuceneIndexableObject
199     {
200         // no content needed
201     }
202 }