package org.aksw.jena_sparql_api.timeout; import java.util.concurrent.TimeUnit; import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.core.QueryExecutionFactoryDecorator; import org.aksw.jena_sparql_api.core.Time; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; /** * A query execution factory, which sets a given timeout * on all created query executions * * * @author Claus Stadler * * * Date: 7/26/11 * Time: 10:27 AM */ public class QueryExecutionFactoryTimeout extends QueryExecutionFactoryDecorator { private Time maxExecutionTime = null; private Time maxRetrievalTime = null; public static QueryExecutionFactoryTimeout decorate(QueryExecutionFactory decoratee, long timeout) { return new QueryExecutionFactoryTimeout(decoratee, timeout); } public QueryExecutionFactoryTimeout(QueryExecutionFactory decoratee) { super(decoratee); } public QueryExecutionFactoryTimeout(QueryExecutionFactory decoratee, long timeout) { this(decoratee, timeout, TimeUnit.MILLISECONDS); } public QueryExecutionFactoryTimeout(QueryExecutionFactory decoratee, long timeout, TimeUnit timeUnit) { super(decoratee); this.maxExecutionTime = new Time(timeout, timeUnit); } public QueryExecutionFactoryTimeout(QueryExecutionFactory decoratee, long timeout1, long timeout2) { this(decoratee, timeout1, TimeUnit.MILLISECONDS, timeout2, TimeUnit.MILLISECONDS); } public QueryExecutionFactoryTimeout(QueryExecutionFactory decoratee, long timeout1, TimeUnit timeUnit1, long timeout2, TimeUnit timeUnit2) { super(decoratee); this.maxExecutionTime = new Time(timeout1, timeUnit1); this.maxRetrievalTime = new Time(timeout2, timeUnit2); } private void configureWithTimeout(QueryExecution qe) { // Note maxRetrieval time implies a setting of max execution time if(maxExecutionTime != null) { if(maxRetrievalTime != null) { qe.setTimeout(maxExecutionTime.getTime(), maxExecutionTime.getTimeUnit(), maxRetrievalTime.getTime(), maxRetrievalTime.getTimeUnit()); } else { qe.setTimeout(maxExecutionTime.getTime(), maxExecutionTime.getTimeUnit()); } } } @Override public QueryExecution createQueryExecution(Query query) { QueryExecution result = super.createQueryExecution(query); configureWithTimeout(result); return result; } @Override public QueryExecution createQueryExecution(String queryString) { QueryExecution result = super.createQueryExecution(queryString); configureWithTimeout(result); return result; } }