package org.jbpm.services.task.audit.service; import org.jbpm.query.jpa.builder.impl.AbstractQueryBuilderImpl; import org.jbpm.query.jpa.data.QueryWhere; import org.jbpm.query.jpa.impl.QueryCriteriaUtil; import org.jbpm.services.task.commands.TaskCommand; import org.kie.internal.query.ParametrizedQuery; import org.kie.internal.task.api.InternalTaskService; import java.util.Date; import java.util.List; import static org.kie.internal.query.QueryParameterIdentifiers.*; /** * * * * @param <Q> The type of the interface of the specific {@link AbstractQueryBuilderImpl} implementation * @param <R> The type of result */ public abstract class AbstractTaskAuditQueryBuilderImpl<Q, R> extends AbstractQueryBuilderImpl<Q> { private final TaskAuditQueryCriteriaUtil queryCriteriaUtil; private final InternalTaskService taskService; public AbstractTaskAuditQueryBuilderImpl(TaskJPAAuditService jpaAuditService) { this(jpaAuditService, null); } public AbstractTaskAuditQueryBuilderImpl(InternalTaskService taskService) { this(null, taskService); } private AbstractTaskAuditQueryBuilderImpl(TaskJPAAuditService jpaService, InternalTaskService taskService) { if( jpaService != null ) { this.queryCriteriaUtil = new TaskAuditQueryCriteriaUtil(jpaService); this.taskService = null; } else if( taskService != null ) { this.queryCriteriaUtil = null; this.taskService = taskService; } else { throw new IllegalStateException( "At least one of the " + this.getClass().getSimpleName() + " constructor arguments must be non-null!"); } } // query builder result methods public Q processInstanceId( long... processInstanceId ) { addLongParameter(PROCESS_INSTANCE_ID_LIST, "process instance id", processInstanceId); return (Q) this; } public Q processInstanceIdRange( Long processInstanceIdMin, Long processInstanceIdMax ) { addRangeParameters(PROCESS_INSTANCE_ID_LIST, "process instance id", processInstanceIdMin, processInstanceIdMax); return (Q) this; } public Q processId( String... processId ) { addObjectParameter(PROCESS_ID_LIST, "process id", processId); return (Q) this; } public Q date( Date... date ) { addObjectParameter(DATE_LIST, "date", date); return (Q) this; } public Q dateRangeStart( Date rangeStart ) { addRangeParameter(DATE_LIST, "date range start", rangeStart, true); return (Q) this; } public Q dateRangeEnd( Date rangeStart ) { addRangeParameter(DATE_LIST, "date range end", rangeStart, false); return (Q) this; } protected abstract Class<R> getResultType(); protected abstract Class getQueryType(); protected abstract TaskCommand getCommand(); public ParametrizedQuery<R> build() { return new ParametrizedQuery<R>() { private QueryWhere queryWhere = new QueryWhere(getQueryWhere()); @Override public List<R> getResultList() { if( queryCriteriaUtil != null ) { List implResult = queryCriteriaUtil.doCriteriaQuery(queryWhere, getQueryType()); return QueryCriteriaUtil.convertListToInterfaceList(implResult, getResultType()); } else { return (List<R>) taskService.execute(getCommand()); } } }; } }