package org.ovirt.engine.core.dao; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; import javax.inject.Named; import javax.inject.Singleton; import org.ovirt.engine.core.common.businessentities.Label; import org.ovirt.engine.core.common.businessentities.LabelBuilder; import org.ovirt.engine.core.compat.Guid; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @Named @Singleton public class LabelDaoImpl extends BaseDao implements LabelDao { private static final RowMapper<Label> labelRowMapper = (rs, rowNum) -> { String[] rawUuids = (String[])rs.getArray("vm_ids").getArray(); List<String> vms = Arrays.asList(rawUuids); rawUuids = (String[])rs.getArray("vds_ids").getArray(); List<String> hosts = Arrays.asList(rawUuids); return new LabelBuilder() .id(getGuidDefaultNewGuid(rs, "label_id")) .name(rs.getString("label_name")) .readOnly(rs.getBoolean("read_only")) .vmIds(vms.stream() // Labels with no assignments will have null in the column .filter(v -> v != null) // Convert to Guid .map(Guid::new) .collect(Collectors.toSet())) .hostIds(hosts.stream() // Labels with no assignments will have null in the column .filter(v -> v != null) // Convert to Guid .map(Guid::new) .collect(Collectors.toSet())) .build(); }; @Override public Label get(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("label_id", id); return getCallsHandler() .executeRead("GetLabelById", labelRowMapper, parameterSource); } @Override public Label getByName(String name) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("label_name", name); return getCallsHandler() .executeRead("GetLabelByName", labelRowMapper, parameterSource); } @Override public List<Label> getAll() { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource(); return getCallsHandler() .executeReadList("GetAllLabels", labelRowMapper, parameterSource); } @Override public List<Label> getAllByEntityIds(Iterable<Guid> entities) { List<UUID> uuids = new ArrayList<>(); for (Guid guid: entities) { uuids.add(guid.getUuid()); } MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("entity_ids", createArrayOf("uuid", uuids.toArray())); return getCallsHandler() .executeReadList("GetLabelsByReferencedIds", labelRowMapper, parameterSource); } @Override public List<Label> getAllByIds(Iterable<Guid> ids) { List<UUID> uuids = new ArrayList<>(); for (Guid guid: ids) { uuids.add(guid.getUuid()); } MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("label_ids", createArrayOf("uuid", uuids.toArray())); return getCallsHandler() .executeReadList("GetLabelByIds", labelRowMapper, parameterSource); } @Override public void save(Label label) { Guid id = label.getId(); if (Guid.isNullOrEmpty(id)) { id = Guid.newGuid(); label.setId(id); } MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("label_id", label.getId()) .addValue("label_name", label.getName()) .addValue("readonly", label.isReadOnly()) .addValue("vms", createArrayOf("uuid", label.getVms().toArray())) .addValue("hosts", createArrayOf("uuid", label.getHosts().toArray())); getCallsHandler().executeModification("CreateLabel", parameterSource); } @Override public void remove(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("label_id", id); getCallsHandler() .executeModification("DeleteLabel", parameterSource); } @Override public void update(Label label) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("label_id", label.getId()) .addValue("label_name", label.getName()) .addValue("readonly", label.isReadOnly()) .addValue("vms", createArrayOf("uuid", label.getVms().toArray())) .addValue("hosts", createArrayOf("uuid", label.getHosts().toArray())); getCallsHandler() .executeModification("UpdateLabel", parameterSource); } }