package com.griddynamics.jagger.jaas.service.impl; import com.griddynamics.jagger.engine.e1.services.DataService; import com.griddynamics.jagger.jaas.exceptions.ResourceNotFoundException; import com.griddynamics.jagger.jaas.service.DynamicReportingService; import com.griddynamics.jagger.jaas.service.ReportingServiceFactory; import com.griddynamics.jagger.reporting.ReportingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional; /** * Provides {@link com.griddynamics.jagger.reporting.ReportingService} based on runtime DB config. * * Note: <code>baseLineSessionId</code> parameter is optional, * i.e. if passed value is <code>null</code> then default value provided by Spring context is used. */ @Service public class DynamicReportingServiceImpl implements DynamicReportingService { private final DynamicDataServiceImpl dynamicDataService; public DynamicReportingServiceImpl(@Autowired DynamicDataServiceImpl dynamicDataService) { this.dynamicDataService = dynamicDataService; } @Override public Resource generateReportFor(final Long dbId, final String sessionId, final String baseLineSessionId) throws IOException { ReportingService reportingService = getReportingServiceFor(dbId, sessionId, baseLineSessionId); reportingService.renderReport(true); return new FileSystemResource(reportingService.getOutputReportLocation()); } @Override public ReportingService getReportingServiceFor(final Long dbId, final String sessionId, final String baseLineSessionId ) throws IOException { ApplicationContext applicationContext = Optional.ofNullable(dynamicDataService.getDynamicContextFor(dbId)) .orElseThrow(ResourceNotFoundException::getDbResourceNfe); Optional.ofNullable(applicationContext.getBean(DataService.class).getSession(sessionId)) .orElseThrow(ResourceNotFoundException::getSessionResourceNfe); ReportingServiceFactory factory = applicationContext.getBean(ReportingServiceFactory.class); Path path = Files.createTempDirectory("jaas"); return factory.newInstance(sessionId, baseLineSessionId, path.resolve("jagger-report.pdf").toString()); } }