/*
* 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.AbstractDeleteBuilderImpl;
import org.jbpm.query.jpa.data.QueryWhere;
import org.kie.api.runtime.CommandExecutor;
import org.kie.api.runtime.Context;
import org.kie.internal.query.ParametrizedUpdate;
import org.kie.internal.runtime.manager.audit.query.AuditDeleteBuilder;
import java.sql.Timestamp;
import java.util.Date;
import static org.kie.internal.query.QueryParameterIdentifiers.*;
public abstract class AbstractAuditDeleteBuilderImpl<T> extends AbstractDeleteBuilderImpl<T> implements AuditDeleteBuilder<T> {
protected static String ONLY_COMPLETED_PROCESS_INSTANCES =
" l.processInstanceId in (select spl.processInstanceId \n"
+ "FROM ProcessInstanceLog spl \n"
+ "WHERE spl.status in (2, 3))";
protected final CommandExecutor executor;
protected final JPAAuditLogService jpaAuditService;
protected AbstractAuditDeleteBuilderImpl(JPAAuditLogService jpaService) {
this.executor = null;
this.jpaAuditService = jpaService;
}
protected AbstractAuditDeleteBuilderImpl(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
@SuppressWarnings("unchecked")
public T date( Date... date ) {
if (checkIfNull(date)) {
return (T) this;
}
date = ensureDateNotTimestamp(date);
addObjectParameter(DATE_LIST, "date", date);
return (T) this;
}
@SuppressWarnings("unchecked")
public T dateRangeStart( Date rangeStart ) {
if (checkIfNull(rangeStart)) {
return (T) this;
}
rangeStart = ensureDateNotTimestamp(rangeStart)[0];
addRangeParameter(DATE_LIST, "date range start", rangeStart, true);
return (T) this;
}
@SuppressWarnings("unchecked")
public T dateRangeEnd(Date rangeEnd) {
if (checkIfNull(rangeEnd)) {
return (T) this;
}
rangeEnd = ensureDateNotTimestamp(rangeEnd)[0];
addRangeParameter(DATE_LIST, "date range end", rangeEnd, false);
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T processInstanceId(long... processInstanceId) {
if (checkIfNull(processInstanceId)) {
return (T) this;
}
addLongParameter(PROCESS_INSTANCE_ID_LIST, "process instance id", processInstanceId);
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T processId(String... processId) {
if (checkIfNull(processId)) {
return (T) this;
}
addObjectParameter(PROCESS_ID_LIST, "process id", processId);
return (T) this;
}
protected <T> boolean checkIfNull(T...parameter) {
if( parameter == null ) {
return true;
}
for( int i = 0; i < parameter.length; ++i ) {
if( parameter[i] == null ) {
return true;
}
}
return false;
}
protected Date[] ensureDateNotTimestamp(Date...date) {
Date[] validated = new Date[date.length];
for (int i = 0; i < date.length; ++i) {
if (date[i] instanceof Timestamp) {
validated[i] = new Date(date[i].getTime());
} else {
validated[i] = date[i];
}
}
return validated;
}
abstract protected Class getQueryType();
abstract protected String getQueryBase();
protected String getSubQuery() {
return null;
}
public ParametrizedUpdate build() {
return new ParametrizedUpdate() {
private QueryWhere queryWhere = new QueryWhere(getQueryWhere());
@Override
public int execute() {
int result = getJpaAuditLogService().doDelete(getQueryBase(), queryWhere, getQueryType(), getSubQuery());
return result;
}
};
}
}