package au.org.aurin.wif.executors.svc; import java.io.IOException; import java.util.concurrent.Future; import javax.annotation.Resource; import org.opengis.geometry.MismatchedDimensionException; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.operation.TransformException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import au.org.aurin.wif.exception.config.InvalidEntityIdException; import au.org.aurin.wif.exception.config.ParsingException; import au.org.aurin.wif.exception.config.WifInvalidConfigException; import au.org.aurin.wif.exception.validate.SuitabilityAnalysisFailedException; import au.org.aurin.wif.exception.validate.WifInvalidInputException; import au.org.aurin.wif.impl.lsa.SuitabilityAnalyzer; import au.org.aurin.wif.model.suitability.SuitabilityScenario; import au.org.aurin.wif.repo.suitability.SuitabilityScenarioDao; import au.org.aurin.wif.svc.suitability.SuitabilityScenarioService; import com.vividsolutions.jts.io.ParseException; /** * Asynchronous service to perform lengthy suitability analysis. */ @Service @Qualifier("asyncSuitabilityService") public class AsyncSuitabilityService { /** The Constant LOGGER. */ private static final Logger LOGGER = LoggerFactory .getLogger(AsyncSuitabilityService.class); /** The suitability analyzer. */ @Autowired private SuitabilityAnalyzer suitabilityAnalyzer; /** The wif suitabilityScenario dao. */ @Autowired private SuitabilityScenarioDao suitabilityScenarioDao; /** The suitability scenario service. */ @Resource private SuitabilityScenarioService suitabilityScenarioService; /** * Do suitability analysis wms async. * * @param id * the id * @param areaAnalyzed * the area analyzed * @param crsArea * the crs area * @return the future * @throws WifInvalidConfigException * the wif invalid config exception * @throws WifInvalidInputException * the wif invalid input exception * @throws NoSuchAuthorityCodeException * the no such authority code exception * @throws FactoryException * the factory exception * @throws MismatchedDimensionException * the mismatched dimension exception * @throws TransformException * the transform exception * @throws ParseException * the parse exception * @throws IOException * Signals that an I/O exception has occurred. * @throws SuitabilityAnalysisFailedException * the wif analysis failed exception * @throws ParsingException * the parsing exception */ @Async public Future<Boolean> doSuitabilityAnalysisWMSAsync(String id, String areaAnalyzed, String crsArea) throws WifInvalidConfigException, WifInvalidInputException, NoSuchAuthorityCodeException, FactoryException, MismatchedDimensionException, TransformException, ParseException, IOException, SuitabilityAnalysisFailedException, ParsingException { SuitabilityScenario suitabilityScenario = suitabilityScenarioService .getSuitabilityScenario(id); suitabilityScenarioDao.updateSuitabilityScenarioStatus(suitabilityScenario, Boolean.FALSE); if (suitabilityScenario == null) { LOGGER.error("illegal argument, the suitabilityScenario with the ID " + id + " supplied was not found "); throw new InvalidEntityIdException( "illegal argument, the suitabilityScenario with the ID " + id + " supplied was not found "); } LOGGER .debug( "doSuitabilityAnalysisWMSAsync processing suitability analysis for ={}", suitabilityScenario.getLabel()); return new AsyncResult<Boolean>( suitabilityAnalyzer.doSuitabilityAnalysisWMS(suitabilityScenario, areaAnalyzed, crsArea)); } }