package org.aperteworkflow.plugin.ext.log;
import junit.framework.Assert;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;
import pl.net.bluesoft.rnd.processtool.model.BpmStep;
import pl.net.bluesoft.rnd.processtool.model.BpmTask;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstance;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstanceSimpleAttribute;
import pl.net.bluesoft.rnd.processtool.model.nonpersistent.MutableBpmStep;
import pl.net.bluesoft.rnd.processtool.model.nonpersistent.MutableBpmTask;
import pl.net.bluesoft.rnd.processtool.steps.ProcessToolProcessStep;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AutoWiredProperty;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LogStepTest {
private static final Logger logger = Logger.getLogger(LogStepTest.class.getName());
@Test
public void testParse() throws Exception {
ProcessInstance process = new ProcessInstance();
process.addAttribute(new ProcessInstanceSimpleAttribute("p1", "my-very-first-param"));
process.addAttribute(new ProcessInstanceSimpleAttribute("p2", "second_param_123"));
Map<String, String> properties = new HashMap<String, String>();
properties.put("message", "${p1} and ${p2} or ${something}");
String result = processStep(new LogStep(), process, properties);
Assert.assertEquals(result, "my-very-first-param and second_param_123 or ${something}");
}
@Test
public void testNoParse() throws Exception {
final String message = "no message here ${this-is-my-attribute}";
Map<String, String> properties = new HashMap<String, String>();
properties.put("message", message);
String result = processStep(new LogStep(), new ProcessInstance(), properties);
Assert.assertEquals(result, message);
}
// TODO move to common test case class for Steps
private String processStep(final ProcessToolProcessStep step, final ProcessInstance process, final Map<String, String> properties)
throws Exception{
processAutowiredProperties(step, properties);
BpmStep bpmTask = new MutableBpmStep() {
@Override
public ProcessInstance getProcessInstance() {
return process;
}
};
return step.invoke(bpmTask, properties);
}
private void processAutowiredProperties(Object object, Map<String, String> m) {
Class cls = object.getClass();
for (Field f : cls.getDeclaredFields()) {
String autoName = null;
for (Annotation a : f.getAnnotations()) {
if (a instanceof AutoWiredProperty) {
AutoWiredProperty awp = (AutoWiredProperty) a;
if (AutoWiredProperty.DEFAULT.equals(awp.name())) {
autoName = f.getName();
} else {
autoName = awp.name();
}
}
}
String value = m.get(autoName);
if (autoName != null && value != null) {
try {
BeanUtils.setProperty(object, autoName, value);
} catch (Exception e) {
logger.log(Level.SEVERE, "Error setting attribute " + autoName + ": " +e.getMessage(), e);
}
}
}
}
}