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 if( rs != 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 if( rs != 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!=null) con.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
|