/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portlet.expando.model.impl;
import com.liferay.expando.kernel.exception.ValueDataException;
import com.liferay.expando.kernel.model.ExpandoColumn;
import com.liferay.expando.kernel.model.ExpandoColumnConstants;
import com.liferay.expando.kernel.service.ExpandoColumnLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.LocalizationUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* @author Raymond Augé
* @author Brian Wing Shun Chan
* @author Marcellus Tavares
*/
public class ExpandoValueImpl extends ExpandoValueBaseImpl {
@Override
public List<Locale> getAvailableLocales() throws PortalException {
if (!isColumnLocalized()) {
return null;
}
List<Locale> locales = new ArrayList<>();
for (String languageId :
LocalizationUtil.getAvailableLanguageIds(getData())) {
locales.add(LocaleUtil.fromLanguageId(languageId));
}
return locales;
}
@Override
public boolean getBoolean() throws PortalException {
validate(ExpandoColumnConstants.BOOLEAN);
return GetterUtil.getBoolean(getData());
}
@Override
public boolean[] getBooleanArray() throws PortalException {
validate(ExpandoColumnConstants.BOOLEAN_ARRAY);
return GetterUtil.getBooleanValues(StringUtil.split(getData()));
}
@Override
public ExpandoColumn getColumn() throws PortalException {
if (_column != null) {
return _column;
}
long columnId = getColumnId();
if (columnId <= 0) {
return null;
}
return ExpandoColumnLocalServiceUtil.getColumn(columnId);
}
@Override
public Date getDate() throws PortalException {
validate(ExpandoColumnConstants.DATE);
return new Date(GetterUtil.getLong(getData()));
}
@Override
public Date[] getDateArray() throws PortalException {
validate(ExpandoColumnConstants.DATE_ARRAY);
String[] data = StringUtil.split(getData());
Date[] dateArray = new Date[data.length];
for (int i = 0; i < data.length; i++) {
dateArray[i] = new Date(GetterUtil.getLong(data[i]));
}
return dateArray;
}
@Override
public Locale getDefaultLocale() throws PortalException {
if (!isColumnLocalized()) {
return null;
}
String defaultLanguageId = LocalizationUtil.getDefaultLanguageId(
getData());
return LocaleUtil.fromLanguageId(defaultLanguageId);
}
@Override
public double getDouble() throws PortalException {
validate(ExpandoColumnConstants.DOUBLE);
return GetterUtil.getDouble(getData());
}
@Override
public double[] getDoubleArray() throws PortalException {
validate(ExpandoColumnConstants.DOUBLE_ARRAY);
return GetterUtil.getDoubleValues(StringUtil.split(getData()));
}
@Override
public float getFloat() throws PortalException {
validate(ExpandoColumnConstants.FLOAT);
return GetterUtil.getFloat(getData());
}
@Override
public float[] getFloatArray() throws PortalException {
validate(ExpandoColumnConstants.FLOAT_ARRAY);
return GetterUtil.getFloatValues(StringUtil.split(getData()));
}
@Override
public JSONObject getGeolocationJSONObject() throws PortalException {
validate(ExpandoColumnConstants.GEOLOCATION);
return JSONFactoryUtil.createJSONObject(getData());
}
@Override
public int getInteger() throws PortalException {
validate(ExpandoColumnConstants.INTEGER);
return GetterUtil.getInteger(getData());
}
@Override
public int[] getIntegerArray() throws PortalException {
validate(ExpandoColumnConstants.INTEGER_ARRAY);
return GetterUtil.getIntegerValues(StringUtil.split(getData()));
}
@Override
public long getLong() throws PortalException {
validate(ExpandoColumnConstants.LONG);
return GetterUtil.getLong(getData());
}
@Override
public long[] getLongArray() throws PortalException {
validate(ExpandoColumnConstants.LONG_ARRAY);
return GetterUtil.getLongValues(StringUtil.split(getData()));
}
@Override
public Number getNumber() throws PortalException {
validate(ExpandoColumnConstants.NUMBER);
return GetterUtil.getNumber(getData());
}
@Override
public Number[] getNumberArray() throws PortalException {
validate(ExpandoColumnConstants.NUMBER_ARRAY);
return GetterUtil.getNumberValues(StringUtil.split(getData()));
}
@Override
public Serializable getSerializable() throws PortalException {
ExpandoColumn column = getColumn();
int type = column.getType();
if (type == ExpandoColumnConstants.BOOLEAN) {
return getBoolean();
}
else if (type == ExpandoColumnConstants.BOOLEAN_ARRAY) {
return getBooleanArray();
}
else if (type == ExpandoColumnConstants.DATE) {
return getDate();
}
else if (type == ExpandoColumnConstants.DATE_ARRAY) {
return getDateArray();
}
else if (type == ExpandoColumnConstants.DOUBLE) {
return getDouble();
}
else if (type == ExpandoColumnConstants.DOUBLE_ARRAY) {
return getDoubleArray();
}
else if (type == ExpandoColumnConstants.FLOAT) {
return getFloat();
}
else if (type == ExpandoColumnConstants.FLOAT_ARRAY) {
return getFloatArray();
}
else if (type == ExpandoColumnConstants.INTEGER) {
return getInteger();
}
else if (type == ExpandoColumnConstants.INTEGER_ARRAY) {
return getIntegerArray();
}
else if (type == ExpandoColumnConstants.LONG) {
return getLong();
}
else if (type == ExpandoColumnConstants.LONG_ARRAY) {
return getLongArray();
}
else if (type == ExpandoColumnConstants.NUMBER) {
return getNumber();
}
else if (type == ExpandoColumnConstants.NUMBER_ARRAY) {
return getNumberArray();
}
else if (type == ExpandoColumnConstants.SHORT) {
return getShort();
}
else if (type == ExpandoColumnConstants.SHORT_ARRAY) {
return getShortArray();
}
else if (type == ExpandoColumnConstants.STRING_ARRAY) {
return getStringArray();
}
else if (type == ExpandoColumnConstants.STRING_ARRAY_LOCALIZED) {
return (Serializable)getStringArrayMap();
}
else if (type == ExpandoColumnConstants.STRING_LOCALIZED) {
return (Serializable)getStringMap();
}
else {
return getData();
}
}
@Override
public short getShort() throws PortalException {
validate(ExpandoColumnConstants.SHORT);
return GetterUtil.getShort(getData());
}
@Override
public short[] getShortArray() throws PortalException {
validate(ExpandoColumnConstants.SHORT_ARRAY);
return GetterUtil.getShortValues(StringUtil.split(getData()));
}
@Override
public String getString() throws PortalException {
validate(ExpandoColumnConstants.STRING);
return getData();
}
@Override
public String getString(Locale locale) throws PortalException {
validate(ExpandoColumnConstants.STRING_LOCALIZED);
String languageId = LocaleUtil.toLanguageId(locale);
return getData(languageId);
}
@Override
public String[] getStringArray() throws PortalException {
validate(ExpandoColumnConstants.STRING_ARRAY);
return split(getData());
}
@Override
public String[] getStringArray(Locale locale) throws PortalException {
validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
String languageId = LocaleUtil.toLanguageId(locale);
return split(getData(languageId));
}
@Override
public Map<Locale, String[]> getStringArrayMap() throws PortalException {
validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
Map<Locale, String> stringMap = LocalizationUtil.getLocalizationMap(
getData());
Map<Locale, String[]> stringArrayMap = new HashMap<>(stringMap.size());
for (Map.Entry<Locale, String> entry : stringMap.entrySet()) {
stringArrayMap.put(entry.getKey(), split(entry.getValue()));
}
return stringArrayMap;
}
@Override
public Map<Locale, String> getStringMap() throws PortalException {
validate(ExpandoColumnConstants.STRING_LOCALIZED);
return LocalizationUtil.getLocalizationMap(getData());
}
@Override
public void setBoolean(boolean data) throws PortalException {
validate(ExpandoColumnConstants.BOOLEAN);
setData(String.valueOf(data));
}
@Override
public void setBooleanArray(boolean[] data) throws PortalException {
validate(ExpandoColumnConstants.BOOLEAN_ARRAY);
setData(StringUtil.merge(data));
}
@Override
public void setColumn(ExpandoColumn column) {
_column = column;
setColumnId(_column.getColumnId());
}
@Override
public void setDate(Date data) throws PortalException {
validate(ExpandoColumnConstants.DATE);
setData(String.valueOf(data.getTime()));
}
@Override
public void setDateArray(Date[] data) throws PortalException {
validate(ExpandoColumnConstants.DATE_ARRAY);
if (data.length > 0) {
StringBundler sb = new StringBundler(data.length * 2);
for (Date date : data) {
sb.append(date.getTime());
sb.append(StringPool.COMMA);
}
sb.setIndex(sb.index() - 1);
setData(sb.toString());
}
else {
setData(StringPool.BLANK);
}
}
@Override
public void setDouble(double data) throws PortalException {
validate(ExpandoColumnConstants.DOUBLE);
setData(String.valueOf(data));
}
@Override
public void setDoubleArray(double[] data) throws PortalException {
validate(ExpandoColumnConstants.DOUBLE_ARRAY);
setData(StringUtil.merge(data));
}
@Override
public void setFloat(float data) throws PortalException {
validate(ExpandoColumnConstants.FLOAT);
setData(String.valueOf(data));
}
@Override
public void setFloatArray(float[] data) throws PortalException {
validate(ExpandoColumnConstants.FLOAT_ARRAY);
setData(StringUtil.merge(data));
}
@Override
public void setGeolocationJSONObject(JSONObject data)
throws PortalException {
validate(ExpandoColumnConstants.GEOLOCATION);
setData(data.toJSONString());
}
@Override
public void setInteger(int data) throws PortalException {
validate(ExpandoColumnConstants.INTEGER);
setData(String.valueOf(data));
}
@Override
public void setIntegerArray(int[] data) throws PortalException {
validate(ExpandoColumnConstants.INTEGER_ARRAY);
setData(StringUtil.merge(data));
}
@Override
public void setLong(long data) throws PortalException {
validate(ExpandoColumnConstants.LONG);
setData(String.valueOf(data));
}
@Override
public void setLongArray(long[] data) throws PortalException {
validate(ExpandoColumnConstants.LONG_ARRAY);
setData(StringUtil.merge(data));
}
@Override
public void setNumber(Number data) throws PortalException {
validate(ExpandoColumnConstants.NUMBER);
setData(String.valueOf(data));
}
@Override
public void setNumberArray(Number[] data) throws PortalException {
validate(ExpandoColumnConstants.NUMBER_ARRAY);
setData(StringUtil.merge(data));
}
@Override
public void setShort(short data) throws PortalException {
validate(ExpandoColumnConstants.SHORT);
setData(String.valueOf(data));
}
@Override
public void setShortArray(short[] data) throws PortalException {
validate(ExpandoColumnConstants.SHORT_ARRAY);
setData(StringUtil.merge(data));
}
@Override
public void setString(String data) throws PortalException {
validate(ExpandoColumnConstants.STRING);
setData(data);
}
@Override
public void setString(String data, Locale locale, Locale defaultLocale)
throws PortalException {
validate(ExpandoColumnConstants.STRING_LOCALIZED);
doSetString(data, locale, defaultLocale);
}
@Override
public void setStringArray(String[] data) throws PortalException {
validate(ExpandoColumnConstants.STRING_ARRAY);
setData(merge(data));
}
@Override
public void setStringArray(
String[] data, Locale locale, Locale defaultLocale)
throws PortalException {
validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
doSetString(merge(data), locale, defaultLocale);
}
@Override
public void setStringArrayMap(
Map<Locale, String[]> dataMap, Locale defaultLocale)
throws PortalException {
validate(ExpandoColumnConstants.STRING_ARRAY_LOCALIZED);
Map<Locale, String> stringMap = new HashMap<>();
for (Map.Entry<Locale, String[]> entry : dataMap.entrySet()) {
stringMap.put(entry.getKey(), merge(entry.getValue()));
}
doSetStringMap(stringMap, defaultLocale);
}
@Override
public void setStringMap(Map<Locale, String> dataMap, Locale defaultLocale)
throws PortalException {
validate(ExpandoColumnConstants.STRING_LOCALIZED);
doSetStringMap(dataMap, defaultLocale);
}
protected void doSetString(
String data, Locale locale, Locale defaultLocale) {
String languageId = LocaleUtil.toLanguageId(locale);
String defaultLanguageId = LocaleUtil.toLanguageId(defaultLocale);
if (Validator.isNotNull(data)) {
data = LocalizationUtil.updateLocalization(
getData(), "Data", data, languageId, defaultLanguageId);
}
else {
data = LocalizationUtil.removeLocalization(
getData(), "Data", languageId);
}
setData(data);
}
protected void doSetStringMap(
Map<Locale, String> dataMap, Locale defaultLocale) {
if (dataMap == null) {
return;
}
String data = LocalizationUtil.updateLocalization(
dataMap, getData(), "Data", LocaleUtil.toLanguageId(defaultLocale));
setData(data);
}
protected String getData(String languageId) {
return LocalizationUtil.getLocalization(getData(), languageId);
}
protected boolean isColumnLocalized() throws PortalException {
ExpandoColumn column = getColumn();
if (column == null) {
return false;
}
if ((column.getType() ==
ExpandoColumnConstants.STRING_ARRAY_LOCALIZED) ||
(column.getType() == ExpandoColumnConstants.STRING_LOCALIZED)) {
return true;
}
return false;
}
protected String merge(String[] data) {
if (data != null) {
for (int i = 0; i < data.length; i++) {
data[i] = StringUtil.replace(
data[i], CharPool.COMMA, _EXPANDO_COMMA);
}
}
return StringUtil.merge(data);
}
protected String[] split(String data) {
String[] dataArray = StringUtil.split(data);
for (int i = 0; i < dataArray.length; i++) {
dataArray[i] = StringUtil.replace(
dataArray[i], _EXPANDO_COMMA, StringPool.COMMA);
}
return dataArray;
}
protected void validate(int type) throws PortalException {
ExpandoColumn column = getColumn();
if (column == null) {
return;
}
if (column.getType() == type) {
return;
}
StringBundler sb = new StringBundler(6);
sb.append("Column ");
sb.append(getColumnId());
sb.append(" has type ");
sb.append(ExpandoColumnConstants.getTypeLabel(column.getType()));
sb.append(" and is not compatible with type ");
sb.append(ExpandoColumnConstants.getTypeLabel(type));
throw new ValueDataException(sb.toString());
}
private static final String _EXPANDO_COMMA = "[$LIFERAY_EXPANDO_COMMA$]";
private transient ExpandoColumn _column;
}