package org.ovirt.engine.core.bll;
import java.util.List;
import org.ovirt.engine.core.common.EventNotificationMethods;
import org.ovirt.engine.core.common.action.EventSubscriptionParametesBase;
import org.ovirt.engine.core.common.businessentities.DbUser;
import org.ovirt.engine.core.common.businessentities.event_notification_methods;
import org.ovirt.engine.core.common.businessentities.event_subscriber;
import org.ovirt.engine.core.common.businessentities.tags;
import org.ovirt.engine.core.compat.Regex;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
public abstract class EventSubscriptionCommandBase<T extends EventSubscriptionParametesBase> extends
AdminOperationCommandBase<T> {
protected EventSubscriptionCommandBase(T parameters) {
super(parameters);
}
/**
* Validates the notification method.
*
* @param event_notification_methods
* The event_notification_methods.
* @param event_subscriber
* The event_subscriber.
* @param user
* The user.
* @return
*/
protected boolean ValidateNotificationMethod(java.util.List<event_notification_methods> event_notification_methods,
event_subscriber event_subscriber, DbUser user) {
boolean retValue = true;
EventNotificationMethods notificationMethod = event_notification_methods.get(0).getmethod_type();
switch (notificationMethod) {
case EMAIL:
String mailAdress = (StringHelper.isNullOrEmpty(event_subscriber.getmethod_address())) ? user.getemail()
: event_subscriber.getmethod_address();
if (StringHelper.isNullOrEmpty(mailAdress) || !ValidatMailAddress(mailAdress)) {
addCanDoActionMessage(VdcBllMessages.USER_DOES_NOT_HAVE_A_VALID_EMAIL);
retValue = false;
}
break;
default:
addCanDoActionMessage(VdcBllMessages.EN_UNKNOWN_NOTIFICATION_METHOD);
retValue = false;
break;
}
return retValue;
}
/**
* Validates the notification method and tag.
*
* @param event_notification_methods
* The event_notification_methods.
* @param event_subscriber
* The event_subscriber.
* @param user
* The user.
* @return
*/
protected boolean ValidateAdd(List<event_notification_methods> event_notification_methods,
event_subscriber event_subscriber, DbUser user) {
String tagName = event_subscriber.gettag_name();
// validate notification method
boolean retValue = ValidateNotificationMethod(event_notification_methods, event_subscriber, user);
// validate tag name if exists
if (retValue && !StringHelper.isNullOrEmpty(tagName)) {
retValue = ValidateTag(tagName);
}
return retValue;
}
protected boolean ValidateRemove(List<event_notification_methods> event_notification_methods,
event_subscriber event_subscriber, DbUser user) {
boolean retValue = false;
// check if user is subscribed to the event
List<event_subscriber> list = DbFacade.getInstance()
.getEventDAO()
.getAllForSubscriber(event_subscriber.getsubscriber_id());
if (list.isEmpty()) {
addCanDoActionMessage(VdcBllMessages.EN_NOT_SUBSCRIBED);
} else {
if (!ValidateSubscription(list, event_subscriber)) {
addCanDoActionMessage(VdcBllMessages.EN_NOT_SUBSCRIBED);
} else {
String tagName = event_subscriber.gettag_name();
// validate notification method
retValue = ValidateNotificationMethod(event_notification_methods, event_subscriber, user);
// validate tag name if exists
if (retValue && !StringHelper.isNullOrEmpty(tagName)) {
retValue = ValidateTag(tagName);
}
}
}
return retValue;
}
/**
* Validates the tag.
*
* @param tagName
* Name of the tag.
* @return
*/
protected boolean ValidateTag(String tagName) {
boolean retValue = true;
tags tag = DbFacade.getInstance().getTagDAO().getByName(tagName);
if (tag == null) {
addCanDoActionMessage(VdcBllMessages.EN_UNKNOWN_TAG_NAME);
retValue = false;
}
return retValue;
}
/**
* Determines whether [is valid email] [the specified input email].
*
* @param inputEmail
* The input email.
* @return <c>true</c> if [is valid email] [the specified input email];
* otherwise, <c>false</c>.
*/
protected static boolean ValidatMailAddress(String inputEmail) {
final String strRegex = "^[\\w-]+(?:\\.[\\w-]+)*@(?:[\\w-]+\\.)+[a-zA-Z]{2,7}$";
Regex re = new Regex(strRegex);
return re.IsMatch(inputEmail);
}
private static boolean ValidateSubscription(Iterable<event_subscriber> subscriptions, event_subscriber current) {
boolean retValue = false;
for (event_subscriber event_subscriber : subscriptions) {
if (event_subscriber.getsubscriber_id().equals(current.getsubscriber_id())
&& StringHelper.EqOp(event_subscriber.getevent_up_name(), current.getevent_up_name())
&& event_subscriber.getmethod_id() == current.getmethod_id()) {
retValue = true;
break;
}
}
return retValue;
}
}