Bug 532019 - Remove Circular Dependencies in SpreadSheet Renderer
Services

Use a dynamic method that gets the EMFFormsSpreadSheetRendererFactory
when it's needed instead of during the activation of the renderer
services.

Change-Id: I769838ee522bf9dfd3cecadd84b3137ab08cbef1
Signed-off-by: Lucas Koehler <lkoehler@eclipsesource.com>
diff --git a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationElementRendererService.java b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationElementRendererService.java
index 1d2c129..7829dd6 100644
--- a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationElementRendererService.java
+++ b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationElementRendererService.java
@@ -49,6 +49,7 @@
 	}
 
 	private ServiceReference<EMFFormsSpreadsheetRendererFactory> serviceReference;
+	private BundleContext bundleContext;
 
 	/**
 	 * The activate method.
@@ -57,10 +58,8 @@
 	 */
 	@Activate
 	public void activate(BundleContext bundleContext) {
-		serviceReference = bundleContext
-			.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
-		emfformsSpreadsheetRendererFactory = bundleContext
-			.getService(serviceReference);
+		this.bundleContext = bundleContext;
+
 	}
 
 	/**
@@ -70,7 +69,22 @@
 	 */
 	@Deactivate
 	public void deactivate(BundleContext bundleContext) {
-		bundleContext.ungetService(serviceReference);
+		if (serviceReference != null) {
+			bundleContext.ungetService(serviceReference);
+		}
+	}
+
+	/**
+	 * Gets and returns the {@link EMFFormsSpreadsheetRendererFactory}.
+	 *
+	 * @return The {@link EMFFormsSpreadsheetRendererFactory}
+	 */
+	protected EMFFormsSpreadsheetRendererFactory getSpreadsheetRendererFactory() {
+		if (emfformsSpreadsheetRendererFactory == null) {
+			serviceReference = bundleContext.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
+			emfformsSpreadsheetRendererFactory = bundleContext.getService(serviceReference);
+		}
+		return emfformsSpreadsheetRendererFactory;
 	}
 
 	/**
@@ -95,7 +109,7 @@
 	public EMFFormsAbstractSpreadsheetRenderer<VCategorizationElement> getRendererInstance(
 		VCategorizationElement vElement,
 		ViewModelContext viewModelContext) {
-		return new EMFFormsCategorizationElementRenderer(emfformsSpreadsheetRendererFactory, reportService);
+		return new EMFFormsCategorizationElementRenderer(getSpreadsheetRendererFactory(), reportService);
 	}
 
 }
diff --git a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationRendererService.java b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationRendererService.java
index db600bf..94baaca 100644
--- a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationRendererService.java
+++ b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategorizationRendererService.java
@@ -48,6 +48,7 @@
 	}
 
 	private ServiceReference<EMFFormsSpreadsheetRendererFactory> serviceReference;
+	private BundleContext bundleContext;
 
 	/**
 	 * The activate method.
@@ -56,10 +57,8 @@
 	 */
 	@Activate
 	public void activate(BundleContext bundleContext) {
-		serviceReference = bundleContext
-			.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
-		emfformsSpreadsheetRendererFactory = bundleContext
-			.getService(serviceReference);
+		this.bundleContext = bundleContext;
+
 	}
 
 	/**
@@ -69,7 +68,22 @@
 	 */
 	@Deactivate
 	public void deactivate(BundleContext bundleContext) {
-		bundleContext.ungetService(serviceReference);
+		if (serviceReference != null) {
+			bundleContext.ungetService(serviceReference);
+		}
+	}
+
+	/**
+	 * Gets and returns the {@link EMFFormsSpreadsheetRendererFactory}.
+	 *
+	 * @return The {@link EMFFormsSpreadsheetRendererFactory}
+	 */
+	protected EMFFormsSpreadsheetRendererFactory getSpreadsheetRendererFactory() {
+		if (emfformsSpreadsheetRendererFactory == null) {
+			serviceReference = bundleContext.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
+			emfformsSpreadsheetRendererFactory = bundleContext.getService(serviceReference);
+		}
+		return emfformsSpreadsheetRendererFactory;
 	}
 
 	/**
@@ -93,7 +107,7 @@
 	@Override
 	public EMFFormsAbstractSpreadsheetRenderer<VCategorization> getRendererInstance(VCategorization vElement,
 		ViewModelContext viewModelContext) {
-		return new EMFFormsCategorizationRenderer(emfformsSpreadsheetRendererFactory, reportService);
+		return new EMFFormsCategorizationRenderer(getSpreadsheetRendererFactory(), reportService);
 	}
 
 }
diff --git a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategoryRendererService.java b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategoryRendererService.java
index ea7dc8b..ae2fc83 100644
--- a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategoryRendererService.java
+++ b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer.categorization/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/categorization/EMFFormsCategoryRendererService.java
@@ -47,6 +47,7 @@
 	}
 
 	private ServiceReference<EMFFormsSpreadsheetRendererFactory> serviceReference;
+	private BundleContext bundleContext;
 
 	/**
 	 * The activate method.
@@ -55,10 +56,8 @@
 	 */
 	@Activate
 	public void activate(BundleContext bundleContext) {
-		serviceReference = bundleContext
-			.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
-		emfformsSpreadsheetRendererFactory = bundleContext
-			.getService(serviceReference);
+		this.bundleContext = bundleContext;
+
 	}
 
 	/**
@@ -68,7 +67,22 @@
 	 */
 	@Deactivate
 	public void deactivate(BundleContext bundleContext) {
-		bundleContext.ungetService(serviceReference);
+		if (serviceReference != null) {
+			bundleContext.ungetService(serviceReference);
+		}
+	}
+
+	/**
+	 * Gets and returns the {@link EMFFormsSpreadsheetRendererFactory}.
+	 *
+	 * @return The {@link EMFFormsSpreadsheetRendererFactory}
+	 */
+	protected EMFFormsSpreadsheetRendererFactory getSpreadsheetRendererFactory() {
+		if (emfformsSpreadsheetRendererFactory == null) {
+			serviceReference = bundleContext.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
+			emfformsSpreadsheetRendererFactory = bundleContext.getService(serviceReference);
+		}
+		return emfformsSpreadsheetRendererFactory;
 	}
 
 	/**
@@ -92,7 +106,7 @@
 	@Override
 	public EMFFormsAbstractSpreadsheetRenderer<VCategory> getRendererInstance(VCategory vElement,
 		ViewModelContext viewModelContext) {
-		return new EMFFormsCategoryRenderer(emfformsSpreadsheetRendererFactory, reportService);
+		return new EMFFormsCategoryRenderer(getSpreadsheetRendererFactory(), reportService);
 	}
 
 }
diff --git a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/EMFFormsSpreadsheetContainerRendererService.java b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/EMFFormsSpreadsheetContainerRendererService.java
index d300b8c..ddbe881 100644
--- a/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/EMFFormsSpreadsheetContainerRendererService.java
+++ b/bundles/spreadsheet/org.eclipse.emfforms.spreadsheet.core.renderer/src/org/eclipse/emfforms/internal/spreadsheet/core/renderer/EMFFormsSpreadsheetContainerRendererService.java
@@ -48,6 +48,7 @@
 	}
 
 	private ServiceReference<EMFFormsSpreadsheetRendererFactory> serviceReference;
+	private BundleContext bundleContext;
 
 	/**
 	 * The activate method.
@@ -56,10 +57,8 @@
 	 */
 	@Activate
 	public void activate(BundleContext bundleContext) {
-		serviceReference = bundleContext
-			.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
-		emfformsSpreadsheetRendererFactory = bundleContext
-			.getService(serviceReference);
+		this.bundleContext = bundleContext;
+
 	}
 
 	/**
@@ -69,7 +68,22 @@
 	 */
 	@Deactivate
 	public void deactivate(BundleContext bundleContext) {
-		bundleContext.ungetService(serviceReference);
+		if (serviceReference != null) {
+			bundleContext.ungetService(serviceReference);
+		}
+	}
+
+	/**
+	 * Gets and returns the {@link EMFFormsSpreadsheetRendererFactory}.
+	 *
+	 * @return The {@link EMFFormsSpreadsheetRendererFactory}
+	 */
+	protected EMFFormsSpreadsheetRendererFactory getSpreadsheetRendererFactory() {
+		if (emfformsSpreadsheetRendererFactory == null) {
+			serviceReference = bundleContext.getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
+			emfformsSpreadsheetRendererFactory = bundleContext.getService(serviceReference);
+		}
+		return emfformsSpreadsheetRendererFactory;
 	}
 
 	/**
@@ -96,7 +110,7 @@
 	@Override
 	public EMFFormsAbstractSpreadsheetRenderer<VContainer> getRendererInstance(
 		VContainer vElement, ViewModelContext viewModelContext) {
-		return new EMFFormsSpreadsheetContainerRenderer(emfformsSpreadsheetRendererFactory, reportService);
+		return new EMFFormsSpreadsheetContainerRenderer(getSpreadsheetRendererFactory(), reportService);
 	}
 
 }