public static Properties convertProperties(Map<String, Object> json) {
if (json == null) {
return null;
}
PropertiesImpl result = new PropertiesImpl();
for (Object jsonProperty : json.values()) {
Map<String, Object> jsonPropertyMap = getMap(jsonProperty);
if (jsonPropertyMap != null) {
AbstractPropertyData<?> property = null;
String id = getString(jsonPropertyMap, JSON_PROPERTY_ID);
if (id == null) {
throw new CmisRuntimeException("Invalid property!");
}
PropertyType propertyType = null;
try {
propertyType = PropertyType.fromValue(getString(jsonPropertyMap, JSON_PROPERTY_DATATYPE));
} catch (Exception e) {
throw new CmisRuntimeException("Invalid property: " + id);
}
Object value = jsonPropertyMap.get(JSON_PROPERTY_VALUE);
List<Object> values = null;
if (value instanceof List) {
values = (List<Object>) value;
} else if (value != null) {
values = Collections.singletonList(value);
}
switch (propertyType) {
case STRING:
property = new PropertyStringImpl();
{
List<String> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<String>();
for (Object obj : values) {
if (obj instanceof String) {
propertyValues.add(obj.toString());
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyStringImpl) property).setValues(propertyValues);
}
break;
case ID:
property = new PropertyIdImpl();
{
List<String> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<String>();
for (Object obj : values) {
if (obj instanceof String) {
propertyValues.add(obj.toString());
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyIdImpl) property).setValues(propertyValues);
}
break;
case BOOLEAN:
property = new PropertyBooleanImpl();
{
List<Boolean> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<Boolean>();
for (Object obj : values) {
if (obj instanceof Boolean) {
propertyValues.add((Boolean) obj);
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyBooleanImpl) property).setValues(propertyValues);
}
break;
case INTEGER:
property = new PropertyIntegerImpl();
{
List<BigInteger> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<BigInteger>();
for (Object obj : values) {
if (obj instanceof BigInteger) {
propertyValues.add((BigInteger) obj);
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyIntegerImpl) property).setValues(propertyValues);
}
break;
case DECIMAL:
property = new PropertyDecimalImpl();
{
List<BigDecimal> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<BigDecimal>();
for (Object obj : values) {
if (obj instanceof BigDecimal) {
propertyValues.add((BigDecimal) obj);
} else if (obj instanceof BigInteger) {
propertyValues.add(new BigDecimal((BigInteger) obj));
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyDecimalImpl) property).setValues(propertyValues);
}
break;
case DATETIME:
property = new PropertyDateTimeImpl();
{
List<GregorianCalendar> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<GregorianCalendar>();
for (Object obj : values) {
if (obj instanceof Number) {
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTimeInMillis(((Number) obj).longValue());
propertyValues.add(cal);
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyDateTimeImpl) property).setValues(propertyValues);
}
break;
case HTML:
property = new PropertyHtmlImpl();
{
List<String> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<String>();
for (Object obj : values) {
if (obj instanceof String) {
propertyValues.add(obj.toString());
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyHtmlImpl) property).setValues(propertyValues);
}
break;
case URI:
property = new PropertyUriImpl();
{
List<String> propertyValues = null;
if (values != null) {
propertyValues = new ArrayList<String>();
for (Object obj : values) {
if (obj instanceof String) {
propertyValues.add(obj.toString());
} else {
throw new CmisRuntimeException("Invalid property value: " + obj);
}
}
}
((PropertyUriImpl) property).setValues(propertyValues);
}
break;
}
property.setId(id);
property.setDisplayName(getString(jsonPropertyMap, JSON_PROPERTY_DISPLAYNAME));
property.setQueryName(getString(jsonPropertyMap, JSON_PROPERTY_QUERYNAME));
property.setLocalName(getString(jsonPropertyMap, JSON_PROPERTY_LOCALNAME));
convertExtension(jsonPropertyMap, property, PROPERTY_KEYS);
result.addProperty(property);
}
}
// TODO: properties extensions