CobolFixedWidthMigrationPipeline.java

package com.designpatterns.behavioral.templatemethod.applied;

/**
 * Legacy source: fixed-width COBOL-style records, NAME[20] + AMOUNT_CENTS[10].
 */
public class CobolFixedWidthMigrationPipeline extends LegacyMigrationPipeline {

    private static final int NAME_WIDTH = 20;
    private static final int AMOUNT_WIDTH = 10;

    public CobolFixedWidthMigrationPipeline(MigrationSink sink) {
        super(sink);
    }

    @Override
    protected String read(String rawRecord) {
        String name = rawRecord.substring(0, NAME_WIDTH).trim();
        String amountCents = rawRecord.substring(NAME_WIDTH, NAME_WIDTH + AMOUNT_WIDTH).trim();
        return name + "|" + amountCents;
    }

    @Override
    protected void validate(String parsed) {
        String[] parts = parsed.split("\\|", -1);
        if (parts[0].isBlank()) {
            throw new IllegalStateException("missing name in COBOL record");
        }
    }

    @Override
    protected String transform(String parsed) {
        String[] parts = parsed.split("\\|", -1);
        return "{\"name\":\"" + parts[0] + "\",\"amountCents\":" + Long.parseLong(parts[1]) + "}";
    }
}