1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.kernel.search;
16  
17  import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
18  import com.liferay.portal.kernel.util.ArrayUtil;
19  import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
20  import com.liferay.portal.kernel.util.FileUtil;
21  import com.liferay.portal.kernel.util.StringBundler;
22  import com.liferay.portal.kernel.util.StringPool;
23  import com.liferay.portal.kernel.util.Validator;
24  
25  import java.io.File;
26  import java.io.FileInputStream;
27  import java.io.IOException;
28  import java.io.InputStream;
29  
30  import java.text.DateFormat;
31  import java.text.ParseException;
32  
33  import java.util.Arrays;
34  import java.util.Date;
35  import java.util.HashMap;
36  import java.util.Map;
37  
38  /**
39   * <a href="DocumentImpl.java.html"><b><i>View Source</i></b></a>
40   *
41   * @author Brian Wing Shun Chan
42   * @author Bruno Farache
43   */
44  public class DocumentImpl implements Document {
45  
46      public void add(Field field) {
47          _fields.put(field.getName(), field);
48      }
49  
50      public void addDate(String name, Date value) {
51          if (value == null) {
52              return;
53          }
54  
55          addKeyword(name, _dateFormat.format(value));
56      }
57  
58      public void addFile(String name, byte[] bytes, String fileExt) {
59          InputStream is = new UnsyncByteArrayInputStream(bytes);
60  
61          addFile(name, is, fileExt);
62      }
63  
64      public void addFile(String name, File file, String fileExt)
65          throws IOException {
66  
67          InputStream is = new FileInputStream(file);
68  
69          addFile(name, is, fileExt);
70      }
71  
72      public void addFile(String name, InputStream is, String fileExt) {
73          addText(name, FileUtil.extractText(is, fileExt));
74      }
75  
76      public void addKeyword(String name, boolean value) {
77          addKeyword(name, String.valueOf(value));
78      }
79  
80      public void addKeyword(String name, Boolean value) {
81          addKeyword(name, String.valueOf(value));
82      }
83  
84      public void addKeyword(String name, boolean[] values) {
85          if (values == null) {
86              return;
87          }
88  
89          addKeyword(name, ArrayUtil.toStringArray(values));
90      }
91  
92      public void addKeyword(String name, Boolean[] values) {
93          if (values == null) {
94              return;
95          }
96  
97          addKeyword(name, ArrayUtil.toStringArray(values));
98      }
99  
100     public void addKeyword(String name, double value) {
101         addKeyword(name, String.valueOf(value));
102     }
103 
104     public void addKeyword(String name, Double value) {
105         addKeyword(name, String.valueOf(value));
106     }
107 
108     public void addKeyword(String name, double[] values) {
109         if (values == null) {
110             return;
111         }
112 
113         addKeyword(name, ArrayUtil.toStringArray(values));
114     }
115 
116     public void addKeyword(String name, Double[] values) {
117         if (values == null) {
118             return;
119         }
120 
121         addKeyword(name, ArrayUtil.toStringArray(values));
122     }
123 
124     public void addKeyword(String name, int value) {
125         addKeyword(name, String.valueOf(value));
126     }
127 
128     public void addKeyword(String name, int[] values) {
129         if (values == null) {
130             return;
131         }
132 
133         addKeyword(name, ArrayUtil.toStringArray(values));
134     }
135 
136     public void addKeyword(String name, Integer value) {
137         addKeyword(name, String.valueOf(value));
138     }
139 
140     public void addKeyword(String name, Integer[] values) {
141         if (values == null) {
142             return;
143         }
144 
145         addKeyword(name, ArrayUtil.toStringArray(values));
146     }
147 
148     public void addKeyword(String name, long value) {
149         addKeyword(name, String.valueOf(value));
150     }
151 
152     public void addKeyword(String name, Long value) {
153         addKeyword(name, String.valueOf(value));
154     }
155 
156     public void addKeyword(String name, long[] values) {
157         if (values == null) {
158             return;
159         }
160 
161         addKeyword(name, ArrayUtil.toStringArray(values));
162     }
163 
164     public void addKeyword(String name, Long[] values) {
165         if (values == null) {
166             return;
167         }
168 
169         addKeyword(name, ArrayUtil.toStringArray(values));
170     }
171 
172     public void addKeyword(String name, short value) {
173         addKeyword(name, String.valueOf(value));
174     }
175 
176     public void addKeyword(String name, Short value) {
177         addKeyword(name, String.valueOf(value));
178     }
179 
180     public void addKeyword(String name, short[] values) {
181         if (values == null) {
182             return;
183         }
184 
185         addKeyword(name, ArrayUtil.toStringArray(values));
186     }
187 
188     public void addKeyword(String name, Short[] values) {
189         if (values == null) {
190             return;
191         }
192 
193         addKeyword(name, ArrayUtil.toStringArray(values));
194     }
195 
196     public void addKeyword(String name, String value) {
197         addKeyword(name, value, false);
198     }
199 
200     public void addKeyword(String name, String value, boolean lowerCase) {
201         if (lowerCase && Validator.isNotNull(value)) {
202             value = value.toLowerCase();
203         }
204 
205         _fields.put(name, new Field(name, value, false));
206     }
207 
208     public void addKeyword(String name, String[] values) {
209         if (values == null) {
210             return;
211         }
212 
213         _fields.put(name, new Field(name, values, false));
214     }
215 
216     public void addModifiedDate() {
217         addModifiedDate(new Date());
218     }
219 
220     public void addModifiedDate(Date modifiedDate) {
221         addDate(Field.MODIFIED, modifiedDate);
222     }
223 
224     public void addText(String name, String value) {
225         if (Validator.isNotNull(value)) {
226             _fields.put(name, new Field(name, value, true));
227         }
228     }
229 
230     public void addUID(String portletId, long field1) {
231         addUID(portletId, String.valueOf(field1));
232     }
233 
234     public void addUID(
235         String portletId, long field1, String field2) {
236 
237         addUID(portletId, String.valueOf(field1), field2);
238     }
239 
240     public void addUID(String portletId, Long field1) {
241         addUID(portletId, field1.longValue());
242     }
243 
244     public void addUID(
245         String portletId, Long field1, String field2) {
246 
247         addUID(portletId, field1.longValue(), field2);
248     }
249 
250     public void addUID(String portletId, String field1) {
251         addUID(portletId, field1, null);
252     }
253 
254     public void addUID(
255         String portletId, String field1, String field2) {
256 
257         addUID(portletId, field1, field2, null);
258     }
259 
260     public void addUID(
261         String portletId, String field1, String field2, String field3) {
262 
263         addUID(portletId, field1, field2, field3, null);
264     }
265 
266     public void addUID(
267         String portletId, String field1, String field2, String field3,
268         String field4) {
269 
270         String uid = portletId + _UID_PORTLET + field1;
271 
272         if (field2 != null) {
273             uid += _UID_FIELD + field2;
274         }
275 
276         if (field3 != null) {
277             uid += _UID_FIELD + field3;
278         }
279 
280         if (field4 != null) {
281             uid += _UID_FIELD + field4;
282         }
283 
284         addKeyword(Field.UID, uid);
285     }
286 
287     public String get(String name) {
288         Field field = _fields.get(name);
289 
290         if (field == null) {
291             return StringPool.BLANK;
292         }
293 
294         return field.getValue();
295     }
296 
297     public Date getDate(String name) throws ParseException {
298         return _dateFormat.parse(get(name));
299     }
300 
301     public Map<String, Field> getFields() {
302         return _fields;
303     }
304 
305     public String[] getValues(String name) {
306         Field field = _fields.get(name);
307 
308         if (field == null) {
309             return new String[] {StringPool.BLANK};
310         }
311 
312         return field.getValues();
313     }
314 
315     public void setFields(Map<String, Field> fields) {
316         _fields = fields;
317     }
318 
319     public String toString() {
320         StringBundler sb = new StringBundler();
321 
322         sb.append(StringPool.OPEN_CURLY_BRACE);
323 
324         boolean firstField = true;
325 
326         for (Field field : _fields.values()) {
327             if (!firstField) {
328                 sb.append(StringPool.COMMA);
329                 sb.append(StringPool.SPACE);
330             }
331             else {
332                 firstField = false;
333             }
334 
335             sb.append(field.getName());
336             sb.append(StringPool.EQUAL);
337             sb.append(Arrays.toString(field.getValues()));
338         }
339 
340         sb.append(StringPool.CLOSE_CURLY_BRACE);
341 
342         return sb.toString();
343     }
344 
345     private static final String _DATE_FORMAT_PATTERN = "yyyyMMddHHmmss";
346 
347     private static final String _UID_FIELD = "_FIELD_";
348 
349     private static final String _UID_PORTLET = "_PORTLET_";
350 
351     private DateFormat _dateFormat = DateFormatFactoryUtil.getSimpleDateFormat(
352         _DATE_FORMAT_PATTERN);
353     private Map<String, Field> _fields = new HashMap<String, Field>();
354 
355 }