diff --git a/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminDataConsistencyGenerator.java b/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminDataConsistencyGenerator.java index 9ef2b22..416a2b6 100644 --- a/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminDataConsistencyGenerator.java +++ b/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminDataConsistencyGenerator.java @@ -181,8 +181,8 @@ private void generateDataConsistencyController(Path pkg, List mod String schemas = (m.getOwnedSchemas() != null && !m.getOwnedSchemas().isEmpty()) ? String.join(", ", m.getOwnedSchemas()) : "default"; dbChecks.append(String.format( - " {Map db = new LinkedHashMap<>(); db.put(\"service\",\"%s\"); db.put(\"schemas\",\"%s\"); db.put(\"health\", fetchDbHealth(%d)); db.put(\"dbSummary\", fetchDbSummary(%d)); dbList.add(db);}\n", - svcName, schemas, port, port)); + " {Map db = new LinkedHashMap<>(); db.put(\"service\",\"%s\"); db.put(\"schemas\",\"%s\"); db.put(\"health\", fetchDbHealth(%d)); dbList.add(db);}\n", + svcName, schemas, port)); } // Append saga-orchestrator DB — read from generated YAML, fall back to known defaults @@ -203,8 +203,6 @@ private void generateDataConsistencyController(Path pkg, List mod " db.put(\"service\",\"saga-orchestrator\");" + " db.put(\"schemas\",\"saga_instance\");" + " db.put(\"health\", fetchDbHealth(SAGA_ORCHESTRATOR_PORT));" + - " db.put(\"instanceCount\", fetchSagaInstanceCount());" + - " db.put(\"dbSummary\", fetchDbSummary(SAGA_ORCHESTRATOR_PORT));" + " dbList.add(db);}\n" ); diff --git a/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminTemplateGenerator.java b/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminTemplateGenerator.java index bfb9b5a..e8c0603 100644 --- a/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminTemplateGenerator.java +++ b/fractalx-core/src/main/java/org/fractalx/core/generator/admin/AdminTemplateGenerator.java @@ -949,10 +949,10 @@ private String buildSectionData() {
- + - +
ServiceSchemasHealthRow CountActionsServiceSchemasHealthActions
Loading…
Loading…
@@ -1948,24 +1948,16 @@ function loadDataConsistency() { tbody.innerHTML = ''; dbs.forEach(db => { const h = db.health || 'UNKNOWN'; - const summary = db.dbSummary; - let rowCount = '—'; - if (summary && !summary.unavailable && summary.totalRows !== undefined) { - rowCount = summary.totalRows + ' rows'; - } else if (db.instanceCount !== undefined && db.instanceCount >= 0) { - rowCount = db.instanceCount + ' rows'; - } tbody.innerHTML += ` ${db.service} ${db.schemas || '-'} ${h} - ${rowCount} `; }); }).catch(() => { document.getElementById('databases-tbody').innerHTML = - 'DB health unavailable'; + 'DB health unavailable'; }); fetch('/api/data/outbox') diff --git a/fractalx-core/src/main/java/org/fractalx/core/generator/transformation/NetScopeClientWiringStep.java b/fractalx-core/src/main/java/org/fractalx/core/generator/transformation/NetScopeClientWiringStep.java index bf64e89..07eb2fe 100644 --- a/fractalx-core/src/main/java/org/fractalx/core/generator/transformation/NetScopeClientWiringStep.java +++ b/fractalx-core/src/main/java/org/fractalx/core/generator/transformation/NetScopeClientWiringStep.java @@ -5,10 +5,13 @@ import org.fractalx.core.model.FractalModule; import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.FieldDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.expr.FieldAccessExpr; +import com.github.javaparser.ast.expr.MethodCallExpr; import com.github.javaparser.ast.expr.NameExpr; import com.github.javaparser.ast.type.ClassOrInterfaceType; import org.slf4j.Logger; @@ -18,6 +21,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * Rewires cross-module service references in copied source files so they point to @@ -135,6 +140,40 @@ private void wireClientsInFile(Path javaFile, List deps) throws IOExcept } if (modified) { + // Collect all *Client field names that were wired in this file + Set clientFieldNames = deps.stream() + .map(beanType -> decapitalize(beanType + "Client")) + .collect(Collectors.toSet()); + + // For every concrete class in the file, add @Transactional to methods that + // call a wired *Client field but do not already have @Transactional. + for (ClassOrInterfaceDeclaration clazz : cu.findAll(ClassOrInterfaceDeclaration.class)) { + if (clazz.isInterface()) continue; + + for (MethodDeclaration method : clazz.getMethods()) { + if (method.getBody().isEmpty()) continue; // abstract / native + + boolean callsClient = method.findAll(MethodCallExpr.class).stream() + .anyMatch(call -> call.getScope() + .filter(scope -> scope instanceof NameExpr) + .map(scope -> clientFieldNames.contains(((NameExpr) scope).getNameAsString())) + .orElse(false)); + + if (!callsClient) continue; + + boolean alreadyAnnotated = method.getAnnotations().stream() + .anyMatch(a -> a.getNameAsString().equals("Transactional") + || a.getNameAsString().endsWith(".Transactional")); + + if (!alreadyAnnotated) { + method.addAnnotation("Transactional"); + cu.addImport("org.springframework.transaction.annotation.Transactional"); + log.info("Added @Transactional to {}#{} in {}", + clazz.getNameAsString(), method.getNameAsString(), javaFile.getFileName()); + } + } + } + Files.writeString(javaFile, cu.toString()); log.info("Wired NetScope client references in: {}", javaFile.getFileName()); }