secTypeDefs.add(typeCache.getTypeDefinition((String) secTypeId));
}
}
}
PropertiesImpl result = new PropertiesImpl();
for (Map.Entry<String, Object> entry : json.entrySet()) {
String id = entry.getKey();
PropertyDefinition<?> propDef = null;
if (typeDef != null) {
propDef = typeDef.getPropertyDefinitions().get(id);
}
if (propDef == null && secTypeDefs != null) {
for (TypeDefinition secTypeDef : secTypeDefs) {
if (secTypeDef != null && secTypeDef.getPropertyDefinitions() != null) {
propDef = secTypeDef.getPropertyDefinitions().get(id);
if (propDef != null) {
break;
}
}
}
}
if (propDef == null) {
propDef = typeCache.getTypeDefinition(BaseTypeId.CMIS_DOCUMENT.value()).getPropertyDefinitions()
.get(id);
}
if (propDef == null) {
propDef = typeCache.getTypeDefinition(BaseTypeId.CMIS_FOLDER.value()).getPropertyDefinitions().get(id);
}
if (propDef == null && typeDef != null) {
TypeDefinition reloadedTypeDef = typeCache.reloadTypeDefinition(typeDef.getId());
if (reloadedTypeDef != null) {
propDef = reloadedTypeDef.getPropertyDefinitions().get(id);
}
}
if (propDef == null && secTypeDefs != null) {
for (TypeDefinition secTypeDef : secTypeDefs) {
TypeDefinition reloadedTypeDef = typeCache.reloadTypeDefinition(secTypeDef.getId());
if (reloadedTypeDef != null && reloadedTypeDef.getPropertyDefinitions() != null) {
propDef = reloadedTypeDef.getPropertyDefinitions().get(id);
if (propDef != null) {
break;
}
}
}
}
List<Object> values = null;
if (entry.getValue() instanceof List) {
values = (List<Object>) entry.getValue();
} else if (entry.getValue() != null) {
values = Collections.singletonList(entry.getValue());
}
AbstractPropertyData<?> property = null;
if (propDef != null) {
switch (propDef.getPropertyType()) {
case STRING:
property = new PropertyStringImpl();
((PropertyStringImpl) property).setValues(copyStringValues(values));
break;
case ID:
property = new PropertyIdImpl();
((PropertyIdImpl) property).setValues(copyStringValues(values));
break;
case BOOLEAN:
property = new PropertyBooleanImpl();
((PropertyBooleanImpl) property).setValues(copyBooleanValues(values));
break;
case INTEGER:
property = new PropertyIntegerImpl();
((PropertyIntegerImpl) property).setValues(copyIntegerValues(values));
break;
case DECIMAL:
property = new PropertyDecimalImpl();
((PropertyDecimalImpl) property).setValues(copyDecimalValues(values));
break;
case DATETIME:
property = new PropertyDateTimeImpl();
((PropertyDateTimeImpl) property).setValues(copyDateTimeValues(values));
break;
case HTML:
property = new PropertyHtmlImpl();
((PropertyHtmlImpl) property).setValues(copyStringValues(values));
break;
case URI:
property = new PropertyUriImpl();
((PropertyUriImpl) property).setValues(copyStringValues(values));
break;
default:
throw new CmisRuntimeException("Unknown property type!");
}
property.setId(id);
property.setDisplayName(propDef.getDisplayName());
property.setQueryName(propDef.getQueryName());
property.setLocalName(propDef.getLocalName());
} else {
// this else block should only be reached in rare circumstances
// it may return incorrect types
if (values == null) {
property = new PropertyStringImpl();
((PropertyStringImpl) property).setValues(null);
} else {
Object firstValue = values.get(0);
if (firstValue instanceof Boolean) {
property = new PropertyBooleanImpl();
((PropertyBooleanImpl) property).setValues(copyBooleanValues(values));
} else if (firstValue instanceof BigInteger) {
property = new PropertyIntegerImpl();
((PropertyIntegerImpl) property).setValues(copyIntegerValues(values));
} else if (firstValue instanceof BigDecimal) {
property = new PropertyDecimalImpl();
((PropertyDecimalImpl) property).setValues(copyDecimalValues(values));
} else {
property = new PropertyStringImpl();
((PropertyStringImpl) property).setValues(copyStringValues(values));
}
}
property.setId(id);
property.setDisplayName(id);
property.setQueryName(null);
property.setLocalName(null);
}
result.addProperty(property);
}
if (extJson != null) {
convertExtension(extJson, result, Collections.<String> emptySet());
}