package org.ovirt.engine.core.dao.network; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.inject.Named; import javax.inject.Singleton; import org.ovirt.engine.core.common.businessentities.network.HostNicVfsConfig; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.MassOperationsGenericDao; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SingleColumnRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @Named @Singleton public class HostNicVfsConfigDaoImpl extends MassOperationsGenericDao<HostNicVfsConfig, Guid> implements HostNicVfsConfigDao { private final RowMapper<HostNicVfsConfig> nicVfsConfigRowMapper = (rs, rowNum) -> { HostNicVfsConfig entity = new HostNicVfsConfig(); entity.setId(getGuid(rs, "id")); entity.setNicId(getGuid(rs, "nic_id")); entity.setAllNetworksAllowed(rs.getBoolean("is_all_networks_allowed")); fillNetworksAndLabelsDataOnConfig(entity); return entity; }; public HostNicVfsConfigDaoImpl() { super("HostNicVfsConfig"); setProcedureNameForGet("GetHostNicVfsConfigById"); } @Override protected MapSqlParameterSource createFullParametersMapper(HostNicVfsConfig hostNicVfsConfig) { return createIdParameterMapper(hostNicVfsConfig.getId()) .addValue("nic_id", hostNicVfsConfig.getNicId()) .addValue("is_all_networks_allowed", hostNicVfsConfig.isAllNetworksAllowed()); } @Override protected MapSqlParameterSource createIdParameterMapper(Guid id) { return getCustomMapSqlParameterSource().addValue("id", id); } @Override protected RowMapper<HostNicVfsConfig> createEntityRowMapper() { return nicVfsConfigRowMapper; } private void fillNetworksAndLabelsDataOnConfig(HostNicVfsConfig vfsConfig) { Guid id = vfsConfig.getId(); vfsConfig.setNetworks(getNetworksByVfsConfigId(id)); vfsConfig.setNetworkLabels(getLabelsByVfsConfigId(id)); } @Override public void save(HostNicVfsConfig entity) { super.save(entity); saveNetworksAndLabels(entity); } @Override public void update(HostNicVfsConfig entity) { super.update(entity); removeAllNetworksByVfsConfigId(entity.getId()); removeAllLabelsByVfsConfigId(entity.getId()); saveNetworksAndLabels(entity); } private void saveNetworksAndLabels(HostNicVfsConfig entity) { massNetworksUpdate(entity.getId(), entity.getNetworks()); massLabelsUpdate(entity.getId(), entity.getNetworkLabels()); } private MapSqlParameterSource createVfsConfigIdParameter(Guid vfsConfigId) { return getCustomMapSqlParameterSource().addValue("vfs_config_id", vfsConfigId); } @Override public List<HostNicVfsConfig> getAllVfsConfigByHostId(Guid hostId) { return getCallsHandler().executeReadList("GetAllVfsConfigByHostId", createEntityRowMapper(), getCustomMapSqlParameterSource() .addValue("host_id", hostId)); } // VfsConfigNetworks Set<Guid> getNetworksByVfsConfigId(Guid vfsConfigId) { return new HashSet<>(getCallsHandler().executeReadList("GetNetworksByVfsConfigId", createGuidMapper(), createVfsConfigIdParameter(vfsConfigId))); } @Override public HostNicVfsConfig getByNicId(Guid nicId) { return getCallsHandler().executeRead("GetVfsConfigByNicId", createEntityRowMapper(), getCustomMapSqlParameterSource().addValue("nic_id", nicId)); } @Override public void addNetwork(Guid vfsConfigId, Guid networkId) { getCallsHandler().executeModification("InsertVfsConfigNetwork", createNetworkParametersMapper(vfsConfigId, networkId)); } private void massNetworksUpdate(Guid vfsConfigId, Set<Guid> networks) { List<MapSqlParameterSource> executions = networks.stream() .map(networkId -> createNetworkParametersMapper(vfsConfigId, networkId)).collect(Collectors.toList()); getCallsHandler().executeStoredProcAsBatch("InsertVfsConfigNetwork", executions); } @Override public void removeNetwork(Guid vfsConfigId, Guid networkId) { getCallsHandler().executeModification("DeleteVfsConfigNetwork", createNetworkParametersMapper(vfsConfigId, networkId)); } private void removeAllNetworksByVfsConfigId(Guid vfsConfigId) { MapSqlParameterSource parameterSource = createVfsConfigIdParameter(vfsConfigId); getCallsHandler().executeModification("DeleteAllVfsConfigNetworks", parameterSource); } private MapSqlParameterSource createNetworkParametersMapper(Guid vfsConfigId, Guid networkId) { return getCustomMapSqlParameterSource() .addValue("vfs_config_id", vfsConfigId) .addValue("network_id", networkId); } // VfsConfigLabels Set<String> getLabelsByVfsConfigId(Guid vfsConfigId) { return new HashSet<>(getCallsHandler().executeReadList("GetLabelsByVfsConfigId", new SingleColumnRowMapper<>(), createVfsConfigIdParameter(vfsConfigId))); } @Override public void addLabel(Guid vfsConfigId, String label) { getCallsHandler().executeModification("InsertVfsConfigLabel", createLabelParametersMapper(vfsConfigId, label)); } private void massLabelsUpdate(Guid vfsConfigId, Set<String> labels) { List<MapSqlParameterSource> executions = labels.stream().map(l -> createLabelParametersMapper(vfsConfigId, l)).collect(Collectors.toList()); getCallsHandler().executeStoredProcAsBatch("InsertVfsConfigLabel", executions); } @Override public void removeLabel(Guid vfsConfigId, String label) { getCallsHandler().executeModification("DeleteVfsConfigLabel", createLabelParametersMapper(vfsConfigId, label)); } private void removeAllLabelsByVfsConfigId(Guid vfsConfigId) { MapSqlParameterSource parameterSource = createVfsConfigIdParameter(vfsConfigId); getCallsHandler().executeModification("DeleteAllVfsConfigLabels", parameterSource); } private MapSqlParameterSource createLabelParametersMapper(Guid vfsConfigId, String label) { return getCustomMapSqlParameterSource() .addValue("vfs_config_id", vfsConfigId) .addValue("label", label); } }