Bug 425784 - Use internal EventAdmin object for EventRedeliverer

Getting the EventAdmin object from the service registry creates a
dependency cycle when DS is activating EventAdmin. Using the internally
created EventAdmin object avoids the cycle and also ensure the
redeliverer uses the implementations EventAdmin object rather than some
other EventAdmin service found in the service registry. This fix allows
EventAdmin to be used with Apache Felix DS as well as Equinox DS.

Signed-off-by: BJ Hargrave <hargrave@us.ibm.com>
diff --git a/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/EventComponent.java b/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/EventComponent.java
index 581773d..ec1fddb 100644
--- a/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/EventComponent.java
+++ b/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/EventComponent.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
+ * Copyright (c) 2009, 2014 IBM Corporation and others.
  * 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
@@ -22,7 +22,7 @@
 	void activate(BundleContext context) {
 		eventAdmin = new EventAdminImpl(context);
 		eventAdmin.start();
-		eventRedeliverer = new EventRedeliverer(context);
+		eventRedeliverer = new EventRedeliverer(context, eventAdmin);
 		eventRedeliverer.open();
 	}
 
diff --git a/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/mapper/EventRedeliverer.java b/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/mapper/EventRedeliverer.java
index 0b51c10..02e277e 100644
--- a/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/mapper/EventRedeliverer.java
+++ b/bundles/org.eclipse.equinox.event/src/org/eclipse/equinox/internal/event/mapper/EventRedeliverer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2010 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 IBM Corporation and others.
  * 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
@@ -13,65 +13,44 @@
 
 import org.osgi.framework.*;
 import org.osgi.service.event.EventAdmin;
-import org.osgi.util.tracker.ServiceTracker;
 
 /**
- * Main class for redeliver special events like FrameworkEvents via EventAdmin.
+ * Main class to redeliver framework published events via EventAdmin.
  * 
  * @version $Revision: 1.3 $
  */
 public class EventRedeliverer implements FrameworkListener, BundleListener, ServiceListener {
-	private final ServiceTracker<EventAdmin, EventAdmin> eventAdminTracker;
-	private final static boolean DEBUG = false;
-	private BundleContext bc;
+	private final EventAdmin eventAdmin;
+	private final BundleContext bc;
 
-	public EventRedeliverer(BundleContext bc) {
+	public EventRedeliverer(BundleContext bc, EventAdmin eventAdmin) {
 		this.bc = bc;
-		this.eventAdminTracker = new ServiceTracker<EventAdmin, EventAdmin>(bc, EventAdmin.class.getName(), null);
+		this.eventAdmin = eventAdmin;
 	}
 
 	public void close() {
-		eventAdminTracker.close();
 		bc.removeFrameworkListener(this);
 		bc.removeBundleListener(this);
 		bc.removeServiceListener(this);
 	}
 
 	/**
-	 * prepare any service trackers and register event listeners which are
+	 * register event listeners which are
 	 * necessary to obtain events to be mapped
 	 */
 	public void open() {
-		// open ServiceTracker for EventAdmin
-		eventAdminTracker.open();
-
 		// add legacy event listener for framework level event
 		bc.addFrameworkListener(this);
 		bc.addBundleListener(this);
 		bc.addServiceListener(this);
 	}
 
-	private EventAdmin getEventAdmin() {
-		return eventAdminTracker.getService();
-	}
-
 	/**
 	 * @param event
 	 * @see org.osgi.framework.FrameworkListener#frameworkEvent(org.osgi.framework.FrameworkEvent)
 	 */
 	public void frameworkEvent(FrameworkEvent event) {
-		EventAdmin eventAdmin = getEventAdmin();
-		if (eventAdmin != null) {
-			(new FrameworkEventAdapter(event, eventAdmin)).redeliver();
-		} else {
-			printNoEventAdminError();
-		}
-	}
-
-	private void printNoEventAdminError() {
-		if (DEBUG) {
-			System.out.println(this.getClass().getName() + ": Cannot find the EventAdmin."); //$NON-NLS-1$
-		}
+		new FrameworkEventAdapter(event, eventAdmin).redeliver();
 	}
 
 	/**
@@ -79,12 +58,7 @@
 	 * @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)
 	 */
 	public void bundleChanged(BundleEvent event) {
-		EventAdmin eventAdmin = getEventAdmin();
-		if (eventAdmin != null) {
-			(new BundleEventAdapter(event, eventAdmin)).redeliver();
-		} else {
-			printNoEventAdminError();
-		}
+		new BundleEventAdapter(event, eventAdmin).redeliver();
 	}
 
 	/**
@@ -92,12 +66,6 @@
 	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
 	 */
 	public void serviceChanged(ServiceEvent event) {
-		EventAdmin eventAdmin = getEventAdmin();
-		if (eventAdmin != null) {
-			(new ServiceEventAdapter(event, eventAdmin)).redeliver();
-		} else {
-			printNoEventAdminError();
-		}
+		new ServiceEventAdapter(event, eventAdmin).redeliver();
 	}
-
-}
\ No newline at end of file
+}