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
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
70
71 private static final long serialVersionUID = 6904998219814327383L;
72
73
74
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 }
116
117 public List<Date> getTimes() {
118 LOGGER.info("getTimes() aufgerufen.");
119 setUpEvent();
120
121 List<Date> times = new ArrayList<Date>();
122
123
124 Calendar calendarStart = Calendar.getInstance();
125 calendarStart.setTime(event.getBeginning());
126 times.add(calendarStart.getTime());
127
128
129 Calendar calendar = Calendar.getInstance();
130 calendar.setTime(event.getEnding());
131 calendar.add(Calendar.MINUTE, -30);
132 Date end = calendar.getTime();
133
134
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
164 boolean moduleEnabled = propertyDaoLocal.findByKey("module.event").getValue().equals("true") ? true : false;
165
166
167 if(moduleEnabled) {
168
169 this.getLanguageFromActionContext();
170
171 setUpEvent();
172
173 setUpPage();
174
175
176 Date now = new Date();
177
178
179 if(event.getDeadline().after(now)) {
180
181
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
204 return ERROR;
205 }
206
207 }
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
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
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
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
290 e.printStackTrace();
291 }
292 return;
293 }
294 }).start();
295
296 } catch (UnsupportedEncodingException e) {
297 e.printStackTrace();
298 } catch (IOException e) {
299
300 e.printStackTrace();
301 }
302
303
304 }
305
306 private Properties getProperties() {
307 LOGGER.info("getProperties() aufgerufen.");
308
309
310 Properties props = System.getProperties();
311
312
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 }
336
337 }