001
014
015 package com.liferay.portlet.expando.model.impl;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.util.GetterUtil;
020 import com.liferay.portal.kernel.util.LocaleUtil;
021 import com.liferay.portal.kernel.util.LocalizationUtil;
022 import com.liferay.portal.kernel.util.StringBundler;
023 import com.liferay.portal.kernel.util.StringPool;
024 import com.liferay.portal.kernel.util.StringUtil;
025 import com.liferay.portal.kernel.util.Validator;
026 import com.liferay.portlet.expando.ValueDataException;
027 import com.liferay.portlet.expando.model.ExpandoColumn;
028 import com.liferay.portlet.expando.model.ExpandoColumnConstants;
029 import com.liferay.portlet.expando.service.ExpandoColumnLocalServiceUtil;
030
031 import java.io.Serializable;
032
033 import java.util.ArrayList;
034 import java.util.Date;
035 import java.util.HashMap;
036 import java.util.List;
037 import java.util.Locale;
038 import java.util.Map;
039
040
045 public class ExpandoValueImpl extends ExpandoValueBaseImpl {
046
047 public ExpandoValueImpl() {
048 }
049
050 @Override
051 public List<Locale> getAvailableLocales()
052 throws PortalException, SystemException {
053
054 if (!isColumnLocalized()) {
055 return null;
056 }
057
058 List<Locale> locales = new ArrayList<Locale>();
059
060 for (String languageId :
061 LocalizationUtil.getAvailableLanguageIds(getData())) {
062
063 locales.add(LocaleUtil.fromLanguageId(languageId));
064 }
065
066 return locales;
067 }
068
069 @Override
070 public boolean getBoolean() throws PortalException, SystemException {
071 validate(ExpandoColumnConstants.BOOLEAN);
072
073 return GetterUtil.getBoolean(getData());
074 }
075
076 @Override
077 public boolean[] getBooleanArray() throws PortalException, SystemException {
078 validate(ExpandoColumnConstants.BOOLEAN_ARRAY);
079
080 return GetterUtil.getBooleanValues(StringUtil.split(getData()));
081 }
082
083 @Override
084 public ExpandoColumn getColumn() throws PortalException, SystemException {
085 if (_column != null) {
086 return _column;
087 }
088
089 long columnId = getColumnId();
090
091 if (columnId <= 0) {
092 return null;
093 }
094
095 return ExpandoColumnLocalServiceUtil.getColumn(columnId);
096 }
097
098 @Override
099 public Date getDate() throws PortalException, SystemException {
100 validate(ExpandoColumnConstants.DATE);
101
102 return new Date(GetterUtil.getLong(getData()));
103 }
104
105 @Override
106 public Date[] getDateArray() throws PortalException, SystemException {
107 validate(ExpandoColumnConstants.DATE_ARRAY);
108
109 String[] data = StringUtil.split(getData());
110
111 Date[] dateArray = new Date[data.length];
112
113 for (int i = 0; i < data.length; i++) {
114 dateArray[i] = new Date(GetterUtil.getLong(data[i]));
115 }
116
117 return dateArray;
118 }
119
120 @Override
121 public Locale getDefaultLocale() throws PortalException, SystemException {
122 if (!isColumnLocalized()) {
123 return null;
124 }
125
126 String defaultLanguageId = LocalizationUtil.getDefaultLanguageId(
127 getData());
128
129 return LocaleUtil.fromLanguageId(defaultLanguageId);
130 }
131
132 @Override
133 public double getDouble() throws PortalException, SystemException {
134 validate(ExpandoColumnConstants.DOUBLE);
135
136 return GetterUtil.getDouble(getData());
137 }
138
139 @Override
140 public double[] getDoubleArray() throws PortalException, SystemException {
141 validate(ExpandoColumnConstants.DOUBLE_ARRAY);
142
143 return GetterUtil.getDoubleValues(StringUtil.split(getData()));
144 }
145
146 @Override
147 public float getFloat() throws PortalException, SystemException {
148 validate(ExpandoColumnConstants.FLOAT);
149
150 return GetterUtil.getFloat(getData());
151 }
152
153 @Override
154 public float[] getFloatArray() throws PortalException, SystemException {
155 validate(ExpandoColumnConstants.FLOAT_ARRAY);
156
157 return GetterUtil.getFloatValues(StringUtil.split(getData()));
158 }
159
160 @Override
161 public int getInteger() throws PortalException, SystemException {
162 validate(ExpandoColumnConstants.INTEGER);
163
164 return GetterUtil.getInteger(getData());
165 }
166
167 @Override
168 public int[] getIntegerArray() throws PortalException, SystemException {
169 validate(ExpandoColumnConstants.INTEGER_ARRAY);
170
171 return GetterUtil.getIntegerValues(StringUtil.split(getData()));
172 }
173
174 @Override
175 public long getLong() throws PortalException, SystemException {
176 validate(ExpandoColumnConstants.LONG);
177
178 return GetterUtil.getLong(getData());
179 }
180
181 @Override
182 public long[] getLongArray() throws PortalException, SystemException {
183 validate(ExpandoColumnConstants.LONG_ARRAY);
184
185 return GetterUtil.getLongValues(StringUtil.split(getData()));
186 }
187
188 @Override
189 public Number getNumber() throws PortalException, SystemException {
190 validate(ExpandoColumnConstants.NUMBER);
191
192 return GetterUtil.getNumber(getData());
193 }
194
195 @Override
196 public Number[] getNumberArray() throws PortalException, SystemException {
197 validate(ExpandoColumnConstants.NUMBER_ARRAY);
198
199 return GetterUtil.getNumberValues(StringUtil.split(getData()));
200 }
201
202 @Override
203 public Serializable getSerializable()
204 throws PortalException, SystemException {
205
206 ExpandoColumn column = getColumn();
207
208 int type = column.getType();
209
210 if (type == ExpandoColumnConstants.BOOLEAN) {
211 return getBoolean();
212 }
213 else if (type == ExpandoColumnConstants.BOOLEAN_ARRAY) {
214 return getBooleanArray();
215 }
216 else if (type == ExpandoColumnConstants.DATE) {
217 return getDate();
218 }
219 else if (type == ExpandoColumnConstants.DATE_ARRAY) {
220 return getDateArray();
221 }
222 else if (type == ExpandoColumnConstants.DOUBLE) {
223 return getDouble();
224 }
225 else if (type == ExpandoColumnConstants.DOUBLE_ARRAY) {
226 return getDoubleArray();
227 }
228 else if (type == ExpandoColumnConstants.FLOAT) {
229 return getFloat();
230 }
231 else if (type == ExpandoColumnConstants.FLOAT_ARRAY) {
232 return getFloatArray();
233 }
234 else if (type == ExpandoColumnConstants.INTEGER) {
235 return getInteger();
236 }
237 else if (type == ExpandoColumnConstants.INTEGER_ARRAY) {
238 return getIntegerArray();
239 }
240 else if (type == ExpandoColumnConstants.LONG) {
241 return getLong();
242 }
243 else if (type == ExpandoColumnConstants.LONG_ARRAY) {
244 return getLongArray();
245 }
246 else if (type == ExpandoColumnConstants.NUMBER) {
247 return getNumber();
248 }
249 else if (type == ExpandoColumnConstants.NUMBER_ARRAY) {
250 return getNumberArray();
251 }
252 else if (type == ExpandoColumnConstants.SHORT) {
253 return getShort();
254 }
255 else if (type == ExpandoColumnConstants.SHORT_ARRAY) {
256 return getShortArray();
257 }
258 else if (type == ExpandoColumnConstants.STRING_ARRAY) {
259 return getStringArray();
260 }
261 else if (type == ExpandoColumnConstants.STRING_ARRAY_LOCALIZED) {
262 return (Serializable)getStringArrayMap();
263 }
264 else if (type == ExpandoColumnConstants.STRING_LOCALIZED) {
265 return (Serializable)getStringMap();
266 }
267 else {
268 return getData();
269 }
270 }
271
272 @Override
273 public short getShort() throws PortalException, SystemException {
274 validate(ExpandoColumnConstants.SHORT);
275
276 return GetterUtil.getShort(getData());
277 }
278
279 @Override
280 public short[] getShortArray() throws PortalException, SystemException {
281 validate(ExpandoColumnConstants.SHORT_ARRAY);
282
283 return GetterUtil.getShortValues(StringUtil.split(getData()));
284 }
285
286 @Override
287 public String getString() throws PortalException, SystemException {
288 validate(ExpandoColumnConstants.STRING);
289
290 return getData();
291 }
292
293 @Override
294 public String getString(Locale locale)
295 throws PortalException, SystemException {
296
297 validate(ExpandoColumnConstants.STRING_LOCALIZED);
298
299 String languageId = LocaleUtil.toLanguageId(locale);
300
301 return getData(languageId);
302 }
303
304 @Override
305 public String[] getStringArray() throws PortalException, SystemException {
306 validate(ExpandoColumnConstants.STRING_ARRAY);
307
308 return split(getData());
309 }
310
311 @Override
312 public String[] getStringArray(Locale locale)
313 throws PortalException, SystemException {
314
315 validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
316
317 String languageId = LocaleUtil.toLanguageId(locale);
318
319 return split(getData(languageId));
320 }
321
322 @Override
323 public Map<Locale, String[]> getStringArrayMap()
324 throws PortalException, SystemException {
325
326 validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
327
328 Map<Locale, String> stringMap = LocalizationUtil.getLocalizationMap(
329 getData());
330
331 Map<Locale, String[]> stringArrayMap = new HashMap<Locale, String[]>(
332 stringMap.size());
333
334 for (Map.Entry<Locale, String> entry : stringMap.entrySet()) {
335 stringArrayMap.put(entry.getKey(), split(entry.getValue()));
336 }
337
338 return stringArrayMap;
339 }
340
341 @Override
342 public Map<Locale, String> getStringMap()
343 throws PortalException, SystemException {
344
345 validate(ExpandoColumnConstants.STRING_LOCALIZED);
346
347 return LocalizationUtil.getLocalizationMap(getData());
348 }
349
350 @Override
351 public void setBoolean(boolean data)
352 throws PortalException, SystemException {
353
354 validate(ExpandoColumnConstants.BOOLEAN);
355
356 setData(String.valueOf(data));
357 }
358
359 @Override
360 public void setBooleanArray(boolean[] data)
361 throws PortalException, SystemException {
362
363 validate(ExpandoColumnConstants.BOOLEAN_ARRAY);
364
365 setData(StringUtil.merge(data));
366 }
367
368 @Override
369 public void setColumn(ExpandoColumn column) {
370 _column = column;
371
372 setColumnId(_column.getColumnId());
373 }
374
375 @Override
376 public void setDate(Date data) throws PortalException, SystemException {
377 validate(ExpandoColumnConstants.DATE);
378
379 setData(String.valueOf(data.getTime()));
380 }
381
382 @Override
383 public void setDateArray(Date[] data)
384 throws PortalException, SystemException {
385
386 validate(ExpandoColumnConstants.DATE_ARRAY);
387
388 if (data.length > 0) {
389 StringBundler sb = new StringBundler(data.length * 2);
390
391 for (Date date : data) {
392 sb.append(date.getTime());
393 sb.append(StringPool.COMMA);
394 }
395
396 sb.setIndex(sb.index() - 1);
397
398 setData(sb.toString());
399 }
400 else {
401 setData(StringPool.BLANK);
402 }
403 }
404
405 @Override
406 public void setDouble(double data) throws PortalException, SystemException {
407 validate(ExpandoColumnConstants.DOUBLE);
408
409 setData(String.valueOf(data));
410 }
411
412 @Override
413 public void setDoubleArray(double[] data)
414 throws PortalException, SystemException {
415
416 validate(ExpandoColumnConstants.DOUBLE_ARRAY);
417
418 setData(StringUtil.merge(data));
419 }
420
421 @Override
422 public void setFloat(float data) throws PortalException, SystemException {
423 validate(ExpandoColumnConstants.FLOAT);
424
425 setData(String.valueOf(data));
426 }
427
428 @Override
429 public void setFloatArray(float[] data)
430 throws PortalException, SystemException {
431
432 validate(ExpandoColumnConstants.FLOAT_ARRAY);
433
434 setData(StringUtil.merge(data));
435 }
436
437 @Override
438 public void setInteger(int data) throws PortalException, SystemException {
439 validate(ExpandoColumnConstants.INTEGER);
440
441 setData(String.valueOf(data));
442 }
443
444 @Override
445 public void setIntegerArray(int[] data)
446 throws PortalException, SystemException {
447
448 validate(ExpandoColumnConstants.INTEGER_ARRAY);
449
450 setData(StringUtil.merge(data));
451 }
452
453 @Override
454 public void setLong(long data) throws PortalException, SystemException {
455 validate(ExpandoColumnConstants.LONG);
456
457 setData(String.valueOf(data));
458 }
459
460 @Override
461 public void setLongArray(long[] data)
462 throws PortalException, SystemException {
463
464 validate(ExpandoColumnConstants.LONG_ARRAY);
465
466 setData(StringUtil.merge(data));
467 }
468
469 @Override
470 public void setNumber(Number data) throws PortalException, SystemException {
471 validate(ExpandoColumnConstants.NUMBER);
472
473 setData(String.valueOf(data));
474 }
475
476 @Override
477 public void setNumberArray(Number[] data)
478 throws PortalException, SystemException {
479
480 validate(ExpandoColumnConstants.NUMBER_ARRAY);
481
482 setData(StringUtil.merge(data));
483 }
484
485 @Override
486 public void setShort(short data) throws PortalException, SystemException {
487 validate(ExpandoColumnConstants.SHORT);
488
489 setData(String.valueOf(data));
490 }
491
492 @Override
493 public void setShortArray(short[] data)
494 throws PortalException, SystemException {
495
496 validate(ExpandoColumnConstants.SHORT_ARRAY);
497
498 setData(StringUtil.merge(data));
499 }
500
501 @Override
502 public void setString(String data) throws PortalException, SystemException {
503 validate(ExpandoColumnConstants.STRING);
504
505 setData(data);
506 }
507
508 @Override
509 public void setString(String data, Locale locale, Locale defaultLocale)
510 throws PortalException, SystemException {
511
512 validate(ExpandoColumnConstants.STRING_LOCALIZED);
513
514 doSetString(data, locale, defaultLocale);
515 }
516
517 @Override
518 public void setStringArray(String[] data)
519 throws PortalException, SystemException {
520
521 validate(ExpandoColumnConstants.STRING_ARRAY);
522
523 setData(merge(data));
524 }
525
526 @Override
527 public void setStringArray(
528 String[] data, Locale locale, Locale defaultLocale)
529 throws PortalException, SystemException {
530
531 validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
532
533 doSetString(merge(data), locale, defaultLocale);
534 }
535
536 @Override
537 public void setStringArrayMap(
538 Map<Locale, String[]> dataMap, Locale defaultLocale)
539 throws PortalException, SystemException {
540
541 validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
542
543 Map<Locale, String> stringMap = new HashMap<Locale, String>();
544
545 for (Map.Entry<Locale, String[]> entry : dataMap.entrySet()) {
546 stringMap.put(entry.getKey(), merge(entry.getValue()));
547 }
548
549 doSetStringMap(stringMap, defaultLocale);
550 }
551
552 @Override
553 public void setStringMap(Map<Locale, String> dataMap, Locale defaultLocale)
554 throws PortalException, SystemException {
555
556 validate(ExpandoColumnConstants.STRING_LOCALIZED);
557
558 doSetStringMap(dataMap, defaultLocale);
559 }
560
561 protected void doSetString(
562 String data, Locale locale, Locale defaultLocale) {
563
564 String languageId = LocaleUtil.toLanguageId(locale);
565 String defaultLanguageId = LocaleUtil.toLanguageId(defaultLocale);
566
567 if (Validator.isNotNull(data)) {
568 data = LocalizationUtil.updateLocalization(
569 getData(), "Data", data, languageId, defaultLanguageId);
570 }
571 else {
572 data = LocalizationUtil.removeLocalization(
573 getData(), "Data", languageId);
574 }
575
576 setData(data);
577 }
578
579 protected void doSetStringMap(
580 Map<Locale, String> dataMap, Locale defaultLocale) {
581
582 if (dataMap == null) {
583 return;
584 }
585
586 String data = LocalizationUtil.updateLocalization(
587 dataMap, getData(), "Data", LocaleUtil.toLanguageId(defaultLocale));
588
589 setData(data);
590 }
591
592 protected String getData(String languageId) {
593 return LocalizationUtil.getLocalization(getData(), languageId);
594 }
595
596 protected boolean isColumnLocalized()
597 throws PortalException, SystemException {
598
599 ExpandoColumn column = getColumn();
600
601 if (column == null) {
602 return false;
603 }
604
605 if ((column.getType() ==
606 ExpandoColumnConstants.STRING_ARRAY_LOCALIZED) ||
607 (column.getType() == ExpandoColumnConstants.STRING_LOCALIZED)) {
608
609 return true;
610 }
611
612 return false;
613 }
614
615 protected String merge(String[] data) {
616 if (data != null) {
617 for (int i = 0; i < data.length; i++) {
618 data[i] = StringUtil.replace(
619 data[i], StringPool.COMMA, _EXPANDO_COMMA);
620 }
621 }
622
623 return StringUtil.merge(data);
624 }
625
626 protected String[] split(String data) {
627 String[] dataArray = StringUtil.split(data);
628
629 for (int i = 0; i < dataArray.length; i++) {
630 dataArray[i] = StringUtil.replace(
631 dataArray[i], _EXPANDO_COMMA, StringPool.COMMA);
632 }
633
634 return dataArray;
635 }
636
637 protected void validate(int type) throws PortalException, SystemException {
638 ExpandoColumn column = getColumn();
639
640 if (column == null) {
641 return;
642 }
643
644 if (column.getType() == type) {
645 return;
646 }
647
648 StringBundler sb = new StringBundler(6);
649
650 sb.append("Column ");
651 sb.append(getColumnId());
652 sb.append(" has type ");
653 sb.append(ExpandoColumnConstants.getTypeLabel(column.getType()));
654 sb.append(" and is not compatible with type ");
655 sb.append(ExpandoColumnConstants.getTypeLabel(type));
656
657 throw new ValueDataException(sb.toString());
658 }
659
660 private static final String _EXPANDO_COMMA = "[$LIFERAY_EXPANDO_COMMA$]";
661
662 private transient ExpandoColumn _column;
663
664 }