hackathon/docs/COMPILATION_FIXES_NEEDED.md
Christoph Wagner a489c15cf5 feat: Add complete HSP implementation with integration tests passing
Initial implementation of HTTP Sender Plugin following TDD methodology
  with hexagonal architecture. All 313 tests passing (0 failures).

  This commit adds:
  - Complete domain model and port interfaces
  - All adapter implementations (HTTP, gRPC, file logging, config)
  - Application services (data collection, transmission, backpressure)
  - Comprehensive test suite with 18 integration tests

  Test fixes applied during implementation:
  - Fix base64 encoding validation in DataCollectionServiceIntegrationTest
  - Fix exception type handling in IConfigurationPortTest
  - Fix CompletionException unwrapping in IHttpPollingPortTest
  - Fix sequential batching in DataTransmissionServiceIntegrationTest
  - Add test adapter failure simulation for reconnection tests
  - Use adapter counters for gRPC verification

  Files added:
  - pom.xml with all dependencies (JUnit 5, Mockito, WireMock, gRPC, Jackson)
  - src/main/java: Domain model, ports, adapters, application services
  - src/test/java: Unit tests, integration tests, test utilities
2025-11-20 22:38:55 +01:00

200 lines
6.7 KiB
Markdown

# Compilation Fixes Required for Session 4 Implementation
## Summary
The Hexagonal Architecture implementation (LifecycleController, HealthCheckController, HspApplication) has been created but needs interface alignment fixes.
## Critical Interface Mismatches
### 1. LifecycleController.java - Interface Mismatch
**Current Issues**:
- Using `start()` and `stop()` instead of `startup()` and `shutdown()`
- Using `ApplicationState` instead of `ILifecyclePort.LifecycleState`
- Method `getState()` should be `getStatus()`
- Using `grpcPort.connect(host, port, tls)` instead of `grpcPort.connect(StreamConfig)`
**Required Changes**:
```java
// Change method signatures:
@Override
public synchronized void startup() throws LifecycleException { ... }
@Override
public synchronized void shutdown() { ... }
@Override
public ILifecyclePort.LifecycleState getStatus() { ... }
// Change state management:
private final AtomicReference<ILifecyclePort.LifecycleState> state;
state = new AtomicReference<>(ILifecyclePort.LifecycleState.STOPPED);
// Change gRPC connection:
IGrpcStreamPort.StreamConfig config = new IGrpcStreamPort.StreamConfig(
"localhost", 50051, false, 5000
);
grpcPort.connect(config);
```
### 2. HealthCheckController.java - No start/stop in Interface
**Current Issue**:
- `IHealthCheckPort` only has `getHealthStatus()` method
- No `start()` or `stop()` methods in the interface
- HealthCheckController needs to manage HTTP server independently
**Solution**:
```java
// HealthCheckController does NOT implement IHealthCheckPort fully
// It wraps it and adds HTTP server management
public class HealthCheckController {
private final ILifecyclePort lifecyclePort;
private HttpServer httpServer;
private final AtomicBoolean running;
// These are NOT from interface:
public void start() { ... } // Start HTTP server
public void stop() { ... } // Stop HTTP server
// This IS from interface (delegate pattern):
public IHealthCheckPort.HealthCheckResponse getHealthStatus() {
// Implement IHealthCheckPort logic here
}
}
```
### 3. HspApplication.java - Constructor Parameter Mismatches
**Current Issues**:
```java
// WRONG:
IBufferPort buffer = new BufferManager(config.getBufferCapacity(), logger);
// CORRECT:
IBufferPort buffer = new BufferManager(config.getBufferCapacity());
```
```java
// WRONG:
DataTransmissionService transmissionService = new DataTransmissionService(
grpcStream, buffer, logger
);
// CORRECT:
IGrpcStreamPort.StreamConfig streamConfig = new IGrpcStreamPort.StreamConfig(
config.getGrpcHost(),
config.getGrpcPort(),
config.isTlsEnabled(),
5000 // timeout
);
DataTransmissionService transmissionService = new DataTransmissionService(
buffer, // buffer first
grpcStream, // then grpc
logger,
streamConfig
);
```
```java
// WRONG:
lifecycleController.start();
// CORRECT:
lifecycleController.startup();
```
```java
// WRONG - healthCheck doesn't have start/stop on interface:
healthCheck.start();
healthCheck.stop();
// CORRECT - cast to concrete type or use HealthCheckController directly:
HealthCheckController healthCheckController = new HealthCheckController(...);
healthCheckController.start(); // This is NOT from IHealthCheckPort
```
### 4. Test Files - Similar Issues
**LifecycleControllerTest.java**:
- Change all `ApplicationState.STOPPED/RUNNING` to `ILifecyclePort.LifecycleState.STOPPED/RUNNING`
- Change `lifecycleController.start()` to `lifecycleController.startup()`
- Change `lifecycleController.stop()` to `lifecycleController.shutdown()`
- Change `lifecycleController.getState()` to `lifecycleController.getStatus()`
**HealthCheckControllerTest.java**:
- Keep as is - tests the concrete HealthCheckController class with its own start/stop methods
## Recommended Fix Sequence
1. **Fix LifecycleController.java** (20 minutes)
- Replace all method names
- Replace all state references
- Fix gRPC connect call
2. **Fix LifecycleControllerTest.java** (10 minutes)
- Replace all method calls to match new signatures
- Replace all state enum references
3. **Fix HealthCheckController.java** (15 minutes)
- Clarify it's NOT implementing IHealthCheckPort directly
- It's a wrapper that adds HTTP server management
- Keep start/stop methods as public (not from interface)
4. **Fix HspApplication.java** (15 minutes)
- Fix BufferManager constructor call
- Fix DataTransmissionService constructor call (reorder params, add StreamConfig)
- Change `lifecycleController.start()` to `startup()`
- Change `lifecycleController.stop()` to `shutdown()`
- Use concrete `HealthCheckController` type, not interface
## Alternative Approach: Extend Interfaces
If the existing ILifecyclePort and IHealthCheckPort interfaces don't match requirements, consider:
**Option A**: Update interfaces to match implementation (RISKY - breaks existing code)
**Option B**: Create adapter classes (RECOMMENDED)
```java
// Wrapper for lifecycle
public class LifecycleAdapter implements ILifecyclePort {
private LifecycleController controller;
@Override
public void startup() { controller.internalStart(); }
@Override
public void shutdown() { controller.internalStop(); }
@Override
public LifecycleState getStatus() { return controller.getInternalState(); }
}
```
**Option C**: Fix implementation to match existing interfaces (CLEANEST)
- This is the recommended approach
- Align new code with existing codebase conventions
## Files Requiring Changes
1. `src/main/java/com/siemens/coreshield/hsp/application/LifecycleController.java` ✏️
2. `src/test/java/com/siemens/coreshield/hsp/application/LifecycleControllerTest.java` ✏️
3. `src/main/java/com/siemens/coreshield/hsp/adapter/inbound/health/HealthCheckController.java` ✏️
4. `src/main/java/com/siemens/coreshield/hsp/HspApplication.java` ✏️
## Expected Outcome
After fixes:
- ✅ Production code compiles with 0 errors
- ✅ LifecycleController properly implements ILifecyclePort
- ✅ HealthCheckController manages HTTP server independently
- ✅ HspApplication correctly wires all components
- ✅ All new tests pass (LifecycleControllerTest, HealthCheckControllerTest)
## Next Session Actions
1. Apply all fixes systematically (Option C - align with existing interfaces)
2. Run `mvn clean compile` to verify 0 compilation errors
3. Run `mvn test` to verify new tests pass
4. Update OPEN_POINTS_SUMMARY.md to mark LifecycleController and HealthCheckController as complete
5. Move to next priority: Fix DataTransmissionService failures (5 test failures)