[framework] TxCore → common-framework (TxContext·MessageCodec) #1

Open
forge-bot wants to merge 9 commits from forge/ACM-FW-001-attempt-1-run-4a9d6591b579 into main
Showing only changes of commit 3fd7456027 - Show all commits

View file

@ -0,0 +1,192 @@
package com.klaro.acquirecore.framework;
import org.springframework.stereotype.Component;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
/**
* Service registry - equivalent to C tx_register/tx_lookup/tx_dispatch.
* Manages service handlers with priority-based dispatch.
*/
@Component
public class TxServiceRegistry {
private final Map<String, ServiceEntry> services = new ConcurrentHashMap<>();
/**
* Register a service handler - equivalent to C tx_register().
*/
public <T extends TxService> TxServiceRegistry register(String name, T service, int priority) {
services.put(name, new ServiceEntry(name, service, priority));
return this;
}
/**
* Register a simple function handler.
*/
public TxServiceRegistry register(String name, Function<TxRequest, TxResponse> handler, int priority) {
services.put(name, new ServiceEntry(name, new FunctionalTxService(name, handler), priority));
return this;
}
/**
* Lookup service by name - equivalent to C tx_lookup().
*/
public TxService lookup(String name) {
ServiceEntry entry = services.get(name);
return entry != null ? entry.service() : null;
}
/**
* Check if service exists.
*/
public boolean hasService(String name) {
return services.containsKey(name);
}
/**
* Dispatch request to named service - equivalent to C tx_dispatch().
*/
public TxResponse dispatch(String name, TxRequest request) {
ServiceEntry entry = services.get(name);
if (entry == null) {
return TxResponse.error(TxCore.TxResult.ERROR, "Service not found: " + name);
}
if (!entry.service().isEnabled()) {
return TxResponse.error(TxCore.TxResult.ERROR, "Service disabled: " + name);
}
try {
return entry.service().handle(request);
} catch (Exception e) {
return TxResponse.error(TxCore.TxResult.ERROR, e.getMessage());
}
}
/**
* Get all registered service names sorted by priority.
*/
public List<String> getServiceNames() {
return services.values().stream()
.sorted(Comparator.comparingInt(ServiceEntry::priority))
.map(ServiceEntry::name)
.toList();
}
public int getServiceCount() {
return services.size();
}
public TxServiceRegistry unregister(String name) {
services.remove(name);
return this;
}
public void clear() {
services.clear();
}
private record ServiceEntry(String name, TxService service, int priority) {}
// ===== TxService interface - equivalent to C tx_handler_fn =====
public interface TxService {
TxResponse handle(TxRequest request);
String getName();
boolean isEnabled();
void setEnabled(boolean enabled);
int getPriority();
}
// ===== AbstractTxService base class =====
public abstract static class AbstractTxService implements TxService {
private final String name;
private final int priority;
private volatile boolean enabled = true;
protected AbstractTxService(String name, int priority) {
this.name = name;
this.priority = priority;
}
protected AbstractTxService(String name) {
this(name, 0);
}
@Override
public String getName() {
return name;
}
@Override
public int getPriority() {
return priority;
}
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@Override
public TxResponse handle(TxRequest request) {
if (!enabled) {
return TxResponse.error("Service is disabled: " + name);
}
try {
return doHandle(request);
} catch (Exception e) {
return TxResponse.error(e.getMessage());
}
}
protected abstract TxResponse doHandle(TxRequest request);
}
// ===== Functional TxService wrapper =====
private static class FunctionalTxService implements TxService {
private final String name;
private final Function<TxRequest, TxResponse> handler;
private volatile boolean enabled = true;
FunctionalTxService(String name, Function<TxRequest, TxResponse> handler) {
this.name = name;
this.handler = handler;
}
@Override
public TxResponse handle(TxRequest request) {
return handler.apply(request);
}
@Override
public String getName() {
return name;
}
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@Override
public int getPriority() {
return 0;
}
}
}