package org.jbpm.kie.services.impl;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import org.junit.Test;
import org.kie.api.command.Command;
import org.kie.internal.command.ProcessInstanceIdCommand;
import org.reflections.Reflections;
import org.reflections.scanners.FieldAnnotationsScanner;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CommonUtilsTest {
private static final Logger logger = LoggerFactory.getLogger(CommonUtilsTest.class);
private static final Reflections reflections = new Reflections(
ClasspathHelper.forPackage("org.drools"),
ClasspathHelper.forPackage("org.jbpm"),
new TypeAnnotationsScanner(),
new FieldAnnotationsScanner(), new SubTypesScanner());
@Test
public void testProcessInstanceIdCommands() {
List<Class<? extends Command>> cmdClasses
= new ArrayList<Class<? extends Command>>(reflections.getSubTypesOf(Command.class));
assertFalse( "Empty set of command classes to test?!?", cmdClasses.isEmpty() );
// sort alphabetically in order to easily find problems and to make test reproducible
Collections.sort(cmdClasses, new Comparator<Class>() {
@Override
public int compare( Class o1, Class o2 ) {
if( o1 == null ) {
return -1;
} else if( o2 == null ) {
return 1;
} else {
return o1.getName().compareTo(o2.getName());
}
}
});
for( Class<? extends Command> cmdClass : cmdClasses ) {
System.out.println(cmdClass.getName());
Field procInstIdField = findProcessInstanceIdField(cmdClass);
if( procInstIdField != null ) {
List<Class<?>> cmdClassInterfaces = Arrays.asList(cmdClass.getInterfaces());
assertTrue( cmdClass.getName() + " does not implement the "
+ ProcessInstanceIdCommand.class.getSimpleName() + " interface!",
cmdClassInterfaces.contains(ProcessInstanceIdCommand.class));
}
}
}
private static Field findProcessInstanceIdField( Class<? extends Command> cmdClass ) {
// This code
try {
Field[] fields = cmdClass.getDeclaredFields();
for( Field field : fields ) {
field.setAccessible(true);
if( field.isAnnotationPresent(XmlAttribute.class) ) {
String attributeName = field.getAnnotation(XmlAttribute.class).name();
if( "process-instance-id".equalsIgnoreCase(attributeName) ) {
return field;
} else if( "processInstanceId".equals(field.getName()) ) {
return field;
}
} else if( field.isAnnotationPresent(XmlElement.class) ) {
String elementName = field.getAnnotation(XmlElement.class).name();
if( "process-instance-id".equalsIgnoreCase(elementName) ) {
return field;
} else if( "processInstanceId".equals(field.getName()) ) {
return field;
}
} else if( "processInstanceId".equals(field.getName()) ) {
return field;
}
}
} catch( Exception e ) {
logger.debug("Unable to find process instance id field in {} due to {}", cmdClass.getName(), e.getMessage());
}
return null;
}
}