001 /*
002 * Created on 24.02.2004
003 */
004 package de.fub.tip.actions;
005
006 import java.sql.SQLException;
007
008 import javax.servlet.http.HttpServletRequest;
009 import javax.servlet.http.HttpServletResponse;
010 import javax.servlet.http.HttpSession;
011 import javax.sql.DataSource;
012
013 import org.apache.log4j.Logger;
014 import org.apache.struts.action.Action;
015 import org.apache.struts.action.ActionError;
016 import org.apache.struts.action.ActionErrors;
017 import org.apache.struts.action.ActionForm;
018 import org.apache.struts.action.ActionForward;
019 import org.apache.struts.action.ActionMapping;
020 import org.apache.struts.action.ActionMessage;
021 import org.apache.struts.action.ActionMessages;
022
023 import de.fub.tip.actionforms.LoginActionForm;
024 import de.fub.tip.datenanzeige.ormapper.LocationVO;
025 import de.fub.tip.datenanzeige.ormapper.UserdataVO;
026 import de.fub.tip.datenbank.factory.LoginPrueferFactory;
027 import de.fub.tip.datenbank.factory.StandortPrueferFactory;
028 import de.fub.tip.datenbank.logik.LoginPruefer;
029 import de.fub.tip.datenbank.logik.StandortPruefer;
030 import de.fub.tip.exceptions.AmbiguousLocationException;
031 import de.fub.tip.exceptions.InvalidLocationException;
032 import de.fub.tip.exceptions.UserNotFoundException;
033
034 /**
035 * Sinn: Login eines bestehenden Users mit Positionsangabe und<br>
036 * Prüfung der Benutzerdaten durch Datenbankabgleich durchführen
037 *
038 * @author hirsch, 24.02.2004
039 * @version 2004-04-05
040 * $Id: LoginAction.java,v 1.36 2004/05/03 08:30:43 hirsch Exp $
041 *
042 * @see de.fub.tip.datenbank.logik.LoginPruefer
043 */
044 public class LoginAction extends Action {
045 /** Logger zur Fehlersuche */
046 private static Logger logger = Logger.getLogger(LoginAction.class);
047
048 /**
049 * führt die Anmeldung aus
050 *
051 * @param actionMapping ActionMapping
052 * @param actionForm zugehörige ActionForm
053 * @param request der aktuelle Request
054 * @param response ServletResponse
055 *
056 * @return ActionForward nächstes Ziel
057 */
058 public ActionForward execute(ActionMapping actionMapping,
059 ActionForm actionForm, HttpServletRequest request,
060 HttpServletResponse response ) {
061
062 logger.info("LoginAction.execute() called.");
063
064 // Variablen zum Zwischenspeichern
065 UserdataVO user = null;
066 LocationVO loc = null;
067 DataSource dataSource = null;
068 LoginPruefer lp = null;
069 StandortPruefer sp = null;
070 HttpSession session = null;
071 ActionErrors errors = new ActionErrors();
072 // Damit man nicht immer new ActionError() sagt,
073 // wird ein err benutzt! Performanz sollte besser sein!
074 ActionError err = null;
075
076 // Daten aus Form extrahieren
077 LoginActionForm form = (LoginActionForm) actionForm;
078 String username = form.getUsername();
079 String password = form.getPassword();
080 String name = form.getName();
081 String koordX = form.getXkoord();
082 String koordY = form.getYkoord();
083 // Logik zur Unterscheidung der Ortsdatenprüfung
084 boolean koordinatenEingegeben = true;
085
086 // syntaktische Prüfung -
087 // kein else if, damit alle Fehler in einem Abwasch angezeigt werden
088 if ( username == null || username.length() < 1 ) {
089 err = new ActionError("errors.username.required");
090 errors.add("username", err);
091 } // end if username
092
093 if ( password == null || password.length() < 1 ) {
094 err = new ActionError("errors.password.required");
095 errors.add("password", err);
096 } // end if password
097
098 // wenn Formfehler auftraten -> zurückgehen
099 if ( !errors.isEmpty()) {
100 logger.error("LoginAction - StrutsRahmenwerk hat " +
101 "nicht korrekt validiert! Es sind noch Fehler in der Eingabe");
102 this.saveErrors(request, errors);
103 return actionMapping.getInputForward();
104 } // end if
105
106 // Ortsangaben einzeln prüfen
107 err = new ActionError("errors.position.required");
108
109 // Fall1: Name ist leer -> dann prüfen, ob Koordinaten okay sind
110 if( name == null || name.length() < 1 ) {
111 // Koordinaten einzeln prüfen
112 if ( koordX == null || koordX.length() < 1 ) {
113 errors.add("xkoord", err);
114 koordinatenEingegeben = false;
115 } // end if koordX
116
117 if ( koordY== null || koordY.length() < 1 ) {
118 errors.add("ykoord", err);
119 koordinatenEingegeben = false;
120 } // end if ykoord
121
122 // Wenn Koordinaten leer sind, muss Name da sein, sonst Fehler
123 if ( (koordX == null || koordX.length() < 1 )
124 && ( koordY == null || koordY.length() < 1 ) ) {
125 // jetzt wurde wirklich nix angegeben!
126 errors.add("name", err);
127 } // end if
128 } else {
129 // Name ist definitiv angegeben
130 // jetzt prüfen, ob NUR der Name oder auch die Koordinaten da sind
131 if ( (koordX == null || koordX.length() < 1 )
132 || ( koordY == null || koordY.length() < 1 ) ) {
133 // Fall 1) Koordinaten sind nicht da
134 koordinatenEingegeben = false;
135 } else {
136 // Fall 2) Koordinaten sind beide da
137 koordinatenEingegeben = true;
138 } // end if
139 } // end if name
140
141 // semantische Prüfung mit Ausnahmebehandlung
142 // durch STRUTS-Weiterleitungen
143
144 // 1. Prüfung der Logindaten!
145 // Pool braucht
146 // * commons-collections.jar
147 // * commons-pool.jar
148 // * commons-dbcp.jar
149 // * the classes for your (underlying) JDBC driver
150 try {
151 dataSource = this.getDataSource(request, "tip");
152
153 lp = ((LoginPruefer)
154 LoginPrueferFactory.getInstance(dataSource).getLogicObject());
155 user = lp.checkValidUser(username, password);
156
157 } catch (SQLException e) {
158 // spezielles DbProblem
159 logger.error("LoginAction.execute(): " +
160 "Datenbankverbindungsfehler: "+e + e.getMessage());
161
162 return actionMapping.findForward("dbproblem");
163 } catch (UserNotFoundException e) {
164 // falsche Anmeldung
165 logger.error("LoginAction.execute(): UngültigeAnmeldung" +
166 e.getMessage());
167
168 err = new ActionError("errors.anmeldung");
169 errors.add("username", err);
170 err = new ActionError("errors.anmeldung");
171 errors.add("password", err);
172 this.saveErrors(request, errors);
173
174 return actionMapping.getInputForward();
175
176 } catch(Exception ee) {
177 logger.error("LoginAction.execute(): " +
178 "Fehler während der Prüfung : "+ee + ", "+ ee.getMessage());
179
180 return actionMapping.findForward("dbproblem");
181 } // end of catch
182
183 // 2.Prüfung der eingegebenen Koordinaten
184 sp = ( (StandortPruefer)
185 (StandortPrueferFactory.getInstance(dataSource).getLogicObject()));
186
187 try {
188 // Koordinaten eingegeben
189 if ( koordinatenEingegeben ) {
190 loc = sp.checkValidLocation(koordX, koordY);
191 } else {
192 // Name eingegeben
193 loc = sp.checkValidLocation(name);
194 } // end if
195
196 // Logging des Besuchs
197 sp.protokolliereBesuch(loc, user);
198
199 } catch (InvalidLocationException e1) {
200 logger.error("LoginAction.execute() - " +
201 "KoordinatenÜberprüfung fehlgeschlagen: "+e1.getMessage());
202
203 err = new ActionError("errors.position.x.invalid");
204 errors.add("xkoord", err);
205 err = new ActionError("errors.position.y.invalid");
206 errors.add("ykoord", err);
207 err = new ActionError("errors.position.name.invalid");
208 errors.add("name", err);
209
210 this.saveErrors(request, errors);
211 return actionMapping.getInputForward();
212
213 } catch (AmbiguousLocationException e) {
214 logger.error("LoginAction.execute() - " +
215 "Name mehrdeutig: "+e.getMessage());
216
217 err = new ActionError("errors.position.name.ambiguous");
218 errors.add("name", err);
219
220 this.saveErrors(request, errors);
221 return actionMapping.getInputForward();
222 } // end of catch
223
224 // Weiterleitung, wenn keine Fehler waren
225 if (errors.isEmpty() && user != null) {
226 // Setzen des Parameters
227 session = request.getSession(true);
228 session.setAttribute("user", user);
229 logger.debug("Attribut user in Session gespeichert!");
230 session.setAttribute("location", loc);
231 logger.debug("Attribut location in Session gespeichert!");
232
233 // Messages zusammenbasteln zur Anzeige
234 ActionMessages messages = new ActionMessages();
235 ActionMessage msg = new ActionMessage("status.welcomeLong",
236 user.getName(), user.getLast_name());
237 messages.add("welcomeLong", msg);
238
239 // zur späteren Verwendung in der GUI einige Nachrichten speichern,
240 // die die Benutzerinformationen enthalten.
241 msg = new ActionMessage("status.welcomeShort",
242 user.getName());
243 messages.add("welcomeShort", msg);
244
245 msg = new ActionMessage("status.login", user.getLogin());
246 messages.add("login", msg);
247
248 msg = new ActionMessage("status.since",
249 user.getAnmeldedatum());
250 messages.add("since", msg);
251
252 msg = new ActionMessage("status.position",
253 String.valueOf(loc.getLocation().getX()),
254 String.valueOf(loc.getLocation().getY()));
255 messages.add("position", msg);
256
257 saveMessages(request, messages);
258
259 return actionMapping.findForward("success");
260
261 } else {
262 // Fehlermitteilungen speichern
263 this.saveErrors(request, errors);
264 return actionMapping.getInputForward();
265 } // end weiterleitungs-if
266 } // end of execute
267 } // end of LoginAction
|