package org.nextprot.api.user.dao.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nextprot.api.commons.exception.NextProtException;
import org.nextprot.api.commons.spring.jdbc.DataSourceServiceLocator;
import org.nextprot.api.commons.utils.SQLDictionary;
import org.nextprot.api.user.dao.UserApplicationDao;
import org.nextprot.api.user.domain.UserApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Repository
@Lazy
public class UserApplicationDaoImpl implements UserApplicationDao {
private final Log Logger = LogFactory.getLog(UserApplicationDaoImpl.class);
@Autowired
private SQLDictionary sqlDictionary;
@Autowired(required = false)
private DataSourceServiceLocator dsLocator;
@Override
public List<UserApplication> getUserApplicationListByOwnerId(long userId) {
MapSqlParameterSource namedParameters = new MapSqlParameterSource();
namedParameters.addValue("owner_id", userId);
return new NamedParameterJdbcTemplate(dsLocator.getUserDataSource())
.query(sqlDictionary.getSQLQuery("read-user-applications-by-owner-id"), namedParameters, new UserApplicationRowMapper());
}
@Override
public long createUserApplication(final UserApplication userApplication) {
final String INSERT_SQL = sqlDictionary.getSQLQuery("create-user-application");
MapSqlParameterSource namedParameters = new MapSqlParameterSource();
namedParameters.addValue("application_name", userApplication.getName());
namedParameters.addValue("description", userApplication.getDescription());
namedParameters.addValue("organisation", userApplication.getOrganisation());
namedParameters.addValue("responsible_name", userApplication.getResponsibleName());
namedParameters.addValue("responsible_email", userApplication.getResponsibleEmail());
namedParameters.addValue("website", userApplication.getWebsite());
namedParameters.addValue("owner_id", userApplication.getOwnerId());
namedParameters.addValue("token", userApplication.getToken());
namedParameters.addValue("status", userApplication.getStatus());
namedParameters.addValue("user_data_access", userApplication.getUserDataAccess());
namedParameters.addValue("origins", userApplication.getOrigins());
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dsLocator.getUserDataSource());
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(INSERT_SQL, namedParameters, keyHolder, new String[] {"application_id"});
return keyHolder.getKey().longValue();
}
@Override
public void updateUserApplication(final UserApplication src) {
final String UPDATE_SQL = sqlDictionary.getSQLQuery("update-user-application");
MapSqlParameterSource namedParameters = new MapSqlParameterSource();
// key to identify application to be updated
namedParameters.addValue("application_id", src.getId());
// values to update
namedParameters.addValue("application_name", src.getName());
namedParameters.addValue("description", src.getDescription());
namedParameters.addValue("organisation", src.getOrganisation());
namedParameters.addValue("responsible_name", src.getResponsibleName());
namedParameters.addValue("responsible_email", src.getResponsibleEmail());
namedParameters.addValue("website", src.getWebsite());
namedParameters.addValue("token", src.getToken());
namedParameters.addValue("status", src.getStatus());
namedParameters.addValue("user_data_access", src.getUserDataAccess());
namedParameters.addValue("origins", src.getOrigins());
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dsLocator.getUserDataSource());
int affectedRows = jdbcTemplate.update(UPDATE_SQL, namedParameters);
if (affectedRows != 1) {
String msg = "something wrong occurred: " + affectedRows + " rows were affected (expected=1).";
Logger.error(msg);
throw new NextProtException(msg);
}
}
@Override
public void deleteUserApplication(final UserApplication userApplication) {
final String DELETE_SQL = sqlDictionary.getSQLQuery("delete-user-application");
Map<String, Object> params = new HashMap<String, Object>();
params.put("application_id", userApplication.getId());
int affectedRows = new NamedParameterJdbcTemplate(dsLocator.getUserDataSource()).update(DELETE_SQL, params);
if(affectedRows != 1){
String msg = "oops something wrong occured" + affectedRows + " rows were affected instead of only 1.";
Logger.error(msg);
throw new NextProtException(msg);
}
}
@Override
public UserApplication getUserApplicationById(long id) throws DataAccessException {
MapSqlParameterSource namedParameters = new MapSqlParameterSource();
namedParameters.addValue("application_id", id);
String sql = sqlDictionary.getSQLQuery("read-user-application-by-id");
return new NamedParameterJdbcTemplate(dsLocator.getUserDataSource())
.queryForObject(sql, namedParameters, new UserApplicationRowMapper());
}
/**
* Row mapper
*
* @author dteixeira
*/
private static class UserApplicationRowMapper implements ParameterizedRowMapper<UserApplication> {
public UserApplication mapRow(ResultSet resultSet, int row) throws SQLException {
UserApplication app = new UserApplication();
app.setId(resultSet.getLong("application_id"));
app.setName(resultSet.getString("application_name"));
app.setDescription(resultSet.getString("description"));
app.setOrganisation(resultSet.getString("organisation"));
app.setResponsibleName(resultSet.getString("responsible_name"));
app.setResponsibleEmail(resultSet.getString("responsible_email"));
app.setWebsite(resultSet.getString("website"));
app.setOwnerId(resultSet.getLong("owner_id"));
app.setOwner(resultSet.getString("owner"));
app.setToken(resultSet.getString("token"));
app.setStatus(resultSet.getString("status"));
app.setUserDataAccess(resultSet.getString("user_data_access"));
app.setOrigins(resultSet.getString("origins"));
app.setCreationDate(resultSet.getDate("creation_date"));
return app;
}
}
}