/*
* 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.
* 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.test.regression;
import org.jbpm.process.instance.event.DefaultSignalManagerFactory;
import org.jbpm.process.instance.impl.DefaultProcessInstanceManagerFactory;
import org.jbpm.test.JbpmTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.ReleaseId;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.builder.model.ListenerModel;
import org.kie.api.event.process.DefaultProcessEventListener;
import org.kie.api.event.process.ProcessEventListener;
import org.kie.api.event.process.ProcessStartedEvent;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import java.util.Collection;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Tests stateful/stateless KieSession ProcessEventListener registration - DROOLS-818.
*/
public class ListenersTest extends JbpmTestCase {
private static final ReleaseId RELEASE_ID = KieServices.Factory.get()
.newReleaseId("org.jbpm.test", "listeners-test", "1.0.0");
private KieServices ks = KieServices.Factory.get();
private KieSession kieSession;
public ListenersTest() {
super(false, false);
}
@Before
public void init() {
ReleaseId kieModuleId = prepareKieModule();
final KieContainer kieContainer = ks.newKieContainer(kieModuleId);
Properties properties = new Properties();
properties.setProperty("drools.processSignalManagerFactory", DefaultSignalManagerFactory.class.getName());
properties.setProperty("drools.processInstanceManagerFactory", DefaultProcessInstanceManagerFactory.class.getName());
this.kieSession = kieContainer.newKieSession((Environment) null, ks.newKieSessionConfiguration(properties));
}
@After
public void cleanup() {
if (this.kieSession != null) {
this.kieSession.dispose();
}
}
@Test
public void testRegisterProcessEventListenerStateful() throws Exception {
kieSession.startProcess("testProcess");
final Collection<ProcessEventListener> listeners = kieSession.getProcessEventListeners();
assertTrue("Listener not registered.", listeners.size() >= 1);
MarkingProcessEventListener listener = getMarkingListener(listeners);
assertTrue("Expected listener to fire.", listener.hasFired());
}
private MarkingProcessEventListener getMarkingListener(Collection<?> listeners) {
for (Object listener : listeners) {
if (listener instanceof MarkingProcessEventListener) {
return (MarkingProcessEventListener) listener;
}
}
throw new IllegalArgumentException("Expected at least one MarkingProcessEventListener in the collection");
}
/**
* Inserts a new KieModule containing single KieBase and a stateful and stateless KieSessions with listeners
* into KieRepository.
*
* @return created module ReleaseId
*/
private ReleaseId prepareKieModule() {
final KieServices ks = KieServices.Factory.get();
KieModuleModel module = ks.newKieModuleModel();
KieBaseModel baseModel = module.newKieBaseModel("defaultKBase");
baseModel.setDefault(true);
baseModel.addPackage("*");
KieSessionModel sessionModel = baseModel.newKieSessionModel("defaultKSession");
sessionModel.setDefault(true);
sessionModel.setType(KieSessionModel.KieSessionType.STATEFUL);
sessionModel.newListenerModel(MarkingProcessEventListener.class.getName(), ListenerModel.Kind.PROCESS_EVENT_LISTENER);
KieFileSystem kfs = ks.newKieFileSystem();
kfs.writeKModuleXML(module.toXML());
kfs.generateAndWritePomXML(RELEASE_ID);
kfs.write(ResourceFactory.newClassPathResource("listeners-test.bpmn", this.getClass()));
KieBuilder builder = ks.newKieBuilder(kfs).buildAll();
assertEquals("Unexpected compilation errors", 0, builder.getResults().getMessages().size());
ks.getRepository().addKieModule(builder.getKieModule());
return RELEASE_ID;
}
/**
* A listener marking that a ProcessEvent has fired.
*/
public static class MarkingProcessEventListener extends DefaultProcessEventListener {
private final AtomicBoolean fired = new AtomicBoolean(false);
@Override
public void beforeProcessStarted(final ProcessStartedEvent event) {
super.beforeProcessStarted(event);
this.fired.compareAndSet(false, true);
}
public boolean hasFired() {
return this.fired.get();
}
}
}