View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   //CabaWeb
3   //Copyright (C) 2004  Thomas Vogt <Thomas.Vogt@TVC-Software.com>
4   //
5   //This library is free software; you can redistribute it and/or
6   //modify it under the terms of the GNU Lesser General Public
7   //License as published by the Free Software Foundation; either
8   //version 2.1 of the License, or (at your option) any later version.
9   //
10  //This library is distributed in the hope that it will be useful,
11  //but WITHOUT ANY WARRANTY; without even the implied warranty of
12  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  //Lesser General Public License for more details.
14  //
15  //You should have received a copy of the GNU Lesser General Public
16  //License along with this library; if not, write to the Free Software
17  //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ////////////////////////////////////////////////////////////////////////////////
19  package org.fhw.cabaweb.webfrontend.actions.save;
20  
21  import java.lang.reflect.InvocationTargetException;
22  import java.util.Collection;
23  import java.util.Iterator;
24  
25  import javax.servlet.ServletException;
26  import javax.servlet.http.HttpServletRequest;
27  import javax.servlet.http.HttpServletResponse;
28  import javax.servlet.http.HttpSession;
29  
30  import org.apache.struts.action.Action;
31  import org.apache.struts.action.ActionForm;
32  import org.apache.struts.action.ActionForward;
33  import org.apache.struts.action.ActionMapping;
34  
35  import org.apache.struts.util.MessageResources;
36  
37  import org.apache.commons.beanutils.PropertyUtils;
38  import org.apache.commons.logging.Log;
39  import org.apache.commons.logging.LogFactory;
40  
41  import org.fhw.cabaweb.data.DataInterfaceGruppenmitglieder;
42  import org.fhw.cabaweb.data.DataInterfaceProjekte;
43  import org.fhw.cabaweb.data.initialdata.ErgebnissDatenInitialisierung;
44  import org.fhw.cabaweb.data.initialdata.ProjektgruppenUndMitgliederInitialisierung;
45  import org.fhw.cabaweb.data.initialdata.ReporterzeugungenInitialisierung;
46  import org.fhw.cabaweb.data.initialdata.VoreinstellungsDatenInitialisierung;
47  
48  import org.fhw.cabaweb.ojb.dataobjects.Gruppenmitglieder;
49  import org.fhw.cabaweb.ojb.dataobjects.Projekte;
50  
51  import org.fhw.cabaweb.tools.StringUtilities;
52  import org.fhw.cabaweb.webfrontend.configs.Keys;
53  import org.fhw.cabaweb.webfrontend.forms.simple.ProjektForm;
54  
55  /***
56   * <strong>Action</strong>-Klasse f&uuml;r die Save Projekt Action .
57   * Die Controller Klasse der Struts Model View Controller Architektur.
58   *
59   * @author  <a href="mailto:thomas.vogt@tvc-software.com">Thomas Vogt</a>
60   * @version Version 1.0 03.06.2004
61   */
62  public final class SaveProjektAction extends Action {
63  
64      /***
65       * The <code>Log</code> instance for this application.
66       */
67      private Log log = LogFactory.getLog("org.fhw.cabaweb.webfrontend.actions.save");
68  
69      /***
70       * Verarbeiten der spezifizierten HTTP Anfrage und erzeugen der zugeordneten
71       * HTTP Antwort bzw. Forwarden an eine andere Web Komponente, die die Antwort 
72       * erzeugt.  
73       * 
74       * Gibt eine <code>ActionForward</code> Instanz zurück die angibt wohin und wie
75       * die Kontrolle weitergegeben werden soll. Kann auch <code>null</code> sein, 
76       * wenn die Anfrage bereits bearbeitet wurde.
77       * 
78       * @param mapping Das ActionMapping das benutzt wurde um diese Instanz zu selektieren
79       * @param form Das optionale ActionForm Bean für die Anfrage (soweit vorhanden)
80       * @param request Die HTTP Anfrage die wir gerade bearbeiten
81       * @param response The HTTP Antwort die wir erzeugen
82       *
83       * @return Die Action zu der wir weiterleiten
84       * @exception Exception wenn ein Eingabe-/Ausgabe Fehler auftritt oder eine Servlet Exception auftritt
85       *            bzw. die Business Logik einen Fehler verursacht 
86       */
87      public ActionForward execute(ActionMapping mapping,
88  				                 ActionForm form,
89                                   HttpServletRequest request,
90                                   HttpServletResponse response)
91      throws Exception {
92          /*** Forwarding Action Variable mit null initialisieren */
93  //        ActionForward forward = null;
94          /*** Die Locale Variable (Sprache, Formatierung, etc.) */
95  //        Locale locale = getLocale(request);
96  
97          /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
98          DataInterfaceProjekte dip = new DataInterfaceProjekte();
99          /*** Data Interface für Benutzer (indirekter Zugriff auf die OJB Ebene) initialisieren */
100         DataInterfaceGruppenmitglieder dig = new DataInterfaceGruppenmitglieder();
101         /*** Die Resourcen (lokalisierten Meldungen) der Anfrage holen */
102         MessageResources messages = getResources(request);
103         /*** Die Session der aktuellen Anfrage */
104         HttpSession session = request.getSession();
105         /*** Das übergebene Formular */
106         ProjektForm prjform = (ProjektForm) form;
107         /*** Die übergebene Action */
108         String action = prjform.getAction();
109 
110         /*** Zwischenspeichvaribale für den Rückgabewert */
111         boolean returnvalue = false;
112         /*** Zwischenspeichvaribale für das Projekt */
113         Projekte projekt = null;
114 
115         /*** Zwischenspeichvaribale für den Status des Benutzers (Administrator ???) */
116         boolean isAdmin = request.isUserInRole("Administrator");
117         /*** Zwischenspeichvaribale für den Status des Benutzers (Projektleiter ???) */
118         boolean isProjectleader = false;
119         /*** Zwischenspeichvaribale für den Status des Benutzers (Benutzer ???) */
120         boolean isUser = false;
121         /*** Zwischenspeichvaribale für den Namen des Benutzers */
122         String username = request.getRemoteUser();
123 
124         if(!isAdmin)
125         {
126             isProjectleader = request.isUserInRole("Projektleiter");
127         }
128         if(!isAdmin && !isProjectleader)
129         {
130             isUser = request.isUserInRole("Benutzer");
131         }
132 
133     	if (action == null) 
134     	{
135     	    action = "?";
136         }
137         
138         if (log.isDebugEnabled()) 
139         {
140             log.debug("SaveProjektAction: Processing " + action + " action");
141             if(isAdmin)
142             {
143                 log.debug(" User has Role: Administrator");
144             }
145             else if(isProjectleader)
146             {
147                 log.debug(" User has Role: Projectleader");
148             }
149             else if(isUser)
150             {
151                 log.debug(" User has Role: User");
152             }
153         }
154     
155     	// Was this transaction cancelled?
156     	if (isCancelled(request)) 
157     	{
158             if (log.isDebugEnabled()) 
159             {
160                 log.debug(" Transaction '" + action + "' was cancelled");
161             }
162             
163             session.removeAttribute(Keys.PROJEKT_KEY);
164     	    return (mapping.findForward("success"));
165     	}
166 
167         projekt = (Projekte) session.getAttribute(Keys.PROJEKT_KEY);
168 
169         if (projekt == null) 
170         {
171             if (log.isDebugEnabled()) 
172             {
173                 log.debug(" In Session saved Project is NULL.");
174             }
175             
176             projekt = new Projekte();
177         }
178 
179         // All required validations were done by the form itself
180         if (log.isDebugEnabled()) 
181         {
182             log.debug(" Populating database from form bean");
183         }
184 
185         try 
186         {
187             PropertyUtils.copyProperties(projekt, prjform);
188         } 
189         catch (InvocationTargetException e) 
190         {
191             Throwable t = e.getTargetException();
192             if (t == null)
193                 t = e;
194             log.error("Project.populate", t);
195             throw new ServletException("Project.populate", t);
196         } 
197         catch (Throwable t) 
198         {
199             log.error("Project.populate", t);
200             throw new ServletException("Project.populate", t);
201         }
202 
203         projekt.setProjektname(StringUtilities.convertUTF8String(projekt.getProjektname()));
204         
205         if ("Create".equals(action) && isAdmin) 
206         {
207             if (log.isDebugEnabled()) 
208             {
209                 log.debug("Creating a new Project");
210             }
211 
212             returnvalue = dip.erzeugen(projekt);
213             session.removeAttribute(Keys.PROJEKT_KEY);
214 
215             if (!returnvalue) 
216             {
217                 if (log.isDebugEnabled()) 
218                 {
219                     log.debug(" Project creation failed");
220                 }
221 
222                 response.sendError(HttpServletResponse.SC_BAD_REQUEST, messages.getMessage("error.project.create"));
223                 return (null);
224             }
225             else
226             {
227                 Collection projekte = dip.sucheProjektname(projekt.getProjektname());
228                 Iterator iter = projekte.iterator();
229             
230                 if (iter.hasNext())
231                 {
232                     projekt = (Projekte) iter.next();
233                 }         
234                 
235                 if (projekt == null) 
236                 {
237                     if (log.isDebugEnabled()) 
238                     {
239                         log.debug(" Project not found !?!");
240                     }
241 
242                     response.sendError(HttpServletResponse.SC_BAD_REQUEST, messages.getMessage("error.project.create"));
243                     return (null);
244                 }
245                 else
246                 {
247                     ProjektgruppenUndMitgliederInitialisierung.ProjektgruppenInitialisieren(projekt.getProjektnummer());
248                     ProjektgruppenUndMitgliederInitialisierung.GruppenmitgliederInitialisieren(projekt.getProjektnummer());
249                     ErgebnissDatenInitialisierung.ergebnissDatenInitialisieren(projekt.getProjektnummer());
250                     VoreinstellungsDatenInitialisierung.VoreinstellungsDatenInitialisieren(projekt.getProjektnummer());
251                     VoreinstellungsDatenInitialisierung.VoreinstellungenInitialisieren(projekt.getProjektnummer());
252                     ReporterzeugungenInitialisierung.ReporterzeugungenInitialisieren(projekt.getProjektnummer());
253                 }
254             }
255         }
256         
257         if (action.equals("Delete") && isAdmin) 
258         {
259             if (log.isDebugEnabled()) 
260             {
261                 log.debug(" Deleting existing Project [ " + projekt.getProjektnummer() + " ] Name: " + projekt.getProjektname());
262             }
263 
264             returnvalue = dip.loeschen(projekt);
265             session.removeAttribute(Keys.PROJEKT_KEY);
266 
267             if (!returnvalue) 
268             {
269                 if (log.isDebugEnabled()) 
270                 {
271                     log.debug(" Project deletion failed");
272                 }
273 
274                 response.sendError(HttpServletResponse.SC_BAD_REQUEST, messages.getMessage("error.project.delete"));
275                 return (null);
276             }
277         }
278         
279         if (action.equals("Edit") && (isAdmin || isProjectleader)) 
280         {
281             if (log.isDebugEnabled()) 
282             {
283                 log.debug(" Editing existing Project [ " + projekt.getProjektnummer() + " ] Name: " + projekt.getProjektname());
284             }
285 
286             Collection usernames = dig.sucheLogInName(username);
287             Iterator iter = usernames.iterator();
288             Gruppenmitglieder user = null;
289             
290             while (iter.hasNext())
291             {
292                 user = (Gruppenmitglieder) iter.next();
293             }         
294 
295             if(isProjectleader && projekt.getProjektnummer().equals(((user.getProjektgruppe()).getProjekte()).getProjektnummer()) || isAdmin)
296             {
297                 if (log.isDebugEnabled()) 
298                 {
299                     log.debug(" Project editing is being processed");
300                 }
301 
302                 returnvalue = dip.editieren(projekt);
303             }
304             else
305             {
306                 if (log.isDebugEnabled()) 
307                 {
308                     log.debug(" User not authorized to edit Project");
309                 }
310             }
311             
312             session.removeAttribute(Keys.PROJEKT_KEY);
313 
314             if (!returnvalue) 
315             {
316                 if (log.isDebugEnabled()) 
317                 {
318                     log.debug(" Project editing failed");
319                 }
320 
321                 response.sendError(HttpServletResponse.SC_BAD_REQUEST, messages.getMessage("error.project.edit"));
322                 return (null);
323             }
324         }
325     
326         // Remove the obsolete form bean and current project
327         if (mapping.getAttribute() != null) 
328         {
329             if ("request".equals(mapping.getScope()))
330                 request.removeAttribute(mapping.getAttribute());
331             else
332                 session.removeAttribute(mapping.getAttribute());
333         }
334         session.removeAttribute(Keys.PROJEKT_KEY);
335     
336         // Forward control to the specified success URI
337         if (log.isDebugEnabled()) 
338         {
339             log.debug(" Forwarding to 'success' page");
340         }
341     	return (mapping.findForward("success"));
342     }
343 }