From efa8063b57a759110f6e3c3300e92e08ff7697ae Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Tue, 24 Feb 2026 18:07:51 +0000 Subject: [PATCH] resolved workspace adjustments for topological order --- .../workspaces/stages/DepsPipelineStage.java | 7 ++----- .../p/studio/compiler/models/BuildStack.java | 9 ++++++++- .../compiler/models/DependencyContext.java | 4 +--- .../compiler/models/ResolvedWorkspace.java | 17 ++++++++++++++--- ...stMapper.java => PrometeuManifestUtils.java} | 8 +++++--- .../workspaces/phases/DiscoverPhase.java | 4 ++-- .../workspaces/phases/ValidatePhase.java | 2 +- .../workspaces/phases/WireProjectsPhase.java | 2 +- .../utilities/structures/ReadOnlyList.java | 8 ++++++++ 9 files changed, 42 insertions(+), 19 deletions(-) rename prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/utilities/{PrometeuManifestMapper.java => PrometeuManifestUtils.java} (64%) diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/DepsPipelineStage.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/DepsPipelineStage.java index 1d530d86..5bd9be8c 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/DepsPipelineStage.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/DepsPipelineStage.java @@ -22,15 +22,12 @@ public class DepsPipelineStage implements PipelineStage { return ReadOnlyCollection.with(BuildingIssue .builder() .error(true) - .message("[DEPS]: rootProjectId directory no found: " + ctx.config.getRootProjectPath()) + .message("[BUILD]: root project directory no found: " + ctx.config.getRootProjectPath()) .build()); } final var cfg = new DependencyConfig(false, rootCanonPath); final var resolvedWorkspace = DependencyService.INSTANCE.run(cfg, logs); - for (final var pId : resolvedWorkspace.stack().projects()) { - final var pd = resolvedWorkspace.graph().projectTable().get(pId); - logs.info("Project [ " + pd.getName() + " ] read"); - } + resolvedWorkspace.topologicalOrder().forEach(pd -> logs.info("Project [ " + pd.getName() + " ] read")); ctx.resolvedWorkspace = resolvedWorkspace; return ReadOnlyCollection.empty(); } diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/BuildStack.java b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/BuildStack.java index cc585360..19a548a4 100644 --- a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/BuildStack.java +++ b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/BuildStack.java @@ -3,5 +3,12 @@ package p.studio.compiler.models; import p.studio.compiler.source.identifiers.ProjectId; import p.studio.utilities.structures.ReadOnlyList; -public record BuildStack(ReadOnlyList projects) { +public class BuildStack { + public final ReadOnlyList topologicalOrder; + public final ReadOnlyList reverseTopologicalOrder; + + public BuildStack(ReadOnlyList topologicalOrder) { + this.topologicalOrder = topologicalOrder; + this.reverseTopologicalOrder = topologicalOrder.invert(); + } } diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/DependencyContext.java b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/DependencyContext.java index 941e5b1c..9d5f1bab 100644 --- a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/DependencyContext.java +++ b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/DependencyContext.java @@ -3,7 +3,6 @@ package p.studio.compiler.models; import p.studio.compiler.exceptions.BuildException; import p.studio.compiler.messages.DependencyConfig; import p.studio.compiler.source.identifiers.ProjectId; -import p.studio.compiler.source.tables.FileTable; import p.studio.compiler.source.tables.ProjectTable; import p.studio.utilities.structures.ReadOnlyList; @@ -28,7 +27,6 @@ public final class DependencyContext { public ProjectId rootProjectId; public BuildStack stack; - public FileTable fileTable; private DependencyContext(DependencyConfig config) { this.config = config; @@ -56,7 +54,7 @@ public final class DependencyContext { } final var dependenciesByProject = buildDependenciesByProject(); final var workspaceGraph = new WorkspaceGraph(projectTable, dependenciesByProject); - return new ResolvedWorkspace(rootProjectId, workspaceGraph, stack, fileTable); + return new ResolvedWorkspace(rootProjectId, workspaceGraph, stack); } diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/ResolvedWorkspace.java b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/ResolvedWorkspace.java index ab398121..1728da41 100644 --- a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/ResolvedWorkspace.java +++ b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/ResolvedWorkspace.java @@ -1,11 +1,22 @@ package p.studio.compiler.models; import p.studio.compiler.source.identifiers.ProjectId; -import p.studio.compiler.source.tables.FileTable; + +import java.util.stream.Stream; public record ResolvedWorkspace( ProjectId projectId, WorkspaceGraph graph, - BuildStack stack, - FileTable fileTable) { + BuildStack stack) { + public ProjectDescriptor getMainProjectDescriptor() { + return graph.getProjectDescriptor(projectId); + } + + public Stream topologicalOrder() { + return stack.topologicalOrder.stream().map(graph::getProjectDescriptor); + } + + public Stream reverseTopologicalOrder() { + return stack.reverseTopologicalOrder.stream().map(graph::getProjectDescriptor); + } } diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/utilities/PrometeuManifestMapper.java b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/utilities/PrometeuManifestUtils.java similarity index 64% rename from prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/utilities/PrometeuManifestMapper.java rename to prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/utilities/PrometeuManifestUtils.java index 1f39fda0..89e268af 100644 --- a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/utilities/PrometeuManifestMapper.java +++ b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/utilities/PrometeuManifestUtils.java @@ -6,10 +6,12 @@ import p.studio.compiler.dtos.PrometeuManifestDTO; import java.io.IOException; import java.nio.file.Path; -public final class PrometeuManifestMapper { - private static final ObjectMapper mapper = new ObjectMapper(); +public final class PrometeuManifestUtils { + public static final PrometeuManifestUtils INSTANCE = new PrometeuManifestUtils(); - public static PrometeuManifestDTO read(Path manifestPath) { + private final ObjectMapper mapper = new ObjectMapper(); + + public PrometeuManifestDTO read(Path manifestPath) { try { return mapper.readValue(manifestPath.toFile(), PrometeuManifestDTO.class); } catch (IOException e) { diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/DiscoverPhase.java b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/DiscoverPhase.java index 635b0b41..74c07ef5 100644 --- a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/DiscoverPhase.java +++ b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/DiscoverPhase.java @@ -9,7 +9,7 @@ import p.studio.compiler.models.DependencyContext; import p.studio.compiler.models.ProjectInfo; import p.studio.compiler.models.ProjectInfoId; import p.studio.compiler.models.PrometeuManifest; -import p.studio.compiler.utilities.PrometeuManifestMapper; +import p.studio.compiler.utilities.PrometeuManifestUtils; import p.studio.compiler.workspaces.DependencyPhase; import p.studio.compiler.workspaces.DependencyReference; import p.studio.utilities.structures.ReadOnlyCollection; @@ -56,7 +56,7 @@ public class DiscoverPhase implements DependencyPhase { continue; } - final var prometeuManifestDTO = PrometeuManifestMapper.read(manifestPathCanon); + final var prometeuManifestDTO = PrometeuManifestUtils.INSTANCE.read(manifestPathCanon); final var manifestMaybe = map(rootPathCanon, prometeuManifestDTO, issues); if (manifestMaybe.isEmpty()) { diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/ValidatePhase.java b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/ValidatePhase.java index 62f6575a..8ceb967b 100644 --- a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/ValidatePhase.java +++ b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/ValidatePhase.java @@ -28,7 +28,7 @@ public final class ValidatePhase implements DependencyPhase { return ReadOnlyCollection.with(issue); } - // ensure uniformity to version across the same projects (associated by name) + // ensure uniformity to version across the same projectIds (associated by name) for (final var entry : ctx.projectNameAndVersions.entrySet()) { final var name = entry.getKey(); final var versions = entry.getValue(); diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/WireProjectsPhase.java b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/WireProjectsPhase.java index a0e6e179..b097edb7 100644 --- a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/WireProjectsPhase.java +++ b/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/workspaces/phases/WireProjectsPhase.java @@ -43,7 +43,7 @@ public final class WireProjectsPhase implements DependencyPhase { return ReadOnlyCollection.wrap(issues); } - // since it is not ordered, we have to iterate it over again, but now associating dependencies with projects + // since it is not ordered, we have to iterate it over again, but now associating dependencies with projectIds for (int i = 0; i < ctx.projectInfoTable.size(); i++) { final var projectInfo = ctx.projectInfoTable.get(new ProjectInfoId(i)); final var dependencies = new ArrayList(); diff --git a/prometeu-infra/src/main/java/p/studio/utilities/structures/ReadOnlyList.java b/prometeu-infra/src/main/java/p/studio/utilities/structures/ReadOnlyList.java index bb69b58d..73f47fac 100644 --- a/prometeu-infra/src/main/java/p/studio/utilities/structures/ReadOnlyList.java +++ b/prometeu-infra/src/main/java/p/studio/utilities/structures/ReadOnlyList.java @@ -1,5 +1,7 @@ package p.studio.utilities.structures; +import org.apache.commons.collections4.ListUtils; + import java.util.*; import java.util.stream.Stream; @@ -83,4 +85,10 @@ public class ReadOnlyList extends ReadOnlyCollection { } return ReadOnlyList.wrap(s.toList()); } + + public ReadOnlyList invert() { + final var inverted = new ArrayList<>(collection); + java.util.Collections.reverse(inverted); + return ReadOnlyList.wrap(inverted); + } }