// © 2014 by IT-Power GmbH (http://www.it-power.org)
package de.knurt.fam.core.util.booking;
import java.util.Observable;
import java.util.Observer;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.MultiPartEmail;
import de.knurt.fam.core.aspects.logging.FamLog;
import de.knurt.fam.core.model.config.BookingRule;
import de.knurt.fam.core.model.persist.booking.Booking;
import de.knurt.fam.core.model.persist.booking.QueueBooking;
import de.knurt.fam.core.util.mail.UserMailSender;
/**
* observe bookings dao and send mail on bookings to configured e-mail addresses to inform about new bookings.
*
* @see BookingRule#getExtraMailsOnBooking()
* @see Booking#hasJustBeenInserted()
*
* @author daniel.oltmanns@it-power.org
* @since 03/24/2014
*/
public class SendExtraMailObserver implements Observer {
private String from = "noreply@facility-access-manager.com";
public SendExtraMailObserver(String from) {
this.from = from;
}
public void setObservable(Observable observable) {
observable.addObserver(this);
}
private Email getEMail(String to, Booking booking) {
// email message
MultiPartEmail email = new MultiPartEmail();
try {
// basics
email.addTo(to);
email.setFrom(this.from);
email.setSubject("A new booking for \"" + booking.getFacility().getLabel() + "\""); // INTLANG
String message = booking.getUsername() + " booked it on " + booking.getSeton(); // INTLANG
if (booking.isTimeBased()) {
message += " for " + booking.getSessionTimeFrame(); // INTLANG
} else { // queue besed
message += " at the current queue position " + ((QueueBooking) booking).getCurrentQueuePosition(); // INTLANG
}
email.setMsg(message);
} catch (EmailException e) {
FamLog.exception(e, 201403240938l);
email = null;
}
return email;
}
@Override
public void update(Observable arg0, Object booking) {
if (this.isBooking(booking)) {
Booking b = (Booking) booking;
if (b.hasJustBeenInserted() && !b.hasJustBeenUpdated()) {
this.internUpdate(b);
}
}
}
private void internUpdate(Booking b) {
String[] extraEmailsOnBooking = b.getFacility().getBookingRule().getExtraMailsOnBooking();
for (String extraEmailOnBooking : extraEmailsOnBooking) {
Email mail = this.getEMail(extraEmailOnBooking, b);
UserMailSender.sendWithoutUserBox(mail);
}
}
private boolean isBooking(Object booking) {
Booking b = null;
try {
b = (Booking) booking;
} catch (Exception e) {
}
return b != null;
}
}