/*
* Copyright (c) WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* 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.wso2.carbon.bpel.b4p.coordination.event.listeners;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ode.bpel.common.ProcessState;
import org.apache.ode.bpel.evt.BpelEvent;
import org.apache.ode.bpel.evt.ProcessInstanceEvent;
import org.apache.ode.bpel.evt.ProcessInstanceStateChangeEvent;
import org.apache.ode.bpel.evt.ProcessTerminationEvent;
import org.apache.ode.bpel.iapi.BpelEventListener;
import org.wso2.carbon.bpel.b4p.coordination.configuration.CoordinationConfiguration;
import org.wso2.carbon.bpel.b4p.internal.B4PContentHolder;
import org.wso2.carbon.bpel.b4p.internal.B4PServiceComponent;
import org.wso2.carbon.bpel.core.ode.integration.store.ProcessConfigurationImpl;
import java.util.Properties;
/**
* BPEL Event listener for termination tasks.
*/
public class EventListener implements BpelEventListener {
private static final Log log = LogFactory.getLog(EventListener.class);
private boolean isCoordinationEnabled = false;
public void onEvent(BpelEvent bpelEvent) {
if (isCoordinationEnabled) {
if (bpelEvent instanceof ProcessTerminationEvent) {
ProcessTerminationEvent event = (ProcessTerminationEvent) bpelEvent;
ProcessConfigurationImpl processConf = getProcessConfiguration(event);
if (processConf != null && processConf.isB4PTaskIncluded()) {
if (log.isDebugEnabled()) {
log.debug("TERMINATED Process instance " + event.getProcessInstanceId()
+ " has a B4P activity. Initiating Exit Protocol Messages to task(s).");
}
TerminationTask terminationTask = new TerminationTask(Long.toString(event.getProcessInstanceId()));
terminationTask.setTenantID(processConf.getTenantId());
B4PContentHolder.getInstance().getCoordinationController().runTask(terminationTask);
}
} else if (bpelEvent instanceof ProcessInstanceStateChangeEvent) {
ProcessInstanceStateChangeEvent instanceStateChangeEvent = (ProcessInstanceStateChangeEvent) bpelEvent;
if (ProcessState.STATE_COMPLETED_WITH_FAULT == instanceStateChangeEvent.getNewState()) {
ProcessConfigurationImpl processConf = getProcessConfiguration(instanceStateChangeEvent);
if (processConf != null && processConf.isB4PTaskIncluded()) {
if (log.isDebugEnabled()) {
log.debug("Process Instance, COMPLETED WITH FAULT " + instanceStateChangeEvent
.getProcessInstanceId()
+ " has a B4P activity. Initiating Exit Protocol Messages to task(s)");
}
TerminationTask terminationTask = new TerminationTask(Long.toString(instanceStateChangeEvent
.getProcessInstanceId()));
terminationTask.setTenantID(processConf.getTenantId());
B4PContentHolder.getInstance().getCoordinationController().runTask(terminationTask);
}
}
}
}
}
public void startup(Properties properties) {
this.isCoordinationEnabled = CoordinationConfiguration.getInstance().isHumantaskCoordinationEnabled();
}
public void shutdown() {
}
private ProcessConfigurationImpl getProcessConfiguration(ProcessInstanceEvent event) {
int tenantId = B4PServiceComponent.getBPELServer().getMultiTenantProcessStore().getTenantId(event
.getProcessId());
return (ProcessConfigurationImpl) B4PServiceComponent.
getBPELServer().getMultiTenantProcessStore().getTenantsProcessStore(tenantId).
getProcessConfiguration(event.getProcessId());
}
}