package com.stacksync.syncservice.db.postgresql; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.apache.log4j.Logger; import com.stacksync.commons.models.User; import com.stacksync.syncservice.db.DAOError; import com.stacksync.syncservice.db.UserDAO; import com.stacksync.syncservice.exceptions.dao.DAOException; import com.stacksync.syncservice.exceptions.dao.NoResultReturnedDAOException; public class PostgresqlUserDAO extends PostgresqlDAO implements UserDAO { private static final Logger logger = Logger.getLogger(PostgresqlUserDAO.class.getName()); public PostgresqlUserDAO(Connection connection) { super(connection); } @Override public User findById(UUID userID) throws DAOException { ResultSet resultSet = null; User user = null; String query = "SELECT id, name, email, swift_user, swift_account, quota_limit, quota_used_logical, quota_used_real " + " FROM \"user1\" WHERE id = ?::uuid"; try { resultSet = executeQuery(query, new Object[] { userID }); if (resultSet.next()) { user = mapUser(resultSet); } } catch (SQLException e) { logger.error(e); throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } if (user == null){ throw new DAOException(DAOError.USER_NOT_FOUND); } return user; } @Override public User getByEmail(String email) throws DAOException { ResultSet resultSet = null; User user = null; String query = "SELECT * " + " FROM \"user1\" WHERE email = lower(?)"; try { resultSet = executeQuery(query, new Object[] { email }); if (resultSet.next()) { user = mapUser(resultSet); }else{ throw new NoResultReturnedDAOException(DAOError.USER_NOT_FOUND); } } catch (SQLException e) { throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } return user; } @Override public List<User> findAll() throws DAOException { ResultSet resultSet = null; List<User> list = new ArrayList<User>(); String query = "SELECT * FROM user1"; try { resultSet = executeQuery(query, null); while (resultSet.next()) { list.add(mapUser(resultSet)); } } catch (SQLException e) { logger.error(e); throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } return list; } @Override public void add(User user) throws DAOException { if (!user.isValid()) { throw new IllegalArgumentException("User attributes not set"); } Object[] values = { user.getEmail(), user.getName(), user.getSwiftUser(), user.getSwiftAccount(), user.getQuotaLimit(), user.getQuotaUsedLogical(), user.getQuotaUsedReal() }; String query = "INSERT INTO user1 (email, name, swift_user, swift_account, quota_limit, quota_used_logical, quota_used_real) VALUES (?, ?, ?, ?, ?, ?)"; try { UUID userId = (UUID) executeUpdate(query, values); user.setId(userId); } catch (DAOException e) { logger.error(e); throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } } @Override public void update(User user) throws DAOException { if (user.getId() == null || !user.isValid()) { throw new IllegalArgumentException("User attributes not set"); } Object[] values = { user.getEmail(), user.getName(), user.getSwiftUser(), user.getSwiftAccount(), user.getQuotaLimit(), user.getQuotaUsedLogical(), user.getQuotaUsedReal(), user.getId() }; String query = "UPDATE user1 SET email = ?, name = ?, swift_user = ?, swift_account = ?, quota_limit = ?, quota_used_logical = ?, quota_used_real = ? WHERE id = ?::uuid"; try { executeUpdate(query, values); } catch (DAOException e) { logger.error(e); throw new DAOException(e); } } @Override public void delete(UUID userID) throws DAOException { Object[] values = { userID }; String query = "DELETE FROM user1 WHERE id = ?"; executeUpdate(query, values); } private User mapUser(ResultSet resultSet) throws SQLException { User user = new User(); user.setId(UUID.fromString(resultSet.getString("id"))); user.setEmail(resultSet.getString("email")); user.setName(resultSet.getString("name")); user.setSwiftUser(resultSet.getString("swift_user")); user.setSwiftAccount(resultSet.getString("swift_account")); user.setQuotaLimit(resultSet.getLong("quota_limit")); user.setQuotaUsedLogical(resultSet.getLong("quota_used_logical")); user.setQuotaUsedReal(resultSet.getLong("quota_used_real")); return user; } @Override public List<User> findByItemId(Long itemId) throws DAOException { ArrayList<User> users = new ArrayList<User>(); Object[] values = { itemId }; String query = "SELECT u.* " + " FROM item i " + " INNER JOIN workspace_user wu ON i.workspace_id = wu.workspace_id " + " INNER JOIN user1 u ON wu.user_id = u.id " + " WHERE i.id = ?"; ResultSet result = null; try { result = executeQuery(query, values); while (result.next()) { User user = mapUser(result); users.add(user); } } catch (SQLException e) { logger.error(e); throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } return users; } @Override public void updateAvailableQuota(User user) throws DAOException { // TODO Auto-generated method stub if (user.getId() == null || !user.isValid()) { throw new IllegalArgumentException("User attributes not set"); } Object[] values = {user.getQuotaUsedLogical(), user.getId()}; String query = "UPDATE user1 SET quota_used_logical = ? WHERE id = ?::uuid"; try { executeUpdate(query, values); } catch (DAOException e) { logger.error(e); throw new DAOException(e); } } }