/*
* 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.services.task.impl;
import static org.kie.internal.query.QueryParameterIdentifiers.ACTUAL_OWNER_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.ARCHIVED;
import static org.kie.internal.query.QueryParameterIdentifiers.BUSINESS_ADMIN_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.CREATED_BY_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.CREATED_ON_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.DEPLOYMENT_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.EXPIRATION_TIME_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.POTENTIAL_OWNER_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.PROCESS_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.PROCESS_INSTANCE_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.PROCESS_SESSION_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.SKIPPABLE;
import static org.kie.internal.query.QueryParameterIdentifiers.STAKEHOLDER_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.SUB_TASKS_STRATEGY;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_ACTIVATION_TIME_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_DESCRIPTION_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_FORM_NAME_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_NAME_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_PARENT_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_PRIORITY_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_STATUS_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_SUBJECT_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_VARIABLE_NAME_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TASK_VARIABLE_VALUE_ID_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.TYPE_LIST;
import static org.kie.internal.query.QueryParameterIdentifiers.WORK_ITEM_ID_LIST;
import java.util.Date;
import java.util.List;
import org.jbpm.query.jpa.builder.impl.AbstractQueryBuilderImpl;
import org.jbpm.query.jpa.data.QueryWhere;
import org.jbpm.services.task.commands.TaskSummaryQueryCommand;
import org.kie.api.runtime.CommandExecutor;
import org.kie.api.task.TaskService;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.TaskSummary;
import org.kie.internal.query.ParametrizedQuery;
import org.kie.internal.query.QueryContext;
import org.kie.internal.query.QueryParameterIdentifiers;
import org.kie.internal.task.api.model.SubTasksStrategy;
import org.kie.internal.task.query.TaskSummaryQueryBuilder;
/**
* Main Implementation of the {@link TaskSummaryQueryBuilder}. See the {@link TaskSummaryQueryBuilder} interface
* for more information.
* </p>
* This implementation defaults to an ascending orderby of "Id". It's important to
* have a default ordering of results so that optional ({@link QueryContext}) offset and count
* parameters then will actually be useful. Without an ordering, subsequent queries can retrieve
* different randomly ordered lists.
*/
public class TaskSummaryQueryBuilderImpl extends AbstractQueryBuilderImpl<TaskSummaryQueryBuilder> implements TaskSummaryQueryBuilder {
private final CommandExecutor executor;
private final String userId;
// for buiding QueryWhere instances
public TaskSummaryQueryBuilderImpl() {
this.userId = null;
this.executor = null;
}
public TaskSummaryQueryBuilderImpl(String userId, TaskService taskService) {
this.executor = taskService;
this.userId = userId;
this.queryWhere.setAscending(QueryParameterIdentifiers.TASK_ID_LIST);
}
// Task query builder methods
@Override
public TaskSummaryQueryBuilder activationTime( Date... activationTime ) {
addObjectParameter(TASK_ACTIVATION_TIME_LIST, "activation time", activationTime);
return this;
}
@Override
public TaskSummaryQueryBuilder activationTimeRange( Date activationTimeMin, Date activationTimeMax ) {
addRangeParameters(TASK_ACTIVATION_TIME_LIST, "activation time range", activationTimeMin, activationTimeMax);
return this;
}
@Override
public TaskSummaryQueryBuilder actualOwner( String... taskOwnerId ) {
addObjectParameter(ACTUAL_OWNER_ID_LIST, "task owner id", taskOwnerId);
return this;
}
@Override
public TaskSummaryQueryBuilder archived( boolean archived ) {
Short realValue = archived ? new Short((short) 1) : new Short((short) 0);
addObjectParameter(ARCHIVED, "archived", realValue);
return this;
}
@Override
public TaskSummaryQueryBuilder businessAdmin( String... businessAdminId ) {
addObjectParameter(BUSINESS_ADMIN_ID_LIST, "business administrator id", businessAdminId);
return this;
}
@Override
public TaskSummaryQueryBuilder createdBy( String... createdById ) {
addObjectParameter(CREATED_BY_LIST, "created by id", createdById);
return this;
}
@Override
public TaskSummaryQueryBuilder createdOn( Date... createdOnDate ) {
addObjectParameter(CREATED_ON_LIST, "created on", createdOnDate);
return this;
}
@Override
public TaskSummaryQueryBuilder createdOnRange( Date createdOnMin, Date createdOnMax ) {
addRangeParameters(CREATED_ON_LIST, "created on range", createdOnMin, createdOnMax);
return this;
}
@Override
public TaskSummaryQueryBuilder deploymentId( String... deploymentId ) {
addObjectParameter(DEPLOYMENT_ID_LIST, "deployment id", deploymentId);
return this;
}
@Override
public TaskSummaryQueryBuilder description( String... description ) {
addObjectParameter(TASK_DESCRIPTION_LIST, "description", description);
for( String desc : description ) {
if( desc.length() > 255 ) {
throw new IllegalArgumentException("String argument is longer than 255 characters: [" + desc + "]");
}
}
return this;
}
@Override
public TaskSummaryQueryBuilder expirationTime( Date... expirationTime ) {
addObjectParameter(EXPIRATION_TIME_LIST, "expiration time", expirationTime);
return this;
}
@Override
public TaskSummaryQueryBuilder expirationTimeRange( Date expirationTimeMin, Date expirationTimeMax ) {
addRangeParameters(EXPIRATION_TIME_LIST, "expiration time range", expirationTimeMin, expirationTimeMax);
return this;
}
@Override
public TaskSummaryQueryBuilder formName( String... formName ) {
addObjectParameter(TASK_FORM_NAME_LIST, "form name", formName);
return this;
}
@Override
public TaskSummaryQueryBuilder potentialOwner( String... potentialOwnerId ) {
addObjectParameter(POTENTIAL_OWNER_ID_LIST, "potential owner id", potentialOwnerId);
return this;
}
@Override
public TaskSummaryQueryBuilder processInstanceId( long... processInstanceId ) {
addLongParameter(PROCESS_INSTANCE_ID_LIST, "process instance id", processInstanceId);
return this;
}
@Override
public TaskSummaryQueryBuilder name( String... names ) {
addObjectParameter(TASK_NAME_LIST, "task name", names);
for( String name : names ) {
if( name.length() > 255 ) {
throw new IllegalArgumentException("String argument is longer than 255 characters: [" + name + "]");
}
}
return this;
}
@Override
public TaskSummaryQueryBuilder priority( int... priority ) {
addIntParameter(TASK_PRIORITY_LIST, "priority", priority);
return this;
}
@Override
public TaskSummaryQueryBuilder processId( String... processId ) {
addObjectParameter(PROCESS_ID_LIST, "process id", processId);
return this;
}
@Override
public TaskSummaryQueryBuilder processInstanceIdRange( Long processInstanceIdMin, Long processInstanceIdMax ) {
addRangeParameters(PROCESS_INSTANCE_ID_LIST, "process instance id range", processInstanceIdMin, processInstanceIdMax);
return this;
}
@Override
public TaskSummaryQueryBuilder processSessionId( long... processSessionId ) {
addLongParameter(PROCESS_SESSION_ID_LIST, "process session id", processSessionId);
return this;
}
@Override
public TaskSummaryQueryBuilder skippable( boolean skippable ) {
addObjectParameter(SKIPPABLE, "skippable", skippable);
return this;
}
@Override
public TaskSummaryQueryBuilder stakeHolder( String... stakeHolderId ) {
addObjectParameter(STAKEHOLDER_ID_LIST, "stakeholder id", stakeHolderId);
return this;
}
@Override
public TaskSummaryQueryBuilder status( Status... status ) {
addObjectParameter(TASK_STATUS_LIST, "status", status);
return this;
}
@Override
public TaskSummaryQueryBuilder subject( String... subjects ) {
addObjectParameter(TASK_SUBJECT_LIST, "subject", subjects);
for( String subject : subjects ) {
if( subject.length() > 255 ) {
throw new IllegalArgumentException("String argument is longer than 255 characters: [" + subject + "]");
}
}
return this;
}
@Override
public TaskSummaryQueryBuilder subTaskStrategy( SubTasksStrategy... subTasksStrategy ) {
addObjectParameter(SUB_TASKS_STRATEGY, "sub tasks strategy", subTasksStrategy);
return this;
}
@Override
public TaskSummaryQueryBuilder taskId( long... taskId ) {
addLongParameter(TASK_ID_LIST, "task id", taskId);
return this;
}
@Override
public TaskSummaryQueryBuilder taskIdRange( Long taskIdMin, Long taskIdMax ) {
addRangeParameters(TASK_ID_LIST, "task id range", taskIdMin, taskIdMax);
return this;
}
@Override
public TaskSummaryQueryBuilder taskParentId( long... taskParentId ) {
addLongParameter(TASK_PARENT_ID_LIST, "task parent id", taskParentId);
return this;
}
@Override
public TaskSummaryQueryBuilder taskType( String... taskType ) {
addObjectParameter(TYPE_LIST, "created on", taskType);
return this;
}
@Override
public TaskSummaryQueryBuilder variableName( String... varName ) {
addObjectParameter(TASK_VARIABLE_NAME_ID_LIST, "task variable name", varName);
return this;
}
@Override
public TaskSummaryQueryBuilder variableValue( String... varValue ) {
addObjectParameter(TASK_VARIABLE_VALUE_ID_LIST, "task variable value", varValue);
return this;
}
@Override
public TaskSummaryQueryBuilder workItemId( long... workItemId ) {
addLongParameter(WORK_ITEM_ID_LIST, "work item id", workItemId);
return this;
}
// Other methods
@Override
public TaskSummaryQueryBuilder clear() {
super.clear();
getQueryWhere().setAscending(QueryParameterIdentifiers.TASK_ID_LIST);
return this;
}
@Override
public TaskSummaryQueryBuilder ascending( OrderBy field ) {
String listId = getOrderByListId(field);
this.queryWhere.setAscending(listId);
return this;
}
@Override
public TaskSummaryQueryBuilder descending( OrderBy field ) {
String listId = getOrderByListId(field);
this.queryWhere.setDescending(listId);
return this;
}
private String getOrderByListId( OrderBy field ) {
if( field == null ) {
throw new IllegalArgumentException( "A null order by criteria is invalid." );
}
String orderByString;
switch( field ) {
case taskId:
orderByString = QueryParameterIdentifiers.TASK_ID_LIST;
break;
case processInstanceId:
orderByString = QueryParameterIdentifiers.PROCESS_INSTANCE_ID_LIST;
break;
case taskName:
orderByString = QueryParameterIdentifiers.TASK_NAME_LIST;
break;
case taskStatus:
orderByString = QueryParameterIdentifiers.TASK_STATUS_LIST;
break;
case createdOn:
orderByString = QueryParameterIdentifiers.CREATED_ON_LIST;
break;
case createdBy:
orderByString = QueryParameterIdentifiers.CREATED_BY_LIST;
break;
default:
throw new UnsupportedOperationException("Unsupported order by arqument: " + field.toString() );
}
return orderByString;
}
@Override
public ParametrizedQuery<TaskSummary> build() {
return new ParametrizedQuery<TaskSummary>() {
private QueryWhere queryWhere = new QueryWhere(getQueryWhere());
@Override
public List<TaskSummary> getResultList() {
TaskSummaryQueryCommand cmd = new TaskSummaryQueryCommand(queryWhere);
cmd.setUserId(userId);
return executor.execute(cmd);
}
};
}
}