X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.project%2Fsrc%2Forg%2Fsimantics%2Fproject%2FProjectFeatures.java;h=bb2ba5c2c411310fb1971e6609dce41fcf2f814d;hp=7fedc55d11ae8a5713f83e6e5315dbc192cb4e7b;hb=19c8e2d3eba80a750c6fb92de11a209a8132f8c7;hpb=03b0440388d6f2638c9b205debe3a82afd811fc9 diff --git a/bundles/org.simantics.project/src/org/simantics/project/ProjectFeatures.java b/bundles/org.simantics.project/src/org/simantics/project/ProjectFeatures.java index 7fedc55d1..bb2ba5c2c 100644 --- a/bundles/org.simantics.project/src/org/simantics/project/ProjectFeatures.java +++ b/bundles/org.simantics.project/src/org/simantics/project/ProjectFeatures.java @@ -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 sortTopologically(Collection toSort) { - ArrayList sorted = new ArrayList(toSort); - Collections.sort(sorted, new Comparator() { - Set visited = new HashSet(); - @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 result, Set visited) { + if(visited.add(ext)) { + Set reqs = required.getValues(ext); + if(reqs != null) { + for(IProjectFeatureExtension req : reqs) { + requiresDFS(req, result, visited); + } } - }); - return sorted; + result.add(ext); + } + } + + private Collection sortTopologically(Collection toSort) { + ArrayList result = new ArrayList<>(); + Set visited = new HashSet<>(); + for(IProjectFeatureExtension ext : toSort) { + requiresDFS(ext, result, visited); + } + return result; } private Collection requiredExtensions(IProjectFeatureExtension[] allExtensions, Collection 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); } }