use of org.jbpm.kie.services.impl.bpmn2.ProcessDescriptor in project jbpm by kiegroup.
the class KModuleDeploymentService method deploy.
@Override
public void deploy(DeploymentUnit unit) {
try {
super.deploy(unit);
if (!(unit instanceof KModuleDeploymentUnit)) {
throw new IllegalArgumentException("Invalid deployment unit provided - " + unit.getClass().getName());
}
KModuleDeploymentUnit kmoduleUnit = (KModuleDeploymentUnit) unit;
DeployedUnitImpl deployedUnit = new DeployedUnitImpl(unit);
deployedUnit.setActive(kmoduleUnit.isActive());
// Create the release id
KieContainer kieContainer = kmoduleUnit.getKieContainer();
ReleaseId releaseId = null;
if (kieContainer == null) {
KieServices ks = KieServices.Factory.get();
releaseId = ks.newReleaseId(kmoduleUnit.getGroupId(), kmoduleUnit.getArtifactId(), kmoduleUnit.getVersion());
KieMavenRepository repository = getKieMavenRepository();
repository.resolveArtifact(releaseId.toExternalForm());
kieContainer = ks.newKieContainer(releaseId);
kmoduleUnit.setKieContainer(kieContainer);
}
releaseId = kieContainer.getReleaseId();
// retrieve the kbase name
String kbaseName = kmoduleUnit.getKbaseName();
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);
Map<String, ProcessDescriptor> processDescriptors = new HashMap<String, ProcessDescriptor>();
for (org.kie.api.definition.process.Process process : kbase.getProcesses()) {
processDescriptors.put(process.getId(), ((ProcessDescriptor) process.getMetaData().get("ProcessDescriptor")).clone());
}
// TODO: add forms data?
Collection<String> files = module.getFileNames();
processResources(module, files, kieContainer, kmoduleUnit, deployedUnit, releaseId, processDescriptors);
// process the files in the deployment
if (module.getKieDependencies() != null) {
Collection<InternalKieModule> dependencies = module.getKieDependencies().values();
for (InternalKieModule depModule : dependencies) {
logger.debug("Processing dependency module " + depModule.getReleaseId());
files = depModule.getFileNames();
processResources(depModule, files, kieContainer, kmoduleUnit, deployedUnit, depModule.getReleaseId(), processDescriptors);
}
}
Collection<ReleaseId> dependencies = module.getJarDependencies(new DependencyFilter.ExcludeScopeFilter("test", "provided"));
// process deployment dependencies
if (dependencies != null && !dependencies.isEmpty()) {
// Classes 2: classes added from project and dependencies added
processClassloader(kieContainer, deployedUnit);
}
AuditEventBuilder auditLoggerBuilder = setupAuditLogger(identityProvider, unit.getIdentifier());
RuntimeEnvironmentBuilder builder = boostrapRuntimeEnvironmentBuilder(kmoduleUnit, deployedUnit, kieContainer, kmoduleUnit.getMergeMode()).knowledgeBase(kbase).classLoader(kieContainer.getClassLoader());
builder.registerableItemsFactory(getRegisterableItemsFactory(auditLoggerBuilder, kieContainer, kmoduleUnit));
commonDeploy(unit, deployedUnit, builder.get(), kieContainer);
kmoduleUnit.setDeployed(true);
} catch (Throwable e) {
logger.warn("Unexpected error while deploying unit {}", unit.getIdentifier(), e);
// catch all possible errors to be able to report them to caller as RuntimeException
throw new RuntimeException(e);
}
}
use of org.jbpm.kie.services.impl.bpmn2.ProcessDescriptor in project jbpm by kiegroup.
the class KModuleDeploymentService method processResources.
/**
* Goes through all files in a deployment, and processes them so that they are then ready
* for use after deployment.
*
* @param module The {@link InternalKieModule}, necessary to get form content
* @param files The {@link List} of file (names) to process.
* @param kieContainer The {@link KieContainer}, necesary in order to load classes
* @param deploymentUnit The {@link DeploymentUnit}, necessary to get the deployment id
* @param deployedUnit The {@link DeployedUnit}, which contains the results of actions here
*/
protected void processResources(InternalKieModule module, Collection<String> files, KieContainer kieContainer, DeploymentUnit unit, DeployedUnitImpl deployedUnit, ReleaseId releaseId, Map<String, ProcessDescriptor> processes) {
for (String fileName : files) {
if (fileName.matches(".+bpmn[2]?$")) {
ProcessAssetDesc process;
try {
String processString = new String(module.getBytes(fileName), "UTF-8");
String processId = getProcessId(processString);
ProcessDescriptor processDesriptor = processes.get(processId);
if (processDesriptor != null) {
process = processDesriptor.getProcess();
if (process == null) {
throw new IllegalArgumentException("Unable to read process " + fileName);
}
process.setEncodedProcessSource(Base64.encodeBase64String(processString.getBytes()));
process.setDeploymentId(unit.getIdentifier());
deployedUnit.addAssetLocation(process.getId(), process);
bpmn2Service.addProcessDefinition(unit.getIdentifier(), processId, processDesriptor, kieContainer);
}
} catch (UnsupportedEncodingException e) {
throw new IllegalArgumentException("Unsupported encoding while processing process " + fileName);
}
} else if (fileName.matches(".+ftl$") || fileName.matches(".+form$") || fileName.matches(".+frm$")) {
try {
String formContent = new String(module.getBytes(fileName), "UTF-8");
if (fileName.indexOf("/") != -1)
fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
formManagerService.registerForm(unit.getIdentifier(), fileName, formContent);
} catch (UnsupportedEncodingException e) {
throw new IllegalArgumentException("Unsupported encoding while processing form " + fileName);
}
} else if (fileName.matches(".+class$")) {
// Classes 1: classes from deployment added
String className = fileName.replaceAll("/", ".");
className = className.substring(0, fileName.length() - ".class".length());
Class deploymentClass = null;
try {
deploymentClass = kieContainer.getClassLoader().loadClass(className);
} catch (ClassNotFoundException cnfe) {
throw new IllegalArgumentException("Class " + className + " not found in the project");
} catch (NoClassDefFoundError e) {
throw new IllegalArgumentException("Class " + className + " not found in the project");
}
addClassToDeployedUnit(deploymentClass, deployedUnit);
}
}
}
Aggregations