| /******************************************************************************* |
| * Copyright (c) 2009, 2018 SAP AG and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * SAP AG - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.ocl.examples.eventmanager.framework; |
| |
| import java.lang.ref.WeakReference; |
| |
| import org.eclipse.emf.common.notify.Adapter; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.ocl.examples.eventmanager.EventManager; |
| |
| |
| /** |
| * The <code>Notifier</code> encapsulates the knowledge how to notify the listeners. |
| * |
| * @author Daniel Vocke (D044825) |
| */ |
| public class AdapterCapsule { |
| |
| /** |
| * the listener that will be notified when an event is fired. |
| */ |
| protected WeakReference<? extends Adapter> _listener = null; |
| |
| /** |
| * the type of the listener that will be notified. |
| */ |
| protected ListenerTypeEnum _listenerType = null; |
| |
| protected EventManager _manager; |
| |
| public AdapterCapsule(WeakReference<? extends Adapter> listener, ListenerTypeEnum listenerType, EventManager manager) { |
| _listener = listener; |
| _listenerType=listenerType; |
| _manager = manager; |
| } |
| |
| /** |
| * @return the listener associated to this notifier |
| */ |
| public WeakReference<? extends Adapter> getListener() { |
| return _listener; |
| } |
| |
| /** |
| * Each Notifier is responsible for exactly one listener and its role. If a listener implements multiple roles (Pre_Op, Post_Op,postCommit-Listener) |
| * then for each role another instance of <code>Notifier</code> handles the invocation of the listener's <code>notify</code> method. |
| * |
| * @param listener the instance of the listener |
| * @param listenerType the role of the listener that shall be notified |
| * @return whether this instance is responsible for the listener-instance and the specified role or not. |
| */ |
| public boolean isResponsibleFor(Adapter listener, ListenerTypeEnum listenerType){ |
| if (_listener !=null && _listener.get()!=null && _listener.get().equals(listener) && _listenerType.matches(listenerType)) |
| return true; |
| else |
| return false; |
| } |
| |
| /** |
| * @return the type of the listener that this Notifier will notify |
| */ |
| public ListenerTypeEnum getListenerType(){ |
| return _listenerType; |
| } |
| /** |
| * This method is defined here because of convenience reasons. The implementation can be found in subclasses. |
| */ |
| public void deferNotification(){ |
| /* |
| * do nothing. Deferment is implemented in the subclass DeferringNotifier. |
| */ |
| } |
| |
| /** |
| * This method is defined here because of convenience reasons. The implementation can be found in subclasses. |
| */ |
| public void deliverDeferredEvents(){ |
| /* |
| * do nothing. Deferment is implemented in the subclass DeferringNoptifier |
| */ |
| } |
| |
| /** |
| * This method is defined here because of convenience reasons. The implementation can be found in subclasses. |
| */ |
| public void cancelDeferment(){ |
| /* |
| * do nothing. Deferment is implemented in the subclass DeferringNoptifier |
| */ |
| } |
| /** |
| * notifies the encapsulated listener about the passed event |
| * |
| * @param event the event that will be sent to the listener |
| */ |
| public void fireEvent(Notification event) { |
| /* |
| * |
| */ |
| ListenerTypeEnum dedicatedListenerType = getDedicatedListenerType(event); |
| if (!dedicatedListenerType.matches(_listenerType)) |
| { |
| //ERROR!!! This may not happen! |
| //TODO log and throw exception |
| } |
| |
| if (dedicatedListenerType.matches(ListenerTypeEnum.preChange)) { |
| try { |
| _listener.get().notifyChanged(event); |
| } catch (VetoException e) { |
| // VetoExceptions are OK, so pass them on to the next exception block |
| throw e; |
| } catch (Exception e) { |
| //TODO |
| e.printStackTrace(); |
| } |
| } else if (dedicatedListenerType.matches(ListenerTypeEnum.postChange)) { |
| try { |
| _listener.get().notifyChanged(event); |
| } catch (VetoException e) { |
| // VetoExceptions are OK, so pass them on to the next exception block |
| throw e; |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| }else{ |
| //ERROR The deferredNotifier must handle other types of invocation!!! |
| //TODO log and throw exception |
| } |
| } |
| |
| private org.eclipse.ocl.examples.eventmanager.framework.ListenerTypeEnum getDedicatedListenerType(Notification event) { |
| |
| return ListenerTypeEnum.postChange; |
| |
| } |
| |
| /** |
| * @return "DeferringNotifier for Pre_Commit_Tx Listener " for example |
| */ |
| public String toString(){ |
| return getClass().getName()+" for "+ _listenerType.toString(); |
| } |
| } |