ModelAdapters.java

package network.ike.plugin.scaffold;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Registry of {@link ModelAdapter} instances keyed by model name.
 *
 * <p>Contains one adapter per known model
 * ({@code maven-settings-4}, {@code pom-openrewrite},
 * {@code git-config}). The scaffold planner consults this registry
 * when it encounters a {@link ScaffoldTier#MODEL_MANAGED} entry.
 */
public final class ModelAdapters {

    private final Map<String, ModelAdapter> byName;

    /** Create a registry populated with the built-in adapters. */
    public ModelAdapters() {
        this(new MavenSettingsAdapter(),
                new GitConfigAdapter(),
                new PomModelAdapter());
    }

    /**
     * Create a registry from an explicit set of adapters. Intended
     * for tests that swap in a stub.
     *
     * @param adapters one adapter per model name; duplicate names
     *                 cause an {@link IllegalArgumentException}
     */
    public ModelAdapters(ModelAdapter... adapters) {
        Map<String, ModelAdapter> map = new LinkedHashMap<>();
        for (ModelAdapter a : adapters) {
            if (map.putIfAbsent(a.modelName(), a) != null) {
                throw new IllegalArgumentException(
                        "duplicate adapter for model '"
                                + a.modelName() + "'");
            }
        }
        this.byName = map;
    }

    /**
     * Look up the adapter for a model name.
     *
     * @param modelName the model name from
     *                  {@link ManifestEntry#model()}
     * @return the adapter, or {@code null} if none is registered
     */
    public ModelAdapter get(String modelName) {
        return byName.get(modelName);
    }

    /**
     * Look up the adapter for a model name, throwing if none is
     * registered.
     *
     * @param modelName the model name
     * @return the adapter; never {@code null}
     * @throws ScaffoldException if no adapter is registered for
     *                           {@code modelName}
     */
    public ModelAdapter require(String modelName) {
        ModelAdapter a = byName.get(modelName);
        if (a == null) {
            throw new ScaffoldException(
                    "No ModelAdapter registered for model '"
                            + modelName + "'. Known models: "
                            + byName.keySet());
        }
        return a;
    }
}