/*
* 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.runtime.manager.impl.deploy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import javax.xml.bind.annotation.XmlElement;
import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.runtime.conf.AuditMode;
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.PersistenceMode;
import org.kie.internal.runtime.conf.RuntimeStrategy;
import org.kie.test.util.compare.ComparePair;
public class DeploymentDescriptorManagerTest extends AbstractDeploymentDescriptorTest {
private static final String SIMPLE_DRL = "package org.jbpm; "
+ " rule \"Start Hello1\"" + " when" + " then"
+ " System.out.println(\"Hello\");" + " end";
protected static final String ARTIFACT_ID = "test-module";
protected static final String GROUP_ID = "org.jbpm.test";
protected static final String VERSION = "1.0.0-SNAPSHOT";
@Test
public void testDefaultDeploymentDescriptor() {
DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");
DeploymentDescriptor descriptor = manager.getDefaultDescriptor();
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
}
@Test
public void testDefaultDeploymentDescriptorFromClasspath() {
System.setProperty("org.kie.deployment.desc.location",
"classpath:/deployment/deployment-descriptor-defaults-and-ms.xml");
DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");
DeploymentDescriptor descriptor = manager.getDefaultDescriptor();
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
assertEquals(1, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
}
@Test
public void testDefaultDeploymentDescriptorFromFile() {
System.setProperty("org.kie.deployment.desc.location",
"file:src/test/resources/deployment/deployment-descriptor-defaults-and-ms.xml");
DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");
DeploymentDescriptor descriptor = manager.getDefaultDescriptor();
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
assertEquals(1, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
}
@Test
public void testDeploymentDescriptorFromKieContainerNoDescInKjar() {
DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);
Map<String, String> resources = new HashMap<String, String>();
resources.put("src/main/resources/simple.drl", SIMPLE_DRL);
InternalKieModule kJar1 = createKieJar(ks, releaseId, resources);
installKjar(releaseId, kJar1);
KieContainer kieContainer = ks.newKieContainer(releaseId);
assertNotNull(kieContainer);
List<DeploymentDescriptor> descriptorHierarchy = manager.getDeploymentDescriptorHierarchy(kieContainer);
assertNotNull(descriptorHierarchy);
assertEquals(1, descriptorHierarchy.size());
DeploymentDescriptor descriptor = descriptorHierarchy.get(0);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
}
@Test
public void testDeploymentDescriptorFromKieContainer() {
DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);
DeploymentDescriptor descriptor = new DeploymentDescriptorImpl("org.jbpm.domain");
descriptor.getBuilder().runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE);
Map<String, String> resources = new HashMap<String, String>();
resources.put("src/main/resources/simple.drl", SIMPLE_DRL);
resources.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
descriptor.toXml());
InternalKieModule kJar1 = createKieJar(ks, releaseId, resources);
installKjar(releaseId, kJar1);
KieContainer kieContainer = ks.newKieContainer(releaseId);
assertNotNull(kieContainer);
List<DeploymentDescriptor> descriptorHierarchy = manager
.getDeploymentDescriptorHierarchy(kieContainer);
assertNotNull(descriptorHierarchy);
assertEquals(2, descriptorHierarchy.size());
descriptor = descriptorHierarchy.get(0);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
descriptor = descriptorHierarchy.get(1);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
}
@Test
public void testDeploymentDescriptorFromKieContainerWithDependency() {
DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");
KieServices ks = KieServices.Factory.get();
// create dependency kjar
ReleaseId releaseIdDep = ks.newReleaseId(GROUP_ID, "dependency-data", VERSION);
DeploymentDescriptor descriptorDep = new DeploymentDescriptorImpl("org.jbpm.domain");
descriptorDep.getBuilder()
.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE)
.auditPersistenceUnit("org.jbpm.audit");
Map<String, String> resourcesDep = new HashMap<String, String>();
resourcesDep.put("src/main/resources/simple.drl", SIMPLE_DRL);
resourcesDep.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
descriptorDep.toXml());
InternalKieModule kJarDep = createKieJar(ks, releaseIdDep, resourcesDep);
installKjar(releaseIdDep, kJarDep);
// create first kjar that will have dependency to another
ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);
DeploymentDescriptor descriptor = new DeploymentDescriptorImpl("org.jbpm.domain");
descriptor.getBuilder()
.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE);
Map<String, String> resources = new HashMap<String, String>();
resources.put("src/main/resources/simple.drl", SIMPLE_DRL);
resources.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
descriptor.toXml());
InternalKieModule kJar1 = createKieJar(ks, releaseId, resources, releaseIdDep);
installKjar(releaseId, kJar1);
KieContainer kieContainer = ks.newKieContainer(releaseId);
assertNotNull(kieContainer);
List<DeploymentDescriptor> descriptorHierarchy = manager.getDeploymentDescriptorHierarchy(kieContainer);
assertNotNull(descriptorHierarchy);
assertEquals(3, descriptorHierarchy.size());
descriptor = descriptorHierarchy.get(0);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
descriptor = descriptorHierarchy.get(1);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.audit", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
descriptor = descriptorHierarchy.get(2);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
}
@Test
public void testDeploymentDescriptorFromKieContainerWithDependencyMerged() {
DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");
KieServices ks = KieServices.Factory.get();
// create dependency kjar
ReleaseId releaseIdDep = ks.newReleaseId(GROUP_ID, "dependency-data", VERSION);
DeploymentDescriptor descriptorDep = new DeploymentDescriptorImpl("org.jbpm.domain");
descriptorDep.getBuilder()
.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE)
.auditPersistenceUnit("org.jbpm.audit")
.addGlobal(new NamedObjectModel("service", "org.jbpm.global.Service"));
Map<String, String> resourcesDep = new HashMap<String, String>();
resourcesDep.put("src/main/resources/simple.drl", SIMPLE_DRL);
resourcesDep.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
descriptorDep.toXml());
InternalKieModule kJarDep = createKieJar(ks, releaseIdDep, resourcesDep);
installKjar(releaseIdDep, kJarDep);
// create first kjar that will have dependency to another
ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);
DeploymentDescriptor descriptor = new DeploymentDescriptorImpl("org.jbpm.domain");
descriptor.getBuilder()
.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE);
Map<String, String> resources = new HashMap<String, String>();
resources.put("src/main/resources/simple.drl", SIMPLE_DRL);
resources.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
descriptor.toXml());
InternalKieModule kJar1 = createKieJar(ks, releaseId, resources, releaseIdDep);
installKjar(releaseId, kJar1);
KieContainer kieContainer = ks.newKieContainer(releaseId);
assertNotNull(kieContainer);
List<DeploymentDescriptor> descriptorHierarchy = manager.getDeploymentDescriptorHierarchy(kieContainer);
assertNotNull(descriptorHierarchy);
assertEquals(3, descriptorHierarchy.size());
descriptor = descriptorHierarchy.get(0);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
descriptor = descriptorHierarchy.get(1);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.audit", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(1, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
descriptor = descriptorHierarchy.get(2);
assertNotNull(descriptor);
assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, descriptor.getAuditMode());
assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
assertEquals(0, descriptor.getMarshallingStrategies().size());
assertEquals(0, descriptor.getConfiguration().size());
assertEquals(0, descriptor.getEnvironmentEntries().size());
assertEquals(0, descriptor.getEventListeners().size());
assertEquals(0, descriptor.getGlobals().size());
assertEquals(0, descriptor.getTaskEventListeners().size());
assertEquals(0, descriptor.getWorkItemHandlers().size());
DeploymentDescriptorMerger merger = new DeploymentDescriptorMerger();
DeploymentDescriptor outcome = merger.merge(descriptorHierarchy, MergeMode.MERGE_COLLECTIONS);
assertNotNull(outcome);
assertEquals("org.jbpm.domain", outcome.getPersistenceUnit());
assertEquals("org.jbpm.domain", outcome.getAuditPersistenceUnit());
assertEquals(AuditMode.JPA, outcome.getAuditMode());
assertEquals(PersistenceMode.JPA, outcome.getPersistenceMode());
assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, outcome.getRuntimeStrategy());
assertEquals(0, outcome.getMarshallingStrategies().size());
assertEquals(0, outcome.getConfiguration().size());
assertEquals(0, outcome.getEnvironmentEntries().size());
assertEquals(0, outcome.getEventListeners().size());
assertEquals(1, outcome.getGlobals().size());
assertEquals(0, outcome.getTaskEventListeners().size());
assertEquals(0, outcome.getWorkItemHandlers().size());
}
@Test
public void roundTripDescriptorMarshallingTest() throws Exception {
DeploymentDescriptorImpl depDescImpl = new DeploymentDescriptorImpl();
List<Field> fieldsToFill = new LinkedList<Field>();
for( Field field : DeploymentDescriptorImpl.class.getDeclaredFields() ) {
if( field.getAnnotation(XmlElement.class) != null ) {
fieldsToFill.add(field);
}
}
for( Field field : fieldsToFill ) {
field.setAccessible(true);
Class fieldType = field.getType();
if( fieldType.equals(String.class) ) {
field.set(depDescImpl, getStringVal());
} else if( fieldType.equals(Boolean.class) ) {
field.set(depDescImpl, true);
} else if( fieldType.equals(PersistenceMode.class) ) {
field.set(depDescImpl, PersistenceMode.NONE);
} else if( fieldType.equals(AuditMode.class) ) {
field.set(depDescImpl, AuditMode.JMS);
} else if( fieldType.equals(RuntimeStrategy.class) ) {
field.set(depDescImpl, RuntimeStrategy.PER_PROCESS_INSTANCE);
} else if( Set.class.isAssignableFrom(fieldType) ) {
Type genType = field.getGenericType();
Type genParamType = ((ParameterizedType) genType).getActualTypeArguments()[0];
Set val = new HashSet();
if( genParamType.equals(String.class) ) {
val.add(getStringVal());
} else if( genParamType.equals(ObjectModel.class) ) {
val.add(getObjectModelParameter(getStringVal(), false));
} else if( genParamType.equals(NamedObjectModel.class) ) {
val.add(getObjectModelParameter(getStringVal(), true));
}
field.set(depDescImpl, val);
}
}
String depDescXml = DeploymentDescriptorIO.toXml(depDescImpl);
ByteArrayInputStream inputStream = new ByteArrayInputStream(depDescXml.getBytes());
DeploymentDescriptor copyDepDescImpl = DeploymentDescriptorIO.fromXml(inputStream);
new ComparePair(depDescImpl, copyDepDescImpl)
.addNullFields( "mappedRoles" )
.useFields()
.compare();
}
private static String getStringVal() {
String val = UUID.randomUUID().toString();
return val.substring(0, val.indexOf("-"));
}
private static Random random = new Random();
private static ObjectModel getObjectModelParameter( String resolver, boolean named ) {
if( named ) {
return new NamedObjectModel(resolver, UUID.randomUUID().toString(), Integer.toString(random.nextInt(100000)));
} else {
return new ObjectModel(resolver, UUID.randomUUID().toString(), Integer.toString(random.nextInt(100000)));
}
}
}