/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.profile;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Classe decrivant l'utilisateur de l'application.
*
* <p> Un fichier se trouvant dans le CLASS_PATH, nomm� "profile.properties" contient la d�finition de tous
* les profiles. Un profile est d�termin� par un ensemble de clef/valeur: ou les clefs d�finissent une action
* et les valeurs definissent un ou des groupes qui sont autoris�s pour faire l'action. </p>
*
* <p> <b>NB</b> : La localisation du fichier "profile.properties" peut etre chang�e en positionnant la
* properties system "net.codjo.profile.file" (e.g. <code>System.setProperty("net.codjo.profile.file",
* "/preferences/profileAlis.properties");</code> . Cette property doit �tre positionn�e avant le premier
* appel a getUserFor(). </p>
*
* <p> Exemple de fichier :
* <pre>
* ....
* SEE_ADMIN_MENU = Maintenance
* DELETE_QUOTATION = Maintenance, Reporting
* ...
* </pre>
* </p>
*
* <p> Exemple d'utilisation :
* <pre>
* <au d�marrage de l'application> user = User.getUserFor(con);
* ...
* if (user.isAllowedTo("SEE_ADMIN_MENU"))
* buildAdminMenu();
* </pre>
* </p>
*
* @author $Author: blazart $
* @version $Revision: 1.3 $
*/
public class User {
private static final String GET_GROUP_QUERY =
"select name from sysusers "
+ " where gid = (select gid from sysusers where uid =(select user_id())) "
+ " and uid = gid";
private Properties allProfiles = new Properties();
private String group;
private String name;
User(String name, String group) throws IOException {
if (name == null || group == null) {
throw new IllegalArgumentException();
}
this.name = name;
this.group = group;
loadAllProfiles();
}
protected User() {
}
/**
* Factory method permettant de creer l'Utilisateur attach� a cette connection.
*
* @param con une connection
*
* @return L'utilisateur
*
* @throws SQLException Impossible de d�terminer le group ou le profile
* @throws IOException Impossible de charger le profile.
*/
public static User getUserFor(Connection con)
throws SQLException, IOException {
Statement stmt = con.createStatement();
try {
ResultSet rs = stmt.executeQuery(GET_GROUP_QUERY);
if (rs.next() == false) {
throw new SQLException("La base SYBASE est incapable de "
+ "renvoyer le groupe de l'utilisateur");
}
String group = rs.getString(1);
return new User(con.getMetaData().getUserName(), group);
}
finally {
stmt.close();
}
}
/**
* Retourne le groupe de l'utilisateur.
*
* @return La valeur de group
*/
public String getGroup() {
return group;
}
/**
* Retourne le nom de l'utilisateur.
*
* @return La valeur de name
*/
public String getName() {
return name;
}
/**
* Indique si cet utilisateur a le droit de faire l'action d�crit par <code>actionKey</code>.
*
* @param actionKey Clef de l'action (e.g. DISPLAY_REPORT_WINDOW)
*
* @return <code>true</code> si cet utilisateur a le droit de faire cette action.
*/
public boolean isAllowedTo(String actionKey) {
String allowedGroups = allProfiles.getProperty(actionKey);
if (allowedGroups != null && allowedGroups.indexOf(getGroup()) >= 0) {
return true;
}
return false;
}
public String toString() {
return "Utilisateur(" + getName() + "/" + getGroup() + ")";
}
private void loadAllProfiles() throws IOException {
InputStream is =
User.class.getResourceAsStream(System.getProperty("net.codjo.profile.file",
"/profile.properties"));
try {
allProfiles.load(is);
}
finally {
is.close();
}
}
}