package org.ovirt.engine.core.dao; import java.util.List; import javax.inject.Named; import javax.inject.Singleton; import org.ovirt.engine.core.common.businessentities.MacPool; import org.ovirt.engine.core.common.businessentities.MacRange; import org.ovirt.engine.core.compat.Guid; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SingleColumnRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @Named @Singleton public class MacPoolDaoImpl extends DefaultGenericDao<MacPool, Guid> implements MacPoolDao { public MacPoolDaoImpl() { super("MacPool"); } @Override public void save(MacPool entity) { super.save(entity); for (MacRange macRange : entity.getRanges()) { macRange.setMacPoolId(entity.getId()); saveRange(macRange); } } @Override public void update(MacPool entity) { super.update(entity); // If ranges definition is also sent, update them as well. if (entity.getRanges() != null && !entity.getRanges().isEmpty()) { deleteAllRangesForMacPool(entity.getId()); for (MacRange macRange : entity.getRanges()) { macRange.setMacPoolId(entity.getId()); saveRange(macRange); } } } @Override public void remove(Guid guid) { deleteAllRangesForMacPool(guid); super.remove(guid); } @Override public MacPool getDefaultPool() { return getCallsHandler().executeRead("GetDefaultMacPool", macPoolRowMapper, getCustomMapSqlParameterSource()); } @Override public List<String> getAllMacsForMacPool(Guid macPoolId) { return getCallsHandler().executeReadList("GetAllMacsByMacPoolId", SingleColumnRowMapper.newInstance(String.class), createIdParameterMapper(macPoolId)); } @Override public MacPool getByClusterId(Guid dataCenterId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("cluster_id", dataCenterId); return getCallsHandler().executeRead("GetMacPoolByClusterId", macPoolRowMapper, parameterSource); } @Override protected MapSqlParameterSource createFullParametersMapper(MacPool entity) { return createIdParameterMapper(entity.getId()) .addValue("name", entity.getName()) .addValue("allow_duplicate_mac_addresses", entity.isAllowDuplicateMacAddresses()) .addValue("description", entity.getDescription()); } @Override protected MapSqlParameterSource createIdParameterMapper(Guid id) { return getCustomMapSqlParameterSource().addValue("id", id); } @Override protected RowMapper<MacPool> createEntityRowMapper() { return macPoolRowMapper; } private void deleteAllRangesForMacPool(Guid macPoolId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource().addValue("id", macPoolId); getCallsHandler().executeModification("DeleteMacPoolRangesByMacPoolId", parameterSource); } private void saveRange(MacRange entity) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("mac_pool_id", entity.getMacPoolId()) .addValue("from_mac", entity.getMacFrom().toLowerCase()) .addValue("to_mac", entity.getMacTo().toLowerCase()); getCallsHandler().executeModification("InsertMacPoolRange", parameterSource); } private List<MacRange> getMacPoolRangesForPool(Guid id) { return getCallsHandler().executeReadList("GetAllMacPoolRangesByMacPoolId", macPoolRangeRowMapper, createIdParameterMapper(id)); } private static final RowMapper<MacRange> macPoolRangeRowMapper = (rs, rowNum) -> { MacRange macRange = new MacRange(); macRange.setMacPoolId(getGuid(rs, "mac_pool_id")); macRange.setMacFrom(rs.getString("from_mac")); macRange.setMacTo(rs.getString("to_mac")); return macRange; }; private final RowMapper<MacPool> macPoolRowMapper = (rs, rowNum) -> { MacPool macPool = new MacPool(); macPool.setId(getGuid(rs, "id")); macPool.setName(rs.getString("name")); macPool.setAllowDuplicateMacAddresses(rs.getBoolean("allow_duplicate_mac_addresses")); macPool.setDescription(rs.getString("description")); macPool.setDefaultPool(rs.getBoolean("default_pool")); macPool.setRanges(getMacPoolRangesForPool(macPool.getId())); return macPool; }; }