From e085a5cc65b933f3809b63642ccfadcb36334632 Mon Sep 17 00:00:00 2001
From: Konstantin Blaschke <blaschke@fortiss.org>
Date: Wed, 28 Jun 2023 11:13:21 +0200
Subject: [PATCH] Switching to singleton service use in ext.quality

Issue-Ref: 4310
Issue-Url: https://git.fortiss.org/af3/af3/-/issues/4310

Signed-off-by: Konstantin Blaschke <blaschke@fortiss.org>
---
 .../META-INF/MANIFEST.MF                      |  8 ++--
 .../ui/ModelQualityExtractionMenu.java        |  9 +++-
 .../ext/quality/AF3QualityActivator.java      |  5 +++
 .../quality/service/IModelQualityService.java |  5 +++
 .../quality/service/ModelQualityService.java  | 43 ++++++++++++-------
 5 files changed, 48 insertions(+), 22 deletions(-)

diff --git a/org.fortiss.tooling.ext.quality.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.ext.quality.ui/META-INF/MANIFEST.MF
index 7fcef617d..d4bd3f279 100644
--- a/org.fortiss.tooling.ext.quality.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.ext.quality.ui/META-INF/MANIFEST.MF
@@ -2,14 +2,12 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: org.fortiss.tooling.ext.quality.ui
 Bundle-SymbolicName: org.fortiss.tooling.ext.quality.ui;singleton:=true
-Bundle-Version: 1.0.0
+Bundle-Version: 1.0.0.qualifier
 Automatic-Module-Name: org.fortiss.tooling.ext.quality.ui
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Require-Bundle: org.eclipse.ui.ide;visibility:=reexport,
  org.fortiss.tooling.base.ui;visibility:=reexport,
  org.fortiss.tooling.kernel,
  org.fortiss.tooling.kernel.ui,
- org.fortiss.tooling.ext.reuse,
- org.eclipse.emf.ecore,
- org.fortiss.tooling.ext.quality
-Import-Package: org.fortiss.af3.project.model
+ org.fortiss.tooling.ext.quality,
+ org.fortiss.af3.project;bundle-version="2.23.0"
diff --git a/org.fortiss.tooling.ext.quality.ui/src/org/fortiss/tooling/ext/quality/ui/ModelQualityExtractionMenu.java b/org.fortiss.tooling.ext.quality.ui/src/org/fortiss/tooling/ext/quality/ui/ModelQualityExtractionMenu.java
index 3dcbcbb01..594099b41 100644
--- a/org.fortiss.tooling.ext.quality.ui/src/org/fortiss/tooling/ext/quality/ui/ModelQualityExtractionMenu.java
+++ b/org.fortiss.tooling.ext.quality.ui/src/org/fortiss/tooling/ext/quality/ui/ModelQualityExtractionMenu.java
@@ -28,9 +28,13 @@ import org.eclipse.jface.action.ActionContributionItem;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.fortiss.af3.project.model.FileProject;
+import org.fortiss.tooling.ext.quality.service.IModelQualityService;
 import org.fortiss.tooling.ext.quality.service.ModelQualityService;
+import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
+import org.fortiss.tooling.kernel.service.IPersistencyService;
 import org.fortiss.tooling.kernel.ui.extension.IContextMenuContributor;
 import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
+import org.fortiss.tooling.kernel.utils.KernelModelElementUtils;
 
 /**
  * Crates a context menu entry to generate the for the selected
@@ -78,8 +82,9 @@ public class ModelQualityExtractionMenu implements IContextMenuContributor {
 		/** {@inheritDoc} */
 		@Override
 		public void run() {
-			ModelQualityService ms = new ModelQualityService();
-			ms.performMetricAnalysis(this.fp);
+			ITopLevelElement top = IPersistencyService.getInstance().getTopLevelElementFor(this.fp);
+			
+			IModelQualityService.getInstance().performMetricAnalysis(top);
 			
 			System.out.println("We print something");
 		}
diff --git a/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/AF3QualityActivator.java b/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/AF3QualityActivator.java
index 0f067724e..1714186e5 100644
--- a/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/AF3QualityActivator.java
+++ b/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/AF3QualityActivator.java
@@ -17,6 +17,9 @@ package org.fortiss.tooling.ext.quality;
 +--------------------------------------------------------------------------*/
 
 import org.eclipse.core.runtime.Plugin;
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
+import org.fortiss.tooling.ext.quality.service.HierarchicElementSizeProvider;
+import org.fortiss.tooling.ext.quality.service.IModelQualityService;
 import org.fortiss.tooling.ext.quality.service.ModelQualityService;
 import org.osgi.framework.BundleContext;
 
@@ -39,6 +42,8 @@ public class AF3QualityActivator extends Plugin {
 		plugin = this;
 		System.out.println("[Plugin] " + PLUGIN_ID + " started.");
 		ModelQualityService.getInstance().startService();
+		IModelQualityService.getInstance().registerMetricProvider(
+				new HierarchicElementSizeProvider("dasd"), IHierarchicElement.class);
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/IModelQualityService.java b/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/IModelQualityService.java
index b5b7310ca..c9f521e55 100644
--- a/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/IModelQualityService.java
+++ b/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/IModelQualityService.java
@@ -17,6 +17,8 @@ package org.fortiss.tooling.ext.quality.service;
 
 import java.util.Map;
 
+import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
+
 /**
  * The migration service checks and upgrades the old models from the last release.
  * 
@@ -33,4 +35,7 @@ public interface IModelQualityService {
 
 	/** trigger extraction to csv document */
 	void metricExtractionToCSV(Map<String, Double> data);
+
+	/** */
+	void performMetricAnalysis(ITopLevelElement top);
 }
diff --git a/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/ModelQualityService.java b/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/ModelQualityService.java
index 2fa1be0c7..4be3b2362 100644
--- a/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/ModelQualityService.java
+++ b/org.fortiss.tooling.ext.quality/src/org/fortiss/tooling/ext/quality/service/ModelQualityService.java
@@ -30,8 +30,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.eclipse.emf.ecore.EObject;
-import org.fortiss.af3.project.model.FileProject;
-import org.fortiss.tooling.base.model.element.IHierarchicElement;
+import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
 import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.introspection.IIntrospectionItem;
 import org.fortiss.tooling.kernel.introspection.IIntrospectiveKernelService;
@@ -39,6 +38,7 @@ import org.fortiss.tooling.kernel.model.IProjectRootElement;
 import org.fortiss.tooling.kernel.service.IKernelIntrospectionSystemService;
 import org.fortiss.tooling.kernel.service.IMigrationService;
 import org.fortiss.tooling.kernel.service.base.EObjectAwareServiceBase;
+import org.fortiss.tooling.kernel.utils.EcoreUtils;
 
 /**
  * This class implements the {@link IMigrationService} interface.
@@ -51,7 +51,12 @@ public class ModelQualityService extends EObjectAwareServiceBase<IModelQualityPr
 	/** The singleton instance. */
 	private static final ModelQualityService INSTANCE = new ModelQualityService();
 
+	/** Constructor. */
+	private ModelQualityService() {
+	}
+
 	/** Returns singleton instance of the service. */
+	/* package */
 	public static ModelQualityService getInstance() {
 		return INSTANCE;
 	}
@@ -102,27 +107,35 @@ public class ModelQualityService extends EObjectAwareServiceBase<IModelQualityPr
 	}
 
 	/**
-	 * @param fp
+	 * @param top
 	 * @return
 	 */
-	public List<IModelQualityProvider<? extends EObject>> performMetricAnalysis(FileProject fp) {
+	@Override
+	public void performMetricAnalysis(ITopLevelElement top) {
 		List<IModelQualityProvider<? extends EObject>> result =
 				new LinkedList<IModelQualityProvider<? extends EObject>>();
-		for(IProjectRootElement ele : fp.getRootElements()) {
-			if(ele instanceof IHierarchicElement) {
-				HierarchicElementSizeProvider hes =
-						new HierarchicElementSizeProvider(ele.getName());
-				hes.apply((IHierarchicElement)ele);
-				System.out.println("checked in hierarchic metrics for: " + hes.getName());
-				result.add(hes);
-			}
+
+		for(IProjectRootElement ele : EcoreUtils.getChildrenWithType(top.getRootModelElement(),
+				IProjectRootElement.class)) {
+			List<IModelQualityProvider<? extends EObject>> providers =
+					getRegisteredHandlers(ele.getClass());
+
+			// for(IModelQualityProvider<? extends EObject> provider: providers) {
+			// if(provider instanceof IModelQualityProvider<IHierarchicElement>) {
+			//
+			// }
+			// }
+			// mqp.apply(ele);
+			// System.out.println("checked in hierarchic metrics for: " + mqp.getName());
+			// result.add(mqp)
+			// }
 		}
 
-		// List<IModelQualityProvider<?>> handlers = getRegisteredHandlers(modelElement.getClass());
+		//
 		// Map<String, Double> qualityData = new HashMap<String, Double>();
 
 		// getRegisteredHandlers(IHierarchicElement.class);
-		// List<IModelQualityProvider<?>> hierarchicHandlers2 = getAllMetricProviders(fp);
+		// List<IModelQualityProvider<?>> hierarchicHandlers2 = getRegisteredHandlers(fp);
 		// if(handlers == null) {
 		// return null;
 		// }
@@ -134,7 +147,7 @@ public class ModelQualityService extends EObjectAwareServiceBase<IModelQualityPr
 		// metricsList.addAll(metrics);
 		// }
 		// }
-		return result;
+		// return result;
 	}
 
 	/** */
-- 
GitLab