BenutzerBearbeiter.java
001 /*
002  * Created on 17.04.2004
003  */
004 package de.fub.tip.datenbank.logik;
005 
006 import java.sql.Connection;
007 import java.sql.PreparedStatement;
008 import java.sql.ResultSet;
009 import java.sql.SQLException;
010 import java.sql.Statement;
011 
012 import javax.sql.DataSource;
013 
014 import org.apache.log4j.Logger;
015 
016 import de.fub.tip.datenanzeige.ormapper.UserdataVO;
017 import de.fub.tip.datenbank.factory.LogicObject;
018 import de.fub.tip.exceptions.AmbiguousUsernameException;
019 
020 /**
021  * Sinn: stellt die Logik zur Bearbeitung eines Benutzers zur Verfügung. <br>
022  * Das sind Funktionen zum: <br>
023  <ol>
024  <li>Anlegen eines neuen Benutzers</li>
025  <li></li>
026  <li></li>
027  <li></li>
028  </ol>
029  
030  @author hirsch, 17.04.2004
031  @version 2004-05-01
032  * $Id: BenutzerBearbeiter.java,v 1.5 2004/05/01 14:37:36 hirsch Exp $
033  */
034 public class BenutzerBearbeiter implements LogicObject {
035   /** Logger zur Fehlersuche */
036   private static Logger logger = 
037       Logger.getLogger(BenutzerBearbeiter .class);
038   /** Datenquelle mit der der <code>BenutzerBearbeiter</code> arbeitet */
039   private DataSource datasource = null;
040 
041   /**
042    * Standardkonstruktor, der einen BenutzerBearbeiter erzeugt  
043    @param datasource Datenquelle
044    */
045   public BenutzerBearbeiter (DataSource datasource) {
046     this.datasource = datasource;
047     logger.info("BenutzerBearbeiter initialized.");
048   // end of Konstruktor
049   
050   /**
051    * erzeugt einen Benutzer in der Datenbank mit den übergebenen Daten
052    
053    @param benutzer - aus der VIEW erhaltene Logindaten des neuen Benutzers
054    
055    @return UserdataVO des angelegt Benutzers 
056    * (damit man in der GUI eine Bestätigung anzeigen kann)
057    
058    @throws SQLException - falls irgendwas schiefgeht.
059    @throws AmbiguousUsernameException - wenn der 
060    */
061   public UserdataVO createUser(UserdataVO benutzer
062       throws SQLException, AmbiguousUsernameException {
063 
064       // SQL-Statements
065       String usernameCheck = "SELECT udid FROM userdata " +
066           "WHERE lower(login) = lower(?) ";
067       String insertUser = "INSERT INTO userdata " +
068     "(name, last_name, login, passwort) VALUES (?, ?, ?, ?) ";
069       String createProfile = "INSERT INTO profile " +
070     "(udid) VALUES ( ? ) ";
071       String getResult = "SELECT * " +
072     "FROM userdata where lower(login) = lower( ? ) ";
073 
074       UserdataVO ergebnis = null;
075       Statement stat = null;      
076       Connection con = null;
077 
078       try {
079         con = this.datasource.getConnection();
080       stat = con.createStatement();
081       
082       // Benutzernamen überprüfen
083       PreparedStatement prepStatement = 
084           con.prepareStatement(usernameCheck);
085       prepStatement.setString(1, benutzer.getLogin());
086       ResultSet rs = prepStatement.executeQuery();
087   
088       // Wenn hier keine Daten gefunden werden, wird der Benutzer angelegt
089       ifrs != null && !rs.next()) {
090   
091           logger.debug("Transaktion anfangen ...");
092         con.setAutoCommit(false);
093         stat.execute("BEGIN WORK");
094           logger.debug("BenutzerBearbeiter.createUser(): LoginName okay, "+
095               "füge neuen Benutzer hinzu");
096   
097         prepStatement = con.prepareStatement(insertUser);
098         prepStatement.setString(1, benutzer.getName());
099         prepStatement.setString(2, benutzer.getLast_name());
100         prepStatement.setString(3, benutzer.getLogin());
101         prepStatement.setString(4, benutzer.getPasswort());
102   
103         logger.debug("BenutzerBearbeiter.createUser(): " 
104                 prepStatement.executeUpdate() " Benutzer hinzugefügt");
105         
106         // Als Ergebnis den angelegten Benutzer zurückgeben
107         prepStatement = con.prepareStatement(getResult);
108         prepStatement.setString(1, benutzer.getLogin());
109         rs = prepStatement.executeQuery();
110   
111         ifrs != null && rs.next()) {
112            ergebnis = new UserdataVO();
113            ergebnis.setAnmeldedatum(rs.getDate("anmeldedatum").toString());
114            ergebnis.setId(new Integer(rs.getInt("udid")));
115            ergebnis.setLast_name(rs.getString("last_name"));
116            ergebnis.setLogin(rs.getString("login"));
117            ergebnis.setName(rs.getString("name"));
118            // Passwort kriegt aus Sicherheitsgründen einen Dummywert!
119            ergebnis.setPasswort("invisibleHere");
120            logger.debug("BenutzerBearbeiter.createUser(): " +
121                "Ergebnis gelesen und gespeichert.");
122            
123            // Erzeugen eines Profils für den Benutzer
124            prepStatement = con.prepareStatement(createProfile);
125            prepStatement.setString(1, ergebnis.getId().toString());
126            logger.debug(prepStatement.executeUpdate() 
127                "Profile angelegt");
128         // end if
129   
130         // Transaktion beenden
131         logger.debug("COMMIT machen ...");
132         stat.execute("COMMIT");
133       // end if
134     catch (SQLException e) {
135       logger.error(
136             "BenutzerBearbeiter.createUser(): Fehler - "+
137             e + ", "+ e.getLocalizedMessage());
138       
139       try {
140         logger.error("BenutzerBearbeiter.createUser():" +
141           "ROLLBACK gemacht!");
142         stat.execute("ROLLBACK");
143       catch (SQLException e1) {
144         logger.error("BenutzerBearbeiter.createUser():" +
145           "-SQLException: " +
146           "verschachtelte Ausnahme beim ROLLBACK aufgetreten!");
147       // end of try
148       
149       // wenn es zu einem Datenbankfehler kam, 
150       // wird dieser nach draussen gegeben!
151       throw new SQLException(
152               "Fehler beim Anlegen eines neuen Benutzers oder Profils");
153     // end of try
154     
155     // Datenbankverbindung immer korrekt schliessen
156     finally {
157        try {
158         if(con!=nullcon.close();
159         logger.debug("BenutzerBearbeiter.createUser(): " +
160           "DB-Con geschlossen.");
161       catch (SQLException e1) {
162         logger.error("BenutzerBearbeiter.createUser():  " + e1 + ", " +
163                 e1.getLocalizedMessage());
164       // end of catch
165     // end of finally
166 
167     if ergebnis!= null) {
168       logger.info("BenutzerBearbeiter.createUser() erfolgreich beendet.");
169         return ergebnis;
170     }   else  {
171         logger.debug("BenutzerBearbeiter.createUser(): " +
172             "Loginname ungültig");
173         throw new AmbiguousUsernameException(
174             "BenutzerBearbeiter.createUser(): " +
175             "User konnte nicht eingefügt werden (Prozedurende)");
176     // end if
177   // end of createUser
178 // end of class