001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
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.StringBundler;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portal.kernel.util.Validator;
025    
026    import java.io.File;
027    import java.io.FileInputStream;
028    import java.io.IOException;
029    import java.io.InputStream;
030    
031    import java.text.DateFormat;
032    import java.text.Format;
033    import java.text.ParseException;
034    
035    import java.util.Arrays;
036    import java.util.Date;
037    import java.util.HashMap;
038    import java.util.Map;
039    
040    /**
041     * @author Brian Wing Shun Chan
042     * @author Bruno Farache
043     */
044    public class DocumentImpl implements Document {
045    
046            public void add(Field field) {
047                    _fields.put(field.getName(), field);
048            }
049    
050            public void addDate(String name, Date value) {
051                    if (value == null) {
052                            return;
053                    }
054    
055                    addKeyword(name, _dateFormat.format(value));
056            }
057    
058            public void addFile(String name, byte[] bytes, String fileExt) {
059                    InputStream is = new UnsyncByteArrayInputStream(bytes);
060    
061                    addFile(name, is, fileExt);
062            }
063    
064            public void addFile(String name, File file, String fileExt)
065                    throws IOException {
066    
067                    InputStream is = new FileInputStream(file);
068    
069                    addFile(name, is, fileExt);
070            }
071    
072            public void addFile(String name, InputStream is, String fileExt) {
073                    addText(name, FileUtil.extractText(is, fileExt));
074            }
075    
076            public void addKeyword(String name, boolean value) {
077                    addKeyword(name, String.valueOf(value));
078            }
079    
080            public void addKeyword(String name, Boolean value) {
081                    addKeyword(name, String.valueOf(value));
082            }
083    
084            public void addKeyword(String name, boolean[] values) {
085                    if (values == null) {
086                            return;
087                    }
088    
089                    addKeyword(name, ArrayUtil.toStringArray(values));
090            }
091    
092            public void addKeyword(String name, Boolean[] values) {
093                    if (values == null) {
094                            return;
095                    }
096    
097                    addKeyword(name, ArrayUtil.toStringArray(values));
098            }
099    
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, float value) {
125                    addKeyword(name, String.valueOf(value));
126            }
127    
128            public void addKeyword(String name, Float value) {
129                    addKeyword(name, String.valueOf(value));
130            }
131    
132            public void addKeyword(String name, float[] values) {
133                    if (values == null) {
134                            return;
135                    }
136    
137                    addKeyword(name, ArrayUtil.toStringArray(values));
138            }
139    
140            public void addKeyword(String name, Float[] values) {
141                    if (values == null) {
142                            return;
143                    }
144    
145                    addKeyword(name, ArrayUtil.toStringArray(values));
146            }
147    
148            public void addKeyword(String name, int value) {
149                    addKeyword(name, String.valueOf(value));
150            }
151    
152            public void addKeyword(String name, int[] values) {
153                    if (values == null) {
154                            return;
155                    }
156    
157                    addKeyword(name, ArrayUtil.toStringArray(values));
158            }
159    
160            public void addKeyword(String name, Integer value) {
161                    addKeyword(name, String.valueOf(value));
162            }
163    
164            public void addKeyword(String name, Integer[] values) {
165                    if (values == null) {
166                            return;
167                    }
168    
169                    addKeyword(name, ArrayUtil.toStringArray(values));
170            }
171    
172            public void addKeyword(String name, long value) {
173                    addKeyword(name, String.valueOf(value));
174            }
175    
176            public void addKeyword(String name, Long value) {
177                    addKeyword(name, String.valueOf(value));
178            }
179    
180            public void addKeyword(String name, long[] values) {
181                    if (values == null) {
182                            return;
183                    }
184    
185                    addKeyword(name, ArrayUtil.toStringArray(values));
186            }
187    
188            public void addKeyword(String name, Long[] values) {
189                    if (values == null) {
190                            return;
191                    }
192    
193                    addKeyword(name, ArrayUtil.toStringArray(values));
194            }
195    
196            public void addKeyword(String name, short value) {
197                    addKeyword(name, String.valueOf(value));
198            }
199    
200            public void addKeyword(String name, Short value) {
201                    addKeyword(name, String.valueOf(value));
202            }
203    
204            public void addKeyword(String name, short[] values) {
205                    if (values == null) {
206                            return;
207                    }
208    
209                    addKeyword(name, ArrayUtil.toStringArray(values));
210            }
211    
212            public void addKeyword(String name, Short[] values) {
213                    if (values == null) {
214                            return;
215                    }
216    
217                    addKeyword(name, ArrayUtil.toStringArray(values));
218            }
219    
220            public void addKeyword(String name, String value) {
221                    addKeyword(name, value, false);
222            }
223    
224            public void addKeyword(String name, String value, boolean lowerCase) {
225                    if (lowerCase && Validator.isNotNull(value)) {
226                            value = value.toLowerCase();
227                    }
228    
229                    _fields.put(name, new Field(name, value, false));
230            }
231    
232            public void addKeyword(String name, String[] values) {
233                    if (values == null) {
234                            return;
235                    }
236    
237                    _fields.put(name, new Field(name, values, false));
238            }
239    
240            public void addModifiedDate() {
241                    addModifiedDate(new Date());
242            }
243    
244            public void addModifiedDate(Date modifiedDate) {
245                    addDate(Field.MODIFIED, modifiedDate);
246            }
247    
248            public void addText(String name, String value) {
249                    if (Validator.isNotNull(value)) {
250                            _fields.put(name, new Field(name, value, true));
251                    }
252            }
253    
254            public void addUID(String portletId, long field1) {
255                    addUID(portletId, String.valueOf(field1));
256            }
257    
258            public void addUID(
259                    String portletId, long field1, String field2) {
260    
261                    addUID(portletId, String.valueOf(field1), field2);
262            }
263    
264            public void addUID(String portletId, Long field1) {
265                    addUID(portletId, field1.longValue());
266            }
267    
268            public void addUID(
269                    String portletId, Long field1, String field2) {
270    
271                    addUID(portletId, field1.longValue(), field2);
272            }
273    
274            public void addUID(String portletId, String field1) {
275                    addUID(portletId, field1, null);
276            }
277    
278            public void addUID(
279                    String portletId, String field1, String field2) {
280    
281                    addUID(portletId, field1, field2, null);
282            }
283    
284            public void addUID(
285                    String portletId, String field1, String field2, String field3) {
286    
287                    addUID(portletId, field1, field2, field3, null);
288            }
289    
290            public void addUID(
291                    String portletId, String field1, String field2, String field3,
292                    String field4) {
293    
294                    String uid = portletId + _UID_PORTLET + field1;
295    
296                    if (field2 != null) {
297                            uid += _UID_FIELD + field2;
298                    }
299    
300                    if (field3 != null) {
301                            uid += _UID_FIELD + field3;
302                    }
303    
304                    if (field4 != null) {
305                            uid += _UID_FIELD + field4;
306                    }
307    
308                    addKeyword(Field.UID, uid);
309            }
310    
311            public String get(String name) {
312                    Field field = _fields.get(name);
313    
314                    if (field == null) {
315                            return StringPool.BLANK;
316                    }
317    
318                    return field.getValue();
319            }
320    
321            public Date getDate(String name) throws ParseException {
322                    DateFormat dateFormat = DateFormatFactoryUtil.getSimpleDateFormat(
323                            _DATE_FORMAT_PATTERN);
324    
325                    return dateFormat.parse(get(name));
326            }
327    
328            public Map<String, Field> getFields() {
329                    return _fields;
330            }
331    
332            public String getUID() {
333                    Field field = _fields.get(Field.UID);
334    
335                    if (field == null) {
336                            throw new RuntimeException("UID is not set");
337                    }
338    
339                    return field.getValue();
340            }
341    
342            public String[] getValues(String name) {
343                    Field field = _fields.get(name);
344    
345                    if (field == null) {
346                            return new String[] {StringPool.BLANK};
347                    }
348    
349                    return field.getValues();
350            }
351    
352            public void setFields(Map<String, Field> fields) {
353                    _fields = fields;
354            }
355    
356            public String toString() {
357                    StringBundler sb = new StringBundler();
358    
359                    sb.append(StringPool.OPEN_CURLY_BRACE);
360    
361                    boolean firstField = true;
362    
363                    for (Field field : _fields.values()) {
364                            if (!firstField) {
365                                    sb.append(StringPool.COMMA);
366                                    sb.append(StringPool.SPACE);
367                            }
368                            else {
369                                    firstField = false;
370                            }
371    
372                            sb.append(field.getName());
373                            sb.append(StringPool.EQUAL);
374                            sb.append(Arrays.toString(field.getValues()));
375                    }
376    
377                    sb.append(StringPool.CLOSE_CURLY_BRACE);
378    
379                    return sb.toString();
380            }
381    
382            private static final String _DATE_FORMAT_PATTERN = "yyyyMMddHHmmss";
383    
384            private static final String _UID_FIELD = "_FIELD_";
385    
386            private static final String _UID_PORTLET = "_PORTLET_";
387    
388            private Format _dateFormat = FastDateFormatFactoryUtil.getSimpleDateFormat(
389                    _DATE_FORMAT_PATTERN);
390    
391            private Map<String, Field> _fields = new HashMap<String, Field>();
392    
393    }