/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.core.db.cascade.event; import org.eclipse.che.core.db.cascade.CascadeContext; /** * Special event type which is needed only for notification * in the process which can require cascade operation. * * <p>Publisher should invoke {@link #propagateException()} * to get cause of event canceling. * * <p>Rollback of operation must be performed when subscriber * throws {@link Exception} during event processing. * * <p>Usage example: * <pre> * EventService bus = new EventService(); * bus.subscribe(new CascadeEventSubscriber<MyEvent>() { * @Override * public void onCascadeEvent(MyEvent event) throws Exception { * if (event.getEntityName().startsWith("reserved")) { * throw new ConflictException("Entity name can't start with `reserved`."); * } * } * }); * bus.publish(new MyEvent(...)).propagateException(); * </pre> * * @author Anton Korneta * @author Sergii Leschenko */ public abstract class CascadeEvent { protected final CascadeContext context = new CascadeContext(); public CascadeContext getContext() { return context; } /** * Propagates exception if subscriber throws it * while event processing otherwise do nothing * * @throws Exception * when any subscriber throws {@link Exception} */ public void propagateException() throws Exception { if (context.isFailed()) { throw context.getCause(); } } }