/**
 * Copyright (c) 2011, 2014 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 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: 
 * 		Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.vaaclipse.addons.ecview.event;

import org.osgi.service.event.EventHandler;

/**
 * This adapter adapts from the e4 eventbroker to the ecview eventbroker. So the
 * e4 eventbroker can be used in ecview too.
 */
public class E4EventBrokerAdapter implements
		org.eclipse.osbp.runtime.common.event.IEventBroker {

	/** The e4 event broker. */
	private org.eclipse.e4.core.services.events.IEventBroker e4EventBroker;

	/**
	 * Instantiates a new e4 event broker adapter.
	 *
	 * @param e4EventBroker
	 *            the e4 event broker
	 */
	public E4EventBrokerAdapter(
			org.eclipse.e4.core.services.events.IEventBroker e4EventBroker) {
		this.e4EventBroker = e4EventBroker;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.runtime.common.event.IEventBroker#send(java.lang.String, java.lang.Object)
	 */
	@Override
	public boolean send(String topic, Object data) {
		return e4EventBroker.send(topic, data);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.runtime.common.event.IEventBroker#post(java.lang.String, java.lang.Object)
	 */
	@Override
	public boolean post(String topic, Object data) {
		return e4EventBroker.post(topic, data);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.runtime.common.event.IEventBroker#subscribe(java.lang.String, org.osgi.service.event.EventHandler)
	 */
	@Override
	public boolean subscribe(String topic, EventHandler eventHandler) {
		return e4EventBroker.subscribe(topic, eventHandler);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.runtime.common.event.IEventBroker#subscribe(java.lang.String, java.lang.String, org.osgi.service.event.EventHandler, boolean)
	 */
	@Override
	public boolean subscribe(String topic, String filter,
			EventHandler eventHandler, boolean headless) {
		return e4EventBroker.subscribe(topic, filter, eventHandler, headless);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.runtime.common.event.IEventBroker#unsubscribe(org.osgi.service.event.EventHandler)
	 */
	@Override
	public boolean unsubscribe(EventHandler eventHandler) {
		return e4EventBroker.unsubscribe(eventHandler);
	}

}
