LoginAction.java
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 = (LoginActionFormactionForm;
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() ) {
089       err = new ActionError("errors.username.required");
090       errors.add("username", err);
091     // end if username
092     
093     if password == null || password.length() ) {
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     ifname == null || name.length() ) {
111       // Koordinaten einzeln prüfen
112       if koordX == null || koordX.length() ) {
113         errors.add("xkoord", err);
114         koordinatenEingegeben = false;        
115       // end if koordX
116 
117       if koordY== null || koordY.length() ) { 
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() )
124           && koordY == null || koordY.length() ) ) {
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() 
132           || koordY == null || koordY.length() ) ) {
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