/*
* Copyright 2012 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.
* 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.jbpm.services.task.commands;
import org.drools.core.command.impl.ExecutableCommand;
import org.drools.core.fluent.impl.Batch;
import org.drools.core.fluent.impl.InternalExecutable;
import org.drools.core.runtime.ChainableRunner;
import org.drools.core.runtime.InternalLocalRunner;
import org.jbpm.services.task.events.TaskEventSupport;
import org.kie.api.command.Command;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.Executable;
import org.kie.api.runtime.RequestContext;
public class TaskCommandExecutorImpl implements InternalLocalRunner {
private Environment environment;
private TaskEventSupport taskEventSupport;
private InternalLocalRunner commandService = new SelfExecutionCommandService(this);
public TaskCommandExecutorImpl(Environment environment, TaskEventSupport taskEventSupport) {
this.environment = environment;
this.taskEventSupport = taskEventSupport;
}
@Override
public RequestContext execute( Executable executable, RequestContext ctx ) {
return this.commandService.execute(executable, ctx);
}
public <T> T execute(Command<T> command) {
return this.commandService.execute(command);
}
public void addInterceptor(ChainableRunner interceptor) {
interceptor.setNext( this.commandService );
this.commandService = interceptor;
}
@Override
public RequestContext createContext() {
if (this.commandService instanceof SelfExecutionCommandService) {
return new TaskContext();
}
return new TaskContext(commandService.createContext(), environment, taskEventSupport);
}
private class SelfExecutionCommandService implements InternalLocalRunner {
private TaskCommandExecutorImpl owner;
SelfExecutionCommandService(TaskCommandExecutorImpl owner) {
this.owner = owner;
}
@Override
public RequestContext execute(Executable executable, RequestContext context) {
for (Batch batch : ( (InternalExecutable) executable ).getBatches()) {
for (Command command : batch.getCommands()) {
if (command instanceof TaskCommand) {
Object result = ((ExecutableCommand) command).execute( new TaskContext(context, environment, taskEventSupport) );
context.set("Result", result);
} else {
throw new IllegalArgumentException("Task service can only execute task commands");
}
}
}
return context;
}
@Override
public RequestContext createContext() {
return owner.createContext();
}
}
}