package org.ovirt.engine.core.searchbackend;
import java.util.Collections;
import java.util.Date;
import java.util.UUID;
import org.ovirt.engine.core.common.businessentities.ArchitectureType;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmType;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.utils.SimpleDependencyInjector;
import org.ovirt.engine.core.compat.StringFormat;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.core.compat.TimeSpan;
public class VmConditionFieldAutoCompleter extends BaseConditionFieldAutoCompleter {
public static final String NAME = "NAME";
public static final String COMMENT = "COMMENT";
public static final String STATUS = "STATUS";
public static final String HOST = "HOST";
public static final String IP = "IP";
public static final String FQDN = "FQDN";
public static final String UPTIME = "UPTIME";
public static final String OS = "OS";
public static final String CREATIONDATE = "CREATIONDATE";
public static final String ADDRESS = "ADDRESS";
public static final String CPU_USAGE = "CPU_USAGE";
public static final String MEM_USAGE = "MEM_USAGE";
public static final String NETWORK_USAGE = "NETWORK_USAGE";
public static final String MIGRATION_PROGRESS_PERCENT = "MIGRATION_PROGRESS_PERCENT";
public static final String MEMORY = "MEMORY";
public static final String APPS = "APPS";
public static final String CLUSTER = "CLUSTER";
public static final String POOL = "POOL";
public static final String LOGGEDINUSER = "LOGGEDINUSER";
public static final String TAG = "TAG";
public static final String DATACENTER = "DATACENTER";
public static final String TYPE = "TYPE";
public static final String QUOTA = "QUOTA";
public static final String ID = "ID";
public static final String DESCRIPTION = "DESCRIPTION";
public static final String ARCHITECTURE = "ARCHITECTURE";
public static final String CUSTOM_EMULATED_MACHINE = "CUSTOM_EMULATED_MACHINE";
public static final String CUSTOM_CPU_TYPE = "CUSTOM_CPU_TYPE";
public static final String COMPATIBILITY_LEVEL = "COMPATIBILITY_LEVEL";
public static final String CREATED_BY_USER_ID = "CREATED_BY_USER_ID";
private static final int MILISECOND = 1000;
public VmConditionFieldAutoCompleter() {
// Building the basic verbs Dict
verbs.add(NAME);
verbs.add(COMMENT);
verbs.add(STATUS);
verbs.add(IP);
verbs.add(HOST);
verbs.add(FQDN);
verbs.add(UPTIME);
verbs.add(OS);
verbs.add(CREATIONDATE);
verbs.add(ADDRESS);
verbs.add(CPU_USAGE);
verbs.add(MEM_USAGE);
verbs.add(NETWORK_USAGE);
verbs.add(MEMORY);
verbs.add(MIGRATION_PROGRESS_PERCENT);
verbs.add(APPS);
verbs.add(CLUSTER);
verbs.add(POOL);
verbs.add(LOGGEDINUSER);
verbs.add(TAG);
verbs.add(DATACENTER);
verbs.add(TYPE);
verbs.add(QUOTA);
verbs.add(ID);
verbs.add(DESCRIPTION);
verbs.add(ARCHITECTURE);
verbs.add(CUSTOM_EMULATED_MACHINE);
verbs.add(CUSTOM_CPU_TYPE);
verbs.add(COMPATIBILITY_LEVEL);
verbs.add(CREATED_BY_USER_ID);
// Building the autoCompletion Dict
buildCompletions();
// Building the types dict
getTypeDictionary().put(NAME, String.class);
getTypeDictionary().put(COMMENT, String.class);
getTypeDictionary().put(STATUS, VMStatus.class);
getTypeDictionary().put(IP, String.class);
getTypeDictionary().put(FQDN, String.class);
getTypeDictionary().put(UPTIME, TimeSpan.class);
getTypeDictionary().put(OS, String.class);
getTypeDictionary().put(CREATIONDATE, Date.class);
getTypeDictionary().put(ADDRESS, String.class);
getTypeDictionary().put(CPU_USAGE, Integer.class);
getTypeDictionary().put(MEM_USAGE, Integer.class);
getTypeDictionary().put(NETWORK_USAGE, Integer.class);
getTypeDictionary().put(MIGRATION_PROGRESS_PERCENT, Integer.class);
getTypeDictionary().put(MEMORY, Integer.class);
getTypeDictionary().put(APPS, String.class);
getTypeDictionary().put(CLUSTER, String.class);
getTypeDictionary().put(POOL, String.class);
getTypeDictionary().put(LOGGEDINUSER, String.class);
getTypeDictionary().put(TAG, String.class);
getTypeDictionary().put(DATACENTER, String.class);
getTypeDictionary().put(TYPE, VmType.class);
getTypeDictionary().put(QUOTA, String.class);
getTypeDictionary().put(HOST, String.class);
getTypeDictionary().put(ID, UUID.class);
getTypeDictionary().put(DESCRIPTION, String.class);
getTypeDictionary().put(ARCHITECTURE, ArchitectureType.class);
getTypeDictionary().put(CUSTOM_EMULATED_MACHINE, String.class);
getTypeDictionary().put(CUSTOM_CPU_TYPE, String.class);
getTypeDictionary().put(COMPATIBILITY_LEVEL, String.class);
getTypeDictionary().put(CREATED_BY_USER_ID, UUID.class);
// building the ColumnName Dict
columnNameDict.put(NAME, "vm_name");
columnNameDict.put(COMMENT, "free_text_comment");
columnNameDict.put(STATUS, "status");
columnNameDict.put(IP, "vm_ip");
columnNameDict.put(FQDN, "vm_fqdn");
columnNameDict.put(UPTIME, "elapsed_time");
columnNameDict.put(OS, "os");
columnNameDict.put(CREATIONDATE, "creation_date");
columnNameDict.put(ADDRESS, "vm_host");
columnNameDict.put(MEM_USAGE, "usage_mem_percent");
columnNameDict.put(NETWORK_USAGE, "usage_network_percent");
columnNameDict.put(CPU_USAGE, "usage_cpu_percent");
columnNameDict.put(MIGRATION_PROGRESS_PERCENT, "migration_progress_percent");
columnNameDict.put(MEMORY, "mem_size_mb");
columnNameDict.put(APPS, "app_list");
columnNameDict.put(CLUSTER, "cluster_name");
columnNameDict.put(POOL, "vm_pool_name");
columnNameDict.put(LOGGEDINUSER, "guest_cur_user_name");
columnNameDict.put(TAG, "tag_name");
columnNameDict.put(DATACENTER, "storage_pool_name");
columnNameDict.put(TYPE, "vm_type");
columnNameDict.put(QUOTA, "quota_name");
columnNameDict.put(HOST, "run_on_vds_name");
columnNameDict.put(ID, "vm_guid");
columnNameDict.put(DESCRIPTION, "description");
columnNameDict.put(ARCHITECTURE, "architecture");
columnNameDict.put(CUSTOM_EMULATED_MACHINE, "custom_emulated_machine");
columnNameDict.put(CUSTOM_CPU_TYPE, "custom_cpu_name");
columnNameDict.put(COMPATIBILITY_LEVEL, "cluster_compatibility_version");
columnNameDict.put(CREATED_BY_USER_ID, "created_by_user_id");
// Override field names for purpose of sorting, if needed
sortableFieldDict.put(IP, Collections.singletonList(
new SyntaxChecker.SortByElement("vm_ip_inet_array")));
/**
*/
notFreeTextSearchableFieldsList.add(APPS);
notFreeTextSearchableFieldsList.add(OS);
// Building the validation dict
buildBasicValidationTable();
}
@Override
public IAutoCompleter getFieldRelationshipAutoCompleter(String fieldName) {
if (UPTIME.equals(fieldName) || CREATIONDATE.equals(fieldName)) {
return BiggerOrSmallerRelationAutoCompleter.INSTANCE;
} else if (CPU_USAGE.equals(fieldName) || MEM_USAGE.equals(fieldName)
|| MEMORY.equals(fieldName) || NETWORK_USAGE.equals(fieldName)
|| MIGRATION_PROGRESS_PERCENT.equals(fieldName)) {
return NumericConditionRelationAutoCompleter.INSTANCE;
} else if (TAG.equals(fieldName)) {
return StringConditionRelationAutoCompleter.INSTANCE;
} else {
return StringConditionRelationAutoCompleter.INSTANCE;
}
}
@Override
public IConditionValueAutoCompleter getFieldValueAutoCompleter(String fieldName) {
if (OS.equals(fieldName)) {
return SimpleDependencyInjector.getInstance().get(OsValueAutoCompleter.class);
} else if (STATUS.equals(fieldName)) {
return new EnumValueAutoCompleter(VMStatus.class);
} else if (TYPE.equals(fieldName)) {
return new EnumValueAutoCompleter(VmType.class);
} else if (QUOTA.equals(fieldName)) {
return new NullableStringAutoCompleter();
} else if (ARCHITECTURE.equals(fieldName)) {
return new EnumValueAutoCompleter(ArchitectureType.class);
}
return null;
}
@Override
public void formatValue(String fieldName, Pair<String, String> pair, boolean caseSensitive) {
if (APPS.equals(fieldName)) {
pair.setSecond(
StringFormat.format(BaseConditionFieldAutoCompleter.getI18NPrefix() + "'%%%1$s%%'",
StringHelper.trim(pair.getSecond(), '\'').replace("N'",
"")));
if ("=".equals(pair.getFirst())) {
pair.setFirst(BaseConditionFieldAutoCompleter.getLikeSyntax(caseSensitive));
} else if ("!=".equals(pair.getFirst())) {
pair.setFirst("NOT " + BaseConditionFieldAutoCompleter.getLikeSyntax(caseSensitive));
}
}
else if (UPTIME.equals(fieldName)) {
pair.setSecond(StringHelper.trim(pair.getSecond(), '\''));
TimeSpan ts = TimeSpan.parse(pair.getSecond());
pair.setSecond(StringFormat.format("'%1$s'", ts.TotalMilliseconds < MILISECOND ? 0 : ts.TotalMilliseconds / MILISECOND));
}
else if (CREATIONDATE.equals(fieldName)) {
Date tmp = new Date(Date.parse(StringHelper.trim(pair.getSecond(), '\'')));
pair.setSecond(StringFormat.format("'%1$s'", tmp));
} else {
super.formatValue(fieldName, pair, caseSensitive);
}
}
}