001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
045     * @author Brian Wing Shun Chan
046     * @author Bruno Farache
047     */
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            /**
286             * @deprecated
287             */
288            public void addModifiedDate() {
289                    addModifiedDate(new Date());
290            }
291    
292            /**
293             * @deprecated
294             */
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    }