package org.activityinfo.model.type.enumerated; import com.google.common.collect.Lists; import org.activityinfo.model.form.FormClass; import org.activityinfo.model.resource.Record; import org.activityinfo.model.resource.ResourceIdPrefixType; import org.activityinfo.model.type.*; import java.util.ArrayList; import java.util.List; public class EnumType implements ParametrizedFieldType { public interface EnumTypeClass extends ParametrizedFieldTypeClass, RecordFieldTypeClass { } public static final EnumTypeClass TYPE_CLASS = new EnumTypeClass() { @Override public String getId() { return "enumerated"; } @Override public FieldType deserializeType(Record typeParameters) { Cardinality cardinality = Cardinality.valueOf(typeParameters.getString("cardinality")); List<EnumItem> enumItems = Lists.newArrayList(); List<Record> enumValueRecords = typeParameters.getRecordList("values"); for(Record record : enumValueRecords) { enumItems.add(EnumItem.fromRecord(record)); } return new EnumType(cardinality, enumItems); } @Override public EnumType createType() { return new EnumType(); } @Override public FormClass getParameterFormClass() { return new FormClass(ResourceIdPrefixType.TYPE.id("enum")); } @Override public EnumValue deserialize(Record record) { return EnumValue.fromRecord(record); } }; private final Cardinality cardinality; private final List<EnumItem> values; private final List<EnumItem> defaultValues = Lists.newArrayList(); public EnumType() { this.cardinality = Cardinality.SINGLE; this.values = Lists.newArrayList(); } public EnumType(Cardinality cardinality, List<EnumItem> values) { this.cardinality = cardinality; this.values = values != null ? values : new ArrayList<EnumItem>(); } public Cardinality getCardinality() { return cardinality; } public List<EnumItem> getValues() { return values; } public List<EnumItem> getDefaultValues() { return defaultValues; } @Override public ParametrizedFieldTypeClass getTypeClass() { return TYPE_CLASS; } @Override public Record getParameters() { List<Record> enumValueRecords = Lists.newArrayList(); for(EnumItem enumItem : getValues()) { enumValueRecords.add(enumItem.asRecord()); } return new Record() .set("classId", getTypeClass().getParameterFormClass().getId()) .set("cardinality", cardinality.name()) .set("values", enumValueRecords); } @Override public boolean isValid() { return values.size() > 0; } }