/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* 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.activiti.engine.impl;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
import org.activiti.engine.impl.variable.VariableTypes;
/**
* @author Tom Baeyens
* @author Falko Menge
*/
public class HistoricProcessInstanceQueryImpl extends AbstractQuery<HistoricProcessInstanceQuery, HistoricProcessInstance> implements HistoricProcessInstanceQuery {
private static final long serialVersionUID = 1L;
protected String processInstanceId;
protected String processDefinitionId;
protected String businessKey;
protected boolean finished = false;
protected boolean unfinished = false;
protected String startedBy;
protected String superProcessInstanceId;
protected String processDefinitionKey;
protected Set<String> processInstanceIds;
protected Date startDateBy;
protected Date startDateOn;
protected Date finishDateBy;
protected Date finishDateOn;
protected Date startDateOnBegin;
protected Date startDateOnEnd;
protected Date finishDateOnBegin;
protected Date finishDateOnEnd;
protected List<QueryVariableValue> variables = new ArrayList<QueryVariableValue>();
public HistoricProcessInstanceQueryImpl() {
}
public HistoricProcessInstanceQueryImpl(CommandContext commandContext) {
super(commandContext);
}
public HistoricProcessInstanceQueryImpl(CommandExecutor commandExecutor) {
super(commandExecutor);
}
public HistoricProcessInstanceQueryImpl processInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
return this;
}
public HistoricProcessInstanceQuery processInstanceIds(Set<String> processInstanceIds) {
if (processInstanceIds == null) {
throw new ActivitiException("Set of process instance ids is null");
}
if (processInstanceIds.isEmpty()) {
throw new ActivitiException("Set of process instance ids is empty");
}
this.processInstanceIds = processInstanceIds;
return this;
}
public HistoricProcessInstanceQueryImpl processDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
return this;
}
public HistoricProcessInstanceQuery processDefinitionKey(String processDefinitionKey) {
this.processDefinitionKey = processDefinitionKey;
return this;
}
public HistoricProcessInstanceQuery processInstanceBusinessKey(String businessKey) {
this.businessKey = businessKey;
return this;
}
public HistoricProcessInstanceQuery finished() {
this.finished = true;
return this;
}
public HistoricProcessInstanceQuery unfinished() {
this.unfinished = true;
return this;
}
public HistoricProcessInstanceQuery startedBy(String userId) {
this.startedBy = userId;
return this;
}
public HistoricProcessInstanceQuery superProcessInstanceId(String superProcessInstanceId) {
this.superProcessInstanceId = superProcessInstanceId;
return this;
}
public HistoricProcessInstanceQuery startDateBy(Date date) {
this.startDateBy = this.calculateMidnight(date);;
return this;
}
public HistoricProcessInstanceQuery startDateOn(Date date) {
this.startDateOn = date;
this.startDateOnBegin = this.calculateMidnight(date);
this.startDateOnEnd = this.calculateBeforeMidnight(date);
return this;
}
public HistoricProcessInstanceQuery finishDateBy(Date date) {
this.finishDateBy = this.calculateBeforeMidnight(date);
return this;
}
public HistoricProcessInstanceQuery finishDateOn(Date date) {
this.finishDateOn = date;
this.finishDateOnBegin = this.calculateMidnight(date);
this.finishDateOnEnd = this.calculateBeforeMidnight(date);
return this;
}
private Date calculateBeforeMidnight(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.SECOND, -1);
return cal.getTime();
}
private Date calculateMidnight(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.HOUR, 0);
return cal.getTime();
}
/* public HistoricProcessInstanceQuery processVariableEquals(String variableName, Object variableValue) {
variables.add(new QueryVariableValue(variableName, variableValue, QueryOperator.EQUALS));
return this;
} */
protected void ensureVariablesInitialized() {
VariableTypes types = Context.getProcessEngineConfiguration().getVariableTypes();
for(QueryVariableValue var : variables) {
var.initialize(types);
}
}
public HistoricProcessInstanceQuery orderByProcessInstanceBusinessKey() {
return orderBy(HistoricProcessInstanceQueryProperty.BUSINESS_KEY);
}
public HistoricProcessInstanceQuery orderByProcessInstanceDuration() {
return orderBy(HistoricProcessInstanceQueryProperty.DURATION);
}
public HistoricProcessInstanceQuery orderByProcessInstanceStartTime() {
return orderBy(HistoricProcessInstanceQueryProperty.START_TIME);
}
public HistoricProcessInstanceQuery orderByProcessInstanceEndTime() {
return orderBy(HistoricProcessInstanceQueryProperty.END_TIME);
}
public HistoricProcessInstanceQuery orderByProcessDefinitionId() {
return orderBy(HistoricProcessInstanceQueryProperty.PROCESS_DEFINITION_ID);
}
public HistoricProcessInstanceQuery orderByProcessInstanceId() {
return orderBy(HistoricProcessInstanceQueryProperty.PROCESS_INSTANCE_ID_);
}
public long executeCount(CommandContext commandContext) {
checkQueryOk();
ensureVariablesInitialized();
return commandContext
.getHistoricProcessInstanceManager()
.findHistoricProcessInstanceCountByQueryCriteria(this);
}
public List<HistoricProcessInstance> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
ensureVariablesInitialized();
return commandContext
.getHistoricProcessInstanceManager()
.findHistoricProcessInstancesByQueryCriteria(this, page);
}
public String getBusinessKey() {
return businessKey;
}
public boolean isOpen() {
return unfinished;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
public String getProcessDefinitionKey() {
return processDefinitionKey;
}
public String getProcessDefinitionIdLike() {
return processDefinitionKey + ":%:%";
}
public String getProcessInstanceId() {
return processInstanceId;
}
public Set<String> getProcessInstanceIds() {
return processInstanceIds;
}
public String getStartedBy() {
return startedBy;
}
public String getSuperProcessInstanceId() {
return superProcessInstanceId;
}
public void setSuperProcessInstanceId(String superProcessInstanceId) {
this.superProcessInstanceId = superProcessInstanceId;
}
}