View Javadoc

1   package de.tivsource.page.user.actions.event;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   import java.io.UnsupportedEncodingException;
6   import java.net.URL;
7   import java.text.SimpleDateFormat;
8   import java.util.ArrayList;
9   import java.util.Calendar;
10  import java.util.Date;
11  import java.util.List;
12  import java.util.Properties;
13  import java.util.UUID;
14  
15  import javax.mail.MessagingException;
16  import javax.mail.PasswordAuthentication;
17  import javax.mail.Session;
18  
19  import org.apache.logging.log4j.LogManager;
20  import org.apache.logging.log4j.Logger;
21  import org.apache.struts2.ServletActionContext;
22  import org.apache.struts2.convention.annotation.Action;
23  import org.apache.struts2.convention.annotation.Actions;
24  import org.apache.struts2.convention.annotation.Result;
25  import org.apache.struts2.tiles.annotation.TilesDefinition;
26  import org.apache.struts2.tiles.annotation.TilesDefinitions;
27  import org.apache.struts2.tiles.annotation.TilesPutAttribute;
28  
29  import de.tivsource.ejb3plugin.InjectEJB;
30  import de.tivsource.page.dao.event.EventDaoLocal;
31  import de.tivsource.page.dao.page.PageDaoLocal;
32  import de.tivsource.page.dao.property.PropertyDaoLocal;
33  import de.tivsource.page.dao.reservation.ReservationDaoLocal;
34  import de.tivsource.page.entity.enumeration.Language;
35  import de.tivsource.page.entity.event.Event;
36  import de.tivsource.page.entity.page.Page;
37  import de.tivsource.page.entity.reservation.Reservation;
38  import de.tivsource.page.enumeration.Origin;
39  import de.tivsource.page.helper.EmailSender;
40  import de.tivsource.page.helper.EmailTemplate;
41  import de.tivsource.page.user.actions.EmptyAction;
42  
43  /**
44   * 
45   * @author Marc Michele
46   *
47   */
48  @TilesDefinitions({
49    @TilesDefinition(name="event", extend = "userTemplate", putAttributes = {
50      @TilesPutAttribute(name = "meta",    value = "/WEB-INF/tiles/active/meta/event.jsp"),
51      @TilesPutAttribute(name = "twitter", value = "/WEB-INF/tiles/active/twitter/event.jsp"),
52      @TilesPutAttribute(name = "content", value = "/WEB-INF/tiles/active/view/event/event.jsp")
53    }),
54    @TilesDefinition(name="eventSuccess", extend = "userTemplate", putAttributes = {
55      @TilesPutAttribute(name = "meta",     value = "/WEB-INF/tiles/active/meta/event.jsp"),
56      @TilesPutAttribute(name = "twitter",  value = "/WEB-INF/tiles/active/twitter/event.jsp"),
57      @TilesPutAttribute(name = "content",  value = "/WEB-INF/tiles/active/view/event/event_success.jsp"),
58      @TilesPutAttribute(name = "tracking", value = "/WEB-INF/tiles/active/tracking/event_success.jsp")
59    }),
60    @TilesDefinition(name="eventDeadline", extend = "userTemplate", putAttributes = {
61      @TilesPutAttribute(name = "meta",    value = "/WEB-INF/tiles/active/meta/event.jsp"),
62      @TilesPutAttribute(name = "twitter", value = "/WEB-INF/tiles/active/twitter/event.jsp"),
63      @TilesPutAttribute(name = "content", value = "/WEB-INF/tiles/active/view/event/event_deadline.jsp")
64    })
65  })
66  public class ReservationAction extends EmptyAction {
67  
68      /**
69       * Serial Version UID.
70       */
71      private static final long serialVersionUID = 6904998219814327383L;
72  
73      /**
74  	 * Statischer Logger der Klasse.
75  	 */
76      private static final Logger LOGGER = LogManager.getLogger(ReservationAction.class);
77  
78      @InjectEJB(name="PageDao")
79      private PageDaoLocal pageDaoLocal;
80  
81      @InjectEJB(name="PropertyDao")
82      private PropertyDaoLocal propertyDaoLocal;
83  
84      @InjectEJB(name="ReservationDao")
85      private ReservationDaoLocal reservationDaoLocal;
86  
87      @InjectEJB(name="EventDao")
88      private EventDaoLocal eventDaoLocal;
89  
90  	private Reservation reservation;
91  
92  	private Page page;
93  
94  	private Event event;
95  	
96      public Reservation getReservation() {
97          return reservation;
98      }
99  
100     public void setReservation(Reservation reservation) {
101         this.reservation = reservation;
102     }
103 
104     public Event getEvent() {
105         setUpEvent();
106         return event;
107     }
108 
109     @Override
110     public Page getPage() {
111         if(page == null) {
112             setUpPage();
113         }
114         return page;
115     }// Ende getPage()
116 
117     public List<Date> getTimes() {
118         LOGGER.info("getTimes() aufgerufen.");
119         setUpEvent();
120 
121         List<Date> times = new ArrayList<Date>();
122 
123         // Anfangs Punkt der Zeitreihe
124         Calendar calendarStart = Calendar.getInstance();
125         calendarStart.setTime(event.getBeginning());
126         times.add(calendarStart.getTime());
127                 
128         // Endpunkt der Zeitreihe 
129         Calendar calendar = Calendar.getInstance();
130         calendar.setTime(event.getEnding());
131         calendar.add(Calendar.MINUTE, -30);
132         Date end = calendar.getTime();
133 
134         // Datum mit dem gerechnet wird
135         Date time = event.getBeginning();
136         while (time.before(end)) {
137             Calendar calendarTime = Calendar.getInstance();
138             calendarTime.setTime(time);
139             calendarTime.add(Calendar.MINUTE, 15);
140             time = calendarTime.getTime();
141             times.add(time);
142         }
143 
144         LOGGER.info("inhalt der Liste: " + times.size());
145 
146         return times;
147     }
148     
149     @Actions({
150         @Action(
151         		value = "reserve", 
152         		results = { 
153         				@Result(name = "success",  type = "tiles", location = "eventSuccess"), 
154         				@Result(name = "input",    type = "tiles", location = "event"),
155         				@Result(name = "deadline", type = "tiles", location = "eventDeadline"),
156         				@Result(name = "error",    type = "redirectAction", location = "index.html", params={"namespace", "/"})
157         				}
158         )
159     })
160 	public String execute() {
161         LOGGER.info("execute() aufgerufen.");
162 
163         // Hole Eigenschaft aus der Datenbank
164         boolean moduleEnabled = propertyDaoLocal.findByKey("module.event").getValue().equals("true") ? true : false;
165 
166         // Prüfe ob das Module aktiviert ist
167         if(moduleEnabled) {
168             // Hole Action Locale
169             this.getLanguageFromActionContext();
170             // Hole Event aus der Datenbank
171             setUpEvent();
172             // Setze Daten in ein Page Objekt.
173             setUpPage();
174 
175             // Erzeuge aktuelles Datum
176             Date now = new Date();
177 
178             // Überprüfe ob noch eine Reservierung möglich ist.
179             if(event.getDeadline().after(now)) {
180 
181                 // Speichere Message Objekt
182                 String remoteAddress = ServletActionContext.getRequest().getRemoteAddr();
183                 reservation.setUuid(UUID.randomUUID().toString());
184                 reservation.setConfirmed(false);
185                 reservation.setCreatedAddress(remoteAddress);
186                 reservation.setCreated(new Date());
187                 reservation.setModified(new Date());
188                 reservation.setModifiedAddress(remoteAddress);
189                 reservation.setModifiedBy(reservation.getFirstname() + " " + reservation.getLastname());
190                 reservation.setOrigin(Origin.WEBSITE);
191                 reservationDaoLocal.merge(reservation);
192 
193                 sendMail();
194 
195                 return SUCCESS;
196             } else if (event.getBeginning().before(now)) {
197                 return ERROR;
198             } else {
199                 return "deadline";
200             }
201 
202         } else {
203             // Wenn das Module nicht aktviert wurde.
204             return ERROR;
205         }
206 
207 	}// Ende execute()
208 
209     private void setUpPage() {
210         if(event == null) {
211             event = eventDaoLocal.findByUuid(reservation.getEvent().getUuid());
212         }
213         LOGGER.info("Action Errors: " + this.getFieldErrors().size());
214         if(this.getFieldErrors().size() > 0) {
215             page = new Page();
216             page.setTechnical(event.getName(Language.DE));
217             page.setDescriptionMap(event.getDescriptionMap());
218             page.setPicture(event.getPicture());
219             page.setPictureOnPage(event.getPictureOnPage());
220             page.setCssGroup(event.getCssGroup());
221         } else {
222             page = new Page();
223             page.setTechnical(event.getName(Language.DE));
224             page.setDescriptionMap(event.getDescriptionMap());
225             page.getDescriptionMap().get(Language.DE).setName("Reservierung erfolgreich - " + event.getLocation().getName(Language.DE) + " - " + page.getDescriptionMap().get(Language.DE).getName());
226             // TODO: Hier müsste das noch lokalisiert werden
227             page.getDescriptionMap().get(Language.EN).setName("Reservierung erfolgreich - " + event.getLocation().getName(Language.EN) + " - " + page.getDescriptionMap().get(Language.EN).getName());
228             page.setPicture(event.getPicture());
229             page.setPictureOnPage(event.getPictureOnPage());
230             page.setCssGroup(event.getCssGroup());
231         }
232     }
233 
234     private void setUpEvent() {
235         if(event == null) {
236             event = eventDaoLocal.findByUuid(reservation.getEvent().getUuid());
237         }
238     }
239 
240 
241     private void sendMail() {
242         LOGGER.info("sendMail() aufgerufen.");
243         
244         // Datums Formatierung
245         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd-MM-yyyy ");
246         
247         javax.mail.Authenticator auth = new javax.mail.Authenticator() {
248             @Override
249             public PasswordAuthentication getPasswordAuthentication() {
250                 return new PasswordAuthentication(
251                         propertyDaoLocal.findByKey("mail.user").getValue(),
252                         propertyDaoLocal.findByKey("mail.password").getValue());
253             }
254         };
255         
256         InputStream template;
257 
258         try {
259             URL templatePath = new URL(propertyDaoLocal.findByKey("reservation.template.path").getValue());
260             LOGGER.info("Pfad zur template Datei: " + templatePath);
261             template = templatePath.openStream();
262             LOGGER.info("Template eingelesen");
263             Object notification = EmailTemplate.getEmailTemplate(template);
264             LOGGER.info("Template eingelesen");
265 
266             // Get session
267             Session session = Session.getInstance(getProperties(), auth);
268             session.setDebug(false);
269             
270             EmailSender sendIt = new EmailSender();
271             String[] argu = {
272                     reservation.getGender() ? "Frau" : "Herr",
273                     reservation.getFirstname(), 
274                     reservation.getLastname(), 
275                     reservation.getEmail(), 
276                     reservation.getTelephone(),
277                     reservation.getEvent().getName("de") + " im " + reservation.getEvent().getLocation().getName("de"),
278                     simpleDateFormat.format(reservation.getTime()),
279                     reservation.getQuantity().toString(),
280                     reservation.getWishes(),
281                     reservation.getWishes().replace("\n", "<br/>")
282                     };
283 
284             new Thread(new Runnable() {
285                 public void run(){
286                     try {
287                         sendIt.send("Reservierungsformular", (EmailTemplate)notification, argu, session);
288                     } catch (UnsupportedEncodingException | MessagingException e) {
289                         // TODO Auto-generated catch block
290                         e.printStackTrace();
291                     }
292                     return; // to stop the thread
293                 }
294             }).start();
295 
296         } catch (UnsupportedEncodingException e) {
297             e.printStackTrace();
298         } catch (IOException e) {
299             // TODO Auto-generated catch block
300             e.printStackTrace();
301         }
302          
303         
304     }// Ende sendMail()
305 
306     private Properties getProperties() {
307         LOGGER.info("getProperties() aufgerufen.");
308 
309         // Get system properties
310         Properties props = System.getProperties();
311 
312         // Setup mail server
313         props.put("mail.transport.protocol", 
314                 propertyDaoLocal.findByKey("mail.transport.protocol").getValue());
315         props.put("mail.host", 
316                 propertyDaoLocal.findByKey("mail.host").getValue());
317         props.put("mail.smtp.auth", 
318                 propertyDaoLocal.findByKey("mail.smtp.auth").getValue());
319         props.put("mail.smtp.tls", 
320                 propertyDaoLocal.findByKey("mail.smtp.tls").getValue());
321         props.put("mail.smtp.starttls.enable", 
322                 "true");
323         props.put("mail.smtp.localhost", 
324                 propertyDaoLocal.findByKey("mail.smtp.localhost").getValue());
325         props.put("mail.user", 
326                 propertyDaoLocal.findByKey("mail.user").getValue());
327         props.put("mail.password", 
328                 propertyDaoLocal.findByKey("mail.password").getValue());
329         props.put("mail.mime.charset", 
330                 propertyDaoLocal.findByKey("mail.mime.charset").getValue());
331         props.put("mail.use8bit", 
332                 propertyDaoLocal.findByKey("mail.use8bit").getValue());
333         
334         return props;
335     } // Ende getProperties()
336 
337 }// Ende class