/*
* Copyright 2013 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.kie.spring.factorybeans.helper;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.command.Command;
import org.kie.api.command.KieCommands;
import org.kie.api.event.process.ProcessEventListener;
import org.kie.api.event.rule.AgendaEventListener;
import org.kie.api.event.rule.RuleRuntimeEventListener;
import org.kie.api.logger.KieRuntimeLogger;
import org.kie.api.runtime.Channel;
import org.kie.api.runtime.Globals;
import org.kie.api.runtime.StatelessKieSession;
import org.kie.internal.command.CommandFactory;
import org.kie.spring.factorybeans.KSessionFactoryBean;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class StatelessKSessionFactoryBeanHelper extends KSessionFactoryBeanHelper {
protected StatelessKieSession kieSession;
private List<Command<?>> commands;
public StatelessKSessionFactoryBeanHelper(KSessionFactoryBean factoryBean, StatelessKieSession kieSession) {
super(factoryBean);
this.kieSession = kieSession;
}
@Override
public void internalAfterPropertiesSet() throws Exception {
if (factoryBean.getBatch() != null && !factoryBean.getBatch().isEmpty()) {
commands = factoryBean.getBatch();
}
}
@Override
public Object internalGetObject() {
return commands == null ? kieSession : new DelegateStatelessKieSession(kieSession, commands);
}
@Override
public Object internalNewObject() {
if (kieBase != null) {
return kieBase.newStatelessKieSession(factoryBean.getConf());
}
return null;
}
public static class DelegateStatelessKieSession implements StatelessKieSession {
private final StatelessKieSession delegate;
private final List<Command<?>> commands;
public DelegateStatelessKieSession( StatelessKieSession delegate, List<Command<?>> commands ) {
this.delegate = delegate;
this.commands = commands;
}
@Override
public Globals getGlobals() {
return delegate.getGlobals();
}
@Override
public void setGlobal( String s, Object o ) {
delegate.setGlobal( s, o );
}
@Override
public void registerChannel( String s, Channel channel ) {
delegate.registerChannel( s, channel );
}
@Override
public void unregisterChannel( String s ) {
delegate.unregisterChannel( s );
}
@Override
public Map<String, Channel> getChannels() {
return delegate.getChannels();
}
@Override
public KieBase getKieBase() {
return delegate.getKieBase();
}
@Override
public KieRuntimeLogger getLogger() {
return delegate.getLogger();
}
@Override
public void addEventListener( ProcessEventListener processEventListener ) {
delegate.addEventListener( processEventListener );
}
@Override
public void removeEventListener( ProcessEventListener processEventListener ) {
delegate.removeEventListener( processEventListener );
}
@Override
public Collection<ProcessEventListener> getProcessEventListeners() {
return delegate.getProcessEventListeners();
}
@Override
public void addEventListener( RuleRuntimeEventListener ruleRuntimeEventListener ) {
delegate.addEventListener( ruleRuntimeEventListener );
}
@Override
public void removeEventListener( RuleRuntimeEventListener ruleRuntimeEventListener ) {
delegate.removeEventListener( ruleRuntimeEventListener );
}
@Override
public Collection<RuleRuntimeEventListener> getRuleRuntimeEventListeners() {
return delegate.getRuleRuntimeEventListeners();
}
@Override
public void addEventListener( AgendaEventListener agendaEventListener ) {
delegate.addEventListener( agendaEventListener );
}
@Override
public void removeEventListener( AgendaEventListener agendaEventListener ) {
delegate.removeEventListener( agendaEventListener );
}
@Override
public Collection<AgendaEventListener> getAgendaEventListeners() {
return delegate.getAgendaEventListeners();
}
@Override
public <T> T execute( Command<T> command ) {
KieCommands kieCommands = KieServices.Factory.get().getCommands();
List<Command<?>> cmds = new ArrayList<Command<?>>();
cmds.addAll( commands );
cmds.add( command );
return (T) delegate.execute( CommandFactory.newBatchExecution( cmds ) );
}
@Override
public void execute( Object object ) {
KieCommands kieCommands = KieServices.Factory.get().getCommands();
List<Command<?>> cmds = new ArrayList<Command<?>>();
cmds.addAll( commands );
cmds.add( kieCommands.newInsert( object ) );
cmds.add( kieCommands.newFireAllRules() );
delegate.execute( CommandFactory.newBatchExecution( cmds ) );
}
@Override
public void execute( Iterable objects ) {
KieCommands kieCommands = KieServices.Factory.get().getCommands();
List<Command<?>> cmds = new ArrayList<Command<?>>();
cmds.addAll( commands );
for ( Object object : objects ) {
cmds.add( kieCommands.newInsert( object ) );
}
cmds.add( kieCommands.newFireAllRules() );
delegate.execute( CommandFactory.newBatchExecution( cmds ) );
}
}
}