📄 jdbcusersinfomanager.java
字号:
package fr.iutvalence.java.tp8.chat.server;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import fr.iutvalence.java.tp8.chat.server.exceptions.InformationAccessException;
import fr.iutvalence.java.tp8.chat.server.exceptions.NotConnectedException;
import fr.iutvalence.java.tp8.chat.server.exceptions.UnknownUserException;
/**
* IExercice d'application sur l'utilisation de JDBC (TP8)<br/>.Implémentation
* d'un gestionnaire d'informations utilisateurs JDBC pour la partie serveur
* d'un salon de conversation en TCP, version augmentée avec authentification,
* ... <br/><br/>
*
* Commentaires à sebastien.jean@iut-valence.fr
*
* @author Sébastien JEAN, IUT Valence, oct. 2006
* @version 1.0
*/
public class JDBCUsersInfoManager implements UsersInfoManager
{
/**
* La connexion à la base de données
*/
private Connection connection;
/**
* Un émetteur de requêtes
*/
private Statement statement;
/**
* Constructeur avec paramètres. Initialisation du gestionnaires par ouverture
* d'une connexion à une BD distante via JDBC.
*
* @param driverClassName le nom de la classe du driver JDBC à utiliser
* @param databaseURL l'url de la base de données sur laquelle se connecter.
* @param username le nom d'utilisateur pour l'ouverture de la connexion sur
* la BD.
* @param password le mot de passe pour l'ouverture de la connexion sur la
* BD.
* @throws ClassNotFoundException si la classe du driver JDBC n'a pas pu
* être chargée.
* @throws SQLException si la connexion avec la base n'a pu être ouverte.
*/
public JDBCUsersInfoManager(String driverClassName, String databaseURL,
String username, String password) throws ClassNotFoundException,
SQLException
{
// Chargement du driver JDBC
Class.forName(driverClassName);
// Connexion à la base
this.connection = DriverManager.getConnection(databaseURL, username,
password);
// Création d'un émetteur de requêtes
this.statement = this.connection.createStatement();
}
/**
* Terminaison propre de l'utilisation du gestionnaire d'informations
* (méthode appelée directement par le ramasse-miettes à l'arrêt de l'
* application). En particulier, la connexion à la base de données est
* close.
*
* @see java.lang.Object#finalize()
*/
public void finalize()
{
try
{
// Libération du statement
this.statement.close();
// Fermeture de la connexion
this.connection.close();
}
catch (Exception e)
{
// Peu importe si une erreur survient
}
}
/**
* Obtention du mot de passe associé à un utilisateur
*
* @param pseudo le pseudonyme de l'utilisateur
* @return le mot de passe associé à l'utilisateur <tt>pseudo</tt> s'il
* existe.
* @throws UnknownUserException si le pseudonyme ne désigne pas un
* utilisateur connnu.
* @throws InformationAccessException si l'accès à l'information échoue.
*/
public String getPassword(String pseudo) throws UnknownUserException,
InformationAccessException
{
String password = null;
// Définition de la requête à envoyer
String query = "SELECT password FROM users WHERE pseudo = '" + pseudo
+ "';";
// Envoi de la requête et traitement du résultat
try
{
ResultSet rs = this.statement.executeQuery(query);
// Une table résultat vide indique que le pseudonyme est inconnu
if (!(rs.absolute(1)))
throw new UnknownUserException();
// Obtention du mot de passe
password = rs.getString("password");
}
catch (SQLException e)
{
throw new InformationAccessException();
}
return password;
}
/**
* Obtention de l'état de présence d'un utilisateur connecté.
*
* @param pseudo le pseudonyme de l'utilisateur.
* @return <tt>true</tt> si l'utilisateur <tt>pseudo</tt> est connecté
* et présent, <tt>false</tt> si l'utilisateur <tt>pseudo</tt>
* est connecté et absent.
* @throws UnknownUserException si le pseudonyme ne désigne pas un
* utilisateur connu.
* @throws NotConnectedException si l'utilisateur <tt>pseudo</tt> n'est
* pas connecté.
* @throws InformationAccessException si l'accès à l'information échoue.
*/
public boolean getAwayState(String pseudo) throws UnknownUserException,
NotConnectedException, InformationAccessException
{
boolean away = true;
// Définition de la requête à envoyer
String query = "SELECT away FROM users WHERE pseudo = '" + pseudo
+ "';";
// Envoi de la requête et traitement du résultat
try
{
ResultSet rs = this.statement.executeQuery(query);
// Une table résultat vide indique que le pseudonyme est inconnu
if (!(rs.absolute(1)))
throw new UnknownUserException();
// Obtention de l'état de présence
away = rs.getBoolean("away");
}
catch (SQLException e)
{
throw new InformationAccessException();
}
return away;
}
/**
* Modification de l'état de présence d'un utilisateur connecté.
*
* @param pseudo le pseudonyme de l'utilisateur.
* @param away le nouvel état de présence.
* @throws UnknownUserException si le pseudonyme ne désigne pas un
* utilisateur connu.
* @throws NotConnectedException si l'utilisateur <tt>pseudo</tt> n'est
* pas connecté.
* @throws InformationAccessException si l'accès à l'information échoue.
*/
public void setAwayState(String pseudo, boolean away)
throws UnknownUserException, NotConnectedException,
InformationAccessException
{
// Vérification de l'état de connexion du client
if (!(this.getConnectionState(pseudo)))
throw new NotConnectedException();
// Définition de la requête à envoyer
String query = "UPDATE users SET away = '" + away
+ "' WHERE pseudo = '" + pseudo + "';";
// Envoi de la requête et traitement du résultat
try
{
this.statement.executeUpdate(query);
}
catch (SQLException e)
{
throw new InformationAccessException();
}
}
/**
* Obtention de l'état de connexion d'un utilisateur.
*
* @param pseudo le pseudonyme de l'utilisateur.
* @return <tt>true</tt> si l'utilisateur <tt>pseudo</tt> est connecté,
* <tt>false</tt> sinon.
* @throws UnknownUserException si le pseudonyme ne désigne pas un
* utilisateur connu.
* @throws InformationAccessException si l'accès à l'information échoue.
*/
public boolean getConnectionState(String pseudo)
throws UnknownUserException, InformationAccessException
{
boolean connected = true;
// Définition de la requête à envoyer
String query = "SELECT connected FROM users WHERE pseudo = '" + pseudo
+ "';";
// Envoi de la requête et traitement du résultat
try
{
ResultSet rs = this.statement.executeQuery(query);
// Une table résultat vide indique que le pseudonyme est inconnu
if (!(rs.absolute(1)))
throw new UnknownUserException();
// Obtention de l'état de connexion
connected = rs.getBoolean("connected");
}
catch (SQLException e)
{
throw new InformationAccessException();
}
return connected;
}
/**
* Modification de l'état de connexion d'un utilisateur.
*
* @param pseudo le pseudonyme de l'utilisateur.
* @param connected le nouvel état de connexion.
* @throws UnknownUserException si le pseudonyme ne désigne pas un
* utilisateur connu.
* @throws InformationAccessException si l'accès à l'information échoue.
*/
public void setConnectionState(String pseudo, boolean connected)
throws UnknownUserException, InformationAccessException
{
// Vérification de la validité du pseudonyme
String query0 = "SELECT * FROM users WHERE pseudo = '" + pseudo + "';";
// Envoi de la requête et traitement du résultat
try
{
ResultSet rs = this.statement.executeQuery(query0);
// Une table résultat vide indique que le pseudonyme est inconnu
if (!(rs.absolute(1)))
throw new UnknownUserException();
}
catch (SQLException e)
{
throw new InformationAccessException();
}
// Définition de la requête à envoyer
String query = "UPDATE users SET connected = '" + connected
+ "' WHERE pseudo = '" + pseudo + "';";
// Envoi de la requête et traitement du résultat
try
{
this.statement.executeUpdate(query);
}
catch (SQLException e)
{
throw new InformationAccessException();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -