001
014
015 package com.liferay.portal.kernel.search;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
018 import com.liferay.portal.kernel.util.ArrayUtil;
019 import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
020 import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
021 import com.liferay.portal.kernel.util.FileUtil;
022 import com.liferay.portal.kernel.util.LocaleUtil;
023 import com.liferay.portal.kernel.util.PropsKeys;
024 import com.liferay.portal.kernel.util.PropsUtil;
025 import com.liferay.portal.kernel.util.StringBundler;
026 import com.liferay.portal.kernel.util.StringPool;
027 import com.liferay.portal.kernel.util.Validator;
028
029 import java.io.File;
030 import java.io.FileInputStream;
031 import java.io.IOException;
032 import java.io.InputStream;
033
034 import java.text.DateFormat;
035 import java.text.Format;
036 import java.text.ParseException;
037
038 import java.util.Arrays;
039 import java.util.Date;
040 import java.util.HashMap;
041 import java.util.Locale;
042 import java.util.Map;
043
044
048 public class DocumentImpl implements Document {
049
050 public static String getLocalizedName(Locale locale, String name) {
051 String languageId = LocaleUtil.toLanguageId(locale);
052
053 String localizedName = name.concat(StringPool.UNDERLINE).concat(
054 languageId);
055
056 return localizedName;
057 }
058
059 public void add(Field field) {
060 _fields.put(field.getName(), field);
061 }
062
063 public void addDate(String name, Date value) {
064 if (value == null) {
065 return;
066 }
067
068 addKeyword(name, _dateFormat.format(value));
069 }
070
071 public void addFile(String name, byte[] bytes, String fileExt) {
072 InputStream is = new UnsyncByteArrayInputStream(bytes);
073
074 addFile(name, is, fileExt);
075 }
076
077 public void addFile(String name, File file, String fileExt)
078 throws IOException {
079
080 InputStream is = new FileInputStream(file);
081
082 addFile(name, is, fileExt);
083 }
084
085 public void addFile(String name, InputStream is, String fileExt) {
086 addText(name, FileUtil.extractText(is, fileExt));
087 }
088
089 public void addKeyword(String name, boolean value) {
090 addKeyword(name, String.valueOf(value));
091 }
092
093 public void addKeyword(String name, Boolean value) {
094 addKeyword(name, String.valueOf(value));
095 }
096
097 public void addKeyword(String name, boolean[] values) {
098 if (values == null) {
099 return;
100 }
101
102 addKeyword(name, ArrayUtil.toStringArray(values));
103 }
104
105 public void addKeyword(String name, Boolean[] values) {
106 if (values == null) {
107 return;
108 }
109
110 addKeyword(name, ArrayUtil.toStringArray(values));
111 }
112
113 public void addKeyword(String name, double value) {
114 addKeyword(name, String.valueOf(value));
115 }
116
117 public void addKeyword(String name, Double value) {
118 addKeyword(name, String.valueOf(value));
119 }
120
121 public void addKeyword(String name, double[] values) {
122 if (values == null) {
123 return;
124 }
125
126 addKeyword(name, ArrayUtil.toStringArray(values));
127 }
128
129 public void addKeyword(String name, Double[] values) {
130 if (values == null) {
131 return;
132 }
133
134 addKeyword(name, ArrayUtil.toStringArray(values));
135 }
136
137 public void addKeyword(String name, float value) {
138 addKeyword(name, String.valueOf(value));
139 }
140
141 public void addKeyword(String name, Float value) {
142 addKeyword(name, String.valueOf(value));
143 }
144
145 public void addKeyword(String name, float[] values) {
146 if (values == null) {
147 return;
148 }
149
150 addKeyword(name, ArrayUtil.toStringArray(values));
151 }
152
153 public void addKeyword(String name, Float[] values) {
154 if (values == null) {
155 return;
156 }
157
158 addKeyword(name, ArrayUtil.toStringArray(values));
159 }
160
161 public void addKeyword(String name, int value) {
162 addKeyword(name, String.valueOf(value));
163 }
164
165 public void addKeyword(String name, int[] values) {
166 if (values == null) {
167 return;
168 }
169
170 addKeyword(name, ArrayUtil.toStringArray(values));
171 }
172
173 public void addKeyword(String name, Integer value) {
174 addKeyword(name, String.valueOf(value));
175 }
176
177 public void addKeyword(String name, Integer[] values) {
178 if (values == null) {
179 return;
180 }
181
182 addKeyword(name, ArrayUtil.toStringArray(values));
183 }
184
185 public void addKeyword(String name, long value) {
186 addKeyword(name, String.valueOf(value));
187 }
188
189 public void addKeyword(String name, Long value) {
190 addKeyword(name, String.valueOf(value));
191 }
192
193 public void addKeyword(String name, long[] values) {
194 if (values == null) {
195 return;
196 }
197
198 addKeyword(name, ArrayUtil.toStringArray(values));
199 }
200
201 public void addKeyword(String name, Long[] values) {
202 if (values == null) {
203 return;
204 }
205
206 addKeyword(name, ArrayUtil.toStringArray(values));
207 }
208
209 public void addKeyword(String name, short value) {
210 addKeyword(name, String.valueOf(value));
211 }
212
213 public void addKeyword(String name, Short value) {
214 addKeyword(name, String.valueOf(value));
215 }
216
217 public void addKeyword(String name, short[] values) {
218 if (values == null) {
219 return;
220 }
221
222 addKeyword(name, ArrayUtil.toStringArray(values));
223 }
224
225 public void addKeyword(String name, Short[] values) {
226 if (values == null) {
227 return;
228 }
229
230 addKeyword(name, ArrayUtil.toStringArray(values));
231 }
232
233 public void addKeyword(String name, String value) {
234 addKeyword(name, value, false);
235 }
236
237 public void addKeyword(String name, String value, boolean lowerCase) {
238 if (lowerCase && Validator.isNotNull(value)) {
239 value = value.toLowerCase();
240 }
241
242 Field field = new Field(name, value);
243
244 for (String fieldName : Field.UNSCORED_FIELD_NAMES) {
245 if (name.equalsIgnoreCase(fieldName)) {
246 field.setBoost(0);
247 }
248 }
249
250 _fields.put(name, field);
251 }
252
253 public void addKeyword(String name, String[] values) {
254 if (values == null) {
255 return;
256 }
257
258 Field field = new Field(name, values);
259
260 _fields.put(name, field);
261 }
262
263 public void addLocalizedKeyword(String name, Map<Locale, String> values) {
264 if ((values == null) || values.isEmpty()) {
265 return;
266 }
267
268 Field field = new Field(name, values);
269
270 _fields.put(name, field);
271 }
272
273 public void addLocalizedText(String name, Map<Locale, String> values) {
274 if ((values == null) || values.isEmpty()) {
275 return;
276 }
277
278 Field field = new Field(name, values);
279
280 field.setTokenized(true);
281
282 _fields.put(name, field);
283 }
284
285
288 public void addModifiedDate() {
289 addModifiedDate(new Date());
290 }
291
292
295 public void addModifiedDate(Date modifiedDate) {
296 addDate(Field.MODIFIED, modifiedDate);
297 }
298
299 public void addNumber(String name, double value) {
300 addNumber(name, String.valueOf(value));
301 }
302
303 public void addNumber(String name, Double value) {
304 addNumber(name, String.valueOf(value));
305 }
306
307 public void addNumber(String name, double[] values) {
308 addNumber(name, ArrayUtil.toStringArray(values));
309 }
310
311 public void addNumber(String name, Double[] values) {
312 addNumber(name, String.valueOf(ArrayUtil.toStringArray(values)));
313 }
314
315 public void addNumber(String name, float value) {
316 addNumber(name, String.valueOf(value));
317 }
318
319 public void addNumber(String name, Float value) {
320 addNumber(name, String.valueOf(value));
321 }
322
323 public void addNumber(String name, float[] values) {
324 addNumber(name, ArrayUtil.toStringArray(values));
325 }
326
327 public void addNumber(String name, Float[] values) {
328 addNumber(name, ArrayUtil.toStringArray(values));
329 }
330
331 public void addNumber(String name, int value) {
332 addNumber(name, String.valueOf(value));
333 }
334
335 public void addNumber(String name, Integer value) {
336 addNumber(name, String.valueOf(value));
337 }
338
339 public void addNumber(String name, int[] values) {
340 addNumber(name, ArrayUtil.toStringArray(values));
341 }
342
343 public void addNumber(String name, Integer[] values) {
344 addNumber(name, ArrayUtil.toStringArray(values));
345 }
346
347 public void addNumber(String name, long value) {
348 addNumber(name, String.valueOf(value));
349 }
350
351 public void addNumber(String name, Long value) {
352 addNumber(name, String.valueOf(value));
353 }
354
355 public void addNumber(String name, long[] values) {
356 addNumber(name, ArrayUtil.toStringArray(values));
357 }
358
359 public void addNumber(String name, Long[] values) {
360 addNumber(name, ArrayUtil.toStringArray(values));
361 }
362
363 public void addNumber(String name, String value) {
364 if (Validator.isNotNull(value)) {
365 Field field = new Field(name, value);
366
367 field.setNumeric(true);
368
369 _fields.put(name, field);
370 }
371 }
372
373 public void addNumber(String name, String[] values) {
374 if (values == null) {
375 return;
376 }
377
378 Field field = new Field(name, values);
379
380 field.setNumeric(true);
381
382 _fields.put(name, field);
383 }
384
385 public void addText(String name, String value) {
386 if (Validator.isNotNull(value)) {
387 Field field = new Field(name, value);
388
389 field.setTokenized(true);
390
391 _fields.put(name, field);
392 }
393 }
394
395 public void addText(String name, String[] values) {
396 if (values == null) {
397 return;
398 }
399
400 Field field = new Field(name, values);
401
402 field.setTokenized(true);
403
404 _fields.put(name, field);
405 }
406
407 public void addUID(String portletId, long field1) {
408 addUID(portletId, String.valueOf(field1));
409 }
410
411 public void addUID(
412 String portletId, long field1, String field2) {
413
414 addUID(portletId, String.valueOf(field1), field2);
415 }
416
417 public void addUID(String portletId, Long field1) {
418 addUID(portletId, field1.longValue());
419 }
420
421 public void addUID(
422 String portletId, Long field1, String field2) {
423
424 addUID(portletId, field1.longValue(), field2);
425 }
426
427 public void addUID(String portletId, String field1) {
428 addUID(portletId, field1, null);
429 }
430
431 public void addUID(
432 String portletId, String field1, String field2) {
433
434 addUID(portletId, field1, field2, null);
435 }
436
437 public void addUID(
438 String portletId, String field1, String field2, String field3) {
439
440 addUID(portletId, field1, field2, field3, null);
441 }
442
443 public void addUID(
444 String portletId, String field1, String field2, String field3,
445 String field4) {
446
447 String uid = portletId + _UID_PORTLET + field1;
448
449 if (field2 != null) {
450 uid += _UID_FIELD + field2;
451 }
452
453 if (field3 != null) {
454 uid += _UID_FIELD + field3;
455 }
456
457 if (field4 != null) {
458 uid += _UID_FIELD + field4;
459 }
460
461 addKeyword(Field.UID, uid);
462 }
463
464 public String get(Locale locale, String name) {
465 String localizedName = getLocalizedName(locale, name);
466
467 Field field = _fields.get(localizedName);
468
469 if (field == null) {
470 field = _fields.get(name);
471 }
472
473 if (field == null) {
474 return StringPool.BLANK;
475 }
476
477 return field.getValue();
478 }
479
480 public String get(String name) {
481 Field field = _fields.get(name);
482
483 if (field == null) {
484 return StringPool.BLANK;
485 }
486
487 return field.getValue();
488 }
489
490 public Date getDate(String name) throws ParseException {
491 DateFormat dateFormat = DateFormatFactoryUtil.getSimpleDateFormat(
492 _DATE_FORMAT_PATTERN);
493
494 return dateFormat.parse(get(name));
495 }
496
497 public Map<String, Field> getFields() {
498 return _fields;
499 }
500
501 public String getPortletId() {
502 String uid = getUID();
503
504 int pos = uid.indexOf(_UID_PORTLET);
505
506 return uid.substring(0, pos);
507 }
508
509 public String getUID() {
510 Field field = _fields.get(Field.UID);
511
512 if (field == null) {
513 throw new RuntimeException("UID is not set");
514 }
515
516 return field.getValue();
517 }
518
519 public String[] getValues(String name) {
520 Field field = _fields.get(name);
521
522 if (field == null) {
523 return new String[] {StringPool.BLANK};
524 }
525
526 return field.getValues();
527 }
528
529 public void remove(String name) {
530 _fields.remove(name);
531 }
532
533 public void setFields(Map<String, Field> fields) {
534 _fields = fields;
535 }
536
537 @Override
538 public String toString() {
539 StringBundler sb = new StringBundler();
540
541 sb.append(StringPool.OPEN_CURLY_BRACE);
542
543 boolean firstField = true;
544
545 for (Field field : _fields.values()) {
546 if (!firstField) {
547 sb.append(StringPool.COMMA);
548 sb.append(StringPool.SPACE);
549 }
550 else {
551 firstField = false;
552 }
553
554 sb.append(field.getName());
555 sb.append(StringPool.EQUAL);
556 sb.append(Arrays.toString(field.getValues()));
557 }
558
559 sb.append(StringPool.CLOSE_CURLY_BRACE);
560
561 return sb.toString();
562 }
563
564 private static final String _DATE_FORMAT_PATTERN = PropsUtil.get(
565 PropsKeys.INDEX_DATE_FORMAT_PATTERN);
566
567 private static final String _UID_FIELD = "_FIELD_";
568
569 private static final String _UID_PORTLET = "_PORTLET_";
570
571 private Format _dateFormat = FastDateFormatFactoryUtil.getSimpleDateFormat(
572 _DATE_FORMAT_PATTERN);
573
574 private Map<String, Field> _fields = new HashMap<String, Field>();
575
576 }