JobContextFactory.java

package edu.ucsb.cs156.jobs.services;

import edu.ucsb.cs156.jobs.entities.Job;
import edu.ucsb.cs156.jobs.repositories.JobLogRepository;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;

/**
 * Creates {@link JobContext} instances; exists as a seam so tests can substitute contexts.
 *
 * <p>Contexts are given a REQUIRES_NEW transaction template for log writes, so each log line
 * commits (and becomes visible to the admin UI) immediately, independent of the job body's
 * all-or-nothing transaction.
 */
public class JobContextFactory {
  private final JobLogRepository jobLogRepository;
  private final TransactionTemplate logTransactionTemplate;

  public JobContextFactory(
      JobLogRepository jobLogRepository, PlatformTransactionManager transactionManager) {
    this.jobLogRepository = jobLogRepository;
    this.logTransactionTemplate = new TransactionTemplate(transactionManager);
    this.logTransactionTemplate.setPropagationBehavior(
        TransactionDefinition.PROPAGATION_REQUIRES_NEW);
  }

  public JobContext createContext(Job job) {
    return new JobContext(jobLogRepository, job, logTransactionTemplate);
  }
}