TopologyRules.java

package com.cloudforgeci.api.core.rules;

import com.cloudforgeci.api.core.SystemContext;
import com.cloudforgeci.api.core.topology.ApplicationServiceTopologyConfiguration;
import com.cloudforgeci.api.core.topology.JenkinsServiceTopologyConfiguration;
import com.cloudforgeci.api.core.topology.S3WebsiteTopologyConfiguration;
import com.cloudforgeci.api.application.JenkinsApplicationSpec;
import com.cloudforgeci.api.interfaces.Rule;
import com.cloudforgeci.api.interfaces.TopologyConfiguration;
import com.cloudforge.core.interfaces.ApplicationSpec;
import software.constructs.Node;

import java.util.ArrayList;
import java.util.List;

public final class TopologyRules {

  private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(TopologyRules.class.getName());

  public static void install(SystemContext ctx) {
    LOG.fine("=== TopologyRules.install() called for topology: " + ctx.topology + " ===");
    final TopologyConfiguration p = switch (ctx.topology) {
      case JENKINS_SERVICE     -> new JenkinsServiceTopologyConfiguration();
      case S3_WEBSITE          -> new S3WebsiteTopologyConfiguration();
      case APPLICATION_SERVICE -> new ApplicationServiceTopologyConfiguration();
    };
    LOG.fine("Topology configuration created: " + p.getClass().getSimpleName());

    // Install ApplicationSpec for JENKINS_SERVICE topology (hardcoded for backward compatibility)
    if (ctx.topology == com.cloudforge.core.enums.TopologyType.JENKINS_SERVICE) {
      ApplicationSpec appSpec = new JenkinsApplicationSpec();
      ctx.applicationSpec.set(appSpec);
    }

    // For APPLICATION_SERVICE topology, applicationSpec must be provided by caller
    // It will be set in ApplicationFactory before calling createInfrastructureFactories()

    Node.of(ctx).addValidation(() -> {
      List<String> errs = new ArrayList<>();
      for (Rule r : p.rules(ctx)) errs.addAll(r.check(ctx));
      return errs;
    });

    LOG.fine("Registering topology wire() callback with ctx.once() for: " + p.kind());
    ctx.once("ProfileWiring:Topology:" + p.kind(), () -> {
      LOG.fine("=== EXECUTING topology.wire() for " + p.kind() + " ===");
      p.wire(ctx);
      LOG.fine("=== COMPLETED topology.wire() for " + p.kind() + " ===");
    });
    LOG.fine("TopologyRules.install() completed");
  }
}