Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RHPAM-2182 - Multiple Instance data input and output lack of Data Typ… #3130

Merged
merged 3 commits into from
Feb 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@
import org.kie.workbench.common.forms.adf.definitions.annotations.metaModel.FieldValue;
import org.kie.workbench.common.forms.adf.definitions.annotations.metaModel.I18nMode;
import org.kie.workbench.common.stunner.bpmn.definition.BPMNProperty;
import org.kie.workbench.common.stunner.bpmn.definition.property.type.VariablesType;
import org.kie.workbench.common.stunner.core.definition.annotation.Property;
import org.kie.workbench.common.stunner.core.definition.annotation.property.Type;
import org.kie.workbench.common.stunner.core.definition.annotation.property.Value;
import org.kie.workbench.common.stunner.core.definition.property.PropertyType;
import org.kie.workbench.common.stunner.core.util.HashUtil;

@Portable
Expand All @@ -38,6 +41,9 @@ public class MultipleInstanceDataInput implements BPMNProperty {
@FieldValue
private String value;

@Type
public static final PropertyType type = new VariablesType();

public MultipleInstanceDataInput() {
this("");
}
Expand All @@ -46,6 +52,10 @@ public MultipleInstanceDataInput(final String value) {
this.value = value;
}

public PropertyType getType() {
return type;
}

public String getValue() {
return value;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@
import org.kie.workbench.common.forms.adf.definitions.annotations.metaModel.FieldValue;
import org.kie.workbench.common.forms.adf.definitions.annotations.metaModel.I18nMode;
import org.kie.workbench.common.stunner.bpmn.definition.BPMNProperty;
import org.kie.workbench.common.stunner.bpmn.definition.property.type.VariablesType;
import org.kie.workbench.common.stunner.core.definition.annotation.Property;
import org.kie.workbench.common.stunner.core.definition.annotation.property.Type;
import org.kie.workbench.common.stunner.core.definition.annotation.property.Value;
import org.kie.workbench.common.stunner.core.definition.property.PropertyType;
import org.kie.workbench.common.stunner.core.util.HashUtil;

@Portable
Expand All @@ -38,6 +41,9 @@ public class MultipleInstanceDataOutput implements BPMNProperty {
@FieldValue
private String value;

@Type
public static final PropertyType type = new VariablesType();

public MultipleInstanceDataOutput() {
this("");
}
Expand All @@ -46,6 +52,10 @@ public MultipleInstanceDataOutput(final String value) {
this.value = value;
}

public PropertyType getType() {
return type;
}

public String getValue() {
return value;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,15 +110,19 @@ protected void setInput(String name, boolean addDataInputAssociation) {
return;
}

String[] variable = name.split(":");
String variableName = getVariableName(variable);
String variableType = getVariableType(variable);

setUpLoopCharacteristics();
DataInput miDataInputElement = createDataInput(name, name);
ItemDefinition item = createItemDefinition(name);
DataInput miDataInputElement = createDataInput(variableName, variableName);
ItemDefinition item = createItemDefinition(variableName, variableType);
addItemDefinition(item);
miDataInputElement.setItemSubjectRef(item);
miloop.setInputDataItem(miDataInputElement);

String id = Ids.dataInput(activity.getId(), name);
DataInput dataInputElement = createDataInput(id, name);
String id = Ids.dataInput(activity.getId(), variableName);
DataInput dataInputElement = createDataInput(id, variableName);
dataInputElement.setItemSubjectRef(item);
addSafe(ioSpec.getDataInputs(), dataInputElement);
addSafe(inputSet.getDataInputRefs(), dataInputElement);
Expand All @@ -131,6 +135,14 @@ protected void setInput(String name, boolean addDataInputAssociation) {
}
}

private String getVariableName(String[] parsedVariable) {
return (parsedVariable.length > 0 && !parsedVariable[0].isEmpty()) ? parsedVariable[0] : "";
}

private String getVariableType(String[] parsedVariable) {
return (parsedVariable.length > 1 && !parsedVariable[1].isEmpty()) ? parsedVariable[1] : Object.class.getName();
}

public void setOutput(String name) {
setOutput(name, true);
}
Expand All @@ -140,15 +152,19 @@ public void setOutput(String name, boolean addDataOutputAssociation) {
return;
}

String[] variable = name.split(":");
String variableName = getVariableName(variable);
String variableType = getVariableType(variable);

setUpLoopCharacteristics();
DataOutput miDataOutputElement = createDataOutput(name, name);
ItemDefinition item = createItemDefinition(name);
DataOutput miDataOutputElement = createDataOutput(variableName, variableName);
ItemDefinition item = createItemDefinition(variableName, variableType);
addItemDefinition(item);
miDataOutputElement.setItemSubjectRef(item);
miloop.setOutputDataItem(miDataOutputElement);

String id = Ids.dataOutput(activity.getId(), name);
DataOutput dataOutputElement = createDataOutput(id, name);
String id = Ids.dataOutput(activity.getId(), variableName);
DataOutput dataOutputElement = createDataOutput(id, variableName);
dataOutputElement.setItemSubjectRef(item);
addSafe(ioSpec.getDataOutputs(), dataOutputElement);
addSafe(outputSet.getDataOutputRefs(), dataOutputElement);
Expand Down Expand Up @@ -199,10 +215,11 @@ protected static DataOutput createDataOutput(String id, String name) {
return dataOutput;
}

protected ItemDefinition createItemDefinition(String name) {
protected ItemDefinition createItemDefinition(String name, String type) {
ItemDefinition item = bpmn2.createItemDefinition();
item.setId(Ids.multiInstanceItemType(activity.getId(), name));
item.setStructureRef(Object.class.getName());
String varType = type.isEmpty() ? Object.class.getName() : type;
item.setStructureRef(varType);
return item;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import org.eclipse.bpmn2.FormalExpression;
import org.eclipse.bpmn2.ItemAwareElement;
import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
import org.eclipse.bpmn2.Property;
import org.eclipse.bpmn2.di.BPMNDiagram;
import org.kie.workbench.common.stunner.bpmn.backend.converters.tostunner.DefinitionResolver;

Expand Down Expand Up @@ -67,17 +66,27 @@ public String getCollectionOutput() {
public String getDataInput() {
return getMultiInstanceLoopCharacteristics()
.map(MultiInstanceLoopCharacteristics::getInputDataItem)
.map(d -> Optional.ofNullable(d.getName()).orElse(d.getId()))
.map(MultipleInstanceActivityPropertyReader::createInputVariable)
.orElse("");
}

private static String createInputVariable(DataInput input) {
String name = (input.getName() != null) ? input.getName() : input.getId();
return name + ":" + input.getItemSubjectRef().getStructureRef();
}

public String getDataOutput() {
return getMultiInstanceLoopCharacteristics()
.map(MultiInstanceLoopCharacteristics::getOutputDataItem)
.map(d -> Optional.ofNullable(d.getName()).orElse(d.getId()))
.map(MultipleInstanceActivityPropertyReader::createOutputVariable)
.orElse("");
}

private static String createOutputVariable(DataOutput output) {
String name = (output.getName() != null) ? output.getName() : output.getId();
return name + ":" + output.getItemSubjectRef().getStructureRef();
}

public String getCompletionCondition() {
return getMultiInstanceLoopCharacteristics()
.map(miloop -> (FormalExpression) miloop.getCompletionCondition())
Expand All @@ -95,10 +104,6 @@ private Optional<MultiInstanceLoopCharacteristics> getMultiInstanceLoopCharacter
return Optional.ofNullable((MultiInstanceLoopCharacteristics) activity.getLoopCharacteristics());
}

private static String getVariableName(Property property) {
return ProcessVariableReader.getProcessVariableName(property);
}

@Override
protected List<DataInput> getDataInputs() {
if (getMultiInstanceLoopCharacteristics().isPresent()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
Expand Down Expand Up @@ -92,6 +93,28 @@ public void setSetInputAndDontAddAssociation() {
testSetInput(false);
}

@Test
public void testSetInputNotFailed() {
writer.setInput(null, false);
writer.setInput("", false);

assertNull(activity.getIoSpecification());
assertTrue(activity.getDataInputAssociations().isEmpty());
assertNull(activity.getLoopCharacteristics());
}

@Test
public void testSetEmptyVariable() {
final String emptyName = "";
writer.setInput(":", false);

assertInputsInitialized();
String inputId = ACTIVITY_ID + "_" + "InputX";
String itemSubjectRef = ACTIVITY_ID + "_multiInstanceItemType_";
assertHasDataInput(activity.getIoSpecification(), inputId, itemSubjectRef, emptyName);
assertDontHasDataInputAssociation(activity, INPUT_VARIABLE_ID, inputId);
}

private void testSetInput(boolean addAssociation) {
writer.setInput(INPUT_VARIABLE_ID, addAssociation);
assertInputsInitialized();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.eclipse.bpmn2.ExtensionAttributeValue;
import org.eclipse.bpmn2.InputOutputSpecification;
import org.eclipse.bpmn2.ItemAwareElement;
import org.eclipse.bpmn2.ItemDefinition;
import org.eclipse.bpmn2.Property;
import org.eclipse.bpmn2.di.BPMNDiagram;
import org.eclipse.emf.ecore.EStructuralFeature;
Expand Down Expand Up @@ -175,7 +176,11 @@ public static DataInput mockDataInput(String id, String name) {
}

public static DataInput mockDataInput(String id, String name, FeatureMap.Entry... entries) {
ItemDefinition itemDefinition = mock(ItemDefinition.class);
when(itemDefinition.getStructureRef()).thenReturn("java.lang.Object");

DataInput dataInput = mock(DataInput.class);
when(dataInput.getItemSubjectRef()).thenReturn(itemDefinition);
when(dataInput.getId()).thenReturn(id);
when(dataInput.getName()).thenReturn(name);
List<FeatureMap.Entry> entriesList = new ArrayList<>();
Expand All @@ -193,7 +198,11 @@ public static DataOutput mockDataOutput(String id, String name) {
}

public static DataOutput mockDataOutput(String id, String name, FeatureMap.Entry... entries) {
ItemDefinition itemDefinition = mock(ItemDefinition.class);
when(itemDefinition.getStructureRef()).thenReturn("java.lang.Object");

DataOutput dataOutput = mock(DataOutput.class);
when(dataOutput.getItemSubjectRef()).thenReturn(itemDefinition);
when(dataOutput.getId()).thenReturn(id);
when(dataOutput.getName()).thenReturn(name);
List<FeatureMap.Entry> entriesList = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public class MultipleInstanceActivityPropertyReaderTest {
private static final String ITEM_ID = "ITEM_ID";
private static final String PROPERTY_ID = "PROPERTY_ID";
private static final String EXPRESSION = "EXPRESSION";
private static final String DATA_TYPE = "java.lang.Object";
private static final String DELIMITER = ":";

private MultipleInstanceActivityPropertyReader reader;

Expand Down Expand Up @@ -84,7 +86,21 @@ public void testGetCollectionInput() {
public void testGetDataInput() {
DataInput item = mockDataInput(ITEM_ID, PROPERTY_ID);
when(miloop.getInputDataItem()).thenReturn(item);
assertEquals(PROPERTY_ID, reader.getDataInput());
assertEquals(PROPERTY_ID + DELIMITER + DATA_TYPE, reader.getDataInput());
}

@Test
public void testGetEmptyDataInput() {
DataInput item = mockDataInput(ITEM_ID, null);
when(miloop.getInputDataItem()).thenReturn(item);
assertEquals(ITEM_ID + DELIMITER + DATA_TYPE, reader.getDataInput());
}

@Test
public void testGetEmptyDataOutput() {
DataOutput item = mockDataOutput(ITEM_ID, null);
when(miloop.getOutputDataItem()).thenReturn(item);
assertEquals(ITEM_ID + DELIMITER + DATA_TYPE, reader.getDataOutput());
}

@Test
Expand All @@ -100,7 +116,7 @@ public void testGetCollectionOutput() {
public void testGetDataOutput() {
DataOutput item = mockDataOutput(ITEM_ID, PROPERTY_ID);
when(miloop.getOutputDataItem()).thenReturn(item);
assertEquals(PROPERTY_ID, reader.getDataOutput());
assertEquals(PROPERTY_ID + DELIMITER + DATA_TYPE, reader.getDataOutput());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -649,9 +649,9 @@ public void testUnmarshallUserTaskMI() throws Exception {
UserTaskExecutionSet executionSet = userTask.getExecutionSet();
assertTrue(executionSet.getIsMultipleInstance().getValue());
assertEquals("theInputCollection", executionSet.getMultipleInstanceCollectionInput().getValue());
assertEquals("theInputVariable", executionSet.getMultipleInstanceDataInput().getValue());
assertEquals("theInputVariable:java.lang.Object", executionSet.getMultipleInstanceDataInput().getValue());
assertEquals("theOutputCollection", executionSet.getMultipleInstanceCollectionOutput().getValue());
assertEquals("theOutputVariable", executionSet.getMultipleInstanceDataOutput().getValue());
assertEquals("theOutputVariable:java.lang.Object", executionSet.getMultipleInstanceDataOutput().getValue());
assertEquals("theCompletionCondition", executionSet.getMultipleInstanceCompletionCondition().getValue());
}

Expand Down Expand Up @@ -1013,7 +1013,7 @@ public void testUnmarshallIntermediateCompensationEventsWithAssociations() throw

Edge associationEdge = userTask2Node.getInEdges().stream()
.filter(edge -> edge.getUUID().equals("_B41D28D1-FC39-40E8-BF89-C57649989014"))
.map(e -> ((Element) e).asEdge())
.map(e -> e.asEdge())
.findFirst().orElse(null);
assertNotNull(associationEdge);
assertNotNull(associationEdge.getContent());
Expand Down Expand Up @@ -1886,9 +1886,9 @@ public void testUnmarshallReusableSubprocessMI() throws Exception {
assertEquals("test.SubProcess", executionSet.getCalledElement().getValue());
assertTrue(executionSet.getIsMultipleInstance().getValue());
assertEquals("theInputCollection", executionSet.getMultipleInstanceCollectionInput().getValue());
assertEquals("theInputVariable", executionSet.getMultipleInstanceDataInput().getValue());
assertEquals("theInputVariable:java.lang.Object", executionSet.getMultipleInstanceDataInput().getValue());
assertEquals("theOutputCollection", executionSet.getMultipleInstanceCollectionOutput().getValue());
assertEquals("theOutputVariable", executionSet.getMultipleInstanceDataOutput().getValue());
assertEquals("theOutputVariable:java.lang.Object", executionSet.getMultipleInstanceDataOutput().getValue());
assertEquals("theCompletionCondition", executionSet.getMultipleInstanceCompletionCondition().getValue());

final String SLA_DUE_DATE = "12/25/1983";
Expand Down Expand Up @@ -2388,16 +2388,16 @@ public void testMarshallUserTaskAssignments() throws Exception {
org.eclipse.bpmn2.UserTask.class,
"Self Evaluation");
assertNotNull(userTask);
DataInput dataInput = (DataInput) getDataInput(userTask,
"reason");
DataInput dataInput = getDataInput(userTask,
"reason");

// this fails because of type
validateDataInputOrOutput(dataInput,
"_reasonInputX",
"com.test.Reason",
"_reasonInputXItem");
DataOutput dataOutput = (DataOutput) getDataOutput(userTask,
"performance");
DataOutput dataOutput = getDataOutput(userTask,
"performance");
validateDataInputOrOutput(dataOutput,
"_performanceOutputX",
"Object",
Expand Down Expand Up @@ -3576,8 +3576,8 @@ public void testUnmarshallMultipleInstanceSubprocess() throws Exception {

assertEquals("var1", multipleInstanceSubprocess.getExecutionSet().getMultipleInstanceCollectionInput().getValue());
assertEquals("var2", multipleInstanceSubprocess.getExecutionSet().getMultipleInstanceCollectionOutput().getValue());
assertEquals("dataInput", multipleInstanceSubprocess.getExecutionSet().getMultipleInstanceDataInput().getValue());
assertEquals("dataOutput", multipleInstanceSubprocess.getExecutionSet().getMultipleInstanceDataOutput().getValue());
assertEquals("dataInput:java.lang.Object", multipleInstanceSubprocess.getExecutionSet().getMultipleInstanceDataInput().getValue());
assertEquals("dataOutput:java.lang.Object", multipleInstanceSubprocess.getExecutionSet().getMultipleInstanceDataOutput().getValue());
assertEquals("a=b", multipleInstanceSubprocess.getExecutionSet().getMultipleInstanceCompletionCondition().getValue());
assertEquals("onEntryAction",
multipleInstanceSubprocess.getExecutionSet().getOnEntryAction().getValue().getValues().get(0).getScript());
Expand Down Expand Up @@ -4102,7 +4102,7 @@ private Iterator<Element> nodesIterator(Diagram<Graph, Metadata> diagram) {

private Process getProcess(Definitions definitions) {
Object o = Arrays.stream(definitions.getRootElements().toArray())
.filter(x -> Process.class.isInstance(x))
.filter(x -> x instanceof Process)
.findFirst()
.orElse(null);
return (Process) o;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ public class MultipleInstanceSubProcessTest extends SubProcessTest<MultipleInsta
private static final String DEFAULT_MULTIPLE_INSTANCE_COLLECTION = null;
private static final String MULTIPLE_INSTANCE_COLLECTION_INPUT = "miCollectionInput";
private static final String MULTIPLE_INSTANCE_COLLECTION_OUTPUT = "miCollectionOutput";
private static final String MULTIPLE_INSTANCE_DATA_INPUT = "collectionItemVarIn";
private static final String MULTIPLE_INSTANCE_DATA_OUTPUT = "collectionItemVarOut";
private static final String MULTIPLE_INSTANCE_DATA_INPUT = "collectionItemVarIn:java.lang.Object";
private static final String MULTIPLE_INSTANCE_DATA_OUTPUT = "collectionItemVarOut:java.lang.Object";
private static final String MULTIPLE_INSTANCE_COMPLETION_CONDITION = "($ in miCollectionOutput if $ == true).size() == miOutAmountRequired;";

private static final String SUBPROCESS_SCRIPT_JAVA_LANGUAGE = "java";
Expand Down