diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java index 569fe28..fb04068 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import javax.swing.BorderFactory; import javax.swing.JComboBox; @@ -36,12 +37,15 @@ import models.algebra.Expression; import models.algebra.InvalidMessage; import models.algebra.ParameterizedIdentifierIsFutureWork; +import models.algebra.Position; import models.algebra.Term; +import models.algebra.Type; import models.algebra.UnificationFailed; import models.algebra.ValueUndefined; import models.algebra.Variable; import models.dataConstraintModel.Channel; import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.ResourceHierarchy; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferModel; @@ -103,45 +107,41 @@ stopEditing(true); } if (!graphComponent.getGraph().getModel().isEdge(cell)) { - Resource res = simulator.getCurState().getResource((String) ((mxCell) cell).getValue()); ResourceIdentifier resId = res.getResourceIdentifier(); // clicked resource - ArrayList eventChs = new ArrayList<>(); // eventchannelList - ArrayList messages = new ArrayList<>(); // ADLmessage - ArrayList eventMessages = new ArrayList<>(); // messageList + ArrayList eventChs = new ArrayList<>(); // event channel list + ArrayList messageTexts = new ArrayList<>(); // message text list + ArrayList messageExps = new ArrayList<>(); // message expression list + ArrayList> refParams = new ArrayList<>(); // message parameters for ref ports ResourcePath eventResPath = null; for (Channel ch: simulator.getModel().getInputChannels()) { // all channels - eventResPath = getSelectableMessages(ch, resId, eventChs, messages, eventMessages, eventResPath); + eventResPath = getSelectableMessages(ch, resId, eventChs, messageTexts, messageExps, refParams, eventResPath); } - - if (messages.isEmpty()) { + if (messageTexts.isEmpty()) { return; } - String[] eventList = messages.toArray(new String[messages.size()]); - JComboBox event = new JComboBox(eventList); + String[] messageList = messageTexts.toArray(new String[messageTexts.size()]); + JComboBox messageMenu = new JComboBox(messageList); - JPanel eventChoice = new JPanel(); - eventChoice.add(event); // FirstEventChoice + JPanel eventSelectPanel = new JPanel(); + eventSelectPanel.add(messageMenu); - int ret = JOptionPane.showConfirmDialog(window, eventChoice, "Event Choice", JOptionPane.OK_CANCEL_OPTION); + int ret = JOptionPane.showConfirmDialog(window, eventSelectPanel, "Event Choice", JOptionPane.OK_CANCEL_OPTION); // Select an event. if (ret == JOptionPane.OK_OPTION) { - - JPanel inputEvent = new JPanel(); - int i , eventNum; - i = eventNum = 0; - - for (String eventString : eventList) { - if(eventString.equals(event.getSelectedItem().toString())) { - eventNum = i; + int i, messageIdx; + i = messageIdx = 0; + for (String messageText : messageList) { + if(messageText.equals(messageMenu.getSelectedItem().toString())) { + messageIdx = i; } i++; } - - JTextArea textArea = new JTextArea(eventMessages.get(eventNum).toString(), 10, 30); // EventInput - inputEvent.add(textArea); - - int approve = JOptionPane.showConfirmDialog(window, inputEvent, "Event Code", JOptionPane.OK_CANCEL_OPTION); + JPanel inputEventPanel = new JPanel(); + JTextArea textArea = new JTextArea(messageExps.get(messageIdx).toString(), 10, 30); + inputEventPanel.add(textArea); + + int approve = JOptionPane.showConfirmDialog(window, inputEventPanel, "Event Code", JOptionPane.OK_CANCEL_OPTION); // Input an message text for the event. if (approve == JOptionPane.OK_OPTION) { try { @@ -149,8 +149,15 @@ Parser parser = new Parser(stream); stream.addLine(textArea.getText()); Expression eventMessage = parser.parseTerm(stream, simulator.getModel()); + if (eventMessage instanceof Term) { + TreeMap refMap = refParams.get(messageIdx); + for (Integer paramIdx: refMap.keySet()) { + ((Term) eventMessage).getSymbol().setArity(-1); + ((Term) eventMessage).addChild(paramIdx, refMap.get(paramIdx), true); + } + } - Event newEvent = new Event(eventChs.get(eventNum), eventMessage, eventResPath, simulator.getCurState().getResource(resId)); + Event newEvent = new Event(eventChs.get(messageIdx), eventMessage, eventResPath, simulator.getCurState().getResource(resId)); simulator.transition(newEvent); graphComponent.setCellEditor(new InputEventCellEditor(window, graphComponent, simulator, this.editor)); @@ -186,38 +193,61 @@ } private ResourcePath getSelectableMessages(Channel ch, ResourceIdentifier resId, - ArrayList eventChs, ArrayList messages, ArrayList eventMessages, + ArrayList eventChs, ArrayList messageTexts, ArrayList messageExps, ArrayList> refParams, ResourcePath eventResPath) { - if (((DataTransferChannel) ch).getInputResources().size() == 0) { // event ch or normal ch + if (((DataTransferChannel) ch).getInputResources().size() == 0) { // event ch. or normal ch. for (ChannelMember out: ((DataTransferChannel) ch).getOutputChannelMembers()) { ResourcePath resPath = out.getResource(); - if (!out.isOutside() && resId.isInstanceOf(resPath)) { // account.uid == acounts.123 + if (!out.isOutside() && resId.isInstanceOf(resPath)) { eventResPath = resPath; eventChs.add(((DataTransferChannel) ch)); - String message = null; + String messageText = null; Expression mesExp = out.getStateTransition().getMessageExpression(); + TreeMap refMap = new TreeMap<>(); if (mesExp instanceof Term) { + // Reconstruct an input message template List pathParams = resPath.getPathParams(); List children = ((Term) mesExp).getChildren(); mesExp = new Term(((Term) mesExp).getSymbol()); - for (Expression child: children) { - if (!pathParams.contains(child)) { - ((Term) mesExp).addChild(child); + for (int i = 0; i < children.size(); i++) { + Expression child = children.get(i); + boolean isRefVar = false; + for (ChannelMember refCm: ((DataTransferChannel) ch).getReferenceChannelMembers()) { + if (refCm.getStateTransition().getMessageExpression() instanceof Term) { + Expression varExp = ((Term) refCm.getStateTransition().getMessageExpression()).getChild(i); + if (varExp != null && varExp instanceof Variable) { + if (refCm.getStateTransition().getCurStateExpression().contains(varExp)) { + // child has come from a reference resource. + isRefVar = true; + break; + } + } + } + } + if (!isRefVar) { + // child has not come from a reference resource. + if (!pathParams.contains(child)) { + ((Term) mesExp).addChild(child); + } else { + int idx = pathParams.indexOf(child); + ((Term) mesExp).addChild(resId.getPathParams().get(idx)); + } } else { - int idx = pathParams.indexOf(child); - ((Term) mesExp).addChild(resId.getPathParams().get(idx)); + // child has come from a reference resource. + refMap.put(i, child); } } - message = ((Term) mesExp).getSymbol().toString(); + messageText = ((Term) mesExp).getSymbol().toString(); } else if(mesExp instanceof Variable) { - message = ((Variable) mesExp).getName(); + messageText = ((Variable) mesExp).getName(); } - eventMessages.add(mesExp); - messages.add(message); // for the pull-down menu + messageExps.add(mesExp); + messageTexts.add(messageText); // for the pull-down menu + refParams.add(refMap); } } for (Channel childCh: ch.getChildren()) { - eventResPath = getSelectableMessages(childCh, resId, eventChs, messages, eventMessages, eventResPath); + eventResPath = getSelectableMessages(childCh, resId, eventChs, messageTexts, messageExps, refParams, eventResPath); } } return eventResPath;