TierHandlers.java
package network.ike.plugin.scaffold;
import java.util.EnumMap;
import java.util.Map;
/**
* Registry of file-based {@link TierHandler} instances keyed by
* {@link ScaffoldTier}.
*
* <p>Contains one handler per file-based tier
* ({@link ScaffoldTier#TOOL_OWNED}, {@link ScaffoldTier#TRACKED},
* {@link ScaffoldTier#TRACKED_BLOCK}). {@link ScaffoldTier#MODEL_MANAGED}
* entries are planned by model adapters rather than tier handlers and
* are not present here — asking this registry for a model-managed
* handler returns {@code null}.
*/
public final class TierHandlers {
private final Map<ScaffoldTier, TierHandler> byTier;
/** Create a registry with the default set of handlers. */
public TierHandlers() {
this(new ToolOwnedTierHandler(),
new TrackedTierHandler(),
new TrackedBlockTierHandler());
}
/**
* Create a registry from an explicit set of handlers. Intended
* for tests that want to swap in a stub.
*
* @param handlers one handler per file-based tier; duplicate tiers
* cause an {@link IllegalArgumentException}
*/
public TierHandlers(TierHandler... handlers) {
Map<ScaffoldTier, TierHandler> map =
new EnumMap<>(ScaffoldTier.class);
for (TierHandler h : handlers) {
if (map.putIfAbsent(h.tier(), h) != null) {
throw new IllegalArgumentException(
"duplicate handler for tier " + h.tier());
}
}
this.byTier = map;
}
/**
* Look up the handler for a tier.
*
* @param tier the tier
* @return the handler, or {@code null} if no handler is registered
* (e.g. {@link ScaffoldTier#MODEL_MANAGED})
*/
public TierHandler get(ScaffoldTier tier) {
return byTier.get(tier);
}
/**
* Look up the handler for a tier, throwing if none is registered.
*
* @param tier the tier
* @return the handler; never {@code null}
* @throws ScaffoldException if no handler is registered for
* {@code tier}
*/
public TierHandler require(ScaffoldTier tier) {
TierHandler h = byTier.get(tier);
if (h == null) {
throw new ScaffoldException(
"No TierHandler registered for tier "
+ tier.manifestValue()
+ " (model-managed entries go through "
+ "ModelAdapter)");
}
return h;
}
}