package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.action.EventSubscriptionParametesBase; import org.ovirt.engine.core.common.businessentities.DbUser; import org.ovirt.engine.core.common.businessentities.event_map; 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.users.VdcUser; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.dal.dbbroker.DbFacade; public class AddEventSubscriptionCommand<T extends EventSubscriptionParametesBase> extends EventSubscriptionCommandBase<T> { public AddEventSubscriptionCommand(T parameters) { super(parameters); } @Override protected boolean canDoAction() { boolean retValue; // check if user is not already subscribed to this event with same // method and address Guid subscriberId = getParameters().getEventSubscriber().getsubscriber_id(); String event_name = getParameters().getEventSubscriber().getevent_up_name(); int method_id = getParameters().getEventSubscriber().getmethod_id(); List<event_subscriber> subscriptions = DbFacade.getInstance() .getEventDAO().getAllForSubscriber(subscriberId); if (IsAlreadySubscribed(subscriptions, subscriberId, event_name, method_id)) { addCanDoActionMessage(VdcBllMessages.EN_ALREADY_SUBSCRIBED); retValue = false; } else { // get notification method List<event_notification_methods> event_notification_methods = (DbFacade.getInstance() .getEventDAO().getEventNotificationMethodsById(method_id)); if (event_notification_methods.size() > 0) { // validate event List<event_map> event_map = DbFacade.getInstance().getEventDAO().getEventMapByName(event_name); if (event_map.size() > 0) { String domain = getParameters().getDomain(); // Validate user DbUser user = DbFacade.getInstance().getDbUserDAO().get(subscriberId); if (user == null) { // If user exists in AD and does not exist in DB - try to add it to DB // If an exception is thrown while trying, handle it and and fail with the relevant message try { user = UserCommandBase.initUser(new VdcUser(subscriberId, "", domain), getParameters() .getSessionId()); if (user == null) { addCanDoActionMessage(VdcBllMessages.USER_MUST_EXIST_IN_DIRECTORY); retValue = false; } else { retValue = ValidateAdd(event_notification_methods, getParameters().getEventSubscriber(), user); } } catch (VdcBLLException vdcBllException) { addCanDoActionMessage(VdcBllMessages.USER_MUST_EXIST_IN_DIRECTORY); retValue = false; } } else { retValue = ValidateAdd(event_notification_methods, getParameters().getEventSubscriber(), user); } } else { addCanDoActionMessage(VdcBllMessages.EN_UNSUPPORTED_NOTIFICATION_EVENT); retValue = false; } } else { addCanDoActionMessage(VdcBllMessages.EN_UNKNOWN_NOTIFICATION_METHOD); retValue = false; } } return retValue; } /** * Determines whether [is already subscribed] [the specified subscriptions]. * * @param subscriptions * The subscriptions. * @param subscriberId * The subscriber id. * @param eventName * Name of the event. * @param methodId * The method id. * @return <c>true</c> if [is already subscribed] [the specified * subscriptions]; otherwise, <c>false</c>. */ private static boolean IsAlreadySubscribed(Iterable<event_subscriber> subscriptions, Guid subscriberId, String eventName, int methodId) { boolean retval = false; for (event_subscriber eventSubscriber : subscriptions) { if (subscriberId.equals(eventSubscriber.getsubscriber_id()) && StringHelper.EqOp(eventSubscriber.getevent_up_name(), eventName) && eventSubscriber.getmethod_id() == methodId) { retval = true; break; } } return retval; } @Override protected void executeCommand() { if (getParameters().getEventSubscriber().gettag_name() == null) { getParameters().getEventSubscriber().settag_name(""); } DbFacade.getInstance().getEventDAO().subscribe(getParameters().getEventSubscriber()); setSucceeded(true); } }