/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.process.audit.query;
import org.jbpm.process.audit.JPAAuditLogService;
import org.jbpm.process.audit.command.AuditCommand;
import org.jbpm.query.jpa.builder.impl.AbstractQueryBuilderImpl;
import org.jbpm.query.jpa.data.QueryWhere;
import org.kie.api.runtime.CommandExecutor;
import org.kie.api.runtime.Context;
import org.kie.internal.query.ParametrizedQuery;
import org.kie.internal.query.QueryParameterIdentifiers;
import org.kie.internal.runtime.manager.audit.query.AuditLogQueryBuilder;
import java.util.Date;
import java.util.List;
import static org.kie.internal.query.QueryParameterIdentifiers.*;
@SuppressWarnings("unchecked")
public abstract class AbstractAuditQueryBuilderImpl<T,R> extends AbstractQueryBuilderImpl<T> implements AuditLogQueryBuilder<T,R> {
protected final CommandExecutor executor;
protected final JPAAuditLogService jpaAuditService;
protected AbstractAuditQueryBuilderImpl(JPAAuditLogService jpaService) {
this.executor = null;
this.jpaAuditService = jpaService;
}
protected AbstractAuditQueryBuilderImpl(CommandExecutor cmdExecutor) {
this.executor = cmdExecutor;
this.jpaAuditService = null;
}
// service methods
protected JPAAuditLogService getJpaAuditLogService() {
JPAAuditLogService jpaAuditLogService = this.jpaAuditService;
if( jpaAuditLogService == null ) {
jpaAuditLogService = this.executor.execute(getJpaAuditLogServiceCommand);
}
return jpaAuditLogService;
}
private AuditCommand<JPAAuditLogService> getJpaAuditLogServiceCommand = new AuditCommand<JPAAuditLogService>() {
private static final long serialVersionUID = 101L;
@Override
public JPAAuditLogService execute( Context context ) {
setLogEnvironment(context);
return (JPAAuditLogService) this.auditLogService;
}
};
// query builder methods
@Override
public T processInstanceId( long... processInstanceId ) {
addLongParameter(PROCESS_INSTANCE_ID_LIST, "process instance id", processInstanceId);
return (T) this;
}
@Override
public T processInstanceIdRange( Long processInstanceIdMin, Long processInstanceIdMax ) {
addRangeParameters(PROCESS_INSTANCE_ID_LIST, "process instance id", processInstanceIdMin, processInstanceIdMax);
return (T) this;
}
@Override
public T processId( String... processId ) {
addObjectParameter(PROCESS_ID_LIST, "process id", processId);
return (T) this;
}
public T date( Date... date ) {
addObjectParameter(DATE_LIST, "date", date);
return (T) this;
}
public T dateRangeStart( Date rangeStart ) {
addRangeParameter(DATE_LIST, "date range start", rangeStart, true);
return (T) this;
}
public T dateRangeEnd( Date rangeStart ) {
addRangeParameter(DATE_LIST, "date range end", rangeStart, false);
return (T) this;
}
@Override
public T ascending( OrderBy field ) {
String listId = convertOrderByToListId(field);
this.queryWhere.setAscending(listId);
return (T) this;
}
@Override
public T descending( OrderBy field ) {
String listId = convertOrderByToListId(field);
this.queryWhere.setDescending(listId);
return (T) this;
}
private String convertOrderByToListId(OrderBy field) {
String listId;
switch( field ) {
case processId:
listId = QueryParameterIdentifiers.PROCESS_ID_LIST;
break;
case processInstanceId:
listId = QueryParameterIdentifiers.PROCESS_INSTANCE_ID_LIST;
break;
default:
throw new IllegalArgumentException("Unknown 'order-by' field: " + field.toString() );
}
return listId;
}
// query builder result methods
protected abstract Class<R> getResultType();
protected abstract Class getQueryType();
@Override
public ParametrizedQuery<R> build() {
return new ParametrizedQuery<R>() {
private QueryWhere queryData = new QueryWhere(getQueryWhere());
@Override
public List<R> getResultList() {
return getJpaAuditLogService().queryLogs(queryData, getQueryType(), getResultType());
}
};
}
}