/*
* Copyright 2011 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.drools.simulation.fluent.batch.impl;
import org.drools.core.command.IdentifiableResult;
import org.drools.core.command.impl.GenericCommand;
import org.drools.core.command.runtime.BatchExecutionCommandImpl;
import org.drools.core.command.runtime.GetGlobalCommand;
import org.drools.core.command.runtime.SetGlobalCommand;
import org.drools.core.command.runtime.process.CreateProcessInstanceCommand;
import org.drools.core.command.runtime.process.StartProcessCommand;
import org.drools.core.command.runtime.process.StartProcessInstanceCommand;
import org.drools.core.command.runtime.rule.DeleteCommand;
import org.drools.core.command.runtime.rule.FireAllRulesCommand;
import org.drools.core.command.runtime.rule.InsertObjectCommand;
import org.drools.simulation.fluent.batch.FluentBatchExecution;
import org.drools.simulation.fluent.test.impl.MapVariableContext;
import org.kie.api.command.BatchExecutionCommand;
import org.kie.internal.fluent.VariableContext;
import org.kie.api.runtime.rule.FactHandle;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
// TODO Do we really want this as a separate class hierarchy just to do batches? Does this fit in with the SimulationFluent?
public class FluentBatchExecutionImpl implements FluentBatchExecution {
private List<GenericCommand<?>> cmds = new ArrayList<GenericCommand<?>>();
private VariableContext vars;
private GenericCommand<?> lastAddedCommand;
public FluentBatchExecutionImpl() {
vars = new MapVariableContext();
}
public void addCommand(GenericCommand<?> cmd) {
cmds.add(cmd);
}
public <P> VariableContext<P> getVariableContext() {
return vars;
}
public BatchExecutionCommand getBatchExecution() {
return new BatchExecutionCommandImpl((List<GenericCommand<?>>) cmds);
}
public FluentBatchExecution newBatchExecution() {
return this;
}
public FluentBatchExecution insert(Object object) {
lastAddedCommand = new InsertObjectCommand(object);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution update(FactHandle handle, Object object) {
lastAddedCommand = new InsertObjectCommand(object);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution delete(FactHandle handle) {
lastAddedCommand = new DeleteCommand(handle);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution fireAllRules() {
addCommand(new FireAllRulesCommand());
return this;
}
public FluentBatchExecution assertRuleFired(String ruleName) {
throw new UnsupportedOperationException(
"FluentBatchExecutionImpl duplicates DefaultStatefulKnowledgeSessionSimFluent");
}
public FluentBatchExecution assertRuleFired(String ruleName, int fireCount) {
throw new UnsupportedOperationException(
"FluentBatchExecutionImpl duplicates DefaultStatefulKnowledgeSessionSimFluent");
}
public FluentBatchExecution setGlobal(String identifier, Object object) {
lastAddedCommand = new SetGlobalCommand(identifier, object);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution set(String name) {
if (lastAddedCommand instanceof IdentifiableResult){
((IdentifiableResult) lastAddedCommand).setOutIdentifier(name);
} else {
Logger.getLogger(FluentBatchExecutionImpl.class.getName()).log(Level.WARNING,
"The lastAddedCommand class (" + lastAddedCommand.getClass()
+ ") is not an instanceof IdentifiableResult.\n "
+ "As result, the variable '"+name+"' will not be set.");
}
return this;
}
public FluentBatchExecution startProcess(String identifier, Map<String, Object> params) {
lastAddedCommand = new StartProcessCommand(identifier, params);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution startProcess(String identifier) {
lastAddedCommand = new StartProcessCommand(identifier);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution createProcessInstance(String identifier, Map<String, Object> params) {
lastAddedCommand = new CreateProcessInstanceCommand(identifier, params);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution startProcessInstance(long processId) {
lastAddedCommand = new StartProcessInstanceCommand(processId);
addCommand(lastAddedCommand);
return this;
}
public FluentBatchExecution signalEvent(String id, Object event, long processId) {
throw new UnsupportedOperationException("Not supported yet.");
}
// added but not yet tested
public FluentBatchExecution signalEvent(String id, Object event) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public FluentBatchExecution out() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public FluentBatchExecution out(String name) {
throw new UnsupportedOperationException("Not supported yet.");
}
// added but not yet tested
public FluentBatchExecution getGlobal(String identifier) {
lastAddedCommand = new GetGlobalCommand(identifier);
addCommand(lastAddedCommand);
return this;
}
}