package org.ovirt.engine.core.dao; import java.util.List; import javax.inject.Named; import javax.inject.Singleton; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.CustomMapSqlParameterSource; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.simple.SimpleJdbcCall; /** * {@code DBUserDaoImpl} provides an implementation of {@link DbUserDao}. */ @Named @Singleton public class DbUserDaoImpl extends BaseDao implements DbUserDao { private static final RowMapper<DbUser> dbUserRowMapper = (rs, rowNum) -> { DbUser entity = new DbUser(); entity.setDepartment(rs.getString("department")); entity.setDomain(rs.getString("domain")); entity.setEmail(rs.getString("email")); entity.setFirstName(rs.getString("name")); entity.setNote(rs.getString("note")); entity.setLastName(rs.getString("surname")); entity.setId(getGuidDefaultEmpty(rs, "user_id")); entity.setLoginName(rs.getString("username")); entity.setAdmin(rs.getBoolean("last_admin_check_status")); entity.setExternalId(rs.getString("external_id")); entity.setNamespace(rs.getString("namespace")); return entity; }; private class DbUserMapSqlParameterSource extends CustomMapSqlParameterSource { public DbUserMapSqlParameterSource(DbUser user) { super(getDialect()); addValue("department", user.getDepartment()); addValue("domain", user.getDomain()); addValue("email", user.getEmail()); addValue("name", user.getFirstName()); addValue("note", user.getNote()); addValue("surname", user.getLastName()); addValue("user_id", user.getId()); addValue("username", user.getLoginName()); addValue("last_admin_check_status", user.isAdmin()); addValue("external_id", user.getExternalId()); addValue("namespace", user.getNamespace()); } } @Override public DbUser get(Guid id) { return get(id, false); } @Override public DbUser get(Guid id, boolean isFiltered) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("user_id", id) .addValue("is_filtered", isFiltered); return getCallsHandler().executeRead("GetUserByUserId", dbUserRowMapper, parameterSource); } @Override public DbUser getByUsernameAndDomain(String username, String domainName) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("username", username) .addValue("domain", domainName); return getCallsHandler().executeRead("GetUserByUserNameAndDomain", dbUserRowMapper, parameterSource); } @Override public DbUser getByExternalId(String domain, String externalId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("domain", domain) .addValue("external_id", externalId); return getCallsHandler().executeRead("GetUserByExternalId", dbUserRowMapper, parameterSource); } @Override public DbUser getByIdOrExternalId(Guid id, String domain, String externalId) { // Check if there is a user with the given internal identifier: if (id != null) { DbUser existing = get(id); if (existing != null) { return existing; } } // Check if there is an existing user for the given external identifier: if (domain != null && externalId != null) { DbUser existing = getByExternalId(domain, externalId); if (existing != null) { return existing; } } // In older versions of the engine the internal and external identifiers were the same, so we also need to check // if the internal id is really an external id: if (domain != null && id != null) { DbUser existing = getByExternalId(domain, id.toString()); if (existing != null) { return existing; } } // There is no such existing user: return null; } @Override public List<DbUser> getAllForVm(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vm_guid", id); return getCallsHandler().executeReadList("GetUsersByVmGuid", dbUserRowMapper, parameterSource); } @Override public List<DbUser> getAllWithQuery(String query) { return getJdbcTemplate().query(query, dbUserRowMapper); } @Override public List<DbUser> getAll() { return getAll(null, false); } @Override public List<DbUser> getAll(Guid userID, boolean isFiltered) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("user_id", userID).addValue("is_filtered", isFiltered); return getCallsHandler().executeReadList("GetAllFromUsers", dbUserRowMapper, parameterSource); } @Override public void save(DbUser user) { setIdIfNeeded(user); new SimpleJdbcCall(getJdbcTemplate()).withProcedureName("InsertUser") .execute(new DbUserMapSqlParameterSource(user)); } @Override public void update(DbUser user) { getCallsHandler().executeModification("UpdateUser", new DbUserMapSqlParameterSource(user)); } @Override public void remove(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("user_id", id); getCallsHandler().executeModification("DeleteUser", parameterSource); } @Override public void saveOrUpdate(DbUser user) { setIdIfNeeded(user); new SimpleJdbcCall(getJdbcTemplate()).withProcedureName("InsertOrUpdateUser") .execute(new DbUserMapSqlParameterSource(user)); } @Override public void updateLastAdminCheckStatus(Guid... userIds) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource().addValue("userIds", StringUtils.join(userIds, ",")); new SimpleJdbcCall(getJdbcTemplate()).withProcedureName("UpdateLastAdminCheckStatus").execute(parameterSource); } private void setIdIfNeeded(DbUser user) { if (Guid.isNullOrEmpty(user.getId())) { user.setId(Guid.newGuid()); } } }