/*
* 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.
*
* 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.process.audit.strategy;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.EnvironmentName;
public enum PersistenceStrategyType {
KIE_SESSION,
STANDALONE_JTA,
STANDALONE_JTA_SPRING_SHARED_EM,
STANDALONE_LOCAL_SPRING_SHARED_EM,
STANDALONE_LOCAL;
public static PersistenceStrategy getPersistenceStrategy(PersistenceStrategyType type, Environment env ) {
return getPersistenceStrategy(type, env, null, null);
}
public static PersistenceStrategy getPersistenceStrategy(PersistenceStrategyType type, EntityManagerFactory emf ) {
return getPersistenceStrategy(type, null, emf, null);
}
public static PersistenceStrategy getPersistenceStrategy(PersistenceStrategyType type, String peristenceUnitName ) {
return getPersistenceStrategy(type, null, null, peristenceUnitName);
}
public static PersistenceStrategy getPersistenceStrategy(PersistenceStrategyType type,
Environment env, EntityManagerFactory emf,
String persistenceUnitName) {
EntityManager em = null;
if( env != null ) {
emf = (EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY);
// in case there is entity manager already available and the type is shared entity manager then use this
em = (EntityManager) env.get(EnvironmentName.CMD_SCOPED_ENTITY_MANAGER);
}
PersistenceStrategy persistenceStrategy;
switch(type) {
case KIE_SESSION:
persistenceStrategy = new KieSessionCommandScopedStrategy(env);
break;
case STANDALONE_JTA:
if( emf != null ) {
persistenceStrategy = new StandaloneJtaStrategy(emf);
} else if(persistenceUnitName != null) {
persistenceStrategy = new StandaloneJtaStrategy(Persistence.createEntityManagerFactory(persistenceUnitName));
} else {
throw new IllegalArgumentException(
"Either the EnvironmentName.ENTITY_MANAGER_FACTORY should be set in the given Environment, or a valid peristence unit name is required.");
}
break;
case STANDALONE_JTA_SPRING_SHARED_EM:
if( em != null ) {
persistenceStrategy = new SpringStandaloneJtaSharedEntityManagerStrategy(em);
} else if( emf != null ) {
persistenceStrategy = new SpringStandaloneJtaSharedEntityManagerStrategy(emf);
} else {
throw new IllegalArgumentException(
"The EnvironmentName.ENTITY_MANAGER_FACTORY should be set "
+ "with a valid EntityManagerFactory instance in the given Environment instance.");
}
break;
case STANDALONE_LOCAL_SPRING_SHARED_EM:
if( em != null ) {
persistenceStrategy = new SpringStandaloneLocalSharedEntityManagerStrategy(em);
} else if( emf != null ) {
persistenceStrategy = new SpringStandaloneLocalSharedEntityManagerStrategy(emf);
} else {
throw new IllegalArgumentException(
"The EnvironmentName.ENTITY_MANAGER_FACTORY should be set "
+ "with a valid EntityManagerFactory instance in the given Environment instance.");
}
break;
case STANDALONE_LOCAL:
if( emf != null ) {
persistenceStrategy = new StandaloneLocalStrategy(emf);
} else {
throw new IllegalArgumentException( "This strategy requires a EntityManagerFactory instance!");
}
break;
default:
throw new IllegalArgumentException("Unknown " + PersistenceStrategyType.class.getSimpleName() + " type: " + type );
}
return persistenceStrategy;
}
}