/** * Copyright 2013 JBoss Inc * * 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.overlord.dtgov.jbpm.util; import java.io.UnsupportedEncodingException; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import javax.persistence.EntityManagerFactory; import org.apache.commons.codec.binary.Base64; import org.drools.compiler.kie.builder.impl.InternalKieModule; import org.drools.compiler.kie.builder.impl.KieContainerImpl; import org.drools.core.util.StringUtils; import org.jbpm.kie.services.api.IdentityProvider; import org.jbpm.kie.services.api.bpmn2.BPMN2DataService; import org.jbpm.kie.services.impl.AbstractDeploymentService; import org.jbpm.kie.services.impl.DeployedUnitImpl; import org.jbpm.kie.services.impl.KModuleDeploymentUnit; import org.jbpm.kie.services.impl.audit.ServicesAwareAuditEventBuilder; import org.jbpm.kie.services.impl.model.ProcessAssetDesc; import org.jbpm.process.audit.AbstractAuditLogger; import org.jbpm.process.audit.JPAWorkingMemoryDbLogger; import org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder; import org.jbpm.runtime.manager.impl.cdi.InjectableRegisterableItemsFactory; 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.runtime.KieContainer; import org.kie.internal.deployment.DeploymentUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @ApplicationScoped @Sramp public class SrampKModuleDeploymentService extends AbstractDeploymentService { private static Logger logger = LoggerFactory.getLogger(SrampKModuleDeploymentService.class); private static final String DEFAULT_KBASE_NAME = "SRAMPPackage"; //$NON-NLS-1$ @Inject private BeanManager beanManager; @Inject private EntityManagerFactory emf; @Inject private IdentityProvider identityProvider; @Inject private BPMN2DataService bpmn2Service; @Override public void deploy(DeploymentUnit unit) { super.deploy(unit); if (!(unit instanceof KModuleDeploymentUnit)) { throw new IllegalArgumentException("Invalid deployment unit provided - " + unit.getClass().getName()); //$NON-NLS-1$ } KModuleDeploymentUnit kmoduleUnit = (KModuleDeploymentUnit) unit; DeployedUnitImpl deployedUnit = new DeployedUnitImpl(unit); KieSrampUtil kieSrampUtil = new KieSrampUtil(); KieServices ks = KieServices.Factory.get(); ReleaseId releaseId = ks.newReleaseId(kmoduleUnit.getGroupId(), kmoduleUnit.getArtifactId(), kmoduleUnit.getVersion()); KieContainer kieContainer; try { kieContainer = kieSrampUtil.getKieContainer(releaseId); } catch (Exception e) { throw new IllegalStateException("Cannot connect to s-ramp " + e.getMessage()); //$NON-NLS-1$ } 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 with name " + kbaseName); //$NON-NLS-1$ } Map<String, String> formsData = new HashMap<String, String>(); Collection<String> files = module.getFileNames(); for (String fileName : files) { if(fileName.matches(".+bpmn[2]?$")) { //$NON-NLS-1$ ProcessAssetDesc process; try { String processString = new String(module.getBytes(fileName), "UTF-8"); //$NON-NLS-1$ process = bpmn2Service.findProcessId(processString, kieContainer.getClassLoader()); process.setEncodedProcessSource(Base64.encodeBase64String(processString.getBytes())); process.setDeploymentId(unit.getIdentifier()); process.setForms(formsData); deployedUnit.addAssetLocation(process.getId(), process); } catch (UnsupportedEncodingException e) { logger.warn("Unable to load content for file '{}' : {}", fileName, e); //$NON-NLS-1$ } } else if (fileName.matches(".+ftl$")) { //$NON-NLS-1$ try { String formContent = new String(module.getBytes(fileName), "UTF-8"); //$NON-NLS-1$ Pattern regex = Pattern.compile("(.{0}|.*/)([^/]*?)\\.ftl"); //$NON-NLS-1$ Matcher m = regex.matcher(fileName); String key = fileName; while (m.find()) { key = m.group(2); } formsData.put(key, formContent); } catch (UnsupportedEncodingException e) { logger.warn("Unable to load content for form '{}' : {}", fileName, e); //$NON-NLS-1$ } } else if (fileName.matches(".+form$")) { //$NON-NLS-1$ try { String formContent = new String(module.getBytes(fileName), "UTF-8"); //$NON-NLS-1$ Pattern regex = Pattern.compile("(.{0}|.*/)([^/]*?)\\.form"); //$NON-NLS-1$ Matcher m = regex.matcher(fileName); String key = fileName; while (m.find()) { key = m.group(2); } formsData.put(key+".form", formContent); //$NON-NLS-1$ } catch (UnsupportedEncodingException e) { logger.warn("Unable to load content for form '{}' : {}", fileName, e); //$NON-NLS-1$ } } } KieBase kbase = kieContainer.getKieBase(kbaseName); AbstractAuditLogger auditLogger = new JPAWorkingMemoryDbLogger(emf); ServicesAwareAuditEventBuilder auditEventBuilder = new ServicesAwareAuditEventBuilder(); auditEventBuilder.setIdentityProvider(identityProvider); auditEventBuilder.setDeploymentUnitId(unit.getIdentifier()); auditLogger.setBuilder(auditEventBuilder); RuntimeEnvironmentBuilder builder = RuntimeEnvironmentBuilder.getDefault() .entityManagerFactory(emf) .knowledgeBase(kbase) .classLoader(kieContainer.getClassLoader()); if (beanManager != null) { builder.registerableItemsFactory(InjectableRegisterableItemsFactory.getFactory(beanManager, auditLogger, kieContainer, kmoduleUnit.getKsessionName())); } commonDeploy(unit, deployedUnit, builder.get()); } }