package org.ovirt.engine.core.searchbackend.gluster;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType;
import org.ovirt.engine.core.common.businessentities.gluster.TransportType;
import org.ovirt.engine.core.searchbackend.BaseConditionFieldAutoCompleter;
import org.ovirt.engine.core.searchbackend.EnumNameAutoCompleter;
import org.ovirt.engine.core.searchbackend.IAutoCompleter;
import org.ovirt.engine.core.searchbackend.IConditionValueAutoCompleter;
import org.ovirt.engine.core.searchbackend.NumericConditionRelationAutoCompleter;
import org.ovirt.engine.core.searchbackend.StringConditionRelationAutoCompleter;
/**
* Auto completer for conditions on Gluster Volumes. Volumes can be filtered on following fields:<br>
* [field] - [type] - [column name in {@code gluster_volumes} table]<br>
* <li>name - {@link String} - vol_type<br>
* <li>type - {@link GlusterVolumeType} - vol_type<br>
* <li>transport_type - {@link TransportType} - transport_type<br>
* <li>replica_count - {@link Integer} - replica_count<br>
* <li>stripe_count - {@link Integer} - stripe_count<br>
* <li>status - {@link GlusterStatus} - status<br>
*/
public class GlusterVolumeConditionFieldAutoCompleter extends BaseConditionFieldAutoCompleter {
public static final GlusterVolumeConditionFieldAutoCompleter INSTANCE = new GlusterVolumeConditionFieldAutoCompleter();
public enum FIELDS {
NAME,
TYPE,
TRANSPORT_TYPE,
REPLICA_COUNT,
STRIPE_COUNT,
STATUS
};
private static List<AutoCompletionField> fields;
private static void populateAutoCompletionFields() {
fields = new ArrayList<>();
addField(FIELDS.NAME.toString(), String.class, "vol_name");
addField(FIELDS.TYPE.toString(), GlusterVolumeType.class, "vol_type");
addField(FIELDS.TRANSPORT_TYPE.toString(), TransportType.class, "transport_type");
addField(FIELDS.REPLICA_COUNT.toString(), Integer.class, "replica_count");
addField(FIELDS.STRIPE_COUNT.toString(), Integer.class, "stripe_count");
addField(FIELDS.STATUS.toString(), GlusterStatus.class, "status");
}
private GlusterVolumeConditionFieldAutoCompleter() {
super();
populateAutoCompletionFields();
buildDictionaries();
}
@Override
public IAutoCompleter getFieldRelationshipAutoCompleter(String fieldName) {
try {
switch (FIELDS.valueOf(fieldName.toUpperCase())) {
case NAME:
case TYPE:
case TRANSPORT_TYPE:
case STATUS:
return StringConditionRelationAutoCompleter.INSTANCE;
case REPLICA_COUNT:
case STRIPE_COUNT:
return NumericConditionRelationAutoCompleter.INSTANCE;
default:
return null;
}
} catch (Exception e) {
return null;
}
}
@Override
public IConditionValueAutoCompleter getFieldValueAutoCompleter(String fieldName) {
try {
switch (FIELDS.valueOf(fieldName.toUpperCase())) {
case TYPE:
return new EnumNameAutoCompleter(GlusterVolumeType.class);
case TRANSPORT_TYPE:
return new EnumNameAutoCompleter(TransportType.class);
case STATUS:
return new EnumNameAutoCompleter(GlusterStatus.class);
default:
return null;
}
} catch (Exception e) {
return null;
}
}
private static void addField(String fieldName, Class<?> fieldType, String columnName) {
fields.add(new AutoCompletionField(fieldName, fieldType, columnName));
}
private void buildDictionaries() {
// Build the field name auto completion dictionary
for (AutoCompletionField field : fields) {
verbs.add(field.fieldName);
}
buildCompletions();
// Build the field type dictionary
for (AutoCompletionField field : fields) {
getTypeDictionary().put(field.fieldName, field.fieldType);
}
// Build the column name dictionary
for (AutoCompletionField field : fields) {
columnNameDict.put(field.fieldName, field.columnName);
}
// Build the validation dictionary
buildBasicValidationTable();
}
private static final class AutoCompletionField {
protected final String fieldName;
protected final Class<?> fieldType;
protected final String columnName;
public AutoCompletionField(String fieldName, Class<?> fieldType, String columnName) {
this.fieldName = fieldName;
this.fieldType = fieldType;
this.columnName = columnName;
}
}
}