]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.project/src/org/simantics/project/ProjectFeatures.java
Project feature dependency injection is broken
[simantics/platform.git] / bundles / org.simantics.project / src / org / simantics / project / ProjectFeatures.java
index 7fedc55d11ae8a5713f83e6e5315dbc192cb4e7b..bb2ba5c2c411310fb1971e6609dce41fcf2f814d 100644 (file)
@@ -14,8 +14,6 @@ package org.simantics.project;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -188,22 +186,25 @@ public class ProjectFeatures {
             return false;
         }
 
-        private Collection<IProjectFeatureExtension> sortTopologically(Collection<IProjectFeatureExtension> toSort) {
-            ArrayList<IProjectFeatureExtension> sorted = new ArrayList<IProjectFeatureExtension>(toSort);
-            Collections.sort(sorted, new Comparator<IProjectFeatureExtension>() {
-                Set<IProjectFeatureExtension> visited = new HashSet<IProjectFeatureExtension>();
-                @Override
-                public int compare(IProjectFeatureExtension e1, IProjectFeatureExtension e2) {
-                    visited.clear();
-                    if (deepRequires(visited, e1, e2))
-                        return 1;
-                    visited.clear();
-                    if (deepRequires(visited, e2, e1))
-                        return -1;
-                    return 0;
+        private void requiresDFS(IProjectFeatureExtension ext, ArrayList<IProjectFeatureExtension> result, Set<IProjectFeatureExtension> visited) {
+            if(visited.add(ext)) {
+                Set<IProjectFeatureExtension> reqs = required.getValues(ext);
+                if(reqs != null) {
+                    for(IProjectFeatureExtension req : reqs) {
+                        requiresDFS(req, result, visited);
+                    }
                 }
-            });
-            return sorted;
+                result.add(ext);
+            }
+        }
+
+        private Collection<IProjectFeatureExtension> sortTopologically(Collection<IProjectFeatureExtension> toSort) {
+            ArrayList<IProjectFeatureExtension> result = new ArrayList<>();
+            Set<IProjectFeatureExtension> visited = new HashSet<>();
+            for(IProjectFeatureExtension ext : toSort) {
+                requiresDFS(ext, result, visited);
+            }
+            return result;
         }
 
         private Collection<IProjectFeatureExtension> requiredExtensions(IProjectFeatureExtension[] allExtensions, Collection<IProjectFeatureExtension> includedExtensions) throws ProjectException {
@@ -234,7 +235,8 @@ public class ProjectFeatures {
                             if (injectionTargetExt != null) {
                                 changed = true;
                                 includedProjectFeatureIds.add(ext.getId());
-                                result.add(ext);
+                                if(!result.contains(ext))
+                                    result.add(ext);
                                 required.add(injectionTargetExt, ext);
                             }
                         }