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
186 }
187
188 public static class CollectionAppendedMock extends MockLuceneIndexableObject
189 {
190
191 }
192
193 public static class ArrayAppendedMock extends MockLuceneIndexableObject
194 {
195
196 }
197
198 public static class MultiAttrAppendedMock extends MockLuceneIndexableObject
199 {
200
201 }
202 }