All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder Maven / Gradle / Ivy

There is a newer version: 7.74.1.Final
Show newest version
/*
 * Copyright 2017 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.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManagerFactory;

import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.drools.compiler.kie.builder.impl.KieContainerImpl;
import org.drools.core.marshalling.impl.ClassObjectMarshallingStrategyAcceptor;
import org.drools.core.marshalling.impl.SerializablePlaceholderResolverStrategy;
import org.drools.core.util.StringUtils;
import org.jbpm.process.core.timer.GlobalSchedulerService;
import org.jbpm.process.instance.event.DefaultSignalManagerFactory;
import org.jbpm.process.instance.impl.DefaultProcessInstanceManagerFactory;
import org.jbpm.runtime.manager.impl.deploy.DeploymentDescriptorManagerUtil;
import org.jbpm.runtime.manager.impl.deploy.DeploymentDescriptorMerger;
import org.jbpm.runtime.manager.impl.jpa.EntityManagerFactoryManager;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.ReleaseId;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.marshalling.ObjectMarshallingStrategy;
import org.kie.api.runtime.EnvironmentName;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.manager.RegisterableItemsFactory;
import org.kie.api.runtime.manager.RuntimeEnvironmentBuilderFactory;
import org.kie.api.task.UserGroupCallback;
import org.kie.api.task.UserInfo;
import org.kie.internal.runtime.conf.DeploymentDescriptor;
import org.kie.internal.runtime.conf.MergeMode;
import org.kie.internal.runtime.conf.NamedObjectModel;
import org.kie.internal.runtime.conf.ObjectModel;
import org.kie.internal.runtime.conf.ObjectModelResolver;
import org.kie.internal.runtime.conf.ObjectModelResolverProvider;
import org.kie.internal.runtime.conf.PersistenceMode;
import org.kie.internal.runtime.manager.Mapper;
import org.kie.internal.runtime.manager.RuntimeEnvironment;
import org.kie.internal.runtime.manager.deploy.DeploymentDescriptorManager;
import org.kie.scanner.KieMavenRepository;

/**
 * A builder implementation that follows the fluent approach to build RuntimeEnvironments.
 * Comes with short cut methods to get predefined configurations of the RuntimeEnvironment:
 * 
    *
  • getDefault() - returns preconfigured environment with enabled persistence
  • *
  • getDefaultInMemory() - returns preconfigured environment with disabled persistence for runtime engine
  • *
  • getDefault(ReleaseId) - returns preconfigured environment with enabled persistence that is tailored for kjar
  • *
  • getDefault(ReleaseId, String, String) - returns preconfigured environment with enabled persistence that is tailored for kjar and allows to specify kbase and ksession name
  • *
  • getDefault(String, String, String) - returns preconfigured environment with enabled persistence that is tailored for kjar
  • *
  • getDefault(String, String, String, String, String) - returns preconfigured environment with enabled persistence that is tailored for kjar and allows to specify kbase and ksession name
  • *
  • getEmpty() - completely empty environment for self configuration
  • *
  • getClasspathKModuleDefault() - returns preconfigured environment with enabled persistence based on classpath kiecontainer
  • *
  • getClasspathKModuleDefault(String, String) - returns preconfigured environment with enabled persistence based on classpath kiecontainer
  • *
* */ public class RuntimeEnvironmentBuilder implements RuntimeEnvironmentBuilderFactory, org.kie.api.runtime.manager.RuntimeEnvironmentBuilder{ private static final String DEFAULT_KBASE_NAME = "defaultKieBase"; private SimpleRuntimeEnvironment runtimeEnvironment; public RuntimeEnvironmentBuilder() { this.runtimeEnvironment = new SimpleRuntimeEnvironment(); } private RuntimeEnvironmentBuilder(SimpleRuntimeEnvironment runtimeEnvironment) { this.runtimeEnvironment = runtimeEnvironment; } /** * Provides completely empty RuntimeEnvironmentBuilder instance that allows to manually * set all required components instead of relying on any defaults. * @return new instance of RuntimeEnvironmentBuilder */ public static RuntimeEnvironmentBuilder getEmpty() { return new RuntimeEnvironmentBuilder(); } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getDefault() { return new RuntimeEnvironmentBuilder(new DefaultRuntimeEnvironment()); } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* but it does not have persistence for process engine configured so it will only store process instances in memory * @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getDefaultInMemory() { RuntimeEnvironmentBuilder builder = new RuntimeEnvironmentBuilder(new DefaultRuntimeEnvironment(null, false)); builder .addConfiguration("drools.processSignalManagerFactory", DefaultSignalManagerFactory.class.getName()) .addConfiguration("drools.processInstanceManagerFactory", DefaultProcessInstanceManagerFactory.class.getName()); return builder; } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* This one is tailored to works smoothly with kjars as the notion of kbase and ksessions * @param groupId group id of kjar * @param artifactId artifact id of kjar * @param version version number of kjar * @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getDefault(String groupId, String artifactId, String version) { return getDefault(groupId, artifactId, version, null, null); } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* This one is tailored to works smoothly with kjars as the notion of kbase and ksessions * @param groupId group id of kjar * @param artifactId artifact id of kjar * @param version version number of kjar * @param kbaseName name of the kbase defined in kmodule.xml stored in kjar * @param ksessionName name of the ksession define in kmodule.xml stored in kjar * @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getDefault(String groupId, String artifactId, String version, String kbaseName, String ksessionName) { KieServices ks = KieServices.Factory.get(); return getDefault(ks.newReleaseId(groupId, artifactId, version), kbaseName, ksessionName); } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* This one is tailored to works smoothly with kjars as the notion of kbase and ksessions * @param releaseId ReleaseId that described the kjar * @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getDefault(ReleaseId releaseId) { return getDefault(releaseId, null, null); } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* This one is tailored to works smoothly with kjars as the notion of kbase and ksessions * @param releaseId ReleaseId that described the kjar * @param kbaseName name of the kbase defined in kmodule.xml stored in kjar * @param ksessionName name of the ksession define in kmodule.xml stored in kjar * @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getDefault(ReleaseId releaseId, String kbaseName, String ksessionName) { KieMavenRepository repository = KieMavenRepository.getKieMavenRepository(); repository.resolveArtifact(releaseId.toExternalForm()); KieServices ks = KieServices.Factory.get(); KieContainer kieContainer = ks.newKieContainer(releaseId); DeploymentDescriptorManager descriptorManager = new DeploymentDescriptorManager(); List descriptorHierarchy = DeploymentDescriptorManagerUtil.getDeploymentDescriptorHierarchy(descriptorManager, kieContainer); DeploymentDescriptorMerger merger = new DeploymentDescriptorMerger(); DeploymentDescriptor descriptor = merger.merge(descriptorHierarchy, MergeMode.MERGE_COLLECTIONS); if (StringUtils.isEmpty(kbaseName)) { KieBaseModel defaultKBaseModel = ((KieContainerImpl)kieContainer).getKieProject().getDefaultKieBaseModel(); if (defaultKBaseModel != null) { kbaseName = defaultKBaseModel.getName(); } else { kbaseName = DEFAULT_KBASE_NAME; } } InternalKieModule module = (InternalKieModule) ((KieContainerImpl)kieContainer).getKieModuleForKBase(kbaseName); if (module == null) { throw new IllegalStateException("Cannot find kbase, either it does not exist or there are multiple default kbases in kmodule.xml"); } KieBase kbase = kieContainer.getKieBase(kbaseName); RuntimeEnvironmentBuilder builder = null; if (descriptor.getPersistenceMode() == PersistenceMode.NONE) { builder = getDefaultInMemory(); } else { builder = getDefault(); } Map contaxtParams = new HashMap(); contaxtParams.put("classLoader", kieContainer.getClassLoader()); // populate various properties of the builder if (descriptor.getPersistenceUnit() != null) { EntityManagerFactory emf = EntityManagerFactoryManager.get().getOrCreate(descriptor.getPersistenceUnit()); builder.entityManagerFactory(emf); contaxtParams.put("entityManagerFactory", emf); } // process object models that are globally configured (environment entries, session configuration) for (NamedObjectModel model : descriptor.getEnvironmentEntries()) { Object entry = getInstanceFromModel(model, kieContainer, contaxtParams); builder.addEnvironmentEntry(model.getName(), entry); } for (NamedObjectModel model : descriptor.getConfiguration()) { Object entry = getInstanceFromModel(model, kieContainer, contaxtParams); builder.addConfiguration(model.getName(), (String) entry); } ObjectMarshallingStrategy[] mStrategies = new ObjectMarshallingStrategy[descriptor.getMarshallingStrategies().size() + 1]; int index = 0; for (ObjectModel model : descriptor.getMarshallingStrategies()) { Object strategy = getInstanceFromModel(model, kieContainer, contaxtParams); mStrategies[index] = (ObjectMarshallingStrategy)strategy; index++; } // lastly add the main default strategy mStrategies[index] = new SerializablePlaceholderResolverStrategy(ClassObjectMarshallingStrategyAcceptor.DEFAULT); builder.addEnvironmentEntry(EnvironmentName.OBJECT_MARSHALLING_STRATEGIES, mStrategies); builder.addEnvironmentEntry("KieDeploymentDescriptor", descriptor) .knowledgeBase(kbase) .classLoader(kieContainer.getClassLoader()) .registerableItemsFactory(new KModuleRegisterableItemsFactory(kieContainer, ksessionName)); return builder; } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* It relies on KieClasspathContainer that requires to have kmodule.xml present in META-INF folder which * defines the kjar itself. * Expects to use default kbase and ksession from kmodule. * @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getClasspathKmoduleDefault() { return getClasspathKmoduleDefault(null, null); } /** * Provides default configuration of RuntimeEnvironmentBuilder that is based on: *
    *
  • DefaultRuntimeEnvironment
  • *
* It relies on KieClasspathContainer that requires to have kmodule.xml present in META-INF folder which * defines the kjar itself. * @param kbaseName name of the kbase defined in kmodule.xml * @param ksessionName name of the ksession define in kmodule.xml * @return new instance of RuntimeEnvironmentBuilder that is already preconfigured with defaults * * @see DefaultRuntimeEnvironment */ public static RuntimeEnvironmentBuilder getClasspathKmoduleDefault(String kbaseName, String ksessionName) { return setupClasspathKmoduleBuilder( KieServices.Factory.get().getKieClasspathContainer(), kbaseName, ksessionName ); } private static RuntimeEnvironmentBuilder setupClasspathKmoduleBuilder( KieContainer kieContainer, String kbaseName, String ksessionName ) { if (StringUtils.isEmpty(kbaseName)) { KieBaseModel defaultKBaseModel = ((KieContainerImpl)kieContainer).getKieProject().getDefaultKieBaseModel(); if (defaultKBaseModel != null) { kbaseName = defaultKBaseModel.getName(); } else { kbaseName = DEFAULT_KBASE_NAME; } } InternalKieModule module = (InternalKieModule) ((KieContainerImpl)kieContainer).getKieModuleForKBase(kbaseName); if (module == null) { throw new IllegalStateException("Cannot find kbase with name " + kbaseName); } KieBase kbase = kieContainer.getKieBase(kbaseName); return getDefault() .knowledgeBase(kbase) .classLoader(kieContainer.getClassLoader()) .registerableItemsFactory(new KModuleRegisterableItemsFactory(kieContainer, ksessionName)); } public RuntimeEnvironmentBuilder persistence(boolean persistenceEnabled) { this.runtimeEnvironment.setUsePersistence(persistenceEnabled); return this; } public RuntimeEnvironmentBuilder entityManagerFactory(Object emf) { if (emf == null) { return this; } if (!(emf instanceof EntityManagerFactory)) { throw new IllegalArgumentException("Argument is not of type EntityManagerFactory"); } this.runtimeEnvironment.setEmf((EntityManagerFactory) emf); return this; } public RuntimeEnvironmentBuilder addAsset(Resource asset, ResourceType type) { if (asset == null || type == null) { return this; } this.runtimeEnvironment.addAsset(asset, type); return this; } public RuntimeEnvironmentBuilder addEnvironmentEntry(String name, Object value) { if (name == null || value == null) { return this; } this.runtimeEnvironment.addToEnvironment(name, value); return this; } public RuntimeEnvironmentBuilder addConfiguration(String name, String value) { if (name == null || value == null) { return this; } this.runtimeEnvironment.addToConfiguration(name, value); return this; } public RuntimeEnvironmentBuilder knowledgeBase(KieBase kbase) { if (kbase == null) { return this; } this.runtimeEnvironment.setKieBase(kbase); return this; } public RuntimeEnvironmentBuilder userGroupCallback(UserGroupCallback callback) { if (callback == null) { return this; } this.runtimeEnvironment.setUserGroupCallback(callback); return this; } public RuntimeEnvironmentBuilder userInfo(UserInfo userInfo) { if (userInfo == null) { return this; } this.runtimeEnvironment.setUserInfo(userInfo); return this; } public RuntimeEnvironmentBuilder mapper(Mapper mapper) { if (mapper == null) { return this; } this.runtimeEnvironment.setMapper(mapper); return this; } public RuntimeEnvironmentBuilder registerableItemsFactory(RegisterableItemsFactory factory) { if (factory == null) { return this; } this.runtimeEnvironment.setRegisterableItemsFactory(factory); return this; } public RuntimeEnvironment get() { this.runtimeEnvironment.init(); return this.runtimeEnvironment; } public RuntimeEnvironmentBuilder schedulerService(Object globalScheduler) { if (globalScheduler == null) { return this; } if (!(globalScheduler instanceof GlobalSchedulerService)) { throw new IllegalArgumentException("Argument is not of type GlobalSchedulerService"); } this.runtimeEnvironment.setSchedulerService((GlobalSchedulerService) globalScheduler); return this; } public RuntimeEnvironmentBuilder classLoader(ClassLoader cl) { if (cl == null) { return this; } this.runtimeEnvironment.setClassLoader(cl); return this; } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newEmptyBuilder() { return RuntimeEnvironmentBuilder.getEmpty(); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newDefaultBuilder() { return RuntimeEnvironmentBuilder.getDefault(); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newDefaultInMemoryBuilder() { return RuntimeEnvironmentBuilder.getDefaultInMemory(); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newDefaultBuilder(String groupId, String artifactId, String version) { return RuntimeEnvironmentBuilder.getDefault(groupId, artifactId, version); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newDefaultBuilder(String groupId, String artifactId, String version, String kbaseName, String ksessionName) { return RuntimeEnvironmentBuilder.getDefault(groupId, artifactId, version, kbaseName, ksessionName); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newDefaultBuilder(ReleaseId releaseId) { return RuntimeEnvironmentBuilder.getDefault(releaseId); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newDefaultBuilder(ReleaseId releaseId, String kbaseName, String ksessionName) { return RuntimeEnvironmentBuilder.getDefault(releaseId, kbaseName, ksessionName); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newClasspathKmoduleDefaultBuilder() { return newClasspathKmoduleDefaultBuilder( null, null ); } @Override public org.kie.api.runtime.manager.RuntimeEnvironmentBuilder newClasspathKmoduleDefaultBuilder(String kbaseName, String ksessionName) { return setupClasspathKmoduleBuilder( KieServices.Factory.get().newKieClasspathContainer(), kbaseName, ksessionName ); } protected static Object getInstanceFromModel(ObjectModel model, KieContainer kieContainer, Map contaxtParams) { ObjectModelResolver resolver = ObjectModelResolverProvider.get(model.getResolver()); return resolver.getInstance(model, kieContainer.getClassLoader(), contaxtParams); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy