blob: 8ea9cc51e3ec2227395c19cf21e084921b1fe47e [file] [log] [blame]
/*******************************************************************************
* 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();
}
}