diff --git a/src/main/activiti/MQ.json b/src/main/activiti/MQ.json index b4bf547..dd941c0 100644 --- a/src/main/activiti/MQ.json +++ b/src/main/activiti/MQ.json @@ -3087,8 +3087,7 @@ "mq_prioritypackage", "mq_payloadpackage", "mq_replyQueueNamepackage", - "mq_statusQueueNamepackage", - "mq_metadataProcessScopepackage" + "mq_statusQueueNamepackage" ], "hiddenPropertyPackages": [ "multiinstance_typepackage", diff --git a/src/main/java/com/inteligr8/activiti/mq/MqDelegateExecution.java b/src/main/java/com/inteligr8/activiti/mq/MqDelegateExecution.java index 69b4196..7b26864 100644 --- a/src/main/java/com/inteligr8/activiti/mq/MqDelegateExecution.java +++ b/src/main/java/com/inteligr8/activiti/mq/MqDelegateExecution.java @@ -54,12 +54,7 @@ public class MqDelegateExecution { } protected void setMqVariable(String varName, Object value) { - varName = this.formulateVariableName(varName); - if (this.task.doWriteToProcessScope()) { - this.execution.setVariable(varName, value); - } else { - this.execution.setVariableLocal(varName, value); - } + this.execution.setVariable(varName, value); } public String formulateVariableName(String varName) { @@ -67,11 +62,19 @@ public class MqDelegateExecution { varName += "_" + this.getMessageNameFromModel(); return varName; } - + + /** + * Always pull from the process scope. + * @param correlationId + */ public String getCorrelationId() { return this.execution.getVariable(this.formulateVariableName(Constants.VARIABLE_CORRELATION_ID), String.class); } + /** + * Always set at process scope. + * @param correlationId + */ public void setCorrelationId(String correlationId) { this.execution.setVariable(this.formulateVariableName(Constants.VARIABLE_CORRELATION_ID), correlationId); } diff --git a/src/main/java/com/inteligr8/activiti/mq/MqServiceTask.java b/src/main/java/com/inteligr8/activiti/mq/MqServiceTask.java index cc578f8..4508221 100644 --- a/src/main/java/com/inteligr8/activiti/mq/MqServiceTask.java +++ b/src/main/java/com/inteligr8/activiti/mq/MqServiceTask.java @@ -70,26 +70,62 @@ public class MqServiceTask { @SuppressWarnings("unchecked") protected T getFieldValueFromModel(String fieldName, Class type, VariableScope varscope, boolean forceExpressionProcessing) { + Object value = this.getFieldValueFromModel(fieldName, varscope, forceExpressionProcessing); + + if (value == null) { + return null; + } else if (String.class.isAssignableFrom(type)) { + if (value instanceof String) { + return (T) value; + } else { + return (T) value.toString(); + } + } else { + try { + Method method = type.getMethod("valueOf", value.getClass()); + return (T) method.invoke(null, value); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + String strvalue; + if (value instanceof String) { + strvalue = (String) value; + } else { + strvalue = value.toString(); + } + + try { + Method method = type.getMethod("valueOf", String.class); + return (T) method.invoke(null, strvalue); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e2) { + throw new IllegalArgumentException("The target type '" + type + "' has no 'valueOf' method for String or type: " + value.getClass()); + } + } + } + } + + protected Object getFieldValueFromModel(String fieldName, VariableScope varscope, boolean forceExpressionProcessing) { FieldExtension field = this.fieldMap.get(fieldName); if (field == null) { return null; } else if (field.getExpression() != null && field.getExpression().length() > 0) { + this.logger.trace("Field value is recognized as an expression by the Activity framework: {}: {}", fieldName, field.getExpression()); ExpressionManager exprman = Context.getProcessEngineConfiguration().getExpressionManager(); Expression expr = exprman.createExpression(field.getExpression()); - return (T) expr.getValue(varscope); + return expr.getValue(varscope); + } else if (field.getStringValue() == null) { + this.logger.trace("Field value is null: {}", fieldName); + return null; } else if (forceExpressionProcessing) { + this.logger.trace("Field value will be processed as potentially having expression(s): {}", fieldName); ExpressionManager exprman = Context.getProcessEngineConfiguration().getExpressionManager(); Expression expr = exprman.createExpression(field.getStringValue()); - return (T) expr.getValue(varscope); - } else if (String.class.isAssignableFrom(type)) { - return (T) field.getStringValue(); + return expr.getValue(varscope); + } else if (field.getStringValue().startsWith("${") && field.getStringValue().endsWith("}")) { + this.logger.trace("Field value is recognized as an expression by the MQ extension: {}: {}", fieldName, field.getStringValue()); + ExpressionManager exprman = Context.getProcessEngineConfiguration().getExpressionManager(); + Expression expr = exprman.createExpression(field.getStringValue()); + return expr.getValue(varscope); } else { - try { - Method method = type.getMethod("valueOf", String.class); - return (T) method.invoke(null, field.getStringValue()); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - throw new IllegalArgumentException(e); - } + return field.getStringValue(); } } diff --git a/src/main/java/com/inteligr8/activiti/mq/MqSubscribeDelegateExecution.java b/src/main/java/com/inteligr8/activiti/mq/MqSubscribeDelegateExecution.java index cb76925..d4fc4e9 100644 --- a/src/main/java/com/inteligr8/activiti/mq/MqSubscribeDelegateExecution.java +++ b/src/main/java/com/inteligr8/activiti/mq/MqSubscribeDelegateExecution.java @@ -8,6 +8,15 @@ public class MqSubscribeDelegateExecution extends MqDelegateExecution { public MqSubscribeDelegateExecution(ProcessEngine services, MqServiceTaskService msts, DelegateExecution execution) { super(services, msts, execution); } + + protected void setMqVariable(String varName, Object value) { + varName = this.formulateVariableName(varName); + if (this.task.doWriteToProcessScope()) { + this.execution.setVariable(varName, value); + } else { + this.execution.setVariableLocal(varName, value); + } + } public Integer getConcurrencyFromModel() { return this.getFieldValueFromModel(Constants.FIELD_CONCURRENCY, Integer.class);