/* * 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.jbpm.runtime.manager.impl; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.jbpm.process.audit.JPAAuditLogService; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.manager.Context; import org.kie.api.runtime.manager.RuntimeEngine; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.api.runtime.manager.audit.AuditService; import org.kie.api.task.TaskService; import org.kie.internal.runtime.manager.Disposable; import org.kie.internal.runtime.manager.DisposeListener; import org.kie.internal.runtime.manager.InternalRuntimeManager; /** * An implementation of the <code>RuntimeEngine</code> that additionally implements the <code>Disposable</code> * interface to allow other components to register listeners on it. The usual case for this is that listeners * and work item handlers might be interested in receiving notification when the runtime engine is disposed of, * in order deactivate themselves too and not receive any other events. */ public class RuntimeEngineImpl implements RuntimeEngine, Disposable { private RuntimeEngineInitlializer initializer; private Context<?> context; private KieSession ksession; private Long kieSessionId; private TaskService taskService; private AuditService auditService; private RuntimeManager manager; private boolean disposed = false; private boolean afterCompletion = false; private List<DisposeListener> listeners = new CopyOnWriteArrayList<DisposeListener>(); public RuntimeEngineImpl(KieSession ksession, TaskService taskService) { this.ksession = ksession; this.kieSessionId = ksession.getIdentifier(); this.taskService = taskService; } public RuntimeEngineImpl(Context<?> context, RuntimeEngineInitlializer initializer) { this.context = context; this.initializer = initializer; } @Override public KieSession getKieSession() { if (this.disposed) { throw new IllegalStateException("This runtime is already diposed"); } if (ksession == null && initializer != null) { ksession = initializer.initKieSession(context, (InternalRuntimeManager) manager, this); this.kieSessionId = ksession.getIdentifier(); } return this.ksession; } @Override public TaskService getTaskService() { if (this.disposed) { throw new IllegalStateException("This runtime is already diposed"); } if (taskService == null) { if (initializer != null) { taskService = initializer.initTaskService(context, (InternalRuntimeManager) manager, this); } if (taskService == null) { throw new UnsupportedOperationException("TaskService was not configured"); } } return this.taskService; } @Override public void dispose() { if (!this.disposed) { // first call listeners and then dispose itself for (DisposeListener listener : listeners) { listener.onDispose(this); } if (ksession != null) { try { ksession.dispose(); } catch(IllegalStateException e){ // do nothing most likely ksession was already disposed } catch (Exception e) { e.printStackTrace(); } } if (auditService != null) { auditService.dispose(); } this.disposed = true; } } @Override public void addDisposeListener(DisposeListener listener) { if (this.disposed) { throw new IllegalStateException("This runtime is already diposed"); } this.listeners.add(listener); } public RuntimeManager getManager() { return manager; } public void setManager(RuntimeManager manager) { this.manager = manager; } public boolean isDisposed() { return disposed; } @Override public AuditService getAuditService() { if (auditService == null) { boolean usePersistence = ((InternalRuntimeManager)manager).getEnvironment().usePersistence(); if (usePersistence) { auditService = new JPAAuditLogService(getKieSession().getEnvironment()); } else { throw new UnsupportedOperationException("AuditService was not configured, supported only with persistence"); } } return auditService; } public KieSession internalGetKieSession() { return ksession; } public void internalSetKieSession(KieSession ksession) { this.ksession = ksession; this.kieSessionId = ksession.getIdentifier(); } public boolean isAfterCompletion() { return afterCompletion; } public void setAfterCompletion(boolean completing) { this.afterCompletion = completing; } public Context<?> getContext() { return context; } public void setContext(Context<?> context) { this.context = context; } public Long getKieSessionId() { return kieSessionId; } }