package org.ovirt.engine.core.bll; import java.util.List; import javax.inject.Inject; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.EventNotificationMethod; import org.ovirt.engine.core.common.action.EventSubscriptionParametesBase; import org.ovirt.engine.core.common.businessentities.EventSubscriber; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.DbUserDao; public class AddEventSubscriptionCommand<T extends EventSubscriptionParametesBase> extends EventSubscriptionCommandBase<T> { @Inject private DbUserDao dbUserDao; public AddEventSubscriptionCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override protected boolean validate() { boolean retValue; // check if user is not already subscribed to this event with same // method and address Guid subscriberId = getParameters().getEventSubscriber().getSubscriberId(); String eventName = getParameters().getEventSubscriber().getEventUpName(); EventNotificationMethod eventNotificationMethod = getParameters().getEventSubscriber().getEventNotificationMethod(); List<EventSubscriber> subscriptions = eventDao.getAllForSubscriber(subscriberId); if (isAlreadySubscribed(subscriptions, subscriberId, eventName, eventNotificationMethod)) { addValidationMessage(EngineMessage.EN_ALREADY_SUBSCRIBED); retValue = false; } else if (!eventExists(eventName)) { addValidationMessage(EngineMessage.EN_UNSUPPORTED_NOTIFICATION_EVENT); retValue = false; } else { // get notification method if (eventNotificationMethod != null) { // Validate user DbUser user = dbUserDao.get(subscriberId); if (user == null) { addValidationMessage(EngineMessage.USER_MUST_EXIST_IN_DB); retValue = false; } else { retValue = validateAdd(eventNotificationMethod, getParameters().getEventSubscriber(), user); } } else { addValidationMessage(EngineMessage.EN_UNKNOWN_NOTIFICATION_METHOD); retValue = false; } } return retValue; } private boolean eventExists(String eventName) { boolean exists = false; try { AuditLogType.valueOf(eventName); exists = true; } catch (Exception ignore) { } return exists; } /** * Determines whether [is already subscribed] [the specified subscriptions]. * * @param subscriptions The subscriptions. * @param subscriberId The subscriber id. * @param eventName Name of the event. * @param eventNotificationMethod The notification method. * @return <c>true</c> if [is already subscribed] [the specified * subscriptions]; otherwise, <c>false</c>. */ private static boolean isAlreadySubscribed(List<EventSubscriber> subscriptions, Guid subscriberId, String eventName, EventNotificationMethod eventNotificationMethod) { return subscriptions.stream() .anyMatch(subscription -> subscriberId.equals(subscription.getSubscriberId()) && StringUtils.equals(subscription.getEventUpName(), eventName) && subscription.getEventNotificationMethod() == eventNotificationMethod); } @Override protected void executeCommand() { if (getParameters().getEventSubscriber().getTagName() == null) { getParameters().getEventSubscriber().setTagName(""); } eventDao.subscribe(getParameters().getEventSubscriber()); setSucceeded(true); } }