package com.constellio.app.api.cmis.builders.objectType;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.enums.Cardinality;
import org.apache.chemistry.opencmis.commons.enums.PropertyType;
import org.apache.chemistry.opencmis.commons.enums.Updatability;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractPropertyDefinition;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyBooleanDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDateTimeDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDecimalDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.entries.DataEntryType;
import com.constellio.model.services.schemas.SchemaUtils;
public class PropertyBuilderFactory {
public static PropertyBuilder newStringProperty(String id) {
PropertyStringDefinitionImpl property = new PropertyStringDefinitionImpl();
property.setPropertyType(PropertyType.STRING);
return new PropertyBuilder(property, id);
}
public static PropertyBuilder newBooleanProperty(String id) {
PropertyBooleanDefinitionImpl property = new PropertyBooleanDefinitionImpl();
property.setPropertyType(PropertyType.BOOLEAN);
return new PropertyBuilder(property, id);
}
public static PropertyBuilder newNumberProperty(String id) {
PropertyBooleanDefinitionImpl property = new PropertyBooleanDefinitionImpl();
property.setPropertyType(PropertyType.INTEGER);
return new PropertyBuilder(property, id);
}
public static PropertyBuilder newDateProperty(String id) {
PropertyDateTimeDefinitionImpl property = new PropertyDateTimeDefinitionImpl();
property.setPropertyType(PropertyType.DATETIME);
return new PropertyBuilder(property, id);
}
public static PropertyDefinition<?> getPropertyFor(Metadata metadata) {
String metadataCode = metadata.getCode();
String metadataLocalCode = new SchemaUtils().getLocalCodeFromMetadataCode(metadataCode);
String id = metadataLocalCode;
String displayName = metadataLocalCode;
PropertyType datatype;
if (metadata.getType() == MetadataValueType.DATE_TIME || metadata.getType() == MetadataValueType.DATE) {
datatype = PropertyType.DATETIME;
} else if (metadata.getType() == MetadataValueType.NUMBER) {
datatype = PropertyType.DECIMAL;
} else if (metadata.getType() == MetadataValueType.BOOLEAN) {
datatype = PropertyType.BOOLEAN;
} else {
datatype = PropertyType.STRING;
}
Cardinality cardinality = metadata.isMultivalue() ? Cardinality.MULTI : Cardinality.SINGLE;
Updatability updateability = (metadata.isUnmodifiable() || metadata.getDataEntry().getType() != DataEntryType.MANUAL) ?
Updatability.READONLY :
Updatability.READWRITE;
boolean inherited = metadata.inheritDefaultSchema();
boolean required = metadata.isDefaultRequirement();
PropertyDefinition<?> propertyDefinition = createPropertiesDefinition(id, displayName, datatype, cardinality,
updateability, inherited, required);
return propertyDefinition;
}
private static PropertyDefinition<?> createPropertiesDefinition(String id, String displayName, PropertyType datatype,
Cardinality cardinality, Updatability updateability, boolean inherited, boolean required) {
AbstractPropertyDefinition<?> propertyDefinition = null;
if (datatype == PropertyType.DATETIME) {
propertyDefinition = new PropertyDateTimeDefinitionImpl();
} else if (datatype == PropertyType.INTEGER) {
propertyDefinition = new PropertyIntegerDefinitionImpl();
} else if (datatype == PropertyType.DECIMAL) {
propertyDefinition = new PropertyDecimalDefinitionImpl();
} else if (datatype == PropertyType.BOOLEAN) {
propertyDefinition = new PropertyBooleanDefinitionImpl();
} else {
propertyDefinition = new PropertyStringDefinitionImpl();
}
propertyDefinition.setId(id);
propertyDefinition.setLocalName(id);
propertyDefinition.setDisplayName(displayName);
propertyDefinition.setLocalName(displayName);
propertyDefinition.setDescription(displayName);
propertyDefinition.setPropertyType(datatype);
propertyDefinition.setCardinality(cardinality);
propertyDefinition.setUpdatability(updateability);
propertyDefinition.setIsInherited(inherited);
propertyDefinition.setIsRequired(required);
propertyDefinition.setIsQueryable(false);
propertyDefinition.setIsOrderable(false);
propertyDefinition.setQueryName(id);
return propertyDefinition;
}
}