/*
* 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.factory;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEnvironment;
import org.kie.internal.runtime.manager.SessionFactory;
import org.kie.internal.runtime.manager.SessionNotFoundException;
/**
* SessionFactory implementation backed with an in-memory store of used sessions. This does not preserve state
* between server restarts or even <code>RuntimeManager</code> close. For that, the more permanent store
* <code>JPASessionFactory</code> should be used.
*
* @see JPASessionFactory
*/
public class InMemorySessionFactory implements SessionFactory {
private RuntimeEnvironment environment;
private KieBase kbase;
// TODO all sessions stored here should be proxied so it can be removed on dispose/destroy
private Map<Long, KieSession> sessions = new ConcurrentHashMap<Long, KieSession>();
public InMemorySessionFactory(RuntimeEnvironment environment) {
this.environment = environment;
this.kbase = environment.getKieBase();
}
@Override
public KieSession newKieSession() {
KieSession ksession = kbase.newKieSession(environment.getConfiguration(), environment.getEnvironment());
this.sessions.put(ksession.getIdentifier(), ksession);
return ksession;
}
@Override
public KieSession findKieSessionById(Long sessionId) {
if (sessions.containsKey(sessionId)) {
return sessions.get(sessionId);
} else {
throw new SessionNotFoundException("Session with id " + sessionId + " was not found");
}
}
@Override
public void close() {
sessions.clear();
}
}